如何仅根据值执行一次 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
.
我遇到以下问题,找不到合适的解决方案。
我有一个数据集(数千行),其中一列具有不同的值('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
.