AS400/IBMi DDSのCAとCFの違いを超わかりやすく

IT関連

本記事は私の備忘録なので間違いがあればご容赦ください。

 

今回は、DDSに指定するCAとCAの違いについてです。

 

結論から言うと、指定したファンクションキーを押した後、画面にある入力値を

  • プログラム側に渡すのがCF
  • プログラム側に渡さないのがCA

です。

ちょっとない言ってるかわからない・・・ですよね。

わかりやすくご説明します。

 

プログラム例

こういうプログラムがあったとします。

F3を打鍵すれば終了、F5を打鍵すれば更新、実行キー打鍵でループを経てEXFMTに戻る。

古来よりIBMiに伝わるよくあるプログラムだと思います。

DOUEQ 条件
  EXFMT FMT01
  IF *IN03 = *ON
    EXSR @END
  ENDIF
  IF *IN05 = *ON
    EXSR @UPDAT
  ENDIF
ENDDO

 

このプログラム、WORKと言う名前の入出力フィールドが1つだけ存在するとして下さい。

 

そこに入力した文字を、F5更新することによって@UPDATサブルーチンの先でデータベースを直すという段取りです。

 

このプログラムに1行だけ追加します。7行目に挿入したWORK変数の内容を表示するDSPLY命令です。

DOUEQ 条件
  EXFMT FMT01
  IF *IN03 = *ON
    EXSR @END
  ENDIF
  IF *IN05 = *ON
    DSPLY WORK
    EXSR @UPDAT
  ENDIF
ENDDO

 

プログラムを起動して下記の操作をやってみます。

  1. WORKにAAAと文字を入力する
  2. F5を打鍵する

こうですね。ここでF5キーを打鍵です。

 

DDSのFMT01に指定した*IN05がCF05だった場合、DSPLYにはAAAが表示されます。

WORKという変数の中身が表示されたということです。

これは当たり前ですよね。

 

でも、DDSのFMT01に指定した*IN05がCA05だった場合、DSPLYには何も表示されません。

WORKという変数に何も入っていなかかったということです。

ゆえにその直下にある@UPDATでデータベースに書き込まれることもありません。

 

これがCAとCFの違いです。

入力した値がプログラム側に渡っていないということです。

 

プログラム自体としてはバグになります。

ユーザーはきちんとAAAと打鍵したわけですから、正しく反映されないのはおかしいです。

 

ただし、CAでも正しく反映されるパターンがあります。

 

それが、

  1. WORKにAAAと文字を入力する
  2. 実行キーを打鍵する
  3. F5を打鍵する

の場合です。

 

違いは実行キーの有無ですが、ループを経て辿り着くEXFMTがキモです。

 

プログラムを止めてユーザーにコントロールを渡すことで有名なEXFMTには、実は別の機能があります。

それが画面に入力した文字をプログラム側に渡すという機能です。

 

実は、WORKという入出力フィールドに打ち込んだ文字は、打ち込んだだけでは画面表示されているタダの文字。

絵にかいた餅なのです。

だからプログラムでDSPLY命令をかけて変数の中を見ようとしても「何も来てません(*´Д`)」になるのです。

 

それをEXFMTという命令で読んでいるのです。

EXFMTはREADとWRITEという命令の合わせ技なので、READで読み取っているということです。

 

といっても、実行キーを押さなければ入力した値が生きないのなら結局はバグになります。

ちゃんとCFで指定してあげて下さい。

 

結論

ゆえにファンクションキーを押したあと

  • 終了するならCA
  • 同一プログラム内で入力値を使うならCF

ということでいいと思います。

 

記事は以上になります。

コメント

タイトルとURLをコピーしました