我错过了什么。请有人能告诉我这是如何运作的吗?
let rpt.chgkey = null
select cuschage.chgkey from cuschage where cuschage.cuschnum in
(select shtwrd_no from crbookid where
crbookid.book_no = rpt.book_no and crbookid.line_no <= 3)
let scratch = rpt.chgkey
call make_charge_section(scratch) returning rpt.chgkey
if rpt.chgkey is not null then
print
column 1, ESC, "(s0p12h0s3b4099T", ESC, "&a0.5R"
print
column 70, rpt.chgkey using "<<<<<<<<<"
end if
答案 0 :(得分:2)
嗯...... SELECT语句接近毫无意义。您通常 * 执行SELECT语句以将数据转换为变量,但没有INTO子句将返回的值放入。
鉴于SELECT对rpt.chgkey
不执行任何操作,scratch
中的值为NULL。使用此值(NULL)调用函数make_charge_section
,结果保存在rpt.chgkey
; CALL
相当于:
LET rpt.chgkey = make_charge_section(scratch)
或者你可以没有scratch变量并写:
LET rpt.chgkey = make_charge_section(rpt.chgkey)
(您也可以使用CALL
表示法执行此操作。)
此后,您会向终端显示一些奇怪的控制序列 - 我不会尝试找出哪个终端或它的功能;你确定你不能用I4GL本身达到同样的效果吗?然后显示rpt.chgkey
的新(非空)值。
所以,这里的大未知数是'为什么没有INTO子句写的SELECT语句',以及'当给出NULL值作为输入时make_charge_section()
做什么?
* 没有INTO的SELECT的“异常”使用取决于您检测SQL中的错误。如何发生这取决于你将WHENEVER ERROR设置设置为。