#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.