3

プラットフォーム: SoftwareAG WebMethods 8.2 問題: 2 つの DocumentList があります。それらの 1 つは XOPObjects と他の文字列を含みます。XOPObject を String に変換し、それを他の DocList の対応する String フィールドにコピーする必要があります。何が起こるのですか?何もない。XOPObject の base64string が適切に生成されている間、String フィールドはエントリのままです。

指定された DocList:A (XOP を含むソース) DocList:B (文字列フィールドを含むターゲット) で実行された手順

 1. Loop over A
 2. Create Base64String from XOPObject using pub.soap.utils:getXOPObjectContent
 3. Call pub.flow:debugLog to check if the base64String is generated
 4. Generate index variable from $iteration with pub.math:subtractInts as index:=$iteration-1
 5. Perform map step from base64String to B's String field with index set to %index%
 6. After loop
 7. pub.xml:documentToXmlString to generate xml representation of the B document
 8. pub.flow:debugLog
 9. Nothing is in the String field...

ここで何がうまくいかないのですか?

4

3 に答える 3

1

webMethods Integration Server フロー サービスでは、反復するリストを識別するための 2 つのプロパティがループに含まれます。必須の入力配列とオプションの出力配列です。

ループ ステップが機能する方法は、入力配列と出力配列のアイテムに加えられた変更のみを保持することです。パイプライン内の他のリストの項目を変更すると、それらの変更はループ ステップの終了時に失われます。これがまさにその仕組みです。

webMethods Developer User's Guide の198 ページからの引用:

入力配列の指定

LOOP ステップでは、LOOP 内の 1 つ以上のステップへの入力として使用される個々の要素を含む入力配列を指定する必要があります。実行時に、LOOP ステップは、指定された配列内の各メンバーに対してループの 1 つのパスを実行します。たとえば、発注書に格納されている各明細に対して LOOP を実行する場合、注文の明細が格納されているドキュメント リストを LOOP の入力配列として使用します。

LOOP ステップの [プロパティ] パネルで、入力配列の名前を指定します。指定する配列は、次のデータ型のいずれかです。 * 文字列リスト * 文字列テーブル * ドキュメント リスト * オブジェクト リスト

LOOP ステップは、入力配列で指定された配列のメンバーごとに 1 回実行されます。

フローを設計するときは、ループ内のサービスは指定された入力配列の個々の要素に対して動作するため、配列全体ではなく、配列の要素を入力として受け取るように設計する必要があることに注意してください。

ループ ステップのプロパティ

たとえば、Item、Qty、および UnitPrice という名前の子を含む LineItems というドキュメント リストに対して LOOP を実行する場合、LOOP ステップの入力配列として LineItems を指定しますが、ループ内のサービスは LineItems の個々の要素を取得します (たとえば、Item、Qty、UnitPrice など) を入力として使用します。

LOOP ステップからの出力の収集

LOOP ステップが出力変数を生成する場合、サーバーはその出力をパイプラインの配列に収集できます。

これを行うには、Output 配列パラメーターを使用して、サーバーがループの反復ごとに出力を収集する配列変数の名前を指定します。たとえば、ループが発注書の各品目の在庫状況をチェックし、実行するたびに InventoryStatus という文字列を生成する場合、InventoryStatus を Output 配列の値として指定します。実行時に、サーバーは InventoryStatus をループの各反復からの出力を含む配列変数に自動的に変換します。

ループの各パスから出力を収集するには、反復ごとにサーバーに収集させる出力変数の名前を指定します。

これらすべてを考えると、実際に問題に取り組むにはいくつかの異なる方法があります。

  1. ループ ステップの出力配列プロパティで、2 番目のドキュメント リスト変数名を指定します。これを行うと、ループ ステップの終了時に 2 番目のドキュメント リストに加えた変更が保持されます。

  2. ループ ステップの前のマップ ステップで最初のドキュメント リスト (XOPObject オブジェクトを含むもの) のコピーを取得し、元の代わりにコピーをループして、コピーのアイテムをインラインで変更します。

  3. pub.list:appendToDocumentListまたはを使用pub.list:appendToStringListして、ループ ステップで新しいドキュメント リストまたは文字列リストをそれぞれ作成します。これにはより多くのコードが必要であり、出力リストに入力リスト内のすべてのアイテムのアイテムを含める必要があるため、この場合は必要ありませんが、入力リストアイテムをフィルタリングする場合に役立ちます (つまり、結果の出力リストは入力リストのサブセットである)。

于 2014-02-14T23:46:21.197 に答える
0

おそらく、ループ出力配列として文字列リストを生成し、ループの外側で、出力文字列リストを B のフィールドにマップできますか?

于 2015-06-11T12:20:14.833 に答える
0

あなたがまだこれに対する答えを探しているかどうかはわかりません。私はかつて同じ問題を抱えていたことを覚えています。この問題は、オブジェクト タイプと文字列の間のマッピングが原因で発生します。したがって、マップ内では、実行時に base64String が含まれると予想されるため、オブジェクト タイプを文字列にマップします。

直接マッピングする代わりに、ターゲット doc リストの変数名を置き換えることで試すことができます。

于 2014-09-17T14:49:59.910 に答える