【问题标题】:RPGLE Entry list adding leading spaces to string variableRPGLE 条目列表将前导空格添加到字符串变量
【发布时间】:2018-08-03 14:39:34
【问题描述】:

我正在测试一个将参数从 CL 传递到 SQLRPGLE 的新程序

我一共声明了16个变量,并使用CHGVAR设置值来测试参数的传递。

         PGM

         DCL        VAR(&COMPFR) TYPE(*CHAR) LEN(3)
         DCL        VAR(&COMPTO) TYPE(*CHAR) LEN(3)
         DCL        VAR(&LOCFR) TYPE(*CHAR) LEN(4)
         DCL        VAR(&LOCTO) TYPE(*CHAR) LEN(4)
         DCL        VAR(&CLSTFR) TYPE(*CHAR) LEN(1)
         DCL        VAR(&CLSTTO) TYPE(*CHAR) LEN(1)
         DCL        VAR(&CUSTFR) TYPE(*CHAR) LEN(7)
         DCL        VAR(&CUSTTO) TYPE(*CHAR) LEN(7)
         DCL        VAR(&ITEMFR) TYPE(*CHAR) LEN(20)
         DCL        VAR(&ITEMTO) TYPE(*CHAR) LEN(20)
         DCL        VAR(&CLDTFR) TYPE(*CHAR) LEN(8)
         DCL        VAR(&CLDTTO) TYPE(*CHAR) LEN(8)
         DCL        VAR(&SCDTFR) TYPE(*CHAR) LEN(8)
         DCL        VAR(&SCDTTO) TYPE(*CHAR) LEN(8)
         DCL        VAR(&CMDTFR) TYPE(*CHAR) LEN(8)
         DCL        VAR(&CMDTTO) TYPE(*CHAR) LEN(8)

         CHGVAR     VAR(&COMPFR) VALUE('2')
         CHGVAR     VAR(&COMPTO) VALUE('2')
         CHGVAR     VAR(&LOCFR) VALUE('6')
         CHGVAR     VAR(&LOCTO) VALUE('6')
         CHGVAR     VAR(&CLSTFR) VALUE('0')
         CHGVAR     VAR(&CLSTTO) VALUE('9')
         CHGVAR     VAR(&CUSTFR) VALUE('0000000')
         CHGVAR     VAR(&CUSTTO) VALUE('9999999')
         CHGVAR     VAR(&ITEMFR) VALUE('00000000000000000000')
         CHGVAR     VAR(&ITEMTO) VALUE('99999999999999999999')
         CHGVAR     VAR(&CLDTFR) VALUE('00000000')
         CHGVAR     VAR(&CLDTTO) VALUE('99999999')
         CHGVAR     VAR(&SCDTFR) VALUE('00000000')
         CHGVAR     VAR(&SCDTTO) VALUE('99999999')
         CHGVAR     VAR(&CMDTFR) VALUE('00000000')
         CHGVAR     VAR(&CMDTTO) VALUE('99999999')

         CALL       PGM(JALLIB/SBRNTRPT) +
                     PARM(&COMPFR &COMPTO +
                     &LOCFR &LOCTO &CLSTFR &CLSTTO +
                     &CUSTFR &CUSTTO &ITEMFR &ITEMTO +
                     &CLDTFR &CLDTTO &SCDTFR &SCDTTO +
                     &CMDTFR &CMDTTO)


         ENDPGM

然后我接受我的 RPGLE 中的参数并相应地构建一个 SQL 语句。 下面的片段显示了我如何接受参数

// Qualfied parameters data structure defined

    dcl-ds parmsds qualified;
      compfr char(3);
      compto char(3);
      locfr char(4);
      locto char(4);
      clstfr char(1);
      clstto char(1);
      custfr char(7);
      custto char(7);
      itemfr char(20);
      itemto char(20);
      cldtfr char(8);
      cldtto char(8);
      scdtfr char(8);
      scdtto char(8);
      cmdtfr char(8);
      cmdtto char(8);
    end-ds;

    // Prototype and Interface used to pass parmeters from the CL Program

    dcl-pr sbrntrpt extpgm;
      parms likeds(parmsds);
    end-pr;

    dcl-pi sbrntrpt;
      parms likeds(parmsds);
    end-pi;

但由于某种原因,当我调试并检查参数列表时。一个变量 itemfr 向变量添加两个前导空格,并丢弃该变量后面的其余输入

我已使用 SNDPGMMSG 验证从 CL 发送的值是否准确,但当我接受这个大字符串时出现问题。我什至试图使该字符串长2个字符,但紧随其后的变量ITEMTO添加了10个前导空格。

到目前为止,该程序非常简单,所以我不知道是什么原因造成的。 任何指导将不胜感激

【问题讨论】:

  • 以后不要粘贴图片了。它们无法剪切和粘贴。
  • 已编辑。感谢您的建议

标签: ibm-midrange rpgle


【解决方案1】:

所以你正在做的是将 16 个参数传递给一个程序并接收一个参数。根据 16 个参数在内存中的排列方式,它今天可能工作,明天失败。如果要传递 16 个参数,则确实需要接收 16 个参数。有两种方法可以解决这个问题:1)在 RPG 程序中添加每个字段作为参数,或者 2)将 CL 程序中的字段组合成一个结构。

在RPG中接收多个参数:

dcl-pr sbrntrpt extpgm;
  compfr     Char(3);
  compto     Char(3);
  ...
  cmdtto     Char(8);
end-pr;

dcl-pi sbrntrpt;
  compfr     Char(3);
  compto     Char(3);
  ...
  cmdtto     Char(8);
end-pi;

-或-

从 CLP 传递一个结构

PGM

DCL        VAR(&PARMS)  TYPE(*CHAR) LEN(118)
DCL        VAR(&COMPFR) TYPE(*CHAR) LEN( 3) STG(*DEFINED) DEFVAR(&PARMS   1)
DCL        VAR(&COMPTO) TYPE(*CHAR) LEN( 3) STG(*DEFINED) DEFVAR(&PARMS   4) 
DCL        VAR(&LOCFR)  TYPE(*CHAR) LEN( 4) STG(*DEFINED) DEFVAR(&PARMS   7) 
DCL        VAR(&LOCTO)  TYPE(*CHAR) LEN( 4) STG(*DEFINED) DEFVAR(&PARMS  11) 
DCL        VAR(&CLSTFR) TYPE(*CHAR) LEN( 1) STG(*DEFINED) DEFVAR(&PARMS  15) 
DCL        VAR(&CLSTTO) TYPE(*CHAR) LEN( 1) STG(*DEFINED) DEFVAR(&PARMS  16) 
DCL        VAR(&CUSTFR) TYPE(*CHAR) LEN( 7) STG(*DEFINED) DEFVAR(&PARMS  17) 
DCL        VAR(&CUSTTO) TYPE(*CHAR) LEN( 7) STG(*DEFINED) DEFVAR(&PARMS  24) 
DCL        VAR(&ITEMFR) TYPE(*CHAR) LEN(20) STG(*DEFINED) DEFVAR(&PARMS  31) 
DCL        VAR(&ITEMTO) TYPE(*CHAR) LEN(20) STG(*DEFINED) DEFVAR(&PARMS  51) 
DCL        VAR(&CLDTFR) TYPE(*CHAR) LEN( 8) STG(*DEFINED) DEFVAR(&PARMS  71) 
DCL        VAR(&CLDTTO) TYPE(*CHAR) LEN( 8) STG(*DEFINED) DEFVAR(&PARMS  79) 
DCL        VAR(&SCDTFR) TYPE(*CHAR) LEN( 8) STG(*DEFINED) DEFVAR(&PARMS  87) 
DCL        VAR(&SCDTTO) TYPE(*CHAR) LEN( 8) STG(*DEFINED) DEFVAR(&PARMS  95) 
DCL        VAR(&CMDTFR) TYPE(*CHAR) LEN( 8) STG(*DEFINED) DEFVAR(&PARMS 103)
DCL        VAR(&CMDTTO) TYPE(*CHAR) LEN( 8) STG(*DEFINED) DEFVAR(&PARMS 111)

CHGVAR     VAR(&COMPFR) VALUE('2')
CHGVAR     VAR(&COMPTO) VALUE('2')
CHGVAR     VAR(&LOCFR) VALUE('6')
CHGVAR     VAR(&LOCTO) VALUE('6')
CHGVAR     VAR(&CLSTFR) VALUE('0')
CHGVAR     VAR(&CLSTTO) VALUE('9')
CHGVAR     VAR(&CUSTFR) VALUE('0000000')
CHGVAR     VAR(&CUSTTO) VALUE('9999999')
CHGVAR     VAR(&ITEMFR) VALUE('00000000000000000000')
CHGVAR     VAR(&ITEMTO) VALUE('99999999999999999999')
CHGVAR     VAR(&CLDTFR) VALUE('00000000')
CHGVAR     VAR(&CLDTTO) VALUE('99999999')
CHGVAR     VAR(&SCDTFR) VALUE('00000000')
CHGVAR     VAR(&SCDTTO) VALUE('99999999')
CHGVAR     VAR(&CMDTFR) VALUE('00000000')
CHGVAR     VAR(&CMDTTO) VALUE('99999999')

CALL       PGM(JALLIB/SBRNTRPT) +
            PARM(&PARMS)


ENDPGM

【讨论】:

  • 非常感谢。我总是推动在 RPG 中拥有入口数据结构,以便我可以限定它们。但我忽略了 CL。
  • IMO,单独的参数更好,允许使用 *OMIT 和/或 *NOPASS。 (注意 *NOPASS 不能轻易地从 CL 中使用)
  • *NOPASS 没什么特别的,就是不要通过。 CL 和 RPG 一样有效。
猜你喜欢
  • 2013-12-23
  • 2023-02-04
  • 1970-01-01
  • 2020-08-15
  • 2021-06-08
  • 2013-10-18
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
相关资源
最近更新 更多