Dynamics CRM 2011 レポート開発 : 金額の合計について

みなさん、こんにちは。

今日は最近複数のお客様からお問い合わせをいただいた、レポートに
ついてのトピックをお届けします。また関連した開発ネタも紹介します。

前提

グローバル企業では、取引先企業ごとに利用する通貨が異なったり、また
関連する営業案件で利用する通貨が異なる場合が多々あります。その場合
レポートウィザードで作成したレポートにおいて、金額フィールドの合計欄を
出力した場合、以下のような結果を見ることになります。

[レポート列の定義]

image

[レポート列の結果]

image

この例では、営業案件が 2 レコードあり、初めの案件では日本円が、後の
案件ではUS ドルが指定されています。ただし合計欄は日本円表示です。

合計欄の集計方法

合計欄の数値
各レコードの金額は、レコードに紐づいているものを利用しています。ただ、
各レコードは指定された通貨での金額の他、基本通貨での金額も保持して
おり、合計には基本通貨の合計が利用されます。

上記の例の場合、初めのレコードは日本円であるため、22,000 が基本通貨
の金額であり、2 つ目のレコードは 833,333 が基本通貨の金額です。よって
合計が 855,333 となります。

合計欄の金額フォーマット
合計欄の金額フォーマットは、システム設定の形式設定を反映します。よって
組織の設定を 「英語 (英国) 」 に変更した場合、同様のレポートでも以下の
表示となります。

image

レポートのカスタマイズ準備

では今回のメイントピックである、レポートのカスタマイズを紹介します。
レポートをカスタマイズするには、以下のツールが必要です。

SQL Server 2008 Business Intelligence Developer Studio (BIDS)
Microsoft Dynamics CRM 2011 Report Authoring 拡張

BIDS は SQL Server 2008 のインストール DVD に付属しています。後者の
ツールは、こちら よりダウンロード可能です。

レポート定義ファイルの取得

上記ツールを準備したら、以下の手順で作成したレポートを取得します。

1. Microsoft Dynamics CRM 2011 の画面よりレポートの一覧を表示します。
2. カスタマイズしたいレポートにチェックして、編集ボタンをクリックします。
3. 操作メニューよりレポートのダウンロードをクリックします。

image

4. 任意の場所にレポートを保存します。

レポート定義ファイル (rdl) の読み込み

1. BIDS を起動し、新しいプロジェクトを作成します。
2. レポートサーバープロジェクトテンプレートを選択し、OK をクリックします。
3. ソリューション エクスプローラよりレポートフォルダを右クリック | 追加 |
既存の項目を選択し、ダウンロードした rdl ファイルを指定します。
4. 追加されたレポートをダブルクリックします。画面中央にレポートが
表示されます。

合計欄のカスタマイズ

まずは現在の合計欄を確認します。

1. estimatedvalue 列の 2 行目にある、 <<式>> をダブルクリックします。

image

2. プレースホルダーのプロパティ画面が開いたら、値の欄右端にある
ボタンをクリックします。

image

3. 以下の式が確認できます。ここの値を変更することで表示をカスタマイズ
することができます。

=CDbl(Sum(Fields!estimatedvalue_baseValue.Value)).ToString("C2", Microsoft.Crm.Reporting.RdlHelper.ReportCultureInfo.GetCultureInfo(Parameters))

カスタマイズ例 1

上記式の前半部分は、見積もり金額のベース通貨の値の集計です。
またその結果を ToString メソッドを利用して文字列化していますが、
その際にフォーマットを指定して金額表示しています。

フォーマットに指定されている C2 は金額表示で精度が 2 という意味です。
また第 2 引数ではフォーマットに利用するカルチャを指定しますが、ここでは
組織のフォーマットを取得しています。よってシステム設定の形式を変える
ことで、表示も連動して変わっていました。

ここでは組織の形式に依存することなく、常に日本円になるように、また
小数点以下が出ないように変更してみます。

=CDbl(Sum(Fields!estimatedvalue_baseValue.Value)).ToString("C", new System.Globalization.CultureInfo("ja-JP"))

式を変更したら、OK でプロパティを閉じた後、プレビューをクリックします。
結果は意図した通りです。

image

カスタマイズ例 2

次により複雑なカスタマイズを行います。このシナリオでは、ユーザーに
合計欄で表示したい通貨を事前に選択させて、レポートを実行します。

まず以下の手順で新しいデータセットを作成します。

1. デザイン画面に戻った後、レポート データビュー内、データセットを
右クリックし、データセットの追加をクリックします。
2. 名前に Currency と入力し、「レポートに埋め込まれたデータ
セットを使用します。」 にチェックを入れます。
3. データソースより CRM を選択し、クエリ デザイナーをクリックします。
4. 以下の FetchXML を貼り付け、実行ボタンをクリックして結果を確認します。

<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">
  <entity name="transactioncurrency">
    <attribute name="transactioncurrencyid" />
    <attribute name="currencyname" />
    <order attribute="currencyname" descending="false" />
  </entity>
< /fetch>

5. OK ボタンをクリックします。

次にレポートパラメーターを追加します。

1. レポート データビュー内、パラメーターを右クリックし、パラメーターの
追加をクリックします。
2. 名前に Currency、プロンプトに 「通貨を選択してください。」  と入力します。
3. 使用できる値を選択し、クエリから値を取得にチェックを入れます。
4. 以下の様に選択します。

image

5. OK をクリックします。

次にもう 1 つデータセットを追加します。

1. レポート データビュー内、データセットを右クリックし、データセットの
追加をクリックします。
2. 名前に CurrencyDetail と入力し、「レポートに埋め込まれたデータ
セットを使用します。」 にチェックを入れます。
3. データソースより CRM を選択し、クエリ デザイナーをクリックします。
4. 以下の FetchXML を貼り付け、OK をクリックします。この FetchXML は
パラメータ化されており、先ほど追加したパラメータの値を利用します。

<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">
  <entity name="transactioncurrency">
    <attribute name="transactioncurrencyid" />
    <attribute name="currencysymbol" />
    <attribute name="exchangerate" />
    <attribute name="currencyprecision" />
    <filter type="and">
      <condition attribute="transactioncurrencyid" operator="eq" value="@Currency" />
    </filter>
  </entity>
< /fetch>

5. パラメーターをクリックします。パラメーター値に先ほど作成した
パラメーターを指定します。

image

6. OK をクリックします。

ここまでで利用したい通貨の詳細を取得できしたが、この情報だけでは
ToString の第 2 引数を作成できません。そこでコードを利用します。

1. レポート | レポートのプロパティをクリックします。

image

2. コードを選択し、以下のコードを貼り付けます。以下のコードは
引数として通貨の記号と区切り数を渡して、コード内で CultureInfo を
作成します。利用するのは通貨関連の情報だけであるため、ここでは
コンストラクタに ja-JP を取り合えず渡しています。

Public Function GetCultureFromCurrency(ByVal symbol As String, ByVal decimaldigits As Integer ) As System.Globalization.CultureInfo
      Dim ci =  new System.Globalization.CultureInfo("ja-JP")
      ci.NumberFormat.CurrencySymbol = symbol
      ci.NumberFormat.CurrencyDecimalDigits = decimaldigits
      Return ci
End Function

3. OK をクリックします。

最後に合計欄の式を変更します。

1. テーブルより合計欄の式を再度表示します。現在は以下の値が入っています。

=CDbl(Sum(Fields!estimatedvalue_baseValue.Value)).ToString("C", new System.Globalization.CultureInfo("ja-JP"))

2. 内容を以下のように変更します。

=CDbl(Sum(Fields!estimatedvalue_baseValue.Value)*First(Fields!exchangerate.Value, "CurrencyDetail")).ToString("C", Code.GetCultureFromCurrency(First(Fields!currencysymbol.Value, "CurrencyDetail"),First(Fields!currencyprecision.Value, "CurrencyDetail")))

この式では、値の集計に対して、選択した通貨の変換レートを掛け合わせることで
数値を、ToString の第 2 引数に先ほど追加したコードを利用することで形式を
指定しています。引数の値は CurrencyDetail データセットより指定しています。

3. 設定が完了したらすべて OK で閉じます。

動作確認

以下の手順でカスタマイズしたレポートをアップロードします。

1. Microsoft Dynamics CRM 2011 の画面よりレポートの一覧を表示します。
2. 先ほど指定したレポートにチェックして、編集ボタンをクリックします。
3. レポートの種類を既存のファイルに変更します。
4. ファイルの場所より変更したレポートを指定します。既定では以下の
フォルダにレポートが保存されています。

C:\Users\<user>\Documents\Visual Studio 2008\Projects\<Project Name>\<Project Name>

5. 保存ボタンをクリックします。既存のレポートが上書きされる旨の
メッセージが出ますので、OK をクリックします。
6. レポートの実行を行います。

まとめ

レポートウィザードはとても便利なツールですが、より複雑なレポートの
作成や、見た目の変更等には BIDS が必須です。是非カスタムレポート
を開発してみてください。

‐ Dynamics CRM サポート 中村 憲一郎