フィルターを使用してレポートのパフォーマンスを向上

 

公開日: 2016年11月

対象: Dynamics CRM 2015

大量のデータ セットを返すレポートは、使いにくく、パフォーマンス上の問題の原因となる場合があります。 レポートに表示するデータを制限するには、データ フィルターを使用します。

Reporting Services でサポートされているデータ フィルター処理に加え、Microsoft Dynamics 365 ではデータの事前フィルター処理もサポートしています。 データの事前フィルター処理の使用には、次のような利点があります。

  • レポートの範囲を絞り込んで関連性の高いデータを返すようにすることで、状況に即したレポートを作成できる。

  • 関連性の高いデータだけが返されるので、結果セットの取得と表示が速くなる。

  • "高度な検索" 機能を使用してレポートをフィルター処理できる。

重要

現在のところ、Under 演算子などの階層演算子を使用したレポート クエリは、レポート フィルターでは使用できません。 階層演算子を使用するレポートを実行しようとすると、レポートは作成されません。

このトピックの内容

フェッチベースのレポートでデータの事前フィルター処理を有効にする

SQL ベースのレポートでデータの事前フィルター処理を有効にする (設置型 CRM のみ)

フィルターの概要でフィルターを渡す

既定のフィルター

フェッチベースのレポートでデータの事前フィルター処理を有効にする

フェッチベースのレポートがサポートしているのはデータの自動的事前フィルター処理だけです。 各レポートは複数のデータ セットと複数の FetchXML クエリを持つことができます。 1 つのデータ セットは 1 つの FetchXML クエリをサポートします。 フェッチベースのレポートで主エンティティまたはリンクしているエンティティの事前フィルター処理を有効にするには、enableprefiltering パラメーターの値を "1" に設定し、prefilterparametername プロパティでパラメーター名を指定する必要があります。 このパラメーター名は "CRM_" で始めることにより、非表示のパラメーターとして指定します。Microsoft SQL Server ベースのレポートの場合と同様に、FetchXML クエリで指定されるこのパラメーターは FetchXML クエリ内のサブクエリとして機能し、このサブクエリはユーザーがレポートの実行時に [高度な検索] 領域で指定した値によって組み立てられます。

次の例は、FetchXML クエリで主エンティティについて事前フィルター処理を有効にする方法を示しています。

<CommandText
 <fetch distinct="false" mapping="logical">
   <entity name="account" enableprefiltering="1" prefilterparametername="CRM_FilteredAccount">
      <attribute name="name" />
      <attribute name="accountid" />
   </entity>
 </fetch>
</CommandText>
<DataSourceName>CRM</DataSourceName>

同じようにして、リンクしているエンティティについても事前フィルター処理を有効にできます。 FetchXML クエリでリンクしているエンティティについて異なる事前フィルター処理条件を指定することもできます。それには、prefilterparametername プロパティでパラメーター名として別の一意名を指定します。

Microsoft Dynamics 365 Web アプリケーションまたは SQL Server データ ツール のレポート ウィザードを使用せずに、フェッチベースのレポート定義を手動で変更して、主エンティティまたはリンクしているエンティティについて事前フィルター処理を有効にする場合は、次のことを行ってください。

  1. 必須エンティティまたはリンクしているエンティティについて enableprefiltering パラメーターの値を 1 に設定し、prefilterparametername プロパティで一意のパラメーター名を指定します。

    <fetch distinct="false" mapping="logical">
       <entity name="account" enableprefiltering="1" prefilterparametername="CRM_FilteredAccount">
    
  2. prefilterparametername プロパティで指定したものと同じ名前のクエリ パラメーターを作成します。 パラメーター名を CRM_ で始めることにより、非表示のパラメーターとして指定します。

    <QueryParameters>
       <QueryParameter Name="CRM_FilteredAccount">
       <Value>=Parameters!CRM_FilteredAccount.Value</Value>
    </QueryParameter>
    
  3. 同じ名前のレポート パラメーターを作成します。

    <ReportParameters>
        <ReportParameter Name="CRM_FilteredAccount">
          <DataType>String</DataType>
          <Prompt>CRM Filtered Account</Prompt>      
        </ReportParameter>
      </ReportParameters>
    

SQL ベースのレポートでデータの事前フィルター処理を有効にする (設置型 CRM のみ)

Microsoft Dynamics 365SQL ベース のレポートでデータの事前フィルター処理を有効にする方法には、自動的と明示的の 2 つがあります。

自動的事前フィルター処理

データの自動的事前フィルター処理は単純なクエリに適しています。 レポートでデータの自動的事前フィルター処理を有効にするには、クエリでエンティティ テーブルのエイリアス名を使用できます。 これを行うには、CRMAF_ で始まるエイリアス名を使用します。

次の例は、Account エンティティに対して事前フィルター処理を有効にするように変更した単純なクエリを示しています。

事前フィルター処理を使用しないクエリ

自動的事前フィルター処理が有効になるように変更したクエリ

SELECT <column1>, <column2>, <columnN>
FROM FilteredAccount;
SELECT <column1>, <column2>, <columnN>  
FROM FilteredAccount AS CRMAF_FilteredAccount;

CRMAF_ 接頭辞を使用してデータの自動的事前フィルター処理機能を有効にすると、Microsoft Dynamics 365 へのクエリのアップロード時に、Microsoft Dynamics 365 によってクエリに変更が加えられてパラメーター (たとえば、P1) が挿入されます。たとえば、次の例のようになります。

自動的事前フィルター処理を使用したクエリ

Microsoft Dynamics 365 による変更

SELECT <column1>, <column2>, <columnN> 
FROM FilteredAccount AS CRMAF_FilteredAccount;
SELECT <column1>, <column2>, <columnN> 
FROM (@P1) AS CRMAF_FilteredAccount;

Microsoft Dynamics 365 は、レポートをどのようにフィルター処理するかに応じて、クエリを P1 パラメーターに渡します。 つまり、データの自動的事前フィルター処理は既存のクエリ内のサブクエリとして機能します。

以下の例は、さまざまなフィルター処理要件に応じて、Microsoft Dynamics 365 がクエリをどのようにパラメーター (P1) に渡すかを示しています。 これらの例では、Microsoft Dynamics 365 の [レポート] 領域からレポートを実行し、データのフィルター処理オプションを使用するものと仮定しています。

例 1: アクティブな取引先企業のみを表示する場合、結果のクエリは次のようになります。

SELECT <column1>, <column2>, <columnN>
FROM (SELECT FilteredAccount.* FROM FilteredAccount WHERE statecode = 0)
AS CRMAF_FilteredAccount

例 2: 特定の取引先企業内でレポートを実行する場合、結果のクエリは次のようになります。

SELECT <column1>, <column2>, <columnN>
FROM (SELECT FilteredAccount.* FROM FilteredAccount WHERE AccountId = '<CurrentAccountId>')
AS CRMAF_FilteredAccount

例 3: 選択した 3 つの取引先企業のリストを調べていて、選択したレコードに対してレポートを実行するオプションを選択した場合、結果のクエリは次のようになります。

SELECT <column1>, <column2>, <columnN>
FROM  (SELECT FilteredAccount.* FROM FilteredAccount WHERE AccountId in ('<1stAccountId>', '<2ndAccountId>', '<3rdAccountId>') 
AS CRMAF_FilteredAccount

エンティティ テーブル名にエイリアスを指定すると、Microsoft Dynamics 365 からレポートを実行したときに、展開したレポートに "高度な検索" のユーザー インターフェイスが自動的に含まれます。

クエリ ビルダーでエンティティ テーブル名にエイリアスを指定するには、レポート内の各テーブルを右クリックし、[プロパティ] を選択し、エイリアスの値を CRMAF_FilteredEntity の形式 (たとえば、CRMAF_FilteredAccount) で入力します。

自動的事前フィルター処理の制限

CRMAF_ 接頭辞を使用して自動的事前フィルター処理を有効にすると、Microsoft Dynamics 365 によってクエリにパラメーターが追加されます。UNION ステートメントを使用するクエリなど、より複雑なクエリの場合は、これによって予期しない結果が生じることがあります。なぜなら、Microsoft Dynamics 365 が最初のクエリにだけパラメーターを追加する可能性があるからです。

たとえば、次のクエリを見てください。これには UNION ステートメントが含まれています。

SELECT <column1>, <column2>, <columnN>
FROM FilteredAccount AS CRMAF_FilteredAccount
WHERE address1_stateorprovince = ‘FL'
UNION
SELECT <column1>, <column2>, <columnN>
FROM FilteredAccount AS CRMAF_FilteredAccount
WHERE address1_stateorprovince = 'CA'

レポートをアップロードすると、Microsoft Dynamics 365 はパラメーターを使用して最初のクエリだけをフィルター処理する可能性があります。 その場合、2 番目のクエリにはフィルター処理が適用されません。

SELECT <column1>, <column2>, <columnN>
FROM  (@P1) AS CRMAF_FilteredAccount WHERE address1_stateorprovince = 'FL'
UNION
SELECT <column1>, <column2>, <columnN>
FROM FilteredAccount AS CRMAF_FilteredAccount
WHERE address1_stateorprovince = 'CA'

上の例では、Microsoft Dynamics 365 の レポート 領域からレポートを実行し、1,000,000 を超える年間売上高としてフィルターを選択すると、Microsoft Dynamics 365 は、次のようにクエリを P1 パラメーターに渡します。

SELECT <column1>, <column2>, <columnN>
FROM  (SELECT FilteredAccount.* from FilteredAccount where AnnualRevenue > 1000000) AS CRMAF_FilteredAccount
WHERE address1_stateorprovince = 'FL'
UNION
SELECT <column1>, <column2>, <columnN>
FROM FilteredAccount AS CRMAF_FilteredAccount
WHERE address1_stateorprovince = 'CA'

このことは、フロリダ州のアカウント (取引先企業) のうち、売上高が $1,000,000 を超えるアカウントと、カリフォルニア州のすべてのアカウントがクエリで返されることを意味しますが、これは意図した結果ではないはずです。 期待していたのは、フロリダ州とカリフォルニア州のアカウントのうち、売上高が $1,000,000 を超えるすべてのアカウントが返されることです。

Microsoft Dynamics 365 からレポートをダウンロードして、Microsoft Visual Studio でオープンした場合、Microsoft Dynamics 365 にアップロードした元のレポートが表示されます。 レポートを Microsoft SQL Server Reporting Services から直接ダウンロードした場合、Microsoft Dynamics 365 によってクエリに変更が加えられているものの、期待した箇所にパラメーターが挿入されていないことに気付くでしょう。

このような複雑なクエリの場合、明示的事前フィルター処理を使用する必要があります。

明示的事前フィルター処理

UNION ステートメントを使用するクエリなど、複雑なクエリの場合、明示的事前フィルター処理を使用しなければならないこともあります。 明示的事前フィルター処理では自動的事前フィルター処理と異なり、Microsoft Dynamics 365 へのレポートのアップロード時に、Microsoft Dynamics 365 はパラメーターに値を渡すことによるレポート クエリの書き換えを行いません。 明示的事前フィルター処理の場合、レポートに対して必要な変更を明示的に行う必要があります。そのためには、レポートに事前フィルター処理パラメーターを追加し、そのパラメーターをクエリで参照します。 そうすれば、動的 SQL を使用してクエリを実行できます。

動的 SQL を使用する場合、高度な検索を使用したフィルター処理は、CRM_FilteredEntity (CRM_FilteredAccount など) という名前の非表示のパラメーターを作成し、このパラメーターを動的 SQL クエリ式で使用することによって有効になります。 このパラメーターを使用すると、指定したフィルター ビューから取得したテーブル データでのフィルター処理が可能になります。

自動的事前フィルター処理の制限を明らかにするために、先ほどの例を再び使用します。次に示すクエリは、自動的事前フィルター処理に変更を加え、動的 SQL を使用して明示的事前フィルター処理を使用するようにしたものです。 ここでも、Microsoft Dynamics 365 の [レポート] 領域からレポートを実行し、年間売上高が 1,000,000 を超えるものとしてフィルターが適用されていることを仮定しています。

自動的事前フィルター処理を使用したクエリ

明示的事前フィルター処理を使用するように変更したクエリ

SELECT <column1>, <column2>, <columnN>
FROM FilteredAccount AS CRMAF_FilteredAccount
WHERE address1_stateorprovince = ‘FL'
UNION
SELECT <column1>, <column2>, <columnN>
FROM FilteredAccount AS CRMAF_FilteredAccount
WHERE address1_stateorprovince = 'CA'
DECLARE @SQL nvarchar(4000)
DECLARE @CRM_FilteredAccount nvarchar(2000)
Set @CRM_FilteredAccount = 'Select FilteredAccount.* FROM FilteredAccount where AnnualRevenue > 1000000'
SET @SQL = 'SELECT <column1>, <column2>, <columnN>
FROM ('+@CRM_FilteredAccount+') AS FA where address1_stateorprovince = ''FL''
UNION
SELECT <column1>, <column2>, <columnN> 
FROM ('+@CRM_FilteredAccount+') as CA where address1_stateorprovince  = ''CA'' '
EXEC (@SQL)

注意

標準の Microsoft Dynamics 365SQL ベース レポートのほとんどは、明示的な事前フィルター処理オプションを使用しています。

フィルターの概要でフィルターを渡す

フィルターの概要には、レポートを実行する際に使用するフィルターの値が表示されます。Microsoft Dynamics 365 のレポートでは、フィルター テキスト値が含まれるテキスト ボックス レポート項目としてレポート ヘッダーに表示されます。 ユーザーがレポートを実行すると、Report Viewer に [フィルターの編集] ボタンが表示されます。 このボタンをクリックすると、データ フィルターを定義できます。 フィルターの概要の例は、Microsoft Dynamics 365 に含まれている [ユーザーの概要] レポートで確認できます。

レポートにフィルターの概要を追加するには、次の手順を実行します。

  1. CRM_FilterText という非表示の文字列パラメーターを作成します。

  2. レポートにテキスト ボックス レポート項目を追加し、Value プロパティを
    =Parameters!CRM_FilterText.Value. のように設定します。

レポートを実行すると、システムにより、CRM_FilterText パラメーターの値が現在のフィルターのテキストに設定されます。

既定のフィルター

レポートを公開するときに、既定のフィルターを設定できます。 レポート ウィザードで作成されたレポートについては、既定のフィルターを設定しないと、最近 30 日以内に変更されたエンティティの全レコードに自動的に設定されます。 既定のレポート フィルターを定義する手順については、「レポートの公開」を参照してください。

関連項目

設置型用 CRM 2015 を使用してレポートを作成する
Microsoft Dynamics 365 (オンライン) レポートに関する考慮事項

© 2016 Microsoft Corporation. All rights reserved. 著作権