Разделение цифр из упакованного десятичного поля
У меня есть 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 полубайтов, которые представляют этот байт из упакованного десятичного поля.
правый клочок четвертого байта в упакованном десятичном поле - для знака.