サブマップの使用の続き

このセクションでは、サブマップの使用についての次のヒントを説明します。

サブマップの概要については、"サブマップを使用した変換"を参照してください。

サブマップ呼び出し時の条件の指定

マップに、サブマップを呼び出す条件を判別するプログラミング・ロジックが必要な場合がよくあります。時には、呼び出されるサブマップが 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.PartnerIdSAP_CustomerMaster.CustomerId等しくない 場合にのみ 行われるので、条件が必要です。

SAP_CustomerMaster.SAP_CustSalesAreaData.SAP_
 CustPartnerFunctions[n]
 

から次へ

Customer.RelatedCustomerRef
 

次のセクションでは、マップ呼び出しを作成する手順について説明します。

サブマップの作成手順

Sub_SaCwCustCreditAreaData サブマップを作成するには、Map Designer Express で次の手順を実行します。

  1. メイン・マップを閉じて、新規サブマップを開始します。

    SAP_CustPartnerFunctions のソース・ビジネス・オブジェクトと RelatedCustomerRef の宛先ビジネス・オブジェクトを指定します。マップを Sub_SaCwCustPartners と命名します。

  2. "宛先ビジネス・オブジェクトの動詞の設定"の説明に従って動詞を設定します。
  3. 個々の属性を、"標準の属性変換の指定""その他の属性の変換方法"の説明に従って、マップします。
  4. 「ファイル」メニューから「コンパイル」を選択して、サブマップをコンパイルします。

    すべてが正しいと、次のメッセージが表示されます。

    マップ検証が正常に終了しました。
     Native Map: Code generation succeeded.
     

サブマップの呼び出し手順

Sub_SaCwCustCreditAreaData サブマップを呼び出すには、Map Designer Express で次の手順を実行します。

  1. メイン・マップに戻り、「ダイアグラム」タブで Ctrl キーを押したまま SAP_CustPartnerFunctionsRelatedCustomerRef の上へドラッグします。宛先ビジネス・オブジェクトの「規則」列のリストから「サブマップ」をダブルクリックします。「サブマップ」ダイアログで SaCwCustPartners マップを選択して「OK」をクリックします。

    単純な条件の場合は、「サブマップ」ダイアログ・ウィンドウの「条件」領域に条件を入力できます。

    currentBusObj_For_ObjSAP_CustomerMaster_SAP_CustSalesAreaData_
     SAP_CustPartnerFunctions.getString("PartnerId")).equals(
     parent_custid)
     

    Map Designer Express により、サブマップ呼び出しに先行する if 文に条件が追加されて、サブマップ呼び出しのコードが生成されます。

    「条件」フィールドをブランクのままで「OK」をクリックすると、Map Designer Express により条件なしでサブマップを呼び出すコードが生成されます。コードを明示的に追加する方法については、ステップ 2 に進みます。

  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");
                       }
                    }
                 }
              }
     }
     
  3. サブマップの呼び出しを追加したら、メイン・マップを再コンパイルします。

式ビルダーを使用したサブマップの呼び出し

Map Designer Express を使用すると、「サブマップ」ダイアログでのサブマップ呼び出しを自動的に生成できます。しかし、式ビルダーを使用してサブマップ呼び出しを生成することもできます。 マップ呼び出しをコーディングすると、Map Designer Express によるグラフィックでのサポートよりも変化のある操作を作成できます。例えば、子ビジネス・オブジェクトを含まない属性の値を指定するサブマップ、または複数の入力および出力のあるサブマップを使用できます。

式ビルダーを使用したサブマップの呼び出し手順

式ビルダーを使用してサブマップ呼び出しを生成するには、次の手順を行います。

  1. 「テーブル」タブまたは「ダイアグラム」タブで変換規則をダブルクリックして、Java 表示の Activity Editor を表示させます。
  2. Activity Editor の任意の場所を右マウス・ボタンでクリックして、コンテキスト・メニューから「式ビルダー」を選択します。
  3. 式ビルダーで、次の操作をします。



    図 91. サブマップ呼び出しのコーディング

    結果: Map Designer Express により、サブマップとして指定するマップを呼び出すために必要な Java コードが生成されます。これは、「式ビルダー」ウィンドウの上部の「コード」領域に表示されます。

  4. 生成されたコードで、入力および出力プレースホルダーをサブマップの実際の現行ソースと宛先ビジネス・オブジェクト名で置き換えて、サブマップが戻す値を処理するコードを作成します。

    プレースホルダーの InObjInAttrNameOutObj、および OutAttrName を次の正しい名前で置き換えます。

  5. 「OK」をクリックして、式ビルダーを閉じます。

    結果: Activity Editor の挿入ポイントにコードが挿入されます。

異なるタイプのビジネス・オブジェクトのサブマップへの引き渡し

異なるタイプのソース・ビジネス・オブジェクトを宛先ビジネス・オブジェクトにマップするには、多対 1 のサブマップを作成する必要があります。

例: このようなマッピングは次のマッピングの場合に必要になります。

SAP_CustCreditControlAreaData[n]
  
 から次へ
 Customer.CustomerInformation.CustomerCreditData[0].
 CreditAreaCreditData[n]
 

属性の一部が SAP_CustomerMasterSAP_CustCreditCentralData からマップされる必要があります。

タイプが異なる複数のソース・ビジネス・オブジェクトを変換するには、以下の主要な手順を実行します。

  1. 多対 1 のサブマップの作成手順: 複数のソース・ビジネス・オブジェクト内の必要な属性を単一宛先ビジネス・オブジェクト内の属性に変換する、多対 1 サブマップを作成します。
  2. 多対 1 のサブマップの呼び出し手順: メイン・マップから、サブマップの宛先ビジネス・オブジェクトを保持する属性でこのサブマップを呼び出します。

多対 1 のサブマップの作成手順

異なるタイプのソース子ビジネス・オブジェクトを 1 つの宛先子オブジェクトにマップするサブマップを作成するには、複数のソース・ビジネス・オブジェクトと 1 つの宛先ビジネス・オブジェクトでマップを作成します。このマップには、宛先オブジェクトの対応する属性への異なるソース・オブジェクト内の属性の変換を含みます。

多対 1 のサブマップを作成するには、Map Designer Express で次の手順を実行します。

  1. メイン・マップを閉じて、新規マップを開始します。新しいマップには、少なくとも 2 つのソース・オブジェクトと 1 つの宛先オブジェクトが必要です。

    SAP_CustCreditControlAreaDataSAP_CustCreditCentralData、および SAP_CustomerMaster ビジネス・オブジェクトをマッピング画面の左方にドラッグし、CreditAreaCreditData を右方にドラッグします。新しいマップには、3 つのソース・オブジェクトと 1 つの宛先オブジェクトがあります。

  2. サブマップを保管します。

    推奨: サブマップ名はプレフィックス「Sub_」で始めてください。例: Sub_SaCwCustCreditAreaData

  3. 宛先オブジェクトの動詞を、"宛先ビジネス・オブジェクトの動詞の設定"の説明に従って設定します。

    このサブマップで関係管理が実行されない限り、動詞の設定にどのソース・オブジェクトを使用しても問題ありません。このサブマップを呼び出す場合は、特定の同じオブジェクトの動詞を設定してから、サブマップにそのオブジェクトを渡してください。ソース・オブジェクトの 1 つがソース親オブジェクトで、かつその動詞を使用する場合は、動詞を設定してからこのオブジェクトをサブマップに渡す必要はありません。すでに関連する動詞を持っています。

  4. 個々の属性を、"標準の属性変換の指定""その他の属性の変換方法"の説明に従って、マップします。
  5. 「ファイル」メニューから「コンパイル」を選択して、サブマップをコンパイルします。

    結果: すべてが正しいと、次のメッセージが表示されます。

    マップ検証が正常に終了しました。
     Native Map: Code generation succeeded.
     

多対 1 のサブマップの呼び出し手順

多対 1 のサブマップを呼び出すには、メイン・マップから、サブマップの宛先ビジネス・オブジェクトを保持する属性で、runMap() メソッドを使用して呼び出します。 Sub_SaCwCustCreditAreaData サブマップを呼び出すには、Map Designer Express で次の手順を実行します。

  1. メイン・マップを開きます。

    Sub_SaCwCustCreditAreaData サブマップの場合、メイン・マップは CreditAreaCreditData ビジネス・オブジェクトを属性として含むマップです。

  2. サブマップの宛先オブジェクトの変換規則列をダブルクリックして、Activity Editor を開きます。

    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");
              }
           }
        }
     }
     
  3. マップの実行を追跡するには、for ループ内で logInfo() メソッドを使用します。 コードは次のとおりです。
    logInfo("in for loop");
     

    または

    trace("in for loop");
     
  4. サブマップの呼び出しを追加したら、メイン・マップを再コンパイルします。

すべてが適切に動作し、どのソース・オブジェクトも null でない場合、ソース子オブジェクトのインスタンスが存在する回数だけ in for loop メッセージが InterChange Server Express ログ・ファイルに出力されます。

Copyright IBM Corp. 2004