Кто может сказать мне, что не так с этим массивом RPGLE?
У вас есть файл принтера, который выглядит примерно так:
Customer-data Units01 Units02 ....... Units11
-------------------------------------------------------------
Name/address/zip/.... Count01 Count02 ....... Count11
Name/address/zip/.... Count01 Count02 ....... Count11
: : : : : : : :
Name/address/zip/.... Count01 Count02 ....... Count11
------- ------- ------- -------
Totals Total01 Total02 ....... Total11
Поля Units, Count и Total отображаются в структуры данных с наложением определения массива, например:
0014.00 D UNITSDS DS
0015.00 D UNITS01
0016.00 D UNITS02
: : :
0024.00 D UNITS10
0025.00 D UNITS11
0026.00 D UNITSAR LIKE(UNITS) DIM(11)
0026.00 D OVERLAY(UNITSDS)
: D*-------------------------------------------------------
0034.00 D COUNTDS DS
0035.00 D COUNT01
0036.00 D COUNT02
: : :
0044.00 D COUNT10
0045.00 D COUNT11
0046.00 D COUNTAR LIKE(COUNT) DIM(11)
0046.00 D OVERLAY(COUNTDS)
: D*-------------------------------------------------------
0054.00 D TOTALDS DS
0055.00 D TOTAL01
0056.00 D TOTAL02
: : :
0064.00 D TOTAL10
0065.00 D TOTAL11
0066.00 D TOTALAR LIKE(TOTAL) DIM(11)
0066.00 D OVERLAY(TOTALDS)
Когда после некоторой обработки я обрабатываю ЗАПИСЬ в строке сведений в файле принтера, я получаю "Ошибка десятичных данных".
Я был очень удивлен, что кажется, что массивы COUNTAR и TOTALAR имеют тип данных "Packed", хотя все ранее определенные переменные COUNT, COUNTnn, TOTAL и TOTALnn являются "Zoned", а структуры данных COUNTDS и TOTALDS - "Char".
Упакованные данные были сопоставлены в выходном буфере для файла принтера, что вызвало "Ошибка десятичных данных".
Почему эти массивы внезапно оказываются в "упакованном" формате данных?
2 ответа
Я бы код это
0014.00 D UNITSDS DS
0015.00 D UNITS01
0016.00 D UNITS02
: : :
0024.00 D UNITS10
0025.00 D UNITS11
0026.00 D UNITSAR LIKE(UNITS01) DIM(11)
0026.00 D OVERLAY(UNITSDS)
: D*-------------------------------------------------------
0034.00 D COUNTDS DS
0035.00 D COUNT01
0036.00 D COUNT02
: : :
0044.00 D COUNT10
0045.00 D COUNT11
0046.00 D COUNTAR LIKE(COUNT01) DIM(11)
0046.00 D OVERLAY(COUNTDS)
: D*-------------------------------------------------------
0054.00 D TOTALDS DS
0055.00 D TOTAL01
0056.00 D TOTAL02
: : :
0064.00 D TOTAL10
0065.00 D TOTAL11
0066.00 D TOTALAR LIKE(TOTAL01) DIM(11)
0066.00 D OVERLAY(TOTALDS)
Все структуры данных всегда символьные, поскольку в RPG нет типа данных BYTE.
Похоже, вы не определяете здесь подполя, поэтому они должны подбирать там размер и тип из другого места. Скорее всего, файл принтера. Возможно, файл принтера изменился?
Я подозреваю, что это не зонированная и не упакованная проблема. Но нужно было бы увидеть остальные определения и перекрестную ссылку из списка компиляции, чтобы действительно знать, что происходит.
Вместо этого это, вероятно, связано с тем, что DS не инициализирован.
Из руководства
Когда параметр INZ не указан:
- Статические автономные поля и подполя инициализированных структур данных инициализируются их начальными значениями RPG по умолчанию (например, пробелы для символа, 0 для числа).
- Подполя неинициализированных структур данных (INZ, не указанные в спецификации определения для структуры данных) инициализируются пробелами (независимо от их типа данных).
Так как у вас нет INZ
ключевые слова в вашем DS, они считаются неинициализированными, и все подполя вашего DS установлены как пустые. Какие или конечно не действительные числа.
Если отчет обычно работает нормально и печатает данные во всех 11 столбцах. Вы можете увидеть ошибку сейчас, если вы пытаетесь запустить отчет таким образом, что загружаются не все 11 подполей; таким образом оставляя некоторые с пробелами. Когда система пытается переместить данные в выходной буфер файла принтера, вы получаете десятичную ошибку данных.
Короче говоря, добавьте INZ
Ключевое слово для вашего DS.
D COUNTDS DS INZ