INITIALIZE дает значение мусора для переменных PIC X и PIC S9 COMP - PullRequest
3 голосов
/ 12 марта 2019

При инициализации следующих переменных:

01  BATCH-REC.
       03  BATCH-VERSION             PIC X(2).
       03  BATCH-FIELDS              PIC X(682).
       03  BATCH-REC-01 REDEFINES BATCH-FIELDS.
           05  B01-OH-DTL-REC.
               07  B01-PE-ID         PIC X(12).
               07  B01-PMT-DISC-TERMS PIC S9(4) COMP.
               07  B01-PMT-DISC-AMT  PIC S9(18) COMP.

с использованием команды

INITIALIZE BATCH-REC.

переменные B01-PMT-DISC-TERMS инициализируются значением +08224, а B01-PMT-DISC-AMT инициализируются значением +314885530818453536,В чем может быть причина?Было бы хорошей идеей, чтобы переместить пустое пространство для этих переменных после инициализации?Я не хочу изменять этот код BATCH-REC, чтобы добавить к ним значение по умолчанию.

Ответы [ 2 ]

7 голосов
/ 12 марта 2019

Оператор INITIALIZE не будет инициализировать переопределенные поля. Если вы хотите, чтобы переопределенные поля были инициализированы, вы должны идентифицировать их каким-либо образом. Например,

INITIALIZE BATCH-VERSION BATCH-REC-01

Это инициализирует элементарные поля в SPACES или ZEROS в зависимости от их PICTURE. BATCH-FIELDS не будет инициализирован.


В этом случае применяется пункт 3 ниже. От стандарта 2002 года для INITIALIZE:

5) Принимающий операнд в каждом неявном операторе MOVE или SET определяется путем применения следующих шагов по порядку:

a) Во-первых, следующие элементы данных исключаются в качестве операндов-получателей:

  1. Любые идентификаторы, которые не являются допустимыми получающими операндами оператора MOVE, за исключением элементов данных указателя данных категории, ссылки на объект или указателя программы.
  2. Если фраза FILLER не указана, это элементарные элементы данных с явным или неявным предложением FILLER.
  3. Любой элементарный элемент данных, подчиненный идентификатору-1, чья запись описания данных содержит предложение REDEFINES или RENAMES, или подчиняется элементу данных, запись описания которого содержит предложение REDEFINES. Однако идентификатор-1 может сам содержать предложение REDEFINES или подчиняться элементу данных с предложением REDEFINES.
5 голосов
/ 12 марта 2019

В этом случае, я думаю, вы обнаружите, что ваш оператор INITIALIZE инициализировал ваши данные PIC X пробелами.Значение, которое вы имеете для B01-PMT-DISC-TERMS, равно x'2020 ', а значение для B01-PMT-DISC-AMT равно x'2020202020202020' с отсечкой первой цифры, возможно, из-за сообщения об ограничении значенияпункт с изображением из 18 цифр.

Несмотря ни на что, я согласен с @RickSmith и считаю, что он прав в своем решении вашей проблемы.

...