次の方法で共有


アプリケーション スイート レポート データ セットを展開する

コミュニティの関心グループが Yammer から Microsoft Viva Engage に移行されました。 Viva Engage コミュニティに参加し、最新のディスカッションに参加するには、「 Finance and Operations Viva Engage Community へのアクセスを要求する 」フォームに入力し、参加するコミュニティを選択します。

この記事では、レポート データ プロバイダー (RDP) クラスで X++ ビジネス ロジックを使用する既存のレポート データ セットを拡張する方法について説明します。

この記事では、レポート データ プロバイダー (RDP) クラスで X++ ビジネス ロジックを使用する既存のレポート データ セットを拡張することに重点を置いています。 ユーザー設定のデリゲート ハンドラーとテーブル拡張機能を使用して、より多くのフィールド データと計算を含めます。 アプリケーション スイートを重層化する必要はありません。 次に、標準のアプリケーション ソリューションを置き換えてデータをユーザーに提供する、カスタムのデザインを作成します。 次の図は、この記事で説明されている一般的なアプリケーションのカスタマイズを示しています。

データセットを拡張するための一般的なアプリケーションカスタマイズ ワークフローのスクリーンショット。

重要な考慮事項

このソリューションを適用する前に、次の考慮事項に注意してください。

  • RDP クラスを直接拡張することはできません。 ただし、プラットフォームは、標準のアプリケーションのビジネス ロジックを複製せずにデータ セットの拡張を有効にする拡張ポイントを提供します。

  • レポート データ セットを展開するには、2 つの方法を使用できます。 ソリューションに適した戦略を使用します。

    • データ処理ポスト ハンドラー – このメソッドは、 ProcessReport メソッドの完了後、およびデータ セットがレポート サーバーに返される前に、1 回だけ呼び出されます。 標準アプリケーション ソリューションによって生成される一時データ セットに対して一括更新を実行するには、このポスト ハンドラーに登録します。
    • イベントを挿入する一時テーブル – このメソッドは、一時テーブルに追加される各行に対して呼び出されます。 これは計算およびインラインの評価により適しています。 多くの結合操作と検索操作を含むコストの高いクエリは避けてください。
  • イベントハンドラーを使用して、メニュー項目を新しいレポート デザインにリダイレクトします。 イベント ハンドラーを使用して、アプリケーション レポート ソリューションのすべての側面をカスタマイズすることができます。 コントローラー クラスの PostHandler イベントを追加して、ユーザー ナビゲーションをカスタム レポート デザインに再ルーティングします。

レポート データ セットを展開

次のチュートリアルでは、「純粋な」拡張機能ベースのソリューションを使用して既存のアプリケーション データ セットを拡張するプロセスについて説明します。 このソリューションには、Fleet Management アプリケーション用のカスタム レンタル リスト レポートが含まれています。 新しいレポートには、レンタルの詳細にさらにレンタル料金データが含まれています。 アプリケーションのカスタマイズ内容は、拡張モデルで定義されます。 次の図は、標準デザインとカスタム ソリューションを示しています。

(標準デザイン) の前に

カスタマイズ前の標準設計のスクリーンショット。

変更後 (カスタム ソリューション)

カスタマイズ後のカスタム ソリューションのスクリーンショット。

  1. アプリケーション カスタマイズの新しいモデルを作成します。 拡張モデルに関する詳細については、 拡張機能およびオーバーレイによるカスタマイズ を参照してください。 この例では、フリート管理拡張モデルにカスタム レポートを追加します。

  2. Microsoft Visual Studio で、新しいプロジェクトを作成します。 プロジェクトが拡張モデルに関連付けられていることを確認します。 次の図はプロジェクト設定を示します。

    Visual Studio のプロジェクト設定のスクリーンショット。

  3. カスタム レポート データを格納するテーブル拡張機能を追加します。 RDP クラスが設定する TmpFMRentalsByCust データ セットの一時キャッシュを検索し、モデルに拡張機能を作成します。 レポート サーバーのデータを格納するフィールドを定義し、[ 保存] を選択して変更を保存します。 次の図は、この例で必要なテーブル拡張機能を示しています。

    この例のテーブル拡張機能のスクリーンショット。

  4. プロジェクトに、カスタム レポートを追加します。 カスタム デザインは、標準的なソリューションによく似ています。 そのため、 フリート管理拡張機能 モデルで既存のアプリケーション レポートを複製し、カスタム タイトルと Rental Charges コンテナー内の別のテキスト ボックスが含まれるようにレポート デザインを更新できます。

  5. レポートの名前を変更して、わかりやすい名前にします。 この例では、カスタム レポートの FERentalsByCustomer の名前を変更し、標準のソリューションと区別します。

  6. レポート データ セットの参照を復元します。 レポート デザイナーを開き、データセット コレクションを展開し、FMRentalsByCustDS という名前のデータ セットを右クリックして、[復元] を選択します。 データ セットが拡張され、新しく導入された列が含まれます。 したがって、これらの列は、レポート デザイナーで使用できるようになりました。

  7. レポート デザインのカスタマイズ デザイナーは、カスタム ソリューションを作成するために使用できる自由形式のデザイン サーフェスを提供します。 次の図は、この例で使用されるカスタム デザインを示しています。

    この例のカスタム デザインのスクリーンショット。

  8. 新しいレポート ハンドラー (X++) クラスをプロジェクトに追加します。 クラスに、それが既存のアプリケーション レポートのハンドラーであることを適切に表す名前を付けます。 この例では、クラスの FERentalsByCustomerHandler の名前を変更し、他のレポート ハンドラーと区別します。

  9. PostHandler メソッドを追加して、カスタム レポートの使用を開始します。 この例では、次のコードを使用して標準ソリューション FMRentalsByCustController のコントローラー クラスを展開します。

    class FERentalsByCustomerHandler
    {
        [PostHandlerFor(classStr(FMRentalsByCustController), staticMethodStr(FMRentalsByCustController, construct))]
        public static void ReportNamePostHandler(XppPrePostArgs arguments)
        {
            FMRentalsByCustController controller = arguments.getReturnValue();
            controller.parmReportName(ssrsreportstr(FERentalsByCustomer, Report));
        }
    }
    

    アプリケーションのユーザー ナビゲーションがカスタム レポート ソリューションに再ルーティングされるようになりました。 レポート サーバーにカスタム レポートを配置し、アプリケーションがそれを使用していることを確認するには少し時間がかかります。 この時点で、手順 3 で導入したユーザー設定フィールドを設定するビジネス ロジックを追加するだけで済みます。 次の手順では、ソリューションに適したデータ セット拡張の方法を選択する必要があります。

  10. X++ ビジネス ロジックを追加して、カスタム フィールド データを設定します。 ソリューションを必要とする変換のタイプに適したデータの処理方法を選択します。

    • オプション 1: データ処理ポストハンドラーを追加します。 標準ソリューションの結果セットに対して 1 つのパスを使用する一括挿入操作にはこの手法を適用します。 テーブル参照を使用してデータ セットを拡張するコードを次に示します。

      class FERentalsByCustomerHandler
      {
          [PostHandlerFor(classStr(FMRentalsByCustDP), methodstr(FMRentalsByCustDP, processReport))]
          public static void TmpTablePostHandler(XppPrePostArgs arguments)
          {
              FMRentalsByCustDP dpInstance = arguments.getThis() as FMRentalsByCustDP;
              TmpFMRentalsByCust tmpTable = dpInstance.getTmpFMRentalsByCust();
              FMRentalCharge chargeTable;
              ttsbegin;
              while select forUpdate tmpTable
              {
                  select * from chargeTable where chargeTable.RentalId == tmpTable.RentalId;
                  tmpTable.ChargeDesc = chargeTable.Description;
                  tmpTable.update();
              }
              ttscommit;
          }
      }
      
    • オプション 2: イベントを挿入する一時テーブルを追加します。 この手法を行ごとの計算に適用します。 テーブル参照を使用してデータ セットを拡張するコードを次に示します。

      class FERentalsByCustomerHandler
      {
          [DataEventHandlerAttribute(tableStr(TmpFMRentalsByCust), DataEventType::Inserting)]
          public static void TmpFMRentalsByCustInsertEvent(Common c, DataEventArgs e)
          {
              TmpFMRentalsByCust tempTable = c;
              FMRentalCharge chargeTable;
              // update the value of the 'ChargeDesc' column during 'insert' operation
              select * from chargeTable where chargeTable.RentalId == tempTable.RentalId
              && chargeTable.ChargeType == tempTable.ChargeType;
              tempTable.ChargeDesc = chargeTable.Description;
          }
      }
      

レポート データ セットの展開が完了しました。 アプリケーションをコンパイルすると、拡張モデルで定義されているレポート クラス ハンドラーで定義したカスタム X++ ビジネス ロジックを使用して、ユーザー ナビゲーションが新しいレポート デザインに再ルーティングされます。