RPG компилятор преобразует тип S в тип P? - PullRequest
3 голосов
/ 11 июня 2010

Вот моя ситуация: У меня есть программа А, которая выглядит так:

Fmfile     IF   E           K DISK    USROPN
d grue            s                   like(dhseqn)
d
C     *ENTRY        PLIST
C                   PARM                    grue
c                   open      mfile
c*** do something with grue
c                   close     mfile
c                   eval      *inlr = *on

dhseqn - поле 2,0 S.

Список компиляции показывает мне это:

 *RNF7031 DHSEQN            P(2,0)                 000200     1000002D
          GRUE              P(2,0)                 000200D     000500M     000700      000800M
                            BASED(_QRNL_PRM+)

И когда я вызываю программу A с параметром, который был объявлен как 2,0 S, я получаю десятичную ошибку данных.

Ожидается ли это, или это ошибка компилятора?

Ответы [ 2 ]

5 голосов
/ 12 июня 2010

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

Если вам действительно нужно Like из файлового поля, определите фиктивную структуру данных, чтобы она оставалась зонированной.

Еще лучше, если ваш входной параметр не изменен, определите его в прототипе программы с ключевым словом Const итип будет преобразован автоматически, даже принимая выражения и константы!

Вот действительно хорошая статья об использовании Const для прототипов процедур и автоматического преобразования.

0 голосов
/ 01 июля 2010

«s» в определении grue не относится к типу данных, а скорее определяет его как «автономное» поле. Тип данных для grue указан как LIKE (dhseqn), который в вашем списке компиляции отображается как P (2,0).

...