DataTable パーツ

DataTable パーツは、アプリケーションを介して使用可能である表形式のデータの集合で構成されています。他のデータ・パーツとは異なり、各 DataTable パーツは、パーツ独自の EGL ソース・ファイル内で宣言します。 DataTable はメインのパーツです。つまり、このパーツは、他のメイン・パーツを持たないファイル内で定義する必要があり、ファイルと同じ名前でなければなりません。

プログラム、ライブラリー、またはハンドラーから DataTable が見えるようにするには、DataTable を use 文の中に組み込みます。 DataTable をメッセージ・テーブルとしてのみ使用する場合は、プログラムの msgTablePrefix プロパティーを使用して、DataTable をプログラムに接続することができます。

DataTable パーツは必須プロパティー contents を持ち、このプロパティーは、テーブルの値の 2 次元配列を指定します。DataTable のプロパティーと、このトピックの後半にある例を参照してください。

contents プロパティーで指定するデータの各列では、変数宣言を含める必要があります。これらの変数宣言は、構造化レコード (レコード・パーツを参照) 内にあるような、構造体フィールドです。構造体レコードは常に固定長です (例えば、未定義長の STRING 変数は許可されない、など)。 数値接頭部を割り当てることによって、これらの宣言を副構造化できます。 そうしなかった場合、EGL はすべてのフィールドが同じレベルであると仮定します。 副構造体フィールドではなく、構造体の最上位レベルのフィールド (最下位レベル番号を持つ) のみのために内容を指定することができます。 詳しくは、このトピックの後半にある例を参照してください。

構文

DataTable パーツの構文図
DataTablePartName
データ・テーブルの名前。そのテーブルを使用するすべてのプログラムまたはハンドラーが、この名前を使用して、そのテーブルにアクセスします。 このトピックの『互換性』を参照してください。
stereotype
DataTable を特定の用途のために特殊化するステレオタイプです。『ステレオタイプ』を参照してください。使用できるステレオタイプのリストについては、このトピックの『DataTable ステレオタイプ』を参照してください。ここでステレオタイプを指定しない場合、EGL は BasicTable ステレオタイプを想定します。
columnDeclarations
固定長構造体フィールドのリストは、それぞれがテーブル内の各列のデータ型を指定しています。他の変数宣言と同様に、それぞれセミコロン (;) で終了するようにします。
properties
値の設定ブロックには、データ・テーブルのプロパティーが含まれます。これらのプロパティーの 1 つである contents が必要であり、これにより、データ・テーブルのリテラル・データの配列が定義されます。詳しくは、DataTable のプロパティーを参照してください。

DataTable ステレオタイプ

DataTable パーツを次のいずれかのステレオタイプにより特殊化することができます。
BasicTable
プログラム・ロジックで使用される情報 (例えば、国およびそれに関連付けられているコードのリスト) を含んでいます。これはデフォルトのステレオタイプです。
MatchInvalidTable
ユーザー入力の比較対象となる最初の列の情報が含まれます。 ユーザー入力は、提供されるすべての値と異なっている必要があります。このステレオタイプは UI テクノロジーで使用され、DataTable は通常、フィールドの validatorDataTable プロパティーに割り当てられます。 妥当性検査に失敗すると、EGL はエラー・メッセージを表示します。
MatchValidTable
ユーザー入力の比較対象となる最初の列の情報が含まれます。 ユーザー入力は、提供される値の 1 つと一致する必要があります。このステレオタイプは UI テクノロジーで使用され、DataTable は通常、フィールドの validatorDataTable プロパティーに割り当てられます。 妥当性検査に失敗すると、EGL はエラー・メッセージを表示します。
MsgTable
実行時にプログラムの表示が必要な場合があるというメッセージが含まれます。ランタイム・メッセージの表示メカニズムは、個々の UI テクノロジー機能です。DataTable のこの型の名前は、次の形式になります。
  • 1 から 4 文字の接頭部 (「MT1」など)
  • 3 文字の各国語コード (付録『各国語コード』を参照してください。)
米国英語では、テーブルの名前は、「MT1ENU」になります。 接頭部にプログラムの msgTablePrefix プロパティーを設定すると、DataTable とプログラムを関連付けることができます。
rangeChkTable
ユーザー入力の比較対象となる 1 列目と 2 列目の列の情報が含まれます。 ユーザー入力は、少なくとも 1 つのデータ・テーブル行の 1 列目と 2 列目の値の間の値に一致している必要があります。 (範囲は包括的です。 ユーザー入力が任意の行の最初の列または 2 番目の列の値と一致している場合は、有効です。)

データ・テーブルの使用

DataTable を作成後、 EGL コードを書き込んでテーブル内の情報に アクセスできます。多くの EGL パーツの処理と異なり、DataTable パーツを基にした変数の作成は行いません。 代わりに、パーツに割り当てた名前を使用してデータ・テーブルを参照します。 以下の例に示すとおり、ドット構文を使用し、列宣言に割り当てた名前の 1 つに行番号の索引を続けて、列を参照します。
strTest = myDataTable.column3[4];

このサンプルでは、STRING 変数 strTest に、データ・テーブルの 3 番目の列、4 番目の行の値が含まれています。

以下に、DataTable パーツの例を示します。
DataTable myErrorMessages type MsgTable
  { shared = yes }
  msgNum INT;
  msgText char(30);

  { contents = [  
  [ 101, "File not found" ] ,
  [ 102, "Read error" ] ,  
  [ 103, "Write error" ] ]
  } 
end
プログラムから、次のコードを使用してそのテーブルにアクセスすることができます。
Function displayError(index INT in)
  strTest = 
    formatNumber(myErrorMessages.msgNum[index]) +
    "    " +
    myErrorMessages.msgText[index];
  sysLib.writeStdout(strTest);
end
索引値 2 を使用した場合、関数は以下のエラー・メッセージを表示します。
102   Read error 
以下の例に示すとおり、列宣言は副構造化することができます。
DataTable myDataTable type basicTable 
  { shared = yes } 
    10 myColumn1 CHAR(10);
    	15 Column1A CHAR(5);
    	15 Column1B CHAR(5);
    10 myColumn2 CHAR(10); 
    10 myColumn3 CHAR(10); 
    
    { contents = [
	
	[ "ABCDEFGHIJ", "row1 col2", "row1 col3" ] , 
	[ "KLMNOPQRST", "row2 col2", "row2 col3" ] , 
	[ "1234567890", "row3 col2", "row3 col3" ] ] }
end
以下の例に示すとおり、このテーブルを使用するプログラム内でこのデータにアクセスすることができます。
  writeStdOut(myDataTable.Column1B[1]); // FGHIJ の表示

ほとんどの環境で、実行時に DataTable の内容を変更することができます。 実行時に行われた変更は、DataTable にアクセスするすべてのプログラムから見ることができ、 その変更は、その DataTable がアンロードされるまで維持されます。 変更を行えるか、および、その実行単位のほかのプログラムからその変更を見ることができるかは、ターゲット・システムおよび shared プロパティーに影響を受けます。 DataTable のアンロードは、ターゲット・システム、および resident プロパティーによって影響を受けます。 詳しくは、DataTable のプロパティーを参照してください。

比較的一定しているが (例えば、1 年に 1 回のみ変更される パラメーター)、多数のプログラムで使用されているデータがある場合は、 一般に実行時に DataTable の内容を変更することがあります。以下に、 DataTable のような例を示します。
DataTable myConstants type basicTable
  10 myConstant1 INT;
  10 myConstant2 CHAR(10);
  {contents = [ [ 0, ""]]}        //  single row with initial values
end  
次に、以下のコード例の場合は、実行時にデータベースまたはファイルから DataTable を更新することもできます。
get constantInfo;
myConstants.myconstant1[1] = constantInfo.myconstant1;
myConstants.myconstant2[1] = constantInfo.myconstant2;  
プログラムでの定数の宣言でこの技法を使用する利点は、 データの変更時に必要なのがデータベースの更新のみになります。 各プログラムで定数を変更する必要はありません。このように DataTable を使用すると、 環境によっては、ライブラリーまたはデータベースを使用するよりも高いパフォーマンスを 提供することができます。例えば、CICS® の場合、CICS 領域の始動時に DataTable を常駐として定義し初期化できることがあります。

互換性

表 1. DataTable の互換性に関する考慮事項
プラットフォーム 問題
COBOL 生成 DataTable 名の最大長は 7 文字です。
JavaScript 生成 DataTable はサポートされていません。
JSF ハンドラー msgTable 型の DataTable でのメッセージの挿入がサポートされています。最初の挿入は {0} です。
テキスト UI msgTable 型の DataTable でのメッセージの挿入はサポートされていません。
Web トランザクション msgTable 型の DataTable でのメッセージの挿入がサポートされています。最初の挿入は {1} です。

フィードバック