如何仅根据值执行一次 PERFORM 语句

How to executed a PERFORM statement depending on value only once

我遇到以下问题,找不到合适的解决方案。

我有一个数据集(数千行),其中一列具有不同的值('MO' 或 'BO')。 现在我想遍历所有行并检查是否可以在 table/array 中找到该列中的值,该值将填充从之前的步骤中提取的值。 如果该值已添加到 table,则不得执行进一步的步骤。

我想实现只触发一次PERFORM。

现在我的问题是“NOT”条件始终为假,虽然 SHORTCODE 中的值已经添加到 WS-CODE 中,但它仍然被添加。 我唯一想要的就是为我的 table.

添加独特的值

这是我目前得到的:

01 WS-TABLE
  05 WS-CODE PIC X(4) OCCURS 100 TIMES INDEXED BY I.
  05 WS-ANZ  PIC 9(8)
  05 SW-SUBPROD  PIC X(1).
    88 CODE-FOUND VALUE '0'.
    88 CODE-NOTF VALUE '1'.
  01 COLUMN-VALUE PIC X(4).

MOVE COLUMN-VALUE TO SHORTCODE
SET I TO 1

SEARCH CODE
     WHEN SHORTCODE NOT = WS-CODE(I)
          MOVE SHORTCODE TO WS-CODE(ANZ)
          ADD 1 TO ANZ   
          SET CODE-NOTF TO TRUE
END-SEARCH

IF CODE-NOTF  
   PERFORM DO-SOME-TASK
END-IF

示例数据为(数据集):

0101459 MO
0101460 MO
0104610 BO

从提供的代码中的一些提示来看,您似乎只想将 unique 值添加到 table 和 PERFORM DO-SOME-TASK 中,仅当一个值被添加到 table。下面代码中的 SEARCH 语句确定值是否存在于 table 中。以下 IF 语句在 SEARCH 未找到该值时添加该值。添加值后,执行PERFORM语句。

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-CODE PIC X(4) VALUE SPACES
           OCCURS 100 TIMES INDEXED BY I.
      05 WS-ANZ  PIC 9(8) VALUE 0.
      05 SW-SUBPROD  PIC X(1) VALUE '1'.
        88 CODE-FOUND VALUE '0'.
        88 CODE-NOTF VALUE '1'.
   01 COLUMN-VALUE PIC X(4).
   01 SHORTCODE PIC X(4).

   PROCEDURE DIVISION.
       MOVE "MO" TO COLUMN-VALUE
       PERFORM DO-LOOKUP
       MOVE "MO" TO COLUMN-VALUE
       PERFORM DO-LOOKUP
       MOVE "BO" TO COLUMN-VALUE
       PERFORM DO-LOOKUP
       STOP RUN
       .

   DO-LOOKUP.
       MOVE COLUMN-VALUE TO SHORTCODE
       SET I TO 1

       SEARCH WS-CODE
           AT END
               SET CODE-NOTF TO TRUE
           WHEN WS-CODE (I) = SHORTCODE
               SET CODE-FOUND TO TRUE
       END-SEARCH

       IF CODE-NOTF
           ADD 1 TO WS-ANZ
           MOVE SHORTCODE TO WS-CODE (WS-ANZ)
           PERFORM DO-SOME-TASK
       END-IF
       .

   DO-SOME-TASK.
       CONTINUE
       .