Я хотел бы спросить, как переместить число в тексте, например: 01 A PIC X (6) значение «200030», на число, такое как 01 B PIC 9 (6), и я хочу только извлечь первые 4 номера О. В Коболе этот тип перемещения с использованием MOVE запрещен, я использовал ход MOVE A(1:4) в B.
Как переместить число в тексте на число?
Ответы (3)
это не запрещено
вам просто нужно
03 Field-x4 X(4).
03 Field-94 9(4).
Move Field-X4 to Field-94
COBOL предоставляет несколько способов выполнения такого рода заданий. Начните с заявлений, изложенных в вашем вопросе:
01 A PIC X(6) VALUE "200030".
01 B PIC 9(6).
Объявите еще один элемент данных в следующем порядке:
01 AAAABB.
05 AAAA PIC 9(4).
05 BB PIC 9(2).
AAAABB
объявляет структуру записи (составной элемент данных), содержащую два элементарных элемента данных: AAAA
и BB
, оба из которых являются числовыми. Теперь вы можете сделать одно из следующих действий:
MOVE A(1:4) TO B ; DISPLAY B
MOVE A TO AAAABB ; DISPLAY AAAA
DISPLAY BB
Отображаемый вывод будет:
002000
2000
30
Поскольку AAAABB
является составным элементом, он имеет неявный тип данных PIC X
. Это, в свою очередь, позволяет вам присвоить практически любое значение данных, а затем разложить его, обратившись к его отдельным компонентам.
Осторожно, такое задание, как:
MOVE A TO AAAA; DISPLAY AAAA
Обычно это компилируется (с предупреждениями об усечении) и дает следующий результат:
0030
Самые значащие цифры были усечены (вероятно, не то, что вы хотели).
COBOL достаточно гибок в отношении манипулирования данными. Одна вещь, на которую вы должны обратить внимание (защититься), - это присвоение нечисловых значений числовым элементам данных, как в:
MOVE "20++30" TO A
MOVE A TO AAAABB
Это будет "работать" просто отлично, пока вы не попытаетесь сделать что-то вроде:
ADD +1 TO AAAA
Если вам повезет, он взорвется в этот момент (в зависимости от вашего компилятора и реальных нечисловых чисел). Чтобы защититься от этого типа ошибок, вы всегда должны включать логику в соответствии со следующими строками:
MOVE A TO AAAABB
IF (AAAA NOT NUMERIC) OR (BB NOT NUMERIC)
PERFORM BAD-DATA-ASSIGNMENT
END-IF
ADD 1 TO AAAA
Вы можете создавать союзы в COBOL с помощью redefines
. Это по памяти, но я думаю, что это должно работать:
01 YEARMONTH.
03 YM-FULL PIC 9(6).
03 FILLER REDEFINES YM-FULL.
05 YM-YEAR PIC 9(4).
05 YM-MONTH PIC 9(2).
01 JUST-YEAR PIC 9(4).
MOVE 200030 TO YM-FULL.
MOVE YM-YEAR TO JUST-YEAR.