下面是一个基本上创建参考号的PB函数脚本。此脚本在生产环境中工作,但有时字符串变量(ls_ivno)返回一个空值,我怀疑在此过程中会发生死锁。
寻求帮助以追踪此脚本中可能存在的问题。
String ls_branch, ls_gcode1, ls_ivprint, ls_ivno, ls_keyname
long ll_kcount
Select remarks11, remarks12, remarks13
Into :ls_branch, :ls_gcode1, :ls_ivprint
From ordersext
Where orderkey = :arg_orderkey;
ls_branch = trim(ls_branch)
ls_gcode1 = trim(ls_gcode1)
ls_ivprint = trim(ls_ivprint)
choose case ls_ivprint
case 'SIV' //format1
ls_ivno = ls_branch + right(string(today(),"YY"),1) + "U" + ls_gcode1
case 'IIV' //format2
ls_ivno = ls_branch + "Q" + string(today(),"YY")
case else //blank
ls_ivno = ' '
end choose
if ls_ivno <> ' ' then
if ls_ivprint = 'SIV' THEN
declare ncounter_invprn cursor for
select keyname, keycount
from ncounter
where filler01 = 'invprn'
order by keyname;
open ncounter_invprn;
fetch ncounter_invprn into :ls_keyname, :ll_kcount;
do while sqlca.sqlcode = 0
setpointer(hourglass!)
if ll_kcount <> 9999 then
ls_ivno += right(trim(ls_keyname),1) + f_get_ncounter(ls_keyname, 4)
close ncounter_invprn;
end if
fetch ncounter_invprn into :ls_keyname, :ll_kcount;
loop
close ncounter_invprn ;
ELSE //IIV
declare ncounter_invprn_iiv cursor for
select keyname, keycount
from ncounter
where filler01 = 'invprn_iiv'
order by keyname;
open ncounter_invprn_iiv;
fetch ncounter_invprn_iiv into :ls_keyname, :ll_kcount;
do while sqlca.sqlcode = 0
setpointer(hourglass!)
if ll_kcount <> 9999 then
ls_ivno += right(trim(ls_keyname),1) + f_get_ncounter(ls_keyname, 4)
close ncounter_invprn_iiv;
end if
fetch ncounter_invprn_iiv into :ls_keyname, :ll_kcount;
loop
close ncounter_invprn_iiv;
END IF
end if
return ls_ivno
答案 0 :(得分:0)
他返回的字符串实际上是空的,或者是你在“你选择你的盒子ls_ivprint”期间放入ls_ivno的单个空格的字符串。
数据库中remarks13对于空回行的行是什么值?
您可以在查询结尾处添加“with ur”。这可以防止您进行表锁定。 但问题似乎不在这里,如果表被锁定,你不能超越查询。在这种情况下,您的申请只是冻结。
答案 1 :(得分:0)
您应该尝试使用isnull(ls_ivno)
检查值是否为空而不是空。
空值表示您从数据库中选择的值获得空值。
请注意,如果任何术语为null,则null将始终覆盖赋值或连接。如果任何参数为空且未使用if
正确处理,则isnull()
测试将始终失败。在某种程度上,null
值具有传染性。