У вас есть двоичная кодированная десятичная (BCD). То есть данные хранятся в двоичном поле, но это десятичное представление, а не двоичное, что важно для значения. X'160101 'в будет 1 442 049. X'160201 'будет 1 442 305. Поэтому, если бы вы могли рассматривать это как двоичное поле (вам нужно было бы добавить двоичный нуль, чтобы сделать его правильной длиной для двоичного поля), вам придется делать глупые вычисления.
Итак, вы делаете что-то другое и проще. BCD не является родным типом данных COBOL. PACKED-DECIMAL (часто такой же, как COMP-3/COMPUTATIONAL-3) является BCD-типом, который включает значение знака в младшем (почти правее) полубайте. Так что не совсем BCD, но вы можете обращаться со своими BCD в упакованном десятичном так:
01 BCD-TO-PACKED.
05 BTP-SOURCE-BCD PIC XXX.
05 BTP-PACKED-ZERO PACKED-DECIMAL PIC 9 VALUE ZERO.
01 FILLER
REDEFINES BCD-TO-PACKED.
05 BTP-PACKED-TO-MOVE
PAKCED-DECIMAL PIC 9(6)V9.
01 DATE-AS-PIC-X PIC X(6).
01 DATA-AS-CHARACTER-NUMERIC
REDEFINES DATE-AS-PIC-X PIC 9(6).
MOVE your-source-value TO BTP-SOURCE-BCD
MOVE BTP-PACKED-TO-MOVE TO DATA-AS-CHARACTER-NUMERIC
После этого можно спокойно ссылаться на DATE-AS-PIC-X, чтобы делать все, что вы хотите с ним.
BCD-TO-PACKED - это четырехбайтовое групповое поле, которое через предложение VALUE и ничем не изменяющееся имеет в последнем случае X'0F '. Это неподписанное упакованное десятичное поле с одной цифрой и значением нуля.
Затем вы делаете X-to-X MOVE для BTP-SOURCE-BCD. BCD-TO-PACKED теперь выглядит так: X'1601010F '. Это отлично подходит для упакованного десятичного поля. Вы можете разделить это на 10, чтобы получить свою дату (ПЕРЕДАЧАЕТ это как PACKED-DECIMAL PIC 9 (7)), но зачем тратить процессор?
Вместо этого в REDEFINES вы определяете одно десятичное место (V9). Когда компилятор генерирует код для ПЕРЕМЕЩЕНИЯ, чтобы в другое числовое поле без десятичных знаков, десятичное (ые) место (ы) источника просто выпадали. Presto! Разделите на 10 без деления.
Примечание. Названия имен выбраны для того, чтобы помочь объяснению. Вы должны сделать свой смысл для данных, а не просто использовать «банальные» имена. «Число символов» называется ИСПОЛЬЗОВАНИЕ DISPLAY в COBOL, это значение по умолчанию, если ИСПОЛЬЗОВАНИЕ не поставляется. Слово ИСПОЛЬЗОВАНИЕ редко используется само по себе. Таким образом, ИСПОЛЬЗОВАНИЕ DISPLAY - это то, что у вас есть, когда есть поле PIC X или PIC 9 без какого-либо другого использования.
Примечание: Вероятно, вы не должны использовать двузначные годы. Вы не сможете иметь дело с датами раньше 2000 года или позже 2199 года. Историческое использование двузначных лет было связано с дорогостоящим дисковым хранилищем и «избыточным объемом данных» (все значения в столетии составляли 19, поэтому зачем хранить значение 19 80 разное время для одной учетной записи). Если вы используете двузначные годы, убедитесь, что есть что-то, что имеет отношение к столетию.
Примечание. Если вы попытаетесь перенести поле PIC X в числовое поле, компилятор предположит, что у вас есть допустимые номера символов в поле, что является одной из причин, по которым ваша первоначальная попытка не удалась.
Спасибо, что это решение работает отлично! – user3127986
@ user3127986 Тогда вы должны принять этот ответ. Вы должны увидеть контур большого тика рядом с ответом, нажмите на него. Лично я бы сделал REDEFINES по-разному, чтобы включить PIC X (может быть FILLER) (сделайте команду REDEFINES группой, затем часть, в которой вы нуждаетесь, затем FILLER), чтобы никто, глядя в будущее, не задавался вопросом, t. Это не будет иметь никакого значения для того, как он работает, он просто спасет кого-то, кто поцарапает голову. Конечно, если бы вы попробовали мои, вы бы нашли, что это работает. Просто другое определение данных. –