openedge - 每小时生产数据(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 循环已经选择了正确的记录范围,您可以更轻松地获得构建时间的小时数:
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 数据类型之前的黑暗时代使用的东西。
推荐阅读
- c - 缓存模拟
- winforms - 如何将打印页面(Winform)置于前面?
- java - 在 aws 上部署 Spring 启动应用程序时无法创建类型为 org.springframework.orm.jpa.SharedEntityManagerCreator 的内部 bean
- python - Django 验证错误在基于类的视图中不起作用
- php - 考勤一次的学生按考勤键后不能再考勤
- python - 表时间转换纳秒到分钟
- python - 使用 Python [已解决] 从 json 文件中删除枚举器
- angular - Angular ionic build:无法读取未定义 postcss 的属性“toLowerCase”
- vert.x - vertx : setTimer - 它会失败吗?
- javascript - 如何获取新日期();使用ajax从数据库