7.42.3 EXCHANGEによるRPG/COBOLから交換リストへのアクセス
システム定義データ・エリアDC@A01のフラグ・フィールドは、交換機能を要求するよう設定されている必要があります。『LANSA/ADユーザーガイド』の「システム定義データ域 DC@A01」を参照してください。
通常、交換リストは、LANSAプロセスおよびファンクション間で情報を交換する目的にのみ使用されますが、RPG/COBOLなどのプログラムからLANSAアプリケーションを呼び出したり、LANSAアプリケーションからRPG/COBOLなどのプログラムを呼び出して、交換リストにアクセスすることもできます。
この機能は、実際には、LANSAに付属のM@EXCHLというプログラムによって提供されます。RPG/COBOLなどのプログラムは、M@EXCHLを呼び出すことにより、LANSAプロセスおよびファンクションと同様に、情報を交換リストに配置したり、交換リストから情報を取得したりできます。
X_RUN は外部交換リストを認識しないため、RDMLXファンクションでM@EXCHL機能を使用することはできません。交換リストが必要な場合は、RDMLXではなく、LANSA RDMLを呼び出してください。具体的には、以下のようにします。
· RPGからLANSAを呼び出す - これはRDMLファンクションでなければなりません。
· LANSAからRPGを呼び出す - RDMLファンクションまたはRDMLXファンクションのどちらも使用できます。これを行うには、MC@EXCHL値用の単純なRDMLファンクションを作成する必要があります。これにより、値をRDMLXファンクションと交換できるようになります。すなわち、RDMLからこのRDMLXファンクションを呼び出して、値を交換します。
以下の2つのシナリオを通して、M@EXCHLの使用方法を説明します。
シナリオ1 - RPG/COBOLなどからLANSAアプリケーションを呼び出す
RPG/COBOLなどのプログラムに以下のようなロジックが組み込まれているとします。
1. M@EXCHLを呼び出し、リストに残されたごみを"CLR" (クリア)します。
2. M@EXCHLを呼び出し、情報をリストに"PUT" (配置)します。
3. LANSAを呼び出し、LANSAファンクションを実行します。これは、(LANSA X_RUNを介して呼び出される)RDMLXファンクションではなく、RDMLファンクションでなければなりません。
4. M@EXCHLを呼び出して、リストから情報を"GET" (取得)します。
これらの操作の実際のロジック・フローは以下のようになります。
1. M@EXCHLにより、ユーザー・リスト上のごみがクリアされます。
2. M@EXCHLにより、要求された詳細がユーザー・リストに配置されます。
3. LANSAが呼び出されると、現在の交換リストにユーザー・リストが追加され、ユーザー・リストがクリアされます。その後、ファンクションは、通常の交換リストの規則に従って実行されます。制御がRPG/COBOLなどのアプリケーションに戻される直前に、交換リストがユーザー・リストにマッピングされ、交換リストがクリアされます。
4. M@EXCHLによりユーザー・リストが検索され、情報が返されます。
シナリオ2 - LANSAアプリケーションからRPG/COBOLなどを呼び出す
1. LANSAファンクションがRDML CALLコマンドを介してRPG/COBOLなどのプログラムを呼び出します。このプログラムは交換リストへのアクセスを求めているため、PGM_EXCH(*YES)パラメータが使用されます。RDMLファンクションまたはRDMLXファンクションを使用できますが、交換できるのはRDMLフィールドのみです。詳細については、CALLコマンドのセクションを参照してください。
2. RPG/COBOLなどのプログラムが制御を受け取ります。
3. M@EXCHLを呼び出し、リストから詳細を"GET" (取得)します。
4. M@EXCHLを呼び出し、リストを"CLR" (クリア)します。
5. 必要なすべての処理を実行します。
6. その後、M@EXCHLを呼び出し、詳細をリストに"PUT" (配置)します。
7. 制御がLANSAファンクションに戻り、リストの詳細が表示され、他のLANSAファンクションでの交換リストによる交換と同様に処理されます。
これらの操作の実際のロジック・フローは以下のようになります。
1. すべてのOPTION(*ALWAYS)フィールドが交換リストに追加され、交換リストがユーザー・リストにマッピングされます。その後、交換リストがクリアされ、RPG/COBOLなどのアプリケーションが呼び出されます。
2. RPG/COBOLなどのプログラムが制御を受け取ります。
3. M@EXCHLによりユーザー・リストが検索され、情報が返されます。
4. M@EXCHLによりユーザー・リストがクリアされます。
5. 必要なすべての処理が実行されます。
6. M@EXCHLにより、要求された詳細がユーザー・リストに配置されます。
7. 制御がLANSAファンクションに戻り、交換リストがユーザー・リストに置き換わり、ユーザー・リストがクリアされます。次に、交換リストで、ファンクション内のフィールドとの一致が検索され、必要に応じてマッピングが行われます。最後に、交換リストがクリアされます。
M@EXCHLで必要なパラメータ
M@EXCHLには、CALLで指定する必要のある1つのパラメータと、交換リストを介してやり取りする情報を定義し、保持するための最大10「組」のパラメータがあります。すなわち、1回の呼び出しでM@EXCHLに渡すことのできるパラメータは1〜21個です。
これらのパラメータの詳細は以下のとおりです。
パラメータ番号 |
タイプ |
最小長 |
最大長 |
説明 |
---|---|---|---|---|
01 |
Alpha |
3 |
3 |
PUT:リストにデータを配置する |
02,04, |
Alpha |
15 |
15 |
形式:nnnnnnnnnntllld |
03,05, |
指定しない |
1 |
256 |
これはフィールド値です。 |
M@EXCHLの呼び出し例
例1:CL (制御言語)プログラムから、フィールドCOMPNO (会社名)およびACCTYP (口座種別)の値を交換リストに配置します。LANSAファンクションを実行し、交換リストからTOTAMOUNTというフィールドを取得します。
DCL &COMPNO *DEC (3 0)
DCL &ACCTYP *CHAR 5
DCL &TOTAMOUNT *DEC (13 2)
CALL M@EXCHL ('CLR')
CALL M@EXCHL ('PUT' 'COMPNO P0030' &COMPNO ACCTYP A0050' &ACCTYP )
LANSA RUN ... etc .....
CALL M@EXCHL ('GET' 'TOTAMOUNT P0132' &TOTAMOUNT)
例2:同じ操作をRPGから実行します。
E ATR 1 3 15
C*
C* CLEAR THE LIST
C*
C CALL 'M@EXCHL'
C PARM 'CLR' A@EXCH 3
C*
C* PUT TO THE LIST
C*
C CALL 'M@EXCHL'
C PARM 'PUT' A@EXCH
C PARM ATR,01
C PARM COMPNO 30
C PARM ATR,02
C PARM ACCTYP 5
C*
C* INVOKE THE FUNCTION
C*
C CALL 'LANSA'
C ---------- ETC -----------
C ---------- ETC -----------
C ---------- ETC -----------
C*
C* GET FROM THE LIST
C*
C* NOTE: The field is named "TOTAMOUNT" in the exchange
C* list, but is actually returned into a field
C* called TOTAMT.
C CALL 'M@EXCHL'
C PARM 'GET' A@EXCH
C PARM ATR,03
C PARM TOTAMT 132
C*
C MOVE '1' *INLR
C RETRN
**
COMPNO P0030
ACCTYP A0050
TOTAMOUNT P0132
例3:交換リストからファイルおよびライブラリの名前を受け取り、ファイルをテープにコピーし、戻りコードを交換リストに配置するCLプログラムを作成します。
COPYTAPE: PGM
DCL &FILE *CHAR 10
DCL &LIBRARY *CHAR 10
DCL &RETCODE *CHAR 1
CALL M@EXCHL ('GET' 'FILE A0100' &FILE 'LIBRARY A0100' &LIBRARY )
CALL M@EXCHL ('CLR')
CHGVAR &RETCODE 'Y'
CPYTOTAP ... etc .....
MONMSG (CPF0000 MCH0000) EXEC(CHGVAR &RETCODE 'N')
CALL M@EXCHL ('PUT' 'RETCODE A0010' &RETCODE)
ENDPGM
例4:画面パネルを表示し、ファイルおよびライブラリ名を入力し、例3のCLプログラムを呼び出し、戻りコードに基づいて操作を実行するRDMLコードを作成します。
DEFINE #FILE *CHAR 10
DEFINE #LIBRARY *CHAR 10
DEFINE #RETCODE *CHAR 1
REQUEST FIELDS(#FILE #LIBRARY)
EXCHANGE FIELDS(#FILE #LIBRARY)
CALL PGM(COPYTAPE) PGM_EXCH(*YES)
IF ('#RETCODE *NE Y')
MESSAGE MSGTXT('Copy to tape failed')
ENDIF