【问题标题】:Looping Methods needed here这里需要的循环方法
【发布时间】:2018-12-15 00:48:23
【问题描述】:

我在 Progress 4GL 的一位经验丰富的人的帮助下编写了一个查询,但我错过了一个要问的概念。我已经分享了查询。在这里,我需要根据每个班次序列(总共 21 个序列)的开始和结束时间计算总订单并分配给变量。例如看下面

 DEFINE VARIABLE StartHour06 AS INTEGER NO-UNDO.
 DEFINE VARIABLE StartHour07 AS INTEGER NO-UNDO

FIND FIRST gdmf_shift WHERE gdmf_shift.shft_sequence = 1 NO-LOCK NO-ERROR.
StartHour06 = gdmf_shift.shft_start_hour.
StopHour07 =  gdmf_shift.shft_stop_hour.

像这样我需要编写最多 21 个班次序列的查询..实际上它不是一个好的代码..我需要使它简单并尝试一种方法,但我不知道如何分配给变量.请看下面我尝试了什么

DEFINE VARIABLE sSeq AS INTEGER EXTENT 21 NO-UNDO. /* start hour */
DEFINE VARIABLE eSeq AS INTEGER EXTENT 21 NO-UNDO. /* end hour */ 
FOR EACH gdmf_shift WHERE gdmf_shift.shft_sequence LE 21 NO-LOCK BY gdmf_shift.shft_sequence:
sSeq[1] = gdmf_shift.shft_start_hour.
eSeq[21] =  gdmf_shift.shft_stop_hour.
DISP sSeq[1] eSeq[21].

结束。

【问题讨论】:

    标签: openedge progress-4gl


    【解决方案1】:

    如果您想跟踪多达 21 个单独的班次序列。也许你应该做一些类似下面的代码的事情。

    现在您只需为循环的每次迭代更新 sSeq[1] 和 eSeq[21]。

    插入移位序列作为数组 instad 的索引:

    DEFINE VARIABLE sSeq AS INTEGER EXTENT 21 NO-UNDO. /* start hour */
    DEFINE VARIABLE eSeq AS INTEGER EXTENT 21 NO-UNDO. /* end hour */ 
    FOR EACH gdmf_shift WHERE gdmf_shift.shft_sequence LE 21 NO-LOCK BY gdmf_shift.shft_sequence:
      sSeq[gdmf_shift.shft_sequence] = gdmf_shift.shft_start_hour.
      eSeq[gdmf_shift.shft_sequence] =  gdmf_shift.shft_stop_hour.
      DISP sSeq[gdmf_shift.shft_sequence] eSeq[gdmf_shift.shft_sequence].
    END.
    

    如果您绝对需要单个变量而不是在范围上,则需要更多代码和 CASE 语句(也可以是 IF)来决定要分配的变量:

    DEFINE VARIABLE sSeq1 AS INTEGER NO-UNDO. /* start hour */
    DEFINE VARIABLE eSeq1 AS INTEGER NO-UNDO. /* end hour */ 
    DEFINE VARIABLE sSeq2 AS INTEGER NO-UNDO. /* start hour */
    DEFINE VARIABLE eSeq2 AS INTEGER NO-UNDO. /* end hour */ 
    /* More variables here... */
    DEFINE VARIABLE sSeq21 AS INTEGER NO-UNDO. /* start hour */
    DEFINE VARIABLE eSeq21 AS INTEGER NO-UNDO. /* end hour */ 
    
    
     FOR EACH gdmf_shift WHERE gdmf_shift.shft_sequence LE 21 NO-LOCK BY gdmf_shift.shft_sequence:
       CASE gdmf_shift.shft_sequence:
         WHEN 1 THEN DO:
          sSeq1 = gdmf_shift.shft_start_hour.
          eSeq1 =  gdmf_shift.shft_stop_hour.
        END.
         WHEN 2 THEN DO:
          sSeq2 = gdmf_shift.shft_start_hour.
          eSeq2 =  gdmf_shift.shft_stop_hour.
        END.
        /* more code here */
        WHEN 21 THEN DO:
           sSeq21 = gdmf_shift.shft_start_hour.
           eSeq21 =  gdmf_shift.shft_stop_hour.
        END.
      END CASE.
    END.
    

    但这将是很多代码。如果您不喜欢数组,请考虑使用类似临时表的东西。如果您将临时表中的字段命名为表中的名称,则可以使用BUFFER-COPY,否则您可以使用ASSIGN 任何字段。

    DEFINE TEMP-TABLE tt NO-UNDO
      FIELD shft_sequence   LIKE gdmf_shift.shft_sequence
      FIELD shft_start_hour LIKE gdmf_shift.s.shft_start_hour
      FIELD shft_stop_hour LIKE gdmf_shift.s.shft_stop_hour.
    
    
    FOR EACH gdmf_shift WHERE gdmf_shift.shft_sequence LE 21 NO-LOCK BY gdmf_shift.shft_sequence:
    
      CREATE tt.
      BUFFER-COPY gdmf_shift TO tt.
    
    END.
    

    【讨论】:

    • 是的,我可以做到这一点,但在该迭代中,有可能将每个开始和结束时间分配给每个班次的各个变量??最多 21 个序列??
    • 在我的代码中,我根据移位序列设置 sSeq sSeq[gdmf_shift.shft_sequence]
    • 是的,先生..但问题是我如何将开始和结束时间分配给每个班次序列的变量??
    • 您已经在两个变量中分配了 21 个班次序列的每个开始和结束时间数据,即 sSeq[gdmf_shift.shft_sequence] ,eSeq[gdmf_shift.shft_sequence]..实际上我需要的是每个班次都有分配两个变量。
    • 为此使用变量是没有意义的,当添加新班次时会发生什么?您创建一个新变量并编写更多代码?临时表更加灵活,代码更加健壮。
    猜你喜欢
    • 1970-01-01
    • 2020-09-30
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多