08.1TSO端末との通信(TPUTとTGET)
MVSにおけるアプリケーション・プログラムの基本はバッチ処理ですが、端末と直接会話できるオンライン処理もポピュラーな利用方法です。基幹業務システムに使うプログラムはCICSやIMSなどを使って動かしますが、簡単な処理や非定型なものはTSOが便利です。ここではTSO端末への簡単なI/O方法(送受信処理)を紹介します。MSPとVOS3にも共通な方法です。
QSAMによるTSO端末I/Oプログラム
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- OPEN (SYSPRINT,OUTPUT, OPEN SYSPRINT/SYSIN + SYSIN,INPUT) PUT SYSPRINT,MSG1 PUT MESSAGE-1 LOOP DS 0H PUT SYSPRINT,MSG2 PUT MESSAGE-2(COMMAND PROMPT) GET SYSIN,CMDBUF GET COMMAND FROM SYSIN PUT SYSPRINT,MSG3 ECHO IT B LOOP LOOP UNTIL E.O.D EODAD DS 0H CLOSE (SYSPRINT,,SYSIN) CLOSE SYSPRINT/SYSIN : : : MSG1 DC CL80'TSO COMMAND LINE PROGRAM STARTED.' MSG2 DC CL80'COMMAND READY.' MSG3 DC C'ENTERED COMMAND IS ==>' CMDBUF DC CL80' ' SYSPRINT DCB DDNAME=SYSPRINT, + MACRF=PM,DSORG=PS,RECFM=FB,LRECL=80 SYSIN DCB DDNAME=SYSIN,EODAD=EODAD, + MACRF=GM,DSORG=PS,RECFM=FB,LRECL=80
別のカテゴリー「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プログラム?
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- TPUT MSG1,L'MSG1 PUT MESSAGE-1 LOOP DS 0H TPUT MSG2,L'MSG2 PUT MESSAGE-2(COMMAND PROMPT) TGET CMDBUF,L'CMDBUF GET COMMAND FROM TERMINAL + GR1 <-- CONTAIN INPUT LENGTH SPACE , CLC CMDBUF(2),=CL2'/*' PSEUDO EOD ? BE EODAD YES, DONE SPACE , LA R0,L'MSG3 LOAD MSG3 LENGTH ALR R0,R1 ADD INPUT DATA LENGTH LA R1,MSG3 LOAD MSG3 ADDRESS TPUT (1),(0) ECHO IT B LOOP LOOP UNTIL E.O.D EODAD DS 0H : : : MSG1 DC C'TSO COMMAND LINE PROGRAM STARTED.' MSG2 DC C'COMMAND READY.' MSG3 DC C'ENTERED COMMAND IS ==>' CMDBUF DC CL80' '
最初のサンプルと同じことを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プログラム?
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- TPUT MSG1,L'MSG1 PUT MESSAGE-1 LOOP DS 0H TPUT MSG2,L'MSG2,ASIS PUT MESSAGE-2(COMMAND PROMPT) TGET AIDCHR,1,ASIS GET AID BYTE TGET CMDBUF,L'CMDBUF GET COMMAND FROM TERMINAL + GR1 <-- CONTAIN INPUT LENGTH SPACE , CLI AIDCHR,X'F3' HIT PF3 ? BE EODAD YES, DONE CLC CMDBUF(2),=CL2'/*' PSEUDO EOD ? BE EODAD YES, DONE CLI AIDCHR,X'7C' HIT PF12 ? BE CLRSCRN YES, CLEAR SCREEN CLC CMDBUF(3),=CL3'CLR' CLEAR SCREEN ? BE CLRSCRN YES, CLEAR SCREEN SPACE , LA R0,L'MSG3+1 LOAD MSG3 LENGTH + AID CHAR ALR R0,R1 ADD INPUT DATA LENGTH LA R1,MSG3 LOAD MSG3 ADDRESS TPUT (1),(0) ECHO IT B LOOP LOOP UNTIL E.O.D CLRSCRN DS 0H TPUT CLRDATA,L'CLRDATA, CLEAR TERMINAL SCREEN + FULLSCR B LOOP CLRDATA DC X'27F5C311000013' ERASE SCREEN(3270/6680) + X'27F5838111E0C013' ERASE SCREEN(560/20) EODAD DS 0H : : : MSG1 DC C'TSO COMMAND LINE PROGRAM STARTED.' MSG2 DC C'COMMAND READY >>' MSG3 DC C'ENTERED COMMAND IS ==>' AIDCHR DC CL1' ' CMDBUF DC CL256' '
少しだけ込み入った処理を加えます。プロンプトの「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のプログラミング・マニュアルを参照して下さい。
- z/OS:TSO/E Programming Services
- MSP:TSS/Eコマンド開発手引書
- VOS3:システムプログラマの手引?TSS編?