Unstring действительно не работает таким образом.Unstring будет работать, если вы знаете имена полей того, в что вы хотите удалить строку.В основном то, что происходит в вашем коде, это то, что вы запускаете unstring 3 раза, и, поскольку "hello" - это первое, что в unstring, он не натягивается 3 раза.Если вы хотите сделать что-то масштабируемое в массиве, вам нужно было бы кодировать цикл следующим образом:
01 WS-UNSTRING-FIELDS.
05 WS-INPUT PIC X(1000).
05 WS-SUB PIC 9(4) COMP.
05 WS-START PIC 9(4) COMP VALUE 1.
05 WS-INDEX PIC 9(4) COMP VALUE 0.
05 WS-ARRAY OCCURS 0 TO 9999 DEPENDING ON WS-INDEX.
PERFORM VARYING WS-SUB
FROM 1 BY 1
UNTIL WS-SUB > FUNCTION LENGTH(WS-INPUT)
IF WS-INPUT(WS-SUB:1) = ";"
ADD 1 TO WS-INDEX
MOVE WS-INPUT(WS-START:WS-SUB - 1)
TO WS-ARRAY(WS-INDEX)
COMPUTE
WS-START = WS-SUB + 1
END-COMPUTE
END-IF
END-PERFORM
У меня не было времени, чтобы проверить это и убедиться, что он работает на 100%, но вы бынужно что-то в этом роде.Во всяком случае, я бы не использовал здесь unstring.
Unstring прекрасно работает, когда вы точно знаете, сколько полей вводите. Как, например, предположим, у вас есть общая программа, которая взаимодействует с сериями MQ.В качестве входных данных для этой программы вы можете передать строку, содержащую инструкции, например,
QueueName/Action
, которые затем вы можете использовать в этом контексте в качестве строки для разделения на 2 поля:
UNSTRING WS-INPUT DELIMITED BY "/"
INTO WS-Q-NAME
WS-ACTION
END-UNSTRING
Позволяетскажем, что здесь ввод был:
THIS_IS_MY_QUEUE/DELETE
WS-Q-NAME будет иметь THIS_IS_MY_QUEUE_NAME, а WS-ACTION будет иметь DELETE