首页 > 解决方案 > 每小时生产数据(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.

标签: openedgeprogress-4gl

解决方案


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

hh = truncate( word_build_time / 3600, 0 ).

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

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

旁注: FOR EACH 可能没有选择正确的记录。当时间段超过午夜时,离散的 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 )
         )

为此,您至少需要设置 date1 & date2 和 4 个时间值。

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

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


推荐阅读