我有一个SQLRPGLE程序,用于更新托盘文件以更改给定位置中所有托盘的状态字段,除了用户在提示时输入的(最多)4。
如果用户输入2-4个托盘,它就像一个魅力,但每次用户只输入1个托盘,它返回一个100的sqlcde(没有找到更新的记录。)我调试了代码并实际复制了在SQL shell中粘贴(更改变量)仍然可以在程序外部工作,但不在内部。
在下面的代码中,当1个托盘在2时进入p2时P1为真,依此类推......
if (Error=*off);
strline=%char(XLINE);
select;
when p4=true;
exec sql
update plt set ptstat='0'
where ptloc=:strLINE and
ptplt not in (:xpal1, :xpal2, :xpal3, :Xpal4);
if sqlcod<>0;
msgnbr='SQL0001';
exsr MSG;
leave;
endif;
when p3=true;
exec sql
update plt set ptstat='0'
where ptloc=:strLINE and
ptplt not in (:xpal1, :xpal2, :xpal3);
if sqlcod<>0;
msgnbr='SQL0001';
exsr MSG;
leave;
endif;
when p2=true;
exec sql
update plt set ptstat='0'
where ptloc=:strLINE and
ptplt not in (:xpal1, :xpal2);
if sqlcod<>0;
msgnbr='SQL0001';
exsr MSG;
leave;
endif;
when p1=true;
exec sql
update plt set ptstat='0'
where ptloc=:strLINE and
ptplt not in (:xpal1);
if sqlcod<>0;
msgnbr='SQL0001';
exsr MSG;
leave;
endif;
other;
ENDSL;
有什么想法吗?
我忘了提....原来1托盘的代码是:
when p1=true;
exec sql
update plt set ptstat='0'
where ptloc=:strLINE and
ptplt<>:xpal1;
if sqlcod<>0;
msgnbr='SQL0001';
exsr MSG;
leave;
endif;
但是没有用,所以我把它改成了第一个试图让它尽可能与工作代码相似的例子。
答案 0 :(得分:3)
如何简化代码以便不需要四个不同的UPDATE语句?
如果用户未提供所有四个值,请将第一个值复制到其他空字段中。现在你可以说
ptplt not in (:xpal1, :xpal2, :xpal3, :Xpal4);
无论变量中的任何变量是否具有相同的值,都应该得到正确的结果。
答案 1 :(得分:0)
此代码有效:
D mycnt s 10i 0 inz( 0 )
D myName s 10a inz( 'ACCP' )
/free
*inlr = *on ;
EXEC SQL Select count(*) into :mycnt
from ACCPTH where APFILE in(:myName) ;
if SQLCODE = +100 and SQLSTATE = '02000' ;
dsply 'None 1' ;
endif ;
if SQLERRD(3) > 0 ;
dsply 'None 2' ;
endif ;
if mycnt > 0 ;
dsply 'Found some' ;
endif ;
return ;
/end-free
ACCPTH测试文件是通过对已有文件名为“ACCP”的库运行DSPFD TYPE(* ACCPTH)而创建的。调试显示mycnt在IF语句测试它时具有正确的计数。
如果重复执行EXEC SQL和IF测试部分并为附加代码块添加第二个myName2变量,它将继续正常工作(对我而言)。 myName2变量将具有第二个文件名(或不存在的名称;无关紧要)。
需要有关您的代码的其他详细信息,以便猜测它为什么不适合您。