モデル駆動型アプリでビューをカスタマイズする

モデル駆動型アプリのビューをプログラムでカスタマイズして、ユーザーが取得するデータとその表示方法を制御します。 ビューは、特定のフィルターと表示設定を使用する SavedQuery レコードです。 これらをコードで作成したり、XML として定義したり、アンマネージド ソリューションでインポートしたりできます。

SavedQuery ビューは UserQuery とは異なります。 モデル駆動型アプリの 保存済みビュー と呼ばれるユーザー クエリは、個々のユーザーが所有し、他のユーザーに割り当てて共有したり、クエリのアクセス権限に応じて他のユーザーが表示したりできます。 このビューの種類は、集計を実行するテーブルの種類とクエリにまたがる頻繁に使用されるクエリに適しています。 詳細については、「 保存されたクエリ」を参照してください。

カスタマイズ ツールを使用して、ビューをカスタマイズすることもできます。 詳細については、「ビューの 作成と編集」を参照してください。

ビューの種類

次の表に、カスタマイズできる 5 種類のビューを示します。 ビューのタイプ コードは、SavedQuery.QueryType パラメーターに保存されます。

特定のテーブルのビューを定義すると、 SavedQuery.ReturnedTypeCode パラメーターはテーブルの論理名を返します。

ビューの種類 種類コード 内容
公開 0 - 出現回数: 複数
- アクション: 作成、更新、削除
- コメント: SavedQuery.IsDefault を true に設定して、これらのビューのいずれかを既定のパブリック ビューとして設定します。
高度な検索 1 - 出現回数: 1
- アクション: 更新のみ。
- コメント: 既定では、このビューは結果が高度な検索に表示されるときに表示されます。
関連 2 - 出現回数: 1
- アクション: 更新のみ。
- コメント: 既定では、このビューは関連するレコードのグリッドがレコードのナビゲーション ウィンドウに表示されるときに表示されます。
簡易検索 4 - 出現回数: 1
- アクション: 更新のみ。
- コメント: このビューは、ユーザーがリスト ビューの検索列を使用してレコードを検索するときに検索される列を定義します。
検索 64 - 出現回数: 1
- アクション: 更新のみ。
- コメント: これは、ルックアップ列に対して他のビューが構成されていない場合にレコードを検索するために使用される既定のビューです。

ソリューション コンポーネントとしてビューを管理する

ビューはソリューション コンポーネントです。 ソリューション コンポーネントを作成、更新、または削除するときは、そのコンポーネントを含むソリューションに変更を適用します。 ソリューションを明示的に指定しない場合、変更はコードを実行するユーザーの 優先ソリューションに設定されます 。 そのユーザーが優先ソリューションを持っていない場合、変更は 既定のソリューションのいずれかに移動します。

開発者は、 SolutionUniqueName 省略可能なパラメーター を使用して、これらのデータ変更を特定のアンマネージド ソリューションに明示的に関連付けます。

ビューの作成

パブリック ビューを作成するには、次の SavedQuery プロパティを指定します。

財産 内容
Name 保存されたクエリの一意の識別子。
ReturnedTypeCode テーブルの論理名と一致します。
FetchXml フィルター条件を編集するか、並べ替えを構成します。 FetchXml を使用したデータのクエリを参照してください。
LayoutXml 有効な要素については、カスタマイズ ソリューション ファイル スキーマlayoutxml 要素を参照してください。
QueryType 常にゼロ (0) にする必要があります。

次の例では、 営業案件テーブルの新しいパブリック ビューを作成します。

このサンプルでは、CreateRequest クラス省略可能なパラメーターSolutionUniqueNameIOrganizationService.Execute メソッドを使用します。

System.String layoutXml =
@"<grid name='resultset' object='3' jump='name' select='1'
   preview='1' icon='1'>
   <row name='result' id='opportunityid'>
   <cell name='name' width='150' />
   <cell name='customerid' width='150' />
   <cell name='estimatedclosedate' width='150' />
   <cell name='estimatedvalue' width='150' />
   <cell name='closeprobability' width='150' />
   <cell name='opportunityratingcode' width='150' />
   <cell name='opportunitycustomeridcontactcontactid.emailaddress1'
      width='150' disableSorting='1' />
   </row>
</grid>";

System.String fetchXml =
@"<fetch>
   <entity name='opportunity'>
   <order attribute='estimatedvalue' descending='false' />
   <filter type='and'>
      <condition attribute='statecode' operator='eq'
      value='0' />
   </filter>
   <attribute name='name' />
   <attribute name='estimatedvalue' />
   <attribute name='estimatedclosedate' />
   <attribute name='customerid' />
   <attribute name='opportunityratingcode' />
   <attribute name='closeprobability' />
   <link-entity alias='opportunitycustomeridcontactcontactid'
      name='contact' from='contactid' to='customerid'
      link-type='outer' visible='false'>
      <attribute name='emailaddress1' />
   </link-entity>
   <attribute name='opportunityid' />
   </entity>
</fetch>";

var sq = new SavedQuery
   {
   Name = "A New Custom Public View",
   Description = "A Saved Query created in code",
   ReturnedTypeCode = "opportunity",
   FetchXml = fetchXml,
   LayoutXml = layoutXml,
   QueryType = 0
   };

var request = new CreateRequest
{
   Target = sq
};
request["SolutionUniqueName"] = "< Your Solution Unique Name >";

var response = (CreateResponse)service.Execute(request);
_customViewId = response.id;
Console.WriteLine("A new view with the name {0} was created.", sq.Name);

Dataverse SDK for .NETの詳細を確認する

ビューの更新

IsCustomizable管理プロパティでビューの更新が許可されている場合は、UpdateRequest クラス メッセージを使用してビューを更新します。 ソリューションのコンテキストでビューを常に更新します。 SolutionUniqueName省略可能なパラメーターを使用して、ビューに変更をソリューションに関連付けます。

更新の例については、「ビューの非アクティブ化」を参照してください。

ビューの削除

削除する必要があるのは、作成した保存済みクエリのみです。 ソリューション コンポーネントまたはアプリケーションの一部は、保存された特定のクエリに依存する場合があります。 アプリケーションに表示したくないクエリがある場合は、それらを非アクティブ化します。 ソリューションのコンテキストでビューを常に削除します。 SolutionUniqueName省略可能なパラメーターを使用して、ビューの削除をソリューションに関連付けます。

ビューの取得

次のサンプルでは、 営業案件テーブルのすべてのパブリック ビューを取得します。

この例では、IOrganizationService.Execute メソッドと共に RetrieveMultipleRequest クラスを使用して、保存されたクエリ レコードを取得します。

var mySavedQuery = new QueryExpression
{
   ColumnSet = new ColumnSet(
       "savedqueryid",
       "name",
       "querytype",
       "isdefault",
       "returnedtypecode",
       "isquickfindquery"),
   EntityName = SavedQuery.EntityLogicalName,
   Criteria = new FilterExpression
   {
       Conditions =
       {
           new ConditionExpression
           {
               AttributeName = "querytype",
               Operator = ConditionOperator.Equal,
               Values = { 0 }
           },
           new ConditionExpression
           {
               AttributeName = "returnedtypecode",
               Operator = ConditionOperator.Equal,
               Values = { Opportunity.EntityTypeCode }
           }
       }
   }
};
RetrieveMultipleRequest retrieveSavedQueriesRequest = new RetrieveMultipleRequest { Query = mySavedQuery };

RetrieveMultipleResponse retrieveSavedQueriesResponse =
   (RetrieveMultipleResponse)service.Execute(retrieveSavedQueriesRequest);

DataCollection<Entity> savedQueries = retrieveSavedQueriesResponse.EntityCollection.Entities;

// Display the retrieved views
foreach (Entity ent in savedQueries)
{
   SavedQuery rsq = (SavedQuery)ent;
   Console.WriteLine(
       "{0} : {1} : {2} : {3} : {4} : {5},",
       rsq.SavedQueryId,
       rsq.Name,
       rsq.QueryType,
       rsq.IsDefault,
       rsq.ReturnedTypeCode,
       rsq.IsQuickFindQuery);
}

Dataverse SDK for .NETの詳細を確認する

ビューの非アクティブ化

パブリック ビューをアプリケーションに表示しない場合は、非アクティブ化します。 既定のビューとして設定されているパブリック ビューを非アクティブ化することはできません。

非アクティブ化は更新操作です。 ソリューションのコンテキストでビューを常に更新します。 SolutionUniqueName省略可能なパラメーターを使用して、ビューに変更をソリューションに関連付けます。

次の例では、 営業案件テーブルの [現在の会計年度] ビューの [終了 した 営業案件] を非アクティブ化します。

このサンプルでは、UpdateRequest クラス省略可能なパラメーターSolutionUniqueNameIOrganizationService.Execute メソッドを使用します。

System.String SavedQueryName = "Closed Opportunities in Current Fiscal Year";
QueryExpression ClosedOpportunitiesViewQuery = new QueryExpression
{
   ColumnSet = new ColumnSet("savedqueryid", "statecode", "statuscode"),
   EntityName = SavedQuery.EntityLogicalName,
   Criteria = new FilterExpression
   {
       Conditions =
       {
           new ConditionExpression
           {
               AttributeName = "querytype",
               Operator = ConditionOperator.Equal,
               Values = { 0 }
           },
           new ConditionExpression
           {
               AttributeName = "returnedtypecode",
               Operator = ConditionOperator.Equal,
               Values = { Opportunity.EntityTypeCode }
           },
           new ConditionExpression
           {
               AttributeName = "name",
               Operator = ConditionOperator.Equal,
               Values = { SavedQueryName }
           }
       }
   }
};

RetrieveMultipleRequest retrieveOpportuntiesViewRequest = new RetrieveMultipleRequest
{
   Query = ClosedOpportunitiesViewQuery
};

RetrieveMultipleResponse retrieveOpportuntiesViewResponse =
   (RetrieveMultipleResponse)service.Execute(retrieveOpportuntiesViewRequest);

SavedQuery OpportunityView =
   (SavedQuery)retrieveOpportuntiesViewResponse.EntityCollection.Entities[0];

var updateRequest = new UpdateRequest
{
  Target = new SavedQuery
  {
    Id = OpportunityView.Id,
    StateCode = new OptionSetValue(1), // Inactive
    StatusCode = new OptionSetValue(2) // Inactive
  }
};
updateRequest["SolutionUniqueName"] = "< Your Solution Unique Name >";

service.Execute(updateRequest);

Dataverse SDK for .NETの詳細を確認する

ヒント

ビューステート: active または inactive は、ソリューションに追加するときにビューに含まれません。 そのため、ソリューションをターゲット組織にインポートすると、状態は既定でアクティブに設定されます。

列の編集

テーブルまたは関連テーブルのビューに表示する列を選択できます。 表示する列の指定方法の詳細については、layoutxml 要素を参照してください。

カスタム アイコンとツールヒントを追加して列を表示する

列の値に応じて、ツールヒント テキストを含むカスタム アイコンを追加して列に表示できます。 ローカライズされたヒント テキストを指定することもできます。 カスタム アイコンをイメージ Web リソースとしてインスタンスに追加し、JavaScript Web リソースを使用して列の JavaScript コードを追加し、列の値に応じてアイコンを表示します。

ヒント

ツールヒントを含むカスタム アイコンは、読み取り専用グリッドにのみ追加できます。 この機能は、編集可能なグリッドではサポートされていません。 編集可能なグリッドの詳細については、「編集可能グリッドの使用」を参照してください。

imageproviderwebresourceimageproviderfunctionnameの 2 つの新しいパラメーターが、savedquery の layoutxml のcell要素に追加されます。 これらのパラメーターを使用すると、Web リソースの名前と JavaScript 関数名を指定して、列のカスタム アイコンとヒント テキストを表示できます。 JavaScript コードは、ページが読み込まれるときに実行されます。

新しい Web リソース列のプロパティページ内の関数名を使用しながら、Web クライアント名と JavaScript 関数名の定義を表示する列のプロパティを変更することができます。

次のサンプル コードは、layoutxml の opportunityratingcode にカスタム アイコンとヒントを追加するための Web リソースと JavaScript 関数名をプログラムで指定する方法を示しています。

<grid name='resultset' object='3' jump='name' select='1'
  preview='1' icon='1'>
  <row name='result' id='opportunityid'>
    <cell name='name' width='150' />
    <cell name='customerid' width='150' />
    <cell name='estimatedclosedate' width='150' />
    <cell name='estimatedvalue' width='150' />
    <cell name='closeprobability' width='150' />
    <cell name='opportunityratingcode' width='150' 
          imageproviderwebresource='new_SampleWebResource'
          imageproviderfunctionname='displayIconTooltip' />
    <cell name='opportunitycustomeridcontactcontactid.emailaddress1'
        width='150' disableSorting='1' />
  </row>
</grid>

ユーザー定義アイコンとツールヒントのテキストを表示する JavaScript 関数には、次の 2 つの引数が表示されます: layoutxml で指定された行オブジェクト全体と呼び出し側ユーザーのロケール ID (LCID)。 LCID パラメーターでは、複数の言語でアイコンのツールヒントのテキストを指定できます。 サポートされている言語の詳細については、「 環境の地域と言語のオプション」を参照してください。 コードで使用できるロケール ID (LCID) 値の一覧については、「Microsoft によって割り当てられるロケール ID」を参照してください。

列の選択肢の種類にカスタム アイコンを追加する場合は、定義済みのオプションのセットが限られているため、ラベルの代わりにオプションの整数値を使用して、ローカライズされたラベル文字列の変更によるコードの中断を回避します。 JavaScript 関数で、列の値のアイコンとして使用するイメージ Web リソースの名前のみを指定します。 イメージは 16 x 16 ピクセルである必要があります。 大きな画像は自動的に 16 x 16 ピクセルに縮小されます。

次のサンプル コードは、opportunityratingcode (Rating) 列内の値 (1: 高、2: 中、3: 低) のいずれかに基づき、異なるアイコンとヒント テキストを表示します。 サンプル コードは、ローカライズしたツールヒントのテキストを表示する方法についても示します。 このサンプルを機能させるには、インスタンスにそれぞれ 16 x 16 の画像 ( 、および ) を持つ 3 つのイメージ Web リソース ( new_Hotnew_Warmnew_Cold) を作成する必要があります。

function displayIconTooltip(rowData, userLCID) {
  var str = JSON.parse(rowData);
  var coldata = str.opportunityratingcode_Value;
  var imgName = "";
  var tooltip = "";
  switch (parseInt(coldata, 10)) {
    case 1:
      imgName = "new_Hot";
      switch (userLCID) {
        case 1036:
          tooltip = "French: Opportunity is Hot";
          break;
        default:
          tooltip = "Opportunity is Hot";
          break;
      }
      break;
    case 2:
      imgName = "new_Warm";
      switch (userLCID) {
        case 1036:
          tooltip = "French: Opportunity is Warm";
          break;
        default:
          tooltip = "Opportunity is Warm";
          break;
      }
      break;
    case 3:
      imgName = "new_Cold";
      switch (userLCID) {
        case 1036:
          tooltip = "French: Opportunity is Cold";
          break;
        default:
          tooltip = "Opportunity is Cold";
          break;
      }
      break;
    default:
      imgName = "";
      tooltip = "";
      break;
  }
  var resultarray = [imgName, tooltip];
  return resultarray;
}

この結果、値に基づいた適切なアイコンを含む [Rating] 列の値、およびカーソルを置いたときのアイコンのツールヒント テキストが表示されます。

ビューの [評価] 列に表示されるカスタム アイコンのスクリーンショット。

パブリック ビューを既定のビューとして設定する

既定のビューとして設定できるアクティブなパブリック ビューは 1 つだけです。 ビューを既定のビューにするには、 IsDefault プロパティ を true に設定します。

コミュニティ ツール

これらの API を使用してビューを管理するコミュニティ ツールがいくつかあります。

ヒント

これらのコミュニティ ツールは Dataverse の製品ではなく、Microsoftはコミュニティ ツールのサポートを提供しません。 ツールについて質問がある場合は、発行元にお問い合わせください。 詳細情報: コミュニティ ツール