Pergunta

Aqui está a minha situação: eu tenho o programa A, que se parece com o seguinte:

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

O DHSEQN é um campo de 2,0 s.

A listagem de compilação me mostra isso:

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

E quando eu ligo para o programa A com um parâmetro que foi declarado como 2,0 s, recebo um erro de dados decimal.

Isso é esperado, ou é um bug do compilador?

Foi útil?

Solução

O compilador RPG (mesmo antes de ILE) converte campos de banco de dados em embalados. Às vezes, você descobrirá que não, por exemplo, um campo de arquivo zonado permanecerá zoneado se você o usar em uma estrutura de dados, mas todo campo zonado do mesmo arquivo que você não ficará embalado.

Se você realmente precisa gostar de um campo de arquivo, defina uma estrutura de dados dummy para mantê -la zoneada.

Melhor ainda, se o seu parâmetro de entrada não for modificado, defina -o no protótipo do programa com a palavra -chave const e o tipo será convertido automaticamente, mesmo aceitando expressões e constantes!

Aqui está realmente um bom artigo sobre o uso de protótipos const em procedimentos e conversão automática.

Outras dicas

O 'S' na definição de Grue não se refere ao tipo de dados, mas o define como um campo 'independente'. O tipo de dados para GRUE é especificado como (DHSEQN) que sua listagem de compilação mostra como P (2,0).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top