08.1TSO端末との通信(TPUTとTGET)

By 神居 - Posted: 2008/11/26 Last updated: 2009/12/13 - Leave a Comment
印刷用ページの表示 印刷用ページの表示

MVSにおけるアプリケーション・プログラムの基本はバッチ処理ですが、端末と直接会話できるオンライン処理もポピュラーな利用方法です。基幹業務システムに使うプログラムはCICSやIMSなどを使って動かしますが、簡単な処理や非定型なものはTSOが便利です。ここではTSO端末への簡単なI/O方法(送受信処理)を紹介します。MSPとVOS3にも共通な方法です。


QSAMによるTSO端末I/Oプログラム

別のカテゴリー「TSOで動作する簡単なコマンドライン版プログラムの作り方」でも紹介したQSAMによる方法です。SYSPRINTが端末への出力、SYSINが端末からの入力になります。MVSとMSPではこのDD名でLOGONプロシージャーに割り当てられていますからDD名を合わせればそのまま使えます。
サンプルのようにSYSPRINTとSYSINをそれぞれOUTPUTモード、INPUTモードでOPENします。端末へメッセージを送信するにはPUTマクロを、端末からデータを受信するにはGETマクロを発行します。PUTマクロはメッセージの送信がキューイングされれば完了するので、実際にはすぐに戻ってきます。GETマクロは端末でキー入力が行われるまで待ち状態になります。端末で「/*」の2文字が入力されるとEODと見なされ、DCBで指定したEODADルーチンが実行されます。EODADを使わず任意の文字列を入力終了の判定に使ってもかまいません。処理が終了したらSYSPRINTとSYSINをCLOSEします。
サンプルでは簡単にするために固定長レコードを使っていますが、メッセージ領域を節約するならRECFM=VBで可変長レコード形式にしてもかまいません。


TSOプログラミングAPIによるTSO端末I/Oプログラム?

最初のサンプルと同じことをQSAMではなくTSOのプログラミングAPIであるTPUTマクロとTGETマクロに置換えたものです。TSOでのみ動かすプログラムならTPUT,TGETの方がすっきりしますが、QSAMを使えばバッチ、TSO両方でも実行できるメリットがあります。
TPUT/TGETではメッセージ領域のアドレスと長さを指定します。TGETでは実際にメッセージ領域に格納されたデータ長がGR1に返されます。サンプルでは省略していますがTPUTもTGETも復帰コードを返しますので本来ならば正しくチェックすべきです。QSAMと違って/*入力でのEOD処理はされませんから自分で入力データを判定して同様のことを行っています。TPUT/TGETは可変長データの取り扱いになりますが、RECFM=VB指定のQSAMアクセスと異なりRDWを必要としません。


TSOプログラミングAPIによるTSO端末I/Oプログラム?

少しだけ込み入った処理を加えます。プロンプトの「COMMAND READY >>」の直後にデータを入力できるようにして、入力に使ったキーの種類(アテンションID)をエコーするようにしたものです。TPUTマクロでのASISオプションはメッセージを自動改行しないようにします。TGETマクロでのASISオプションは端末からの入力データを制御コード付きのままプログラムに渡します。

TPUTでコマンドプロンプト・メッセージを送った後、ASIS指定のTGETで入力を待ち合わせます。1バイトのみ読み込んでいるのはどのキーでデータを入力したのかを得るためです。ENTERキーであればx7D、PF1?PF9キーであればxF1?xF9、PF10?PF12キーであればx7A?x7Cとなります。次のTGETで入力された文字列を読み込んでいます。エコーするメッセージの先頭には入力に使われたAID文字を表示するようにしています。
/*の入力またはPF3キー押下であれば処理を終了します。CLRの入力またはPF12キー押下であれば画面をクリアーします。画面のクリアーは端末画面(3270)のデータストリーム・制御コードを直接定義して行っています。データストリームの解説はここでは行いませんが、CLRDATAに定義したコードが画面消去用のデータです。(先頭のx27を除く)これをFULLSCRオプションのTPUTで送信します。FULLSCRオプションを使う時はデータストリームの先頭にx27を付加する決まり事になっています。

TPUTおよびTGETはMVSのAPIではなくTSOのAPIです。
マクロの詳細はTSOのプログラミング・マニュアルを参照して下さい。

Posted in .基礎編 • • Top Of Page