Может кто-нибудь объяснить, почему ошибка десятичных данных происходит с% char ()? - PullRequest
1 голос
/ 02 марта 2020

Для начала я не ищу просто решение, чтобы исправить это сообщение об ошибке. Я был бы гораздо более признателен, если бы обратился к документации, объясняющей эту ошибку, чем к решению проблемы с кодом. Мне нужно понять, ПОЧЕМУ это происходит, потому что я не могу найти документацию, которая объясняет, что является причиной этой ошибки. Я относительно новичок в RPG (менее 2 лет), поэтому нахожусь на разумном уровне незнания этого.

Я работаю над некоторым устаревшим кодом RPG, который был перекомпилирован в октябре 2017 года. Этот код существует с 2013 года.

Моя проблема в том, что мои пользователи недавно (в течение последних 3-4 месяцев) начали получать десятичные ошибки данных, сообщаемые в этой строке кода:

C                   EvalR     NewValueA = %char(NewValue)

Дампы из сообщения об ошибке показывают, что NewValue пусто. Не 0, просто пусто. По моему опыту с другими языками, это NULL. Ни один из моих ресурсов (включая Google) не дает никаких указаний на то, как NULL обрабатывается% char () в RPGLE. Было бы легко предположить , что% char () не обрабатывает NULL изящно и движется дальше, но это трудно оправдать в обзоре кода.

NewValue определяется как десятичное число 7 0 , NewValueA - это символ из 8 символов.

Заранее благодарим всех, кто может предложить полезные комментарии.

Ответы [ 2 ]

4 голосов
/ 02 марта 2020

Текущая версия RPG не полностью поддерживает NULL.

В частности, автономная переменная не может быть NULL. Только переменные, которые происходят прямо или косвенно (через LIKE, LIKEDS или LIKEREC) во внешне описанном файле (таблице) и которые определены в этом файле для разрешения NULL, могут быть NULL в программе RPG; и даже это требует, чтобы программа была скомпилирована с опцией ALWNULL (* USRCTL). См. Поддержка нулевого значения базы данных

Хотя эта поддержка была доступна в течение длительного времени (начало ILE?), Большинство устаревших файлов и связанный код RPG не используют NULL.

Так что NewValue вряд ли будет пустым (NULL).
Какое шестнадцатеричное значение вы видите в отладке?

Как упоминается в ответе jtaylor, большинство ошибок десятичных данных происходит из-за того, что неверные данные записываются в устаревшие файлы, определенные в DDS. Однако в этом случае ошибка будет выдана при чтении файла, а не в указанной строке. (Если файл не читается непосредственно в структуру данных.)

Где определено NewValue? Как это получить значение?

Для программной переменной наиболее вероятной причиной десятичной ошибки данных является то, что переменная цифра c находится в структуре данных, в которой не указано ключевое слово INZ. В этом случае структура данных инициализируется для всех пробелов.

0 голосов
/ 02 марта 2020

Я полагаю, что NewValue читается из устаревшей PF (т.е. DDS), которая допускает фиктивные значения в этом столбце. Эти PF позволяют записывать фиктивные данные, но терпят неудачу, когда вы читаете их и пытаетесь их использовать. С другой стороны, таблицы, определенные DDL, будут давать ошибку при записи.

...