7.54.3 EXCHANGE によるRPG/COBOLから交換リストへのアクセス

システム定義データ・エリアDC@A01のフラグ・フィールドは、交換機能を要求するよう設定されている必要があります。『LANSA/ADユーザーガイド』の&<a href="../../../lansa010/content/lansa/ugubc_c10015.htm"&>「システム定義データ域 DC@A01」&</a&>を参照してください。
通常、交換リストは、LANSAプロセスおよびファンクション間で情報を交換する目的にのみ使用されますが、RPG/COBOLなどのプログラムからLANSAアプリケーションを呼び出したり、LANSAアプリケーションからRPG/COBOLなどのプログラムを呼び出して、交換リストにアクセスすることもできます。
この機能は、実際には、LANSAに付属のM@EXCHLというプログラムによって提供されます。RPG/COBOLなどのプログラムは、M@EXCHLを呼び出すことにより、LANSAプロセスおよびファンクションと同様に、情報を交換リストに配置したり、交換リストから情報を取得したりできます。
X_RUN は外部交換リストを認識しないため、RDMLXファンクションでM@EXCHL機能を使用することはできません。交換リストが必要な場合は、RDMLXではなく、LANSA RDMLを呼び出してください。具体的には、以下のようにします。

以下の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フィールドのみです。詳細については、7.9 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:リストにデータを配置する GET:リストからデータを取得する CLR:リストをクリアする

02,04, 06,08, 10,12, 14,16, 18,20

Alpha

15

15

形式:nnnnnnnnnntllld 表記の説明: nnnnnnnnnnはフィールド名 tはフィールド・タイプ(A/P/S) lllはフィールド長または合計桁数 dは小数点以下桁数

03,05, 07,09, 11,13, 15,17, 19,21

指定しない

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