Как переместить число в тексте на число?

Я хотел бы спросить, как переместить число в тексте, например: 01 A PIC X (6) значение «200030», на число, такое как 01 B PIC 9 (6), и я хочу только извлечь первые 4 номера О. В Коболе этот тип перемещения с использованием MOVE запрещен, я использовал ход MOVE A(1:4) в B.


person lamwaiman1988    schedule 14.03.2011    source источник
comment
Я обновил кейс, этот кейс запрещен? У меня ошибка.   -  person lamwaiman1988    schedule 14.03.2011


Ответы (3)


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

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

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




  Move Field-X4            to Field-94
person Bruce Martin    schedule 14.03.2011
comment
Спасибо......мой ход не запрещен.....Я только что получил ошибку в другом месте моей программы... - person lamwaiman1988; 14.03.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  
person NealB    schedule 14.03.2011
comment
Что касается примера с AAAABB, вы сказали, что это неявно текст, так можем ли мы делать математические вещи с AAAA и BB? - person lamwaiman1988; 15.03.2011
comment
Правильно, составной элемент нетипизирован (неявно текст), но элементы нижнего уровня явно являются PIC 9 (числовыми). Обратите внимание, что это работает только потому, что эти числовые элементы НЕ были объявлены как упакованные десятичные (например, PIC S9(4) PACKED-DECIMAL) или двоичные (например, PIC S9(4) BINARY). COBOL, как и большинство языков программирования, поддерживает несколько типов числовых данных. - person NealB; 15.03.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.
person paxdiablo    schedule 14.03.2011
comment
Однажды я видел, как какая-то программа делает это таким образом... ужасно... Спасибо. - person lamwaiman1988; 14.03.2011
comment
@gunbuster, всегда рад предоставить ужасные ответы на вопросы людей :-) - person paxdiablo; 14.03.2011
comment
Мне кажется, все в порядке. Интересно, что считалось ужасным? - person Bill Woodger; 29.01.2013