Методы зацикливания, необходимые здесь - PullRequest
0 голосов
/ 14 декабря 2018

Я написал запрос с помощью одного опытного человека из прогресса 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].

END.

1 Ответ

0 голосов
/ 14 декабря 2018

Если вы хотите отслеживать до 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...