Как выдать сообщение об ошибке, если ни одна из записей не совпадает в для КАЖДОГО цикла?

#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.
/*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, если ни одна из записей не совпадает. Не могли бы вы, пожалуйста, помочь в этом случае?

Ответ №1:

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

 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.
  

Ответ №2:

Я бы лично попытался выполнить проверку на ошибку, прежде чем вы когда-либо попадете в 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 ).


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