このセクションでは、サブマップの使用についての次のヒントを説明します。
サブマップの概要については、"サブマップを使用した変換"を参照してください。
マップに、サブマップを呼び出す条件を判別するプログラミング・ロジックが必要な場合がよくあります。時には、呼び出されるサブマップが true となる必要のある条件があります。このロジックは、サブマップの宛先ビジネス・オブジェクトを含む属性内で、runMap() メソッドを呼び出す前に、メイン・マップに渡されます。 これらの条件を「サブマップ」ダイアログの「条件」領域に入力すると (図 21 を参照)、Map Designer Express によりこれらの条件が runMap() 呼び出しを囲む if 文に追加されます。
ガイドライン: これらの条件を入力する場合は、以下の点に留意してください。
例: 図 20 に示すビジネス・オブジェクトでは、OrderLine ビジネス・オブジェクトは子ビジネス・オブジェクトである DelSched という属性を持ちます。サブマップ条件で、その属性を次のようにして参照できます。
currentBusObj_For_ObjOrder_OrderLine_DelSched
「サブマップ」ダイアログの「条件」領域に次のサブマップ条件を入力して、同じビジネス・オブジェクトの TransportType 属性の値がストリング AIR と等しい場合にのみ DelSched ビジネス・オブジェクトでサブマップを実行します。
currentBusObj_For_ObjOrder_OrderLine_DelSched.getString( "TransportType").equals("AIR")
次の条件は、OrderLine LinePrice 属性値が $10,000.00 より大きい場合にのみ OrderLine DelSched 属性のサブマップを実行します。
ObjOrderLine.getFloat["LinePrice") > 10000.00
例: 次のマップの場合、マッピングは SAP_CustPartnerFunctions.PartnerId が SAP_CustomerMaster.CustomerId と等しくない 場合にのみ 行われるので、条件が必要です。
SAP_CustomerMaster.SAP_CustSalesAreaData.SAP_ CustPartnerFunctions[n]
から次へ
Customer.RelatedCustomerRef
次のセクションでは、マップ呼び出しを作成する手順について説明します。
Sub_SaCwCustCreditAreaData サブマップを作成するには、Map Designer Express で次の手順を実行します。
SAP_CustPartnerFunctions のソース・ビジネス・オブジェクトと RelatedCustomerRef の宛先ビジネス・オブジェクトを指定します。マップを Sub_SaCwCustPartners と命名します。
すべてが正しいと、次のメッセージが表示されます。
マップ検証が正常に終了しました。 Native Map: Code generation succeeded.
Sub_SaCwCustCreditAreaData サブマップを呼び出すには、Map Designer Express で次の手順を実行します。
単純な条件の場合は、「サブマップ」ダイアログ・ウィンドウの「条件」領域に条件を入力できます。
currentBusObj_For_ObjSAP_CustomerMaster_SAP_CustSalesAreaData_ SAP_CustPartnerFunctions.getString("PartnerId")).equals( parent_custid)
Map Designer Express により、サブマップ呼び出しに先行する if 文に条件が追加されて、サブマップ呼び出しのコードが生成されます。
「条件」フィールドをブランクのままで「OK」をクリックすると、Map Designer Express により条件なしでサブマップを呼び出すコードが生成されます。コードを明示的に追加する方法については、ステップ 2 に進みます。
Activity Editor にアクセスするには、「規則」列を再度ダブルクリックして、「サブマップ」ダイアログの「コードを表示」プッシュボタンをクリックします。
RelatedCustomerRef
属性について、条件を含むコードは次のとおりです。
{ BusObjArray srcCollection_For_ObjSAP_CustomerMaster_ SAP_CustSalesAreaData_ SAP_CustPartnerFunctions = ObjSAP_CustomerMaster.getBusObjArray( "SAP_CustSalesAreaData.SAP_CustPartnerFunctions"); String parent_custid = ObjSAP_CustomerMaster.getString("CustomerId"); // // LOOP ONLY ON NON-EMPTY ARRAYS // ----------------------------- // // Perform the loop only if the source array is non-empty. // if ( (srcCollection_For_ObjSAP_CustomerMaster_SAP_CustSalesAreaData_ SAP_CustPartnerFunctions != null) && (srcCollection_For_ObjSAP_CustomerMaster_SAP_CustSalesAreaData_SAP _CustPartnerFunctions.size() > 0)) { int currentBusObjIndex_For_ObjSAP_CustomerMaster_SAP_CustSalesAreaData_SAP _CustPartnerFunctions; int lastInputIndex_For_ObjSAP_CustomerMaster_SAP_CustSalesAreaData_SAP _CustPartnerFunctions = srcCollection_For_ObjSAP_CustomerMaster_SAP_CustSalesAreaData_SAP _CustPartnerFunctions.getLastIndex(); for (currentBusObjIndex_For_ObjSAP_CustomerMaster_SAP_CustSalesAreaData_SAP _CustPartnerFunctions = 0; currentBusObjIndex_For_ObjSAP_CustomerMaster_SAP_CustSalesAreaData_SAP _CustPartnerFunctions <= lastInputIndex_For_ObjSAP_CustomerMaster_ SAP_CustSalesAreaData_SAP_CustPartnerFunctions; currentBusObjIndex_For_ObjSAP_CustomerMaster_SAP_CustSalesAreaData_SAP _CustPartnerFunctions++) { BusObj currentBusObj_For_ObjSAP_CustomerMaster_SAP_CustSalesAreaData_SAP _CustPartnerFunctions = (BusObj) (srcCollection_For_ObjSAP_CustomerMaster_SAP_CustSalesAreaData_SAP _CustPartnerFunctions.elementAt(currentBusObjIndex_For_ObjSAP_CustomerMaster_SAP _CustSalesAreaData_SAP_CustPartnerFunctions)); // // INVOKE MAP ON VALID OBJECTS // --------------------------- // // Invoke the map only on those child objects that meet certain // criteria. // if (currentBusObj_For_ObjSAP_CustomerMaster_SAP_CustSalesAreaData_SAP _CustPartnerFunctions != null) { if (! (currentBusObj_For_ObjSAP_CustomerMaster_SAP_CustSalesAreaData_SAP _CustPartnerFunctions.getString("PartnerId")).equals(parent_custid)) { currentBusObj_For_ObjSAP_CustomerMaster_SAP_CustSalesAreaData_SAP _CustPartnerFunctions.setVerb(ObjSAP_CustomerMaster.getVerb()); BusObj[] _cw_inObjs = { currentBusObj_For_ObjSAP_CustomerMaster_SAP_CustSalesAreaData_SAP _CustPartnerFunctions }; try { BusObj[] _cw_outObjs = DtpMapService.runMap("Sub_SaCwCustPartners", "CwMap", _cw_inObjs, cwExecCtx); ObjCustomer.setWithCreate("RelatedCustomerRef", _cw_outObjs[0]); } catch (MapNotFoundException me) { logError(5502, "Sub_SaCwCustPartners"); throw new MapFailureException ("Submap not found"); } } } } }
Map Designer Express を使用すると、「サブマップ」ダイアログでのサブマップ呼び出しを自動的に生成できます。しかし、式ビルダーを使用してサブマップ呼び出しを生成することもできます。 マップ呼び出しをコーディングすると、Map Designer Express によるグラフィックでのサポートよりも変化のある操作を作成できます。例えば、子ビジネス・オブジェクトを含まない属性の値を指定するサブマップ、または複数の入力および出力のあるサブマップを使用できます。
式ビルダーを使用してサブマップ呼び出しを生成するには、次の手順を行います。
結果: Map Designer Express により、サブマップとして指定するマップを呼び出すために必要な Java コードが生成されます。これは、「式ビルダー」ウィンドウの上部の「コード」領域に表示されます。
プレースホルダーの InObj、InAttrName、OutObj、および OutAttrName を次の正しい名前で置き換えます。
結果: Activity Editor の挿入ポイントにコードが挿入されます。
異なるタイプのソース・ビジネス・オブジェクトを宛先ビジネス・オブジェクトにマップするには、多対 1 のサブマップを作成する必要があります。
例: このようなマッピングは次のマッピングの場合に必要になります。
SAP_CustCreditControlAreaData[n] から次へ Customer.CustomerInformation.CustomerCreditData[0]. CreditAreaCreditData[n]
属性の一部が SAP_CustomerMaster と SAP_CustCreditCentralData からマップされる必要があります。
タイプが異なる複数のソース・ビジネス・オブジェクトを変換するには、以下の主要な手順を実行します。
異なるタイプのソース子ビジネス・オブジェクトを 1 つの宛先子オブジェクトにマップするサブマップを作成するには、複数のソース・ビジネス・オブジェクトと 1 つの宛先ビジネス・オブジェクトでマップを作成します。このマップには、宛先オブジェクトの対応する属性への異なるソース・オブジェクト内の属性の変換を含みます。
多対 1 のサブマップを作成するには、Map Designer Express で次の手順を実行します。
SAP_CustCreditControlAreaData、SAP_CustCreditCentralData、および SAP_CustomerMaster ビジネス・オブジェクトをマッピング画面の左方にドラッグし、CreditAreaCreditData を右方にドラッグします。新しいマップには、3 つのソース・オブジェクトと 1 つの宛先オブジェクトがあります。
推奨: サブマップ名はプレフィックス「Sub_」で始めてください。例: Sub_SaCwCustCreditAreaData
このサブマップで関係管理が実行されない限り、動詞の設定にどのソース・オブジェクトを使用しても問題ありません。このサブマップを呼び出す場合は、特定の同じオブジェクトの動詞を設定してから、サブマップにそのオブジェクトを渡してください。ソース・オブジェクトの 1 つがソース親オブジェクトで、かつその動詞を使用する場合は、動詞を設定してからこのオブジェクトをサブマップに渡す必要はありません。すでに関連する動詞を持っています。
結果: すべてが正しいと、次のメッセージが表示されます。
マップ検証が正常に終了しました。 Native Map: Code generation succeeded.
多対 1 のサブマップを呼び出すには、メイン・マップから、サブマップの宛先ビジネス・オブジェクトを保持する属性で、runMap() メソッドを使用して呼び出します。 Sub_SaCwCustCreditAreaData サブマップを呼び出すには、Map Designer Express で次の手順を実行します。
Sub_SaCwCustCreditAreaData サブマップの場合、メイン・マップは CreditAreaCreditData ビジネス・オブジェクトを属性として含むマップです。
CreditAreaCreditData 属性に関連した変換規則列をダブルクリックして、Activity Editor を開き、次のコードを入力します。
{ BusObj srcobj1 = ObjSAP_CustomerMaster; BusObj srcobj2 = (BusObj) (ObjSAP_CustomerMaster.getBusObj("SAP_CustCreditCentralData")); BusObjArray srcobj3 = (BusObjArray)(ObjSAP_CustomerMaster.get( "SAP_CustCreditControlAreaData")); // // INVOKE MAP ON VALID OBJECTS // --------------------------- // // Invoke the map only on those child objects that meet certain // criteria. // int i = 0; // When checking all 3 source objects, != null might be not required if (srcobj1 != null && srcobj2 != null & srcobj3 != null) { for (i = 0; i < srcobj3.size(); i++) { BusObj[] _cw_inObjs = new BusObj[3]; // set verb for the one of the following objects _cw_inObjs[0] = srcobj1; _cw_inObjs[1]= srcobj2; _cw_inObjs[2] = srcobj3.elementAt(i); try { BusObj[] _cw_outObjs = DtpMapService.runMap( "Sub_SaCwCustCreditAreaData", "CwMap", _cw_inObjs, cwExecCtx); ObjCustomer.setWithCreate( "CustomerInformation.CustomerCreditData[0].CreditAreaCreditData[" + i + "]", _cw_outObjs[0]); } catch (MapNotFoundException me) { logError(5502, "Sub_SaCwCustCreditAreaData"); throw new MapFailureException ("Submap not found"); } } } }
logInfo("in for loop");
または
trace("in for loop");
すべてが適切に動作し、どのソース・オブジェクトも null でない場合、ソース子オブジェクトのインスタンスが存在する回数だけ in for loop メッセージが InterChange Server Express ログ・ファイルに出力されます。