RPGLE 条目列表将前导空格添加到字符串变量
RPGLE Entry list adding leading spaces to string variable
我正在测试一个将参数从 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 个前导空格。
到目前为止,该程序非常简单,所以我不知道是什么原因造成的。
任何指导将不胜感激
所以你正在做的是将 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
我正在测试一个将参数从 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 个前导空格。
到目前为止,该程序非常简单,所以我不知道是什么原因造成的。 任何指导将不胜感激
所以你正在做的是将 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