3.3.6 RPGデータ構造
RPGデータ構造サポートにより、RPGプログラムでは、RPGプログラムと現在のJSMサービス間で単一または複数のオカレンス・データ構造を送受信できます。
RPGプログラムは、JSMサービスにデータ構造を渡すことができます。これらのデータ構造は、リスト・オブジェクトまたはフィールド・リスト・オブジェクトとして表示されます。
各コマンドでRPGプログラムが渡せるのは、フィールド・リスト・オブジェクトかリスト・オブジェクトだけです。LANSAファンクションは、フィールド・リスト・オブジェクトとリスト・オブジェクトを両方同時に渡すことができます。
JSMCMDX呼び出しは、データ構造をバイト配列として渡す場合に使用されます。
コマンド・キーワードSERVICE_STRUCTUREがある場合、バイト配列は、他のコマンド・キーワードに応じてJSMListまたはJSMFieldListオブジェクトに変換されます。
これらのオブジェクトは、JSMCMDオブジェクトから利用できます。
JSMList list = command.getList () ;
JSMFieldList fieldList = command.getFieldList () ;
SERVICE_STRUCTUREキーワードがない場合、データー構造にはgetByteArrayメソッドでアクセスできます。
byte[] data = command.getByteArray () ;
予約キーワード
· SERVICE_STRUCTURE ( xxx ) - 構造を使用する必要がある場合は必須
· OCCURS ( nnn ) - リストの場合は必須
· SIZE ( nnn ) - リストの場合は必須
· COUNT ( nnn ) - リストの場合はオプション。リストに有効エントリー数を指定
リストとしてのデータ構造
JSMサービスに複数のオカレンス・データ構造をリスト・オブジェクトとして送信する場合、プログラマはキーワードOCCURSを含める必要があります。
· OCCURSキーワードでは、リスト内の最大エントリー数を指定します。
· COUNTキーワードでは、リスト内の現在のエントリー数を指定します。省略値はゼロです。
· SIZEキーワードは、OCCURSキーワードが使用される場合は必須です。これは、計算されたエントリー・サイズをチェックする場合に使用されます。
· バイト配列の長さは、SIZE値にOCCURS値を掛けた値に等しくなければなりません。
フィールド・リストとしてのデータ構造
JSMサービスにデータ構造をフィールド・リスト・オブジェクトとして送信する場合、プログラマはCOUNT、OCCURS、SIZEの各キーワードを使用する必要はありません。
· COUNTキーワード値の省略値は1です。
· OCCURSキーワード値の省略値は1です。
· バイト配列の長さは、計算された構造サイズに等しくなければなりません。
構造のレイアウトの決定
SERVICE_STRUCTUREキーワードの値は、systemサブディレクトリにあるstructure.propertiesファイルのキー検索として使用されます。
このプロパティ・エントリーの値コンポーネントは、構造レイアウトを定義するXMLファイルの位置になります。
#
# Java Service Managerの構造
#
structure.demoxml.orderhead=structure/demoxml-orderhead.xml
structure.demoxml.orderline=structure/demoxml-orderline.xml
構造XMLの例
<?xml version="1.0" encoding="UTF-8"?>
<rdml:structure xmlns:rdml="http://www.lansa.com/2000/XML/Function">
<rdml:field name="ORDER" type="S" length="10" />
<rdml:field name="NAME" type="A" length="50" />
<rdml:field name="STREET" type="A" length="50" />
<rdml:field name="CITY" type="A" length="50" />
<rdml:field name="STATE" type="A" length="5" />
<rdml:field name="ZIP" type="A" length="5" />
</rdml:structure>
RPGプログラムの例
*注文ヘッド
D ORDERHEAD DS
D ORDER 10S 0 INZ(0)
D NAME 50 INZ(' ')
D STREET 50 INZ(' ')
D CITY 50 INZ(' ')
D STATE 5 INZ(' ')
D ZIP 5 INZ(' ')
D HEADSIZE C %SIZE(ORDERHEAD)
*注文行、10行まで
D ORDERLINE DS OCCURS(10)
D LINENUM 3S 0 INZ(0)
D PARTNUM 3S 0 INZ(0)
D PARTDSC 50 INZ(' ')
D PARTAMT 10P 2 INZ(0)
D PARTQTY 3P 0 INZ(0)
D LINEELEM C %ELEM(ORDERLINE)
D LINESIZE C %SIZE(ORDERLINE)
このコマンドは、単一フィールド値を受け取り、ORDERHEAD構造に入れます。
RECEIVE HANDLER(IXML) XSL(RECEIVEORDER) SERVICE_STRUCTURE(DEMOXML.ORDERHEAD)
このコマンドは、複数の注文行を受け取り、ORDERLINE構造に入れます。
RECEIVE HANDLER(IXML) XSL(RECEIVEORDER) SERVICE_STRUCTURE(DEMOXML.ORDERLINE) SIZE(64) OCCURS(10)
データ構造名が構造XMLファイル内の名前に一致している必要はなく、使用されるのはデータ・タイプと位置だけです。
構造XML名は、XSLファイル内のフィールド名と一致している必要があります。
付属のRPG例QRPGLESRC/DEMOXMLでは、データ構造の送受信方法が説明されています。