Как переместить число в тексте в число? - PullRequest
0 голосов
/ 14 марта 2011

Я хотел бы спросить, как переместить число в тексте, например: 01 A PIC X (6), значение "200030", в число, такое как 01 B PIC 9 (6), и я хочу извлечь только первое 4 числа А. В Коболе этот тип движения с использованием ДВИЖЕНИЯ запрещен, ход, который я использовал, - ДВИЖЕНИЕ А (1: 4) в Б.

Ответы [ 3 ]

3 голосов
/ 14 марта 2011

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  
3 голосов
/ 14 марта 2011

Это не запрещено

вам просто нужно

03  Field-x4              X(4).
03  Field-94              9(4).




  Move Field-X4            to Field-94
1 голос
/ 14 марта 2011

Вы можете создавать союзы в 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.
...