每小时生产数据 (Progress 4gl)

Hourly production data (Progress 4gl)

我正在创建一个仪表板来显示每小时的生产数据。需要使用逻辑来显示最近 12 小时的数据。

示例:

Column 1: >= 01:00:00 and < 02:00:00
Column 2: >= 02:00:00 and < 03:00:00

以下是我使用的逻辑:

DEFINE TEMP-TABLE tt_data NO-UNDO
    FIELD ICOUNT        AS INTEGER.
    FIELD cSHPAU        AS CHARACTER
    FIELD cWOBDDDT      AS DATE
    FIELD cWOBTIME      AS INTEGER
    FIELD cWordID       AS CHARACTER.


DEFINE TEMP-TABLE tt_time NO-UNDO
    FIELD A AS INTEGER LABEL "00:00:00 TO 00:59:59"
    FIELD B AS INTEGER LABEL "01:00:00 TO 01:59:59"

DEFINE VARIABLE iTime AS INTEGER NO-UNDO.
DEFINE VARIABLE dDate AS DATE NO-UNDO.

iTime  = TIME - 12 * 3600.
dDate  = NOW.

EMPTY TEMP-TABLE tt_data.

FOR EACH sfcf_au_ship NO-LOCK,
    EACH sfcf_au OF sfcf_au_ship NO-LOCK,
    EACH womf_worder OF sfcf_au_ship 
    WHERE womf_worder.word_production_status = 'B'  
    AND  womf_worder.word_build_time >= iTime 
    AND womf_worder.word_build_date >= dDate NO-LOCK:

    CREATE tt_data.
     ASSIGN
           tt_data.cWordID  = womf_worder.word_id
           tt_data.cWOBDDDT = womf_worder.word_build_date
           tt_data.cWOBTIME = womf_worder.word_build_time
           tt_data.cSHPAU   = sfcf_au.assu_id.

           IF tt_data.cWOBTIME >= ( 00 * 60 * 60 ) AND TIME < ( 01 * 60 * 60 ) THEN DO:
            FIND tt_time NO-LOCK NO-ERROR.
            ASSIGN
                tt_data.cWOBTIME = tt_time.A.
           END.

           IF tt_data.cWOBTIME >= ( 01 * 60 * 60 ) AND TIME < ( 02 * 60 * 60 ) THEN DO:
            FIND tt_time NO-LOCK NO-ERROR.
            ASSIGN
                tt_data.cWOBTIME = tt_time.B.
        END.
END.

假设您的 FOR EACH 循环已经 select 获取正确的记录范围,您可以更轻松地获得构建时间的小时数:

hh = truncate( word_build_time / 3600, 0 ).

然后只需使用该小时作为关键字来创建您的临时 table 记录。如果 FOR EACH 正确,则应该只有 12 个唯一值。

因此向 TT 添加一个名为 tt_data.whichHour 的新字段,您将能够轻松地按小时对记录进行分组。现有的 WobDDDT 和 WobTime 字段可用于正确排序数据。

旁注:FOR EACH 可能不是 select 正确的记录。当时间段跨越午夜时,离散的 DATE 和 TIME 字段会很棘手。您的示例使用当前日期和时间(负 12 小时),因此如果您在早上 6 点 运行 它,您将错过昨天从下午 6 点到午夜的数据。

要正确地做到这一点,您需要编写一个更复杂的 WHERE 子句,用 OR 涵盖两个时期。沿着这些线的东西:

FOR EACH womf_worder NO-LOCK
   WHERE womf_worder.word_production_status = 'B'  
     AND (
           ( word_build_date = date1 AND word_build_time >= time1 and word_build_time < time2 )
          OR
           ( word_build_date = date2 AND word_build_time >= time3 and word_build_time < time4 )
         )

为此,您至少需要设置日期 1 和日期 2 以及 4 个时间值。

如果您只是 select 所需的日期并在代码主体中使用 IF 语句过滤适当的时间,实际上可能更容易理解。

如果 table 有一个 DATETIME 字段,你会过得更好。离散的 DATE 和 TIME 字段是遗留应用程序在支持 DATETIME 数据类型之前的黑暗时代使用的东西。