Как вывести сообщение об ошибке, если ни одна из записей не совпадает в цикле FOR EACH? - PullRequest
0 голосов
/ 28 марта 2019

Я написал программу для сопоставления одной записи другой записи в FOR каждого цикла, но я не знаю, как выдать сообщение об ошибке, если ни одна из записей не совпадает. Позвольте мне поделиться своими кодами

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.
/*so many records are stored in tt_data and below is one of the records for your understanding*/

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

cPos = integer( tt_data.cEndCode / 10 ).

/* Consider 60 records available in tt_data */
FOR EACH tt_data.

     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 */

IF NOT AVAILABLE tt_date THEN
    MESSAGE "NONE OF THE RECORDS MATCHING WITH tt_data.cPosition "
    LEAVE.
END.

Я могу получить хотя бы одну запись в tt_data. Здесь проблема в том, что я не хочу УХОДИТЬ, если какая-либо одна запись совпадает, но я хочу получить сообщение об ошибке с оператором LEAVE, если ни одна из записей не совпадает. Не могли бы вы помочь этому делу?

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Я думаю, это то, что вы пытаетесь сделать:

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.

/*so many records are stored in tt_data and below is one of the records for your understanding*/

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

cPos = integer( tt_data.cEndCode / 10 ).

/* Consider 60 records available in tt_data */

FOR EACH tt_data:  /* although it 'works', "." is not appropriate, FOR EACH should end with a ":" */

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

    /* changes start here */

    IF AVAILABLE tt_date THEN
      do:
        DISPLAY tt_data.cShotCode. /* Displayed Value is S */ /* only display this when it is available! */
      end.
     else
      do:
        MESSAGE "NONE OF THE RECORDS MATCHING WITH tt_data.cPosition ".  /* a "." was missing */
        /* LEAVE. */ 
      end.

END.
0 голосов
/ 10 июня 2019

Я бы лично попробовал выполнить проверку ошибок, прежде чем вы попадете в блок FOR EACH.Иногда вы не можете, но на основе вашего примера кода, я думаю, вы могли бы сначала изучить временную таблицу и предоставить сообщение об ошибке.Но я не совсем уверен, что вы собираетесь на основе образца.

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.
/*so many records are stored in tt_data and below is one of the records for your understanding*/

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

cPos = integer( tt_data.cEndCode / 10 ).


/* Add check here */
IF can-find( FIRST tt_date WHERE 
                   tt_data.cShotCode = SUBSTRING(tt_data.cPosition,cPos,1 ) )
THEN
  message "ERROR message".

ELSE DO:
  /* Consider 60 records available in tt_data */
  FOR EACH tt_data.
    /* DO thing */
  END.
END.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...