**free
ctl-opt main(main);
dcl-pr main ExtPgm('TSTPGM');
*n char(10) const options(*trim);
*n char(10) const options(*trim);
end-pr;
dcl-pr ExecCmd Extpgm('QCMDEXC');
Command Char(40);
CmdLen Packed(15:5);
end-pr;
dcl-s str0 Char(100) inz;
dcl-s $RRN Packed(6);
dcl-s Command Char(40);
dcl-s CmdLen Packed(15:5) Inz(%Len(Command));
dcl-proc main;
dcl-pi *n ;
file char(10) const options(*trim);
lib char(10) const options(*trim);
end-pi ;
Command = 'DSPFFD FILE('+lib+'/'+file+') OUTPUT(*OUTFILE) OUTFILE(QTEMP/QADSPFFD)';
Monitor;
ExecCmd (Command: CmdLen);
On-Error;
EndMon;
end-proc main;
我期待 Options(*Trim) 修剪输入参数、文件和库,这样我就不必在构建命令字符串之前使用 %trim :|
此选项使用起来是否非常不可靠,或者可以使用的设置是否有限?
OS 详细信息:我在 TR1 上运行 7.5
见文档
如果参数不是变长参数,修剪后的值 用空格填充(如果指定了 OPTIONS(*RIGHTADJ),则在左侧, 否则在右边)。
正如@nfgl 指出的
options(*TRIM)
只能修剪一个varchar
字段。
固定长度
char
字段始终是它们定义的任何长度,因此如果未填充,则始终存在填充。
此外,鉴于这是 *PGM 源,我要指出,如果您打算从命令行调用 *PGM,只需将参数更改为
varchar
将无法解决问题。 options()
关键字功能实际上是由原型过程的调用者实现的;不是被叫者。
鉴于 IBM i 命令行处理器无法访问 RPG 原型,它不会知道
options(*TRIM)
已指定。
换句话说,
options()
仅在给定 RPG 调用者时才有用,因为 RPG 编译器会生成支持调用者功能所需的代码。
一个完美的例子,你有一个 RPG 过程调用一个 ILE C 过程,它需要一个 C 标准空终止字符串。当您为 C 程序定义 RPG 原型时,您将使用
const options(*TRIM:*STRING)
现在我已经输入了最后一句话,我意识到这是第一句的例外。 :) 当调用 C 程序时,
const options(*TRIM:*STRING)
将用于 char
字段而不是 varchar
字段。 RPG varchar
不能很好地与 C 程序一起玩,因为他们不期望前导 2 或 4 字节长度。