7.42.2 EXCHANGEについてのコメント/警告
· 情報は、「交換リスト」を介してファンクション間で交換されます。交換リストの形式は以下のとおりです。
||N|T|L|D| V ||N|T|L|D| V | ....... |N|T|L|D| V ||
ここで:
N |
フィールド名 |
T |
フィールド・タイプ |
L |
フィールド長 |
D |
小数点以下桁数 |
V |
可変フィールド長 |
· 交換リストは、ファンクションが呼び出されたとき、別ファンクションの呼び出し(CALL)が完了したとき、または入力可能フィールドからのプロンプト要求後にPROMPT_KEY処理ファンクションが完了したときに、必ず検索されます。 そのファンクションで使用したフィールドと同じ名前のフィールドが交換リストで見つかった場合、そのフィールドがファンクションに「マッピング」されます。交換リストでフィールドが見つかりファンクションにマッピングされたかどうかに関わらず、検索の完了後に交換リストはクリアされます。
· ファンクション間での情報交換は、通常のプログラム・パラメータのように位置ではなく、名前によって行われると見なすことができます。
· 交換リストには、RDMLおよびRDMLXの2種類があります。一般に、RDMLフィールドはRDML交換リストに配置され、RDMLXフィールドはRDMLX交換リストに配置されます。ただし、現在のファンクションまたはコンポーネントがRDMLXの場合は例外です。この場合、フィールドがRDMLで、RDML交換リストがいっぱいのときは、RDMLフィールドがRDMLX交換リストに配置されます。詳細については、「フィールドをRDMLXに分類するもの」を参照してください。
· RDML交換リストがいっぱいでなければ、RDMLフィールドをRDMLXファンクションまたはコンポーネントからRDMLファンクションへ、さらにRDMLファンクションからRDMLXファンクションまたはコンポーネントへ交換できます。交換リストがいっぱいの場合、RDMLフィールド値がRDMLX交換リスト上にあるため、RDMLファンクションは値を交換しません。
· フィールドの定義が交換リスト内とファンクション内とで異なっている場合、上記の「マッピング」手順により、フィールドのタイプ、長さ、および小数点以下桁数が自動的に変換されます。ただし、変換は必ず成功するわけではありません。交換値をターゲット・フィールドの定義に合わせて変換するための「最善の試み」は行われますが、これは失敗する可能性もあります。交換リスト・メカニズムは、同一のフィールドを交換するよう設計されているため、長さ以外の定義を変更しないことを強くお勧めします。
ターゲット・フィールドのタイプがAlphaまたはStringで、ターゲット・フィールド長が交換値より短い場合、値はターゲット・フィールドの最大長に合わせて切り捨てられます。
ソース・フィールドのタイプがAlphaまたはString、ターゲット・フィールドが数値タイプで、ターゲット・フィールド長が交換値より短い場合、値は、ターゲット・フィールドの長さと小数点以下桁数に応じて、小数点の左右の値が切り捨てられます。
ターゲット・フィールドとソース・フィールドのタイプがその他の組み合わせで、フィールド長が交換値より短い場合の動作は不確定です。この不確定な動作は、将来的に変更される可能性がありますが、どのように変更されるかについては未定です。この不確定な動作によって得られる結果は、将来的なリリースで変更されるものと考えてください。
· ASQN属性を持つフィールドを交換することは可能です。この場合、両方のコードでフィールドの定義が同一(ASQN属性を含む)であることが前提となります。
· PROMPT_KEY処理ファンクションがDISPLAY、REQUEST、またはPOP_UPコマンドから自動的に呼び出されると(すなわち、[プロンプト]ファンクション・キーが押されると)、以下のイベントが発生します。
· EXCHANGE OPTION(*ALWAYS)コマンドに指定されたすべてのフィールドが交換リストに配置されます。
· プロンプト要求されているフィールドが交換リストに配置されます。
· プロンプト要求されているフィールドが別のフィールドの定義を参照している場合、「参照」フィールド名で再度交換リストに追加されます。
· 特別なフィールドPROMPT$FNおよびPROMPT$RNが交換リストに配置されます。これらのフィールドにはそれぞれ、プロンプト要求されているフィールドの名前と、それに関連付けられた参照フィールドの名前が保持されます。
· プログラムが使用するその他すべてのフィールドは、システム定義データ・エリアのフラグの設定に従って、交換リストの残りスペースに収まる数だけ交換リストに追加されます。システム定義データ・エリアのフラグがこのように設定されていない場合は、交換されるフィールドのみが交換リストに配置されます。『LANSA/ADユーザーガイド』の「システム定義データ域の概要」を参照してください。
· [プロンプト]キー処理ファンクションが呼び出されます。
· [プロンプト]キー処理ファンクションが正常に完了し、
および
プロンプト要求されているフィールドが、プロンプト要求された時点で画面上で入力可能な場合、プロンプト・ファンクションによって交換リストに配置されたフィールドが呼び出し元プログラムの記憶域にマッピングされます。
· 最後に、交換リストのすべての項目が必ずクリアされます。
· EXCHANGEコマンド、またはTRANSFERコマンドのEXCHANGEパラメータは、交換リストに新しい項目を追加するために使用します。
· RDMLフィールドの交換リストの合計長さは2000文字を超えることはできません。2000文字を超えた場合、EXCHANGEまたはTRANSFERコマンドによって情報をリストに追加しようとすると、異常終了します。
· RDMLX交換リストの長さは、使用可能なメモリー容量によってのみ制限されます。
· 交換情報を受け取るファンクションを使用するときは、ファンクション内の最初のRDMLコマンドが実行される前(すなわち、ファンクションの初期化手順の実行中)に情報交換が行われることを覚えておいてください。
· EXCHANGEコマンドまたはパラメータが正しく機能していないように見える場合、ファンクション内の最初のRDMLコマンドによって、交換リストからマッピングされた直後のフィールドが、*DEFAULTまたは*NULLに設定されている可能性があります。これにより、交換値は上書きされます。
· RPG/CLなどで交換リストからフィールドを取得(GET)する場合は、同じフィールド長と小数点以下桁数を使用してください。異なる値を使用すると、予期しない結果になる可能性があります。
· GETのフィールド長の方が短い場合、以下のようになります。
· 小数部または整数部、あるいはその両方が切り捨てられる可能性があります。
· 文字が切り捨てられる可能性があります。
· GETのフィールド長の方が長い場合、以下のようになります。
· 値に0またはブランクが埋め込まれます。
CALL PROCESS(*DIRECT)オプションの導入により、以前はLANSAで推奨されていなかった大量の呼び出しが可能になりました。他のファンクションの大量呼び出しを実装するときは、交換リストのサイズを考慮してください。このような状況では、交換リスト上に多数のフィールドが存在すると、パフォーマンス・オーバーヘッドが生じる可能性があります。交換オプションを使用する代わりに、ファンクション間でデータ構造(CALL .... PASS_DS(#dddddd))を受け渡しするオプションを検討してください。