I am testing a new program that passes parameters from a CL to an SQLRPGLE
I declare a total of 16 variables and use CHGVAR to just set values to test the passing of parameter.
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
I then accept the parameters in my RPGLE and build an SQL Statement accordingly. Snippet below shows how I accept the parameters
// 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;
But for some reason, when I debug and check the parms list. One variable, itemfr, is adding two leading blanks to the variable and throwing off the rest of input following that variable
I have used SNDPGMMSG to verify that the value sent from the CL is accurate but something is wrong when I accepting this large string. I have even tried to just make that string 2 characters longer but then the variable right after, ITEMTO, gets 10 leading blanks spaces added.
The program is pretty simple so far so I am lost as to what is causing this. Any guidance would be greatly appreciated
So what you are doing is passing 16 parameters to a program and receiving a single parameter. It could work today and fail tomorrow depending on how the 16 parameters are arranged in memory. If you are passing 16 parameters, you really need to receive 16 parameters. There are two ways to solve this 1) add each field as a parameter in the RPG program, or 2) combine the fields in the CL program into a single structure.
Receive multiple parameters in the 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;
-or-
Pass a structure from the 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