RPG Compiler converte o tipo S para o tipo P?
-
26-09-2019 - |
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?
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).