Using IBM i? Need to create Excel, CSV, HTML, JSON, PDF, SPOOL reports? Learn more about the fastest and least expensive tool for the job: SQL iQuery.
Can someone tell me why this happens? I have a program that receives 4 parms. If I call it from a command line, if it's a character parm, I'm not worrying about specifying the entire length of the parm. However, when I look at it in debug, I could have two or more parm values showing in a single parm field. For example, I'm calling this program from the command line:
call altseqtst ('411' 'test@austin.rr.com' 'Bob' 'Cozzi')
My input parms are defined with the following in the program:
d test pr extpgm('ALTSEQTST')
d pstore 3a
d pemail 50a
d pfname 50a
d plname 50a
d test pi
d pstore 3a
d pemail 50a
d pfname 50a
d plname 50a
Because the email address I entered is shorter than the 50a specified, it appears the first name is being appended to the email parm. I should also say that the field below is what the pemail parm is being copied into for the key list. This is what the field looks like:
> EVAL ademl1
ADEML1 =
....5...10...15...20...25...30...35...40...45...50...55...60
1 'test@austin.rr.com Nancy '
61 ' '
121 ' '
181 ' '
241 ' '
I'm sure someone can explain this. I'm sure if I accounted for all 50 characters when I called the program I would have had this issue, but is there a way of getting around it?
Thanks!
If you're not using a command, you have to pad the Command Line call parameters to 32 characters or you end up with crap in your programs.
Any parm length over 32 needs to be manually padded from a command line. It's a known quirk. Pass 50 blanks and then an X in position 51 to get around it.
'12345678901234567890123456789012345678901234567890x'
RPG handles this just fine if the parm value is defined as 50a long. OS400 just passes a memory address, not the value. So you pass in 51a and RPG only uses 50a of it.
Chris Ringer
"Character string constants of 32 bytes or less are always passed with a length of 32 bytes (padded on the right with blanks). If a character constant is longer than 32 bytes, the entire length of the constant is passed. If the parameter is defined to contain more than 32 bytes, the CALL command must pass a constant containing exactly that number of bytes. Constants longer than 32 characters are not padded to the length expected by the receiving program."
Chris Ringer
I've written small CLPs for testing that do nothing but call another program, with the correct *CHAR lengths. But better yet (Bob already gave you the hint), define a *CMD. When your PARM has TYPE(*CHAR) LEN(50), the command processor ensures that your program receives exactly 50 characters, regardless of the length that is parsed from the command line.
Note that command parsing also applies to SBMJOB CMD(CALL ...). Let's say you're in a CLP or CLLE, and do SBMJOB CMD(CALL PGM(x) PARM(&A)). Even when &A is declared as *CHAR 50, the CLP will truncate trailing blanks from &A when putting it in the parm, and the effective SBMJOB will be CMD(CALL PGM(x) PARM('test@austin_rr.com')). Called program X is still subject to the length and padding rules of the parser. Even if it's just for testing, a *CMD can be a real help.
I kinda' thought that was the case. Chris, I didn't realize that anything 32 or less will be padded with blanks. That's some good info to know. Being as this is just a small test pgm I didn't want to go thru the hassle of having to create a cmd for it so I just put it in debug and padded the parm manually.
Thanks for the input, guys!
Chris