Разделение цифр из упакованного десятичного поля

У меня есть 7-значное десятичное поле в моем файле. Как я могу определить элементы данных, которые будут извлекать / разделять эти 7 цифр?

Например, я хочу, чтобы первые две цифры были в одном элементе данных, а другие - в другом, чтобы я мог ими манипулировать позже.

2 ответа

В некоторых других языках одной из общих черт может быть "деление на кратное 10", конечно же, соответствующее кратное число.

Тем не менее, никогда не рассматривайте это с COBOL. "Разрыв" - это "дорого".

       05  input-packed-decimal 
                            PACKED-DECIMAL PIC 9(7).

Затем:

       05  FILLER 
           REDEFINES input-packed-decimal.
           10  ipd-split-two-and-five
                            PACKED-DECIMAL PIC 99V9(5).

   01  two-digits                          PIC 99.
   01  five-digits                         PIC 9(5).
   01  FILLER
       REDEFINES five-digits.
       05  five-digits-as-decimals         PIC V9(5).

       MOVE ipd-split-two-and-five  TO two-digits
                                       five-digits-as-decimals

Тогда вы можете использовать two-digits а также five-digits за то, что вы хотите.

По-другому:

   01  ws-input-seven                      PIC 9(7).
   01  FILLER 
       REDEFINES ws-input-seven.
       05  two-digits                      PIC 99.
       05  five-digits                     PIC 9(5).

       MOVE input-packed-decimal    TO ws-input-seven

Первый способ также будет работать для подписанных исходных полей (просто поместите S в соответствующем месте в каждом предложении PICture).

Второй не будет работать с подписанными полями, потому что знак источника не будет распространяться на two-digits поле, потому что MOVE даже не знает, что есть такое поле.

Будьте внимательны при переопределении полей PACKED-DECIMAL или BINARY (на мэйнфрейме IBM они также могут иметь ИСПОЛЬЗОВАНИЕ COMP-3 и COMP/COMP-4/COMP-5). Всегда, при определении с одинаковым или похожим ИСПОЛЬЗОВАНИЕМ, определяйте одинаковое количество цифр. Для поля REDEFINES компилятор всегда будет предполагать, что вы знаете, что делаете, поэтому он не будет выполнять для вас никакого "усечения источника". Таким образом, вы должны убедиться, что вы не ожидаете явного или неявного усечения источника, когда используете поля, подчиненные REDEFINES.

Чтобы получить вторую цифру, никогда не делайте этого:

       05  FILLER 
           REDEFINES input-packed-decimal.
           10  ignore-one-use-2nd-next-five
                            PACKED-DECIMAL PIC 9V9(5).

Чтобы получить вторую цифру, используйте PACKED-DECIMAL PIC 99V9(5), как и раньше, но задайте поле приема только с одной позицией цифры. Затем компилятор с радостью сгенерирует код для выполнения ожидаемого усечения.

Если вы "не можете использовать ПЕРЕСЫЛКИ", вам нужно будет создать новое поле в РАБОЧЕМ ХРАНИЛИЩЕ с теми же характеристиками, что и в поле ввода, и использовать его.

Имена данных, которые я здесь использовал, предназначены исключительно для общего объяснения. Используйте хорошие, описательные имена для вашей задачи. Если первые две цифры относятся к типу детали, а последние пять - к номеру детали, убедитесь, что это ясно для вашего наименования.

Не называйте их "Var(n)" или подобными и не называйте их именами, которые вводят в заблуждение.

01 Массив.

03  filler pic x(02) value '00'.

03  filler pic x(02) value '01'.

03  filler pic x(02) value '02'.

и так до тех пор, пока

03  filler pic x(02) value 'FF'.

01 два массива переопределяет массив.

03  harry occurs 256 pic x(02).

91 sub1.

03  filler pic x(01) value low-values.

93  sub1-byte2 pic x(01).

01 sub2 переопределяет sub1 comp.

01 pd pic x (04).

01 паб рис 9 (04).

01 яйцо.

03  eggs1 pic x(01).

03  eggs2 pic x(01).

выполнять различные паб

от 1 до 1

пока паб> 4

move pd(pub:1) to sub1-byte2

move harry(sub2 + 1) to eggs

display eggs1 egg2

конечное выполнение.

Таким образом, массив из 256 2-байтовых полей со значениями от '00' до 'FF'.

шаг через 4-байтовое поле, которое содержит упакованное десятичное поле.

используйте каждый байт в качестве индекса в массиве (добавьте 1, чтобы "00" указывало на первое поле в массиве).

2-байтовое поле, на которое указывают, имеет значения 2 полубайтов, которые представляют этот байт из упакованного десятичного поля.

правый клочок четвертого байта в упакованном десятичном поле - для знака.

Другие вопросы по тегам