1

私は何かが欠けています。誰かがこれがどのように機能するか教えてください。

 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
4

1 に答える 1

2

うーん...そのSELECT文はほとんど無意味です。*通常は SELECT ステートメントを実行してデータを変数に入れますが、戻り値を入れる INTO 句はありません。

SELECT が に対して何もしないrpt.chgkey場合、 の値scratchは NULL です。関数make_charge_sectionはこの値 (NULL) で呼び出され、結果は に保存されrpt.chgkeyます。これCALLは次と同等です。

LET rpt.chgkey = make_charge_section(scratch)

または、scratch 変数を使用せずに次のように書くこともできます。

LET rpt.chgkey = make_charge_section(rpt.chgkey)

(そして、CALL表記法でもそれを行うことができます)。

その後、奇妙な制御シーケンスを端末に表示します — どの端末が何をするのかを調べるつもりはありません。I4GL自体で同じ効果を達成できないと確信していますか? 次に、 の新しい (null 以外の) 値を表示しますrpt.chgkey

では、ここでの大きな不明点は、「SELECT ステートメントが INTO 句なしで記述される理由」と「make_charge_section()入力として NULL 値を指定するとどうなるか」です。


* INTO を使用しない SELECT の「異常な」使用は、SQL でエラーを検出したかどうかによって異なります。それがどのように発生するかは、WHENEVER ERROR 設定が何に設定されているかによって異なります。

于 2012-08-31T02:08:20.920 に答える