Как сопоставить две записи, используя ЗАПИСЬ в процессе выполнения 4GL?

#openedge #progress-4gl

#openedge #прогресс-4gl

Вопрос:

Я написал программу для сопоставления двух записей. Если она совпадает, то мне нужно сообщение «Сопоставлено», но проблема здесь в том, что я не имею ни малейшего представления о том, как сопоставить. Позвольте мне поделиться моей программой

 DEFINE VARIABLE cPos AS INTEGER NO-UNDO.
DEFINE TEMP-TABLE tt_data NO-UNDO
      FIELD cPosition AS CHARACTER FORMAT "X(60)"
      FIELD cEndCode  AS CHARACTER
      FIELD cShotCode AS CHARACTER. 

CREATE tt_data.
ASSIGN
tt_data.cPosition ="S$$$^^^^^^^^^^$$$^^^MC^^^^^^^^^^^^R^^^^^^^^^^^^^^^^^^^^^^^^^"
tt_data.cEndCode =  10
tt_data.cShotCode = "S".

CASE tt_data.cEndCode:

WHEN 10 THEN DO:
cPos = 1.
END.

WHEN 20 THEN DO:
cPos = 2.
END.
.
.
.
WHEN 600 THEN DO:
cPos = 60
END.

END CASE.

FIND FIRST tt_date WHERE tt_data.cShotCode = SUBSTRING(tt_data.cPosition,cPos,1) NO-LOCK NO-ERROR. 

DISPLAY tt_data.cShotCode. /* Displayed Value is S */
  

Если вы видите, что значение tt_datacEndCode равно 10, что означает, что оно указывает на запись 1 в tt_data.cPosition (т. Е. S).

Когда 20, то это для ЗАПИСИ 2, как мудрый, я хочу получить до 600 (т. Е. tt_datacEndCode = 60).

Проблема здесь в том, что у меня не может быть оператора WHEN до 600. Итак, не могли бы вы, пожалуйста, помочь в этом случае?

Ответ №1:

Для примера, который вы показали, вы могли бы исключить оператор CASE и просто заменить его на:

 cPos = integer( tt_data.cEndCode / 10 ).
  

(предполагая, что, как показано, cEndCode всегда кратен 10, а желаемый CPO равен 1/10 от этого значения.)

Таким образом:

 DEFINE VARIABLE cPos AS INTEGER NO-UNDO.
DEFINE TEMP-TABLE tt_data NO-UNDO
      FIELD cPosition AS CHARACTER FORMAT "X(60)"
      FIELD cEndCode  AS CHARACTER
      FIELD cShotCode AS CHARACTER. 

CREATE tt_data.
ASSIGN
tt_data.cPosition ="S$$$^^^^^^^^^^$$$^^^MC^^^^^^^^^^^^R^^^^^^^^^^^^^^^^^^^^^^^^^"
tt_data.cEndCode =  10
tt_data.cShotCode = "S".

cPos = integer( tt_data.cEndCode / 10 ).

FIND FIRST tt_date WHERE tt_data.cShotCode = SUBSTRING(tt_data.cPosition,cPos,1) NO-LOCK NO-ERROR. 

DISPLAY tt_data.cShotCode. /* Displayed Value is S */
  

Комментарии:

1. Я бы согласился, но рекомендовал заменить FIND FIRST на FOR FIRST , при этом отбросив NO-ERROR в конце. Это создает блок и выполняет DISPLAY инструкцию только в том случае, если запись была успешно найдена, и сохраняет логику обработки ошибок вокруг нее.

2. Я не любитель бессмысленно указывать ПЕРВОЕ место при каждой находке, но по какой-то причине решил придержать язык. ДЛЯ FIRST — это еще одна банка с червями — хотя мне нравится часть о том, что она формирует блок и запускается только при значении true.

3. Будет ли это цикл? потому что значение tt_data.cPosition не всегда одинаково. Это может измениться. Таким образом, мы должны использовать каждую запись из tt_data.cPosition для всех случаев проверки, которые я имею в виду, вплоть до tt_data. Конечный код = 600.