Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

複雑なレコード・マッパーの使用法

メッセージ形式が複数の異種レコードで構成されている場合は、複雑なレコード・マッパーと、組み込みファイルまたは FTP サービスおよびオペレーションを使用して、これらの複雑なレコードを処理できます。これらの複雑なレコードの多くは、ヘッダ・レコードの後ろにレコードのパターンが続き、トレーラ・レコードで終わっています。これらのレコードは、固定フィールド・レコードまたは区切りのあるレコードのどちらにすることも、省略したり、繰り返したりすることもできます。通常は、レコードにはレコードの種類を識別する先行データが含まれています。

概要

複雑なレコード・マップは、以下を含む構造化レコードを記述することができます。

  1. オプションのヘッダ・レコード。

  2. 各要素を RecordMap またはシーケンスによって定義されたレコードにすることができる要素のシーケンス。シーケンスには、一連のレコードと他のシーケンスを含めることができます。

  3. オプションのトレーラ・レコード。

シーケンス内のレコードは、区切りのあるレコードまたは固定幅レコードのどちらにもすることができます。複雑なレコード・マップ内では区切りのあるレコードと固定幅レコードを混在させることができますが、通常は、すべてのレコードが区切られるか、すべてのレコードが固定幅になるかのどちらかです。

以下に示す区切りのあるサンプル・データは、複雑なレコード・マップで記述することができます。このデータは、大学の学期を識別するヘッダと、学生と各学生が受講するクラスに関する情報で構成されています。

SEM|194;2012;Fall;20
STU|12345;Adams;John;Michael;2;john.michael.adams@example.com;617-999-9999
CLS|18.034;1;Differential Equations;4
CLS|21W.759;1;Writing Science Fiction;4
STU|12346;Adams;Jane;Michelle;3;jane.michelle.adams@example.com;
CLS|21L.285;1;Modern Fiction;3
CLS|7.03;1;Genetics;4
STU|12347;Jones;Robert;Alfred;1;bobby.jones@example.com;
CLS|18.02;1;Calculus;4

このデータを記述する複雑なレコード・マップは、以下で構成されます。

  1. 先行データの “SEM|” で識別されるヘッダ・レコード。

  2. 学生のシーケンス。ここでは、各学生が以下で構成されます。

    1. 先行データの “STU|” で識別される学生レコード。

    2. 先行データの “CLS|” で識別される繰り返しクラス・レコード。

学生のシーケンスは、複雑なレコードの繰り返し構造を定義したものですが、データ内のレコードには対応していません。

複雑なレコード・マップは、ファイル構造とオブジェクト構造の両方を定義します。複雑なレコード・マップ・ファイル・サービスは、複雑なレコード・マップによって定義されたファイル構造を使用してファイルを解釈してから、そのデータをオブジェクト構造によって定義されたオブジェクトに保存します。複雑なレコード・マップ・ファイル・オペレーションは、その逆を実行します。つまり、オブジェクト内のデータを取得して、それを複雑なレコード・マップによって定義されたファイル構造を使用してファイルに書き出します。

複雑なレコード・マップの作成と編集

管理ポータル内の複雑なレコード・マッパーを使用することによって、または、スタジオで XML 定義をインポートしたり、編集したりすることによって、新しい複雑なレコード・マップを作成したり、既存の複雑なレコード・マップを編集したりできます。

複雑なマップには、フィールドを定義可能な最上位シーケンスが含まれています。複雑なレコードが、シーケンスが繰り返されない単一のレコード・シーケンスで構成されている場合は、レコードのレコード・マップを直接、複雑なレコード・マップに入力できます。ただし、ヘッダとトレーラ間でシーケンス全体を繰り返すことができる場合は、繰り返しシーケンス・レコードを最上位シーケンスの唯一の要素として入力する必要があります。

はじめに

管理ポータルから複雑なレコード・マッパーにアクセスするには、[Ensemble][ビルド][複雑なレコード・マップ] の順にクリックします。ここから、以下のコマンドを使用できます。

  • [開く] — 既存の複雑なレコード・マップを開きます。

  • [新規作成] — 新しい複雑なレコード・マップを作成します。

  • [保存] — 複雑なレコード・マップ構造を、[複雑な RecordMap 名] で指定されたパッケージ内の作業中のネームスペース内の 1 つのクラスとして保存します。

  • [生成] — 複雑なレコード・マップ・パーサ・コードと関連する永続メッセージの複雑なレコード・クラス・オブジェクトを生成します。

    オブジェクトを手動で生成するには、EnsLib.RecordMap.ComplexGeneratorOpens in a new tab 内の Generate()Opens in a new tab クラス・メソッドを使用します。

  • [削除] — 現在の複雑なレコード・マップを削除します。オプションで、関連する永続メッセージの複雑なレコード・クラスと保存されたすべてのクラスのインスタンスを削除できます。

Important:

[保存] 操作では、現在の複雑なレコード・マップのみがディスクに書き込まれます。対照的に、[生成] 操作では、基礎のオブジェクトに対してパーサ・コードと永続オブジェクト構造が生成されます。

複雑なレコード・マップ・プロパティの編集

新しい複雑なレコード・マップのプロパティを入力する場合も、ウィザード生成マップから作業を始める場合も、既存のマップを編集する場合も、プロセスは同じです。複雑なレコード自体に対して、以下のフィールドの値を入力または更新します。

[複雑な RecordMap 名]

複雑なレコード・マップの名前。複雑なレコード・マップ名はパッケージ名で修飾する必要があります。パッケージ名を入力せず、非修飾の複雑なレコード・マップ名を指定しなかった場合は、デフォルトで、複雑なレコード・マップ・クラスがユーザ・パッケージ内に保存されます。

[ターゲット・クラス名]

複雑なレコードを表す Ensemble クラスの名前。 デフォルトで、複雑なレコード・マッパーは、ターゲット・クラス名を、複雑なレコード・マップ名の後に “.Batch” が付いた修飾名に設定しますが、このターゲット・クラス名は変更できます。 ターゲット・クラス名はパッケージ名で修飾する必要があります。パッケージ名を入力せず、非修飾ターゲット・クラス名を指定した場合は、デフォルトで、ターゲット・クラスがユーザ・パッケージ内に保存されます。

[文字エンコード]

インポートしたデータ・レコードの文字エンコード。複雑なレコード・マップに対する指定は、複雑なレコード・マップに含まれているすべてのレコード・マップのエンコーディングと同じにする必要があります。これらが異なる場合は、複雑なレコード・マップの文字エンコーディングの方が、レコード・マップの文字エンコーディングより優先されます。

[アノテーション]

この複雑なレコード・マップの目的と用途を記述するテキスト。

新しい複雑なレコード・マップを作成すると、複雑なレコード・マッパーによって、以下の要素で構成された定義が作成されます。

  • 複雑なマップの名前と型 — 複雑なマップの名前とクラスを入力します。

  • ヘッダ — 複雑なレコードにヘッダが含まれている場合は、ヘッダを記述するレコード・マップの名前とクラスを入力します。

  • トレーラ — 複雑なレコードにトレーラが含まれている場合は、トレーラを記述するレコード・マップの名前とクラスを入力します。

複雑なレコード・マップのレコードとシーケンスの編集

複雑なレコード・マップは以下で構成されます。

  1. オプションのヘッダ・レコード。

  2. 要素のシーケンス。ここでは、各要素を以下にすることができます。

    • RecordMap によって定義されたレコード。複雑なレコード・マップ内に以下のプロパティを含めることができます。

      • 必須項目。値 0 はレコードが省略可能なことを意味し、値 1 はレコードが必須であることを意味します。

      • 最小回数と最大回数の繰り返し。

    • ネストした要素のシーケンス。

  3. オプションのトレーラ・レコード。

各レコードはレコード・マップによって定義されます。シーケンスは、複雑なレコード・マップ定義内で定義されます。これは、メッセージ内のデータの構造を記述しますが、それ自体がデータ内のフィールドに対応しているわけではありません。

ヘッダ・レコードとトレーラ・レコードはそれぞれレコード・マップによって定義されます。複雑なレコード・マップ定義にヘッダ・レコードまたはトレーラ・レコードを含めるかどうかは任意ですが、定義にヘッダ・レコードが含まれている場合は、データにヘッダ・レコードを含める必要があり、定義にトレーラ・レコードが含まれている場合は、データにトレーラ・レコードを含める必要があります。ヘッダ・レコードとトレーラ・レコードは繰り返すことができません。

すべてのシーケンスに 1 つ以上のレコードまたはシーケンスを含める必要があります。

レコードを編集しているときに、[シーケンスの作成] ボタンをクリックすると、レコードをシーケンスに置き換えることができます。シーケンスを編集しているときに、[レコードの作成] ボタンをクリックすると、シーケンスをレコードに置き換えることができます。

レコードに対して以下のプロパティを指定できます。

  • レコード名。

  • レコード形式を定義する RecordMap。RecordMap は、レコード、レコードが固定列と区切りのいずれを含んでいるか、セパレータ、およびレコードのターミネータを定義する [先行データ] を指定します。RecordMap の定義方法の詳細は、"Ensemble レコード・マッパーの使用法" を参照してください。

  • レコードが必須かどうか。

  • レコードを繰り返すことができるかどうか。レコードを繰り返すことができる場合は、以下も指定できます。

    • 最小繰り返し回数

    • 最大繰り返し回数

  • 複雑なレコード・マップ内のレコードの目的と用途を記述するアノテーション。

シーケンスに対して以下のプロパティを指定できます。

  • シーケンス名。

  • シーケンスが必須かどうか。

  • シーケンスを繰り返すことができるかどうか。シーケンスを繰り返すことができる場合は、以下も指定できます。

    • 最小繰り返し回数

    • 最大繰り返し回数

  • 複雑なレコード・マップ内のシーケンスの目的と用途を記述するアノテーション。

複雑なレコード・マップ・クラスの構造

レコード・マップを記述する 2 つのクラスと同様の方法で複雑なレコード・マップを記述する 2 つのクラスがあります。この複雑なレコード・マップを記述する 2 つのクラスを以下に示します。

  • 複雑なレコードの外部構造を記述し、複雑なレコード・パーサと複雑なレコード・ライタを実装する複雑なレコード・マップ。

  • データを含むオブジェクトの構造を定義する生成された複雑なレコード・クラス。このオブジェクトを使用すれば、データ変換とルーティング・ルール条件内のデータを参照できます。

複雑なレコード・マップ・ビジネス・サービスは、受信データを読み取って解釈し、生成されたレコード・クラスのインスタンスであるメッセージを作成します。ビジネス・プロセスは、生成された複雑なレコード・クラスのインスタンスを読み取り、変更、または生成することができます。最後に、複雑なレコード・マップ・ビジネス・オペレーションは、インスタンス内のデータを使用して、複雑なレコード・マップを書式設定テンプレートとして送信データを書き込みます。複雑なレコード・マップ・クラスと生成された複雑なレコード・クラスの両方がデータを記述する階層構造を持っています。また、複雑なレコード・マップ・クラスと生成されたレコード・クラスは並列構造を持っています。これは、生成されたレコード・クラスが別の階層構造を持つことが可能な RecordMap クラスと違う点です。

管理ポータルで新しい複雑なレコード・マップを作成してから保存すると、EnsLib.RecordMap.ComplexMapOpens in a new tab クラスと Ens.RequestOpens in a new tab クラスを拡張するためのクラスが定義されます。生成されたレコード・クラスを定義するには、管理ポータルで [生成] をクリックする必要があります。これにより、EnsLib.ComplexGenerator クラス内の Generate()Opens in a new tab メソッドが呼び出されます。スタジオで作業している場合は、ComplexMap クラス定義をコンパイルしても生成されたレコード・クラス用のコードは作成されません。管理ポータルを使用するか、ターミナルまたはコードから ComplexGenerator.Generate() メソッドを呼び出す必要があります。生成されたクラスは、RecordMap.ComplexBatchOpens in a new tab クラスと Ens.RequestOpens in a new tab クラスを拡張します。

ComplexMap クラスは、RecordReference 要素によって指定されたレコードと RecordSequence 要素によって定義されたシーケンスを使用して ComplexBatch を定義する XData 定義内の複雑なレコード構造を定義します。既存のクラスの RECORDMAPGENERATED パラメータが 0 の場合は、ターゲット・クラスが複雑なレコード・マップ・フレームワークによって変更されません。したがって、すべての変更をプロダクション開発者が行う必要があります。

ComplexBatch クラスには、複雑なマップ定義内の以下の最上位要素に対応するプロパティが含まれています。

  • 指定された場合のヘッダ・レコード。このプロパティには、指定されたレコード・マップ用の生成されたレコード・クラスに設定された型が設定されます。

  • 指定されたレコード・マップ用の生成されたレコード・クラスに設定された型を持つレコード。または、レコードを繰り返すことが可能な場合は、型は生成されたレコード・クラスの配列に設定されます。

  • シーケンス用に定義されたクラスに設定された型を持つシーケンス。または、シーケンスを繰り返すことが可能な場合は、型はそのクラスの配列に設定されます。

  • 指定された場合のトレーラ・レコード。このプロパティには、指定されたレコード・マップ用の生成されたレコード・クラスに設定された型が設定されます。

クラスはシーケンスごとに定義されます。シーケンス・クラスは、ComplexSequenceOpens in a new tab クラスと %XML.AdaptorOpens in a new tab クラスを拡張します。また、シーケンス・クラスは、ComplexBatch クラスに対して定義されたパッケージとネームスペース内で定義されます。すべてのシーケンス・クラスが、他のシーケンス内に含まれている場合でもこのレベルのネームスペース内で定義されます。

各シーケンスには、その中のレコードとシーケンスに対応するプロパティが含まれています。

プロダクションでの複雑なレコード・マップの使用

複雑なレコードを使用するプロダクションを作成するには、次の手順を実行します。

  1. ヘッダとトレーラを含めて、複雑なレコードの部分ごとにレコード・マップを作成します。個別のレコード・マップの作成方法は、“レコード・マッパーの使用法” を参照してください。サンプル・ファイルを使用する場合は、個別のレコード・マップ内で定義している複雑なレコードの部分のみを含むサンプル・ファイルを作成する必要があることに注意してください。サンプル・ファイルには複雑なレコード全体を含めないようにする必要があります。

  2. 複雑なレコード・マッパーを使用して、複雑なレコードの構造を定義します。

  3. プロダクションを作成して、1 つ以上の組み込みの複雑なレコード・サービスおよびオペレーションを追加します。

  4. プロダクションがアプリケーション間で複雑なレコードを受け渡すだけの場合は、単純なルーティング・エンジン・プロセスを使用できます。しかし、プロダクションが複雑なレコードを別の複雑なレコードに変換する場合は、ルーティング・エンジン内にデータ変換を作成することになります。入力の複雑なレコードと出力の複雑なレコードの両方が同じ構造の場合は、ソース・フィールドとターゲット・フィールドをつなげる単純なデータ変換を作成できます。例えば、単純なデータ変換を使用して、区切りのあるレコードを含む複雑なレコードを、固定列レコードを含む複雑なレコードに変換することができます。ただし、入力の複雑なレコードと出力の複雑なレコードの構造が異なる場合は、データ変換とビジネス・プロセス言語 (BPL) プロセス内のどちらかにコードを追加する必要があります。

FeedbackOpens in a new tab