サンプル: ユーザー定義の言語制約を使用した Universal Resource Scheduling の拡張
このステップ バイ ステップのガイドでは、 Universal Resource Scheduling (URS)におけるリソース マッチングの理解とカスタマイズを説明します
この詳細な手順では、Language
制約で Universal Resource Scheduling リソースを拡張します。 話す言語によってリソースをフィルター処理する組織を検討します。 また、業務のためにその言語が必要とする Requirement
レコード上でキャプチャします。 この制約は組み込み Territory
制約に似たパターンに従います。 新しいマスター エンティティ Language
は、リソースが話すことができる異なる言語を保管します。 次に、Resource
レコードは多対多関連付けエンティティを介して多くの Languages
に関連付けることができます。 Requirement
エンティティで、新しい 2 つの検索属性 Primary Language
および Secondary Language
を作成することにより、これをモデル化します。 必要条件のために使用可能なリソースを検索する際、Primary Language
または Secondary Language
のいずれかに関連付けられたリソースのみが表示されます。
新しいエンティティおよび関連付けの作成
このセクションでは、マスター Language
エンティティの新しいスキーマを作成し、対応する関連付けを使用して Resource
および Requirement
エンティティを新しい Language
エンティティに対して更新します。
新しい発行元の作成
Dynamics 365 の、カスタマイズで、新しい発行元を作成します。
新しい発行元フォームに以下の詳細を入力します。
フィールド Value 表示名 言語 名前 言語 接頭辞 lang 保存して閉じるをクリックします。
新しいソリューションの作成
Dynamics 365 の、カスタマイズで、新しいソリューションを作成します。
新しいソリューション フォームに以下の詳細を入力します。
フィールド Value 表示名 言語 名前 言語 公開元 言語 バージョン 1.0.0.0 [保存] をクリックします。
言語エンティティの作成
言語ソリューションで、新しいエンティティを作成します
新しいエンティティ フォームに以下の詳細を入力します。
フィールド Value 表示名 言語 複数名 言語 件名 lang_language ( lang_
接頭語は自動入力され、読み取り専用です)[保存] をクリックします。
リソース エンティティから言語エンティティへの多対多関連付けの作成
言語エンティティで、新しい多対多関連付けを作成します
新しい関連付けフォームに以下の詳細を入力します。
フィールド Value 現在のエンティティ 表示オプション 複数形の名前を使用する その他のエンティティ エンティティ名 予約可能リソース 保存して閉じるをクリックします。
言語エンティティ フォームを閉じます
関連付けエンティティから言語エンティティへの関連付けの作成
言語ソリューションで、既存のリソース要件エンティティをソリューションに追加します (足りない必須コンポーネント ダイアログが指摘される場合、いいえを選択し、必須コンポーネントは含めません。)
リソース要件のエンティティで、新しいフィールドを作成します
新しいフィールド フォームに以下の詳細を入力します。
フィールド Value 表示名 一次言語 データの種類 検索 ターゲット レコードの種類 言語 保存して閉じるをクリックします。
リソース要件のエンティティで、新しいフィールドを作成します
新しいフィールド フォームに以下の詳細を入力します。
フィールド Value 表示名 二次言語 データの種類 検索 ターゲット レコードの種類 言語 保存して閉じるをクリックします。
要件のメイン フォームを更新します
- リソース要件エンティティで、既存の情報フォームをエンティティのサブコンポーネントに追加します (足りない必須コンポーネント ダイアログが指摘される場合、いいえを選択し、必須コンポーネントは含めません。)
- 情報フォームで、フィールド エクスプローラーを使用して新しい 2 つの属性、一次言語と二次言語をフォームに追加し、ユーザーが要件を作成するときにこの情報を入力することができるようにします
- [保存] をクリックします。
- 発行をクリックします
- フォーム エディターを閉じることができます
概要
上記の手順で、新しい言語エンティティを作成しました。 次に、リソースおよび要件エンティティとの新しい関連付けを追加しました。 言語とリソース間の多対多関連付けを追加したため、リソースは複数の言語に関連付けることができます。 新しい言語エンティティを示す要件エンティティで 2 つの検索軸性を追加したため、要件は 2 つの言語に関連付けることができます。
データの追加
高度な検索を使用して新しいレコードを言語エンティティに追加します。 次に、リソース レコードを開いてナビゲーション バーの言語関連付けに移動することにより、リソース レコードを新しい言語レコードに関連付けます。 要件レコードでは、要件フォーム上の新しい一次言語と二次言語フィールドに入力することができます。
スケジュール ボードのカスタマイズ
新しい言語制約を使用してスケジュール ボード内のリソースをフィルター処理するため、リソース取得クエリおよびフィルター レイアウト構成レコードを更新します。
フィルター レイアウト構成
チップ
以下の手順では、XML構文を強調表示に対応した便利なテキストエディタを使用して変更を加え、その変更を Universal Resource Scheduling エディタに貼り付けています。
フィルター レイアウト構成は、フィルター パネルのレイアウトをカスタマイズするための XML レイアウト定義です。
Note
ここでは、Universal Resource Scheduling に付属する既定のフィルターをフィルター パネルから除去して、利用可能な唯一のフィルターとして言語を追加します。
<control type="combo" source="entity" key="Languages" inactive-state="1" label-id="Languages" entity="lang_language" multi="true" />
control
要素により新しいコントロールがフィルター パネルに追加されます。 これは各属性の説明です。
名前 | 説明 |
---|---|
type |
フィルター コントロールの種類です。 combo コントロールには値を選択するためのドロップダウンが表示されます |
source |
ドロップダウン コントロールの値のソースです。 entity ソースにはドロップダウン内のエンティティ レコードが標示されます |
key |
選択した値を制約プロパティ バッグに保管するために使用するキー |
inactive-state |
このエンティティのための非アクティブ statecode です。 これはドロップダウンから非アクティブなレコードを除外するために使用します |
label-id |
このコントロールのために使用するローカライズされたラベル |
entity |
このエンティティのレコードはドロップダウンに表示されます |
multi |
単一レコードまたは複数レコードを選択可能にするようにドロップダウンを構成します |
フィルター レイアウト:
<?xml version="1.0" encoding="utf-8" ?>
<filter>
<controls>
<control type="combo" source="entity" key="Languages" inactive-state="1" label-id="Languages" entity="lang_language" multi="true" />
</controls>
</filter>
新しい言語ボードを作成します
これらの変更を分離するため、新しい別々のスケジュール ボードを作成して変更を実装しますが、他のスケジュール ボードが自動的にこれらの変更を継承するように、常にこれらの変更を既定のスケジュール ボードにすることができます。
- Dynamics 365 の、上部のナビゲーション バーで、リソース スケジュール > スケジュール ボードの順に移動します
- 右上で、+ 記号をクリックして新しいボードを作成します
- 新しいボードに言語という名前を付けます
- ダイアログの下部で、追加をクリックします。 新しいボードが作成されます。
スケジュール ボード フィルター レイアウトの更新
次に、スケジュール ボードが使用するフィルター レイアウトとクエリを保管する新しい構成レコードを作成し、新しく作成したスケジュール ボードを新しい構成レコードにリンクします。 これを行う方法は複数ありますが、以下の方法が最も迅速です。
- 右上の、言語タブをダブルクリックします
- 全般設定 > その他の設定の順にスクロール ダウンします
- フィルター レイアウト フィールドを見つけて、右のボタンをクリックしてエディターを開きます。
- 上記のフィルター レイアウト コードで値フィールドを更新して、名前を付けて保存をクリックします。
- 名前フィールドに「言語フィルター レイアウト」と入力して保存をクリックします。 これで、新しい構成レコードが作成され、このスケジュール ボードがレコードにリンクされます。
- ダイアログの下部で、適用をクリックします。
ボードが再びロードされ、フィルター パネルが新しいレイアウトで左に表示されます。言語フィルターのみを利用することができます。 新しいフィルターを活用するためにはリソース取得クエリを更新する必要があるため、フィルターはまだ動作しません。
リソース取得クエリの構成
チップ
以下の手順では、XML構文を強調表示に対応した便利なテキストエディタを使用して変更を加え、その変更を Universal Resource Scheduling エディタに貼り付けています。
リソース取得クエリの構成は、リソース マッチング API が使用する UFX クエリです。 フィルター パネルに入力された値は入力とみなされ、正しい FetchXML を動的に作成して一致するリソースを検索します。
以下のものは、リソースの言語ごとに一致および配列された、リソース取得クエリに追加された新しいスニペットです。
bookableresource
から lang_language
への結合の追加
<link-entity name="lang_lang_language_bookableresource" from="bookableresourceid" to="bookableresourceid" alias="lang_primary" link-type="outer" ufx:if="$input/Languages/bag[1]">
<attribute name="lang_languageid" alias="lang_primary" groupby="true" />
<filter>
<condition attribute="lang_languageid" operator="eq">
<ufx:value select="$input/Languages/bag[1]/@ufx-id" attribute="value" />
</condition>
</filter>
</link-entity>
<link-entity name="lang_lang_language_bookableresource" from="bookableresourceid" to="bookableresourceid" alias="lang_secondary" link-type="outer" ufx:if="$input/Languages/bag[2]">
<attribute name="lang_languageid" alias="lang_secondary" groupby="true" />
<filter>
<condition attribute="lang_languageid" operator="eq">
<ufx:value select="$input/Languages/bag[2]/@ufx-id" attribute="value" />
</condition>
</filter>
</link-entity>
<link-entity name="lang_lang_language_bookableresource" from="bookableresourceid" to="bookableresourceid" alias="lang_others" link-type="outer" ufx:if="$input/Languages/bag[position() > 2]">
<filter>
<condition attribute="lang_languageid" operator="in">
<ufx:apply select="$input/Languages/bag[position() > 2]">
<value>
<ufx:value select="@ufx-id" />
</value>
</ufx:apply>
</condition>
</filter>
</link-entity>
<filter type="or">
<condition entityname="lang_primary" attribute="lang_languageid" operator="not-null" ufx:if="$input/Languages/bag[1]" />
<condition entityname="lang_secondary" attribute="lang_languageid" operator="not-null" ufx:if="$input/Languages/bag[2]" />
<condition entityname="lang_others" attribute="lang_languageid" operator="not-null" ufx:if="$input/Languages/bag[position() > 2]" />
</filter>
フィルター パネルで選択した値は入力としてクエリに渡され、XPath
$input
変数で利用可能です
リソース取得クエリは FetchXML を使用して Resource (bookableresource)
エンティティをクエリします。 ここでは FetchXML link-entity
要素はフィルター パネルで選択された言語レコードに関連付けられたリソースを戻すためにのみ使用します。 リソース セル テンプレート セクションで後で説明されますが、一致する言語の表示、および一次言語または二次言語での配列をサポートするため、複数の link-entity
結合を使用します。
これは element
および attribute
ごとの説明です。
名前 | 説明 |
---|---|
link-entity |
リソース エンティティと言語エンティティ間の多対多関連付けに対する結合の作成 |
ufx:if |
この属性内の XPath 表現が値を返す場合にのみ、この FetchXML 要素 (link-entity ) を発します |
attribute |
一致する一次言語または二次言語を戻します |
filter および condition |
指定した言語 ID と一致する多対多関連付けレコードのみをフィルターします |
ufx:value および select |
select 属性内の XPath 表現の結果を出力します |
ufx:apply および select |
select 属性内の XPath 表現から戻された各結果のために子 FetchXML 要素を発します |
value |
言語レコードの ID を含みます |
リソースの並べ替え順序の決定
一致するリソースを取得後、各リソースに割り当てられた言語に基づき、新しい lang_order
プロパティを割り当て、その並び変え順を決定します。
<bag>
<lang_order ufx:select="iif(lang_primary and lang_secondary, 1, iif(lang_primary, 2, iif(lang_secondary, 3, 4)))" />
</bag>
これは element
および attribute
ごとの説明です。
名前 | 説明 |
---|---|
lang_order |
lang_order という名前の FetchXML クエリから戻された各リソースで新しいプロパティを作成します |
ufx:select |
この属性内の XPath 表現の結果を lang_order プロパティに割り当てます。 先にクエリで取得された lang_primary および lang_secondary プロパティは、XPath iif 関数とともに使用して、リソースが一致する順序を決定します。 |
結果の順位設定
<Resources ufx:select="order(Resources, 'lang_order')" />
UFX クエリは順番に処理されます。 FetchXML を介してリソースが取得された後、結果が Resources
プロパティに割り当てられます。 既に追加している lang_order
プロパティに基づいて結果を並び替え、並び替えの結果を Resources
プロパティに再度割り当てます。
これは element
および attribute
ごとの説明です。
件名 | 内容 |
---|---|
Resources |
Resources プロパティの再割り当て |
ufx:select |
この属性内の XPath 表現の結果を Resources プロパティに割り当てます。 XPath order 関数は lang_order プロパティ上の Resources リストを並び替えるために使用します。 |
Note
Universal Resource Scheduling に付属する既定のリソース取得クエリは、Universal Resource Scheduling に含まれるすべてのリソース制約をサポートする大きなクエリです。 この演習では、既定のクエリのサブセットのみを使用して、言語をフィルターとしてのみ追加します。
<?xml version="1.0" encoding="utf-8" ?>
<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
<Resources ufx:source="fetch">
<fetch mapping="logical" aggregate="true">
<entity name="bookableresource">
<attribute name="bookableresourceid" alias="bookableresourceid" groupby="true"/>
<attribute name="name" alias="name" groupby="true"/>
<attribute name="calendarid" alias="calendarid" groupby="true"/>
<attribute name="resourcetype" alias="resourcetype" groupby="true"/>
<attribute name="msdyn_startlocation" alias="startlocation" groupby="true"/>
<!-- Language join -->
<link-entity name="lang_lang_language_bookableresource" from="bookableresourceid" to="bookableresourceid" alias="lang_primary" link-type="outer" ufx:if="$input/Languages/bag[1]">
<attribute name="lang_languageid" alias="lang_primary" groupby="true" />
<filter>
<condition attribute="lang_languageid" operator="eq">
<ufx:value select="$input/Languages/bag[1]/@ufx-id" attribute="value" />
</condition>
</filter>
</link-entity>
<link-entity name="lang_lang_language_bookableresource" from="bookableresourceid" to="bookableresourceid" alias="lang_secondary" link-type="outer" ufx:if="$input/Languages/bag[2]">
<attribute name="lang_languageid" alias="lang_secondary" groupby="true" />
<filter>
<condition attribute="lang_languageid" operator="eq">
<ufx:value select="$input/Languages/bag[2]/@ufx-id" attribute="value" />
</condition>
</filter>
</link-entity>
<link-entity name="lang_lang_language_bookableresource" from="bookableresourceid" to="bookableresourceid" alias="lang_others" link-type="outer" ufx:if="$input/Languages/bag[position() > 2]">
<filter>
<condition attribute="lang_languageid" operator="in">
<ufx:apply select="$input/Languages/bag[position() > 2]">
<value>
<ufx:value select="@ufx-id" />
</value>
</ufx:apply>
</condition>
</filter>
</link-entity>
<filter type="or">
<condition entityname="lang_primary" attribute="lang_languageid" operator="not-null" ufx:if="$input/Languages/bag[1]" />
<condition entityname="lang_secondary" attribute="lang_languageid" operator="not-null" ufx:if="$input/Languages/bag[2]" />
<condition entityname="lang_others" attribute="lang_languageid" operator="not-null" ufx:if="$input/Languages/bag[position() > 2]" />
</filter>
<link-entity name="systemuser" from="systemuserid" to="userid" link-type="outer">
<attribute name="systemuserid" alias="systemuserid" groupby="true" />
<attribute name="entityimage_url" alias="userimagepath" groupby="true"/>
</link-entity>
<link-entity name="contact" from="contactid" to="contactid" link-type="outer">
<attribute name="contactid" alias="contactid" groupby="true"/>
<attribute name="entityimage_url" alias="contactimagepath" groupby="true"/>
</link-entity>
<link-entity name="account" from="accountid" to="accountid" link-type="outer">
<attribute name="accountid" alias="accountid" groupby="true"/>
<attribute name="entityimage_url" alias="accountimagepath" groupby="true"/>
</link-entity>
</entity>
</fetch>
<bag>
<imagepath ufx:select="accountimagepath | contactimagepath | userimagepath" />
<accountimagepath ufx:select="$null" />
<contactimagepath ufx:select="$null" />
<userimagepath ufx:select="$null" />
<lang_order ufx:select="iif(lang_primary and lang_secondary, 1, iif(lang_primary, 2, iif(lang_secondary, 3, 4)))" />
</bag>
</Resources>
<Resources ufx:select="order(Resources, 'lang_order')" />
</bag>
スケジュール ボードのリソース取得クエリの更新
- 右上の、言語タブをダブルクリックします
- 全般設定 > その他の設定の順にスクロール ダウンします
- リソース取得クエリのフィールドを見つけて、右のボタンをクリックしエディターを開きます。
- 上のリソース取得クエリ コードで値フィールドを更新して、名前を付けて保存をクリックします
- 名前フィールドに「言語リソース クエリ」と入力して保存をクリックします。 これで、新しい構成レコードが作成され、このスケジュール ボードがレコードにリンクされます。
- ダイアログの下部で、適用をクリックします。
ボードは更新された構成を再ロードします。 フィルター処理が機能するようになります。 言語レコードを作成してリソース レコードに関連付けている場合、それらに関連付けられた言語でリソースをフィルター処理することができるようになります。
サマリー
上記の手順では、言語エンティティにフィルター コントロールを表示するようフィルター パネルを修正しました。 また、選択された言語レコードに関連付けられたリソースに一致するようにリソース取得クエリを修正しました。 ユーザーがフィルター コントロール内の値を選択して検索をクリックが取得すると、値がクエリに渡され、FetchXML クエリは一致するリソースのみを戻します。
スケジュール アシスタントのカスタマイズ
新しい言語制約をスケジュール アシスタントで使用するため、スケジュール アシスタント フィルターのレイアウトおよび制約取得クエリの構成をカスタマイズする必要があります。
各ボードが別々にカスタマイズされることができるスケジュール ボードのカスタマイズとは異なり、スケジュール アシスタントのカスタマイズはスケジュール アシスタントを使用するすべてのボードに影響します。 スケジュール アシスタントのカスタマイズは、スケジュール可能な種類固有に、またはすべての種類に対して作成することができます。 この例では、すべての種類に対するスケジュール アシスタントをカスタマイズします。
スケジュール アシスタント フィルター レイアウトの構成
チップ
以下の手順では、XML構文を強調表示に対応した便利なテキストエディタを使用して変更を加え、その変更を Universal Resource Scheduling エディタに貼り付けています。
スケジュール アシスタント フィルター レイアウトの構成は、スケジュール ボード フィルター レイアウトのように、フィルター パネル内のコントロールのレイアウトを定義します。 スケジュール アシスタントは、開始時間、終了時間、期間など、スケジュール ボードより多くのフィルターを使用し、異なるレイアウトが使用されます。
Note
この演習では、スケジュール アシスタント フィルター レイアウトの構成に由来する Universal Resource Scheduling で出荷された既定のフィルターのサブセットのみを再使用し、言語ドロップダウンを唯一使用可能なフィルターとして追加します。
レイアウトに追加するフィルターは、フィルター レイアウトの構成では上記と同じです。 他のコントロールは、スケジュール アシスタント検索パラメータを修正する必要があります。
完全なスケジュール アシスタント フィルター レイアウト
<?xml version="1.0" encoding="utf-8" ?>
<filter>
<controls>
<control type="twocolumn">
<control type="combo" source="optionset" key="Requirement/msdyn_worklocation" label-id="ScheduleAssistant.West.settingsform.WorkLocation" entity="msdyn_resourcerequirement" attribute="msdyn_worklocation">
<bind property="disabled" to="Requirement/InitialWorkLocation" operator="eq" value="690970002" />
<data>
<value id="690970000" />
<value id="690970001" />
<value id="690970002" />
</data>
</control>
<control type="duration" key="Requirement/msdyn_remainingduration" label-id="ScheduleAssistant.West.settingsform.AvailableDuration" />
</control>
<control type="distance" key="Requirement/Radius" label-id="ScheduleAssistant.West.settingsform.Radius" min="1">
<bind property="disabled" to="Requirement/msdyn_worklocation" operator="eq" value="690970002" />
</control>
<control type="datetime" key="Requirement/msdyn_fromdate" label-id="ScheduleAssistant.West.settingsform.StartDay">
<bind property="disabled" to="Requirement/RealTimeMode" operator="eq" value="true" />
<bind property="max" to="Requirement/msdyn_todate" operator="eq" />
</control>
<control type="datetime" key="Requirement/msdyn_todate" label-id="ScheduleAssistant.West.settingsform.EndDay">
<bind property="min" to="Requirement/msdyn_fromdate" operator="eq" />
</control>
<control type="combo" source="entity" key="Languages" inactive-state="1" label-id="Languages" entity="lang_language" multi="true" />
</controls>
</filter>
スケジュール アシスタント フィルター レイアウトの更新
- 右上の、言語タブをダブルクリックします
- 右上で、既定の設定を開くをクリックします
- スケジュールの種類セクションまでスクロールして、左のリストでなしを選択します。
- スケジュール アシスタント フィルター レイアウト フィールドを見つけて、右のボタンをクリックしてエディターを開きます。
- 上のスケジュール アシスタント フィルター レイアウト コードで値フィールドを更新して、名前を付けて保存をクリックします。
- 名前フィールドに「言語スケジュール アシスタント フィルター レイアウト」と入力して保存をクリックします。 これで、新しい構成レコードが作成され、このスケジュール ボードがレコードにリンクされます。
- ダイアログの下部で、適用をクリックします。
ボードが再ロードされます。 次に、新しい言語制約でスケジュール アシスタントを使用し、要件の言語セットがスケジュール アシスタント検索の一部になるようにするため、制約取得クエリを変更する必要があります。
制約取得クエリの構成
チップ
以下の手順では、XML構文を強調表示に対応した便利なテキストエディタを使用して変更を加え、その変更を Universal Resource Scheduling エディタに貼り付けています。
制約取得クエリの構成は、要件制約取得 API が使用する UFX クエリです。 入力内容は要件レコードの ID (UI で選択した) とみなされ、要件レコードおよびその子レコードすべてを戻します。
Note
Universal Resource Scheduling に付属する既定の制約取得クエリは、Universal Resource Scheduling に含まれるすべての要件制約をサポートする大きなクエリです。 この演習では、既定のクエリのサブセットのみを使用して、言語をフィルターとしてのみ追加します。
<Languages ufx:select="lookup-to-list(Requirement/lang_primarylanguage, Requirement/lang_secondarylanguage)" />
UFX クエリは順番に処理されます。 制約取得クエリは FetchXML を使用して Requirement (msdyn_resourcerequirement)
エンティティをクエリし、結果の要件レコードを Requirement
プロパティに割り当てます。 属性、一次言語と二次言語の両方をエンティティの単一のリスト (EntityCollection) に結合する新しいプロパティ Languages
を、制約プロパティ バッグに追加します。 言語コントロールをレコードの一覧としてフィルター パネルに表示するためにこれが必要になります。 代わりの方法は、2 つの属性に対してフィルター パネルに 2 つの異なるコントロールを作成することです。
これは element
および attribute
ごとの説明です。
名前 | 説明 |
---|---|
Languages |
結果の制約プロパティ バッグに Languages という名前の新しいプロパティを作成します |
ufx:select |
この属性内の XPath 表現の結果を Languages プロパティに割り当てます。 先のクエリで取得した Requirement プロパティで使用可能な lang_primarylanguage および lang_secondarylanguage プロパティは、複数の lookup プロパティを単一の list (EntityCollection) に変換する lookup-to-list XPath 関数に渡されます |
制約取得クエリ:
<?xml version="1.0" encoding="utf-8" ?>
<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
<Requirement ufx:source="fetch" ufx:select="bag[1]">
<fetch top="1">
<entity name="msdyn_resourcerequirement">
<all-attributes />
<filter>
<condition attribute="statecode" operator="eq" value="0" />
<condition attribute="msdyn_resourcerequirementid" operator="eq">
<ufx:value select="$input/@ufx-id" attribute="value" />
</condition>
</filter>
</entity>
</fetch>
<bag>
<InitialWorkLocation ufx:select="msdyn_worklocation" />
</bag>
</Requirement>
<Languages ufx:select="lookup-to-list(Requirement/lang_primarylanguage, Requirement/lang_secondarylanguage)" />
</bag>
制約取得クエリの更新
- 右上の、言語タブをダブルクリックします
- 右上で、既定の設定を開くをクリックします
- スケジュールの種類セクションまでスクロールして、左のリストでなしを選択します。
- スケジュール アシスタントの制約取得クエリ フィールドを見つけて、右のボタンをクリックしてエディターを開きます。
- 上のリソース取得クエリ コードで値フィールドを更新して、名前を付けて保存をクリックします
- 名前フィールドに「言語制約クエリ」と入力して保存をクリックします。 これで、新しい構成レコードが作成され、このスケジュール ボードがレコードにリンクされます。
- スケジュール アシスタントの制約取得クエリ フィールドを見つけて、先にスケジュール ボードのカスタマイズのために作成した言語リソース クエリを選択します
- ダイアログの下部で、適用をクリックします。
ボードは更新された構成を再ロードします。 スケジュール アシスタントのフィルター処理が機能するようになります。 言語レコードを作成して要件レコードに関連付けている場合、スケジュール ボードの下部にある要件レコードを検索して、空き時間の検索をクリックしてスケジュール アシスタントを起動し、要件で保存した言語に一致するリソースのみを表示することができます。
リソース セル テンプレートの構成
チップ
以下の手順では、XML構文の強調表示に対応した便利なテキストエディタを使用して変更を加え、その変更を Universal Resource Scheduling エディタに貼り付けています。
リソース セル テンプレートの構成は、リソース セル内の内容を表示するために使用する Handlebars テンプレートです。 リソース取得クエリからの出力はテンプレートに対して使用可能です。
リソースが一次言語および二次言語に一致する場合は緑の ✔✱ インジケーター、リソースが一次言語のみに一致する場合は緑の ✔ インジケーター、リソースが二次言語のみに一致する場合は黄色の ✔ インジケーターを表示するように、既定のリソース テンプレートを修正します。
{{#if lang_primary}}
<span style='color:green;'>✔{{#if lang_secondary}} ✱{{/if}}</span>
{{else if lang_secondary}}
<span style='color:#ffe700;'>✔</span>
{{/if}}
lang_primary
および lang_secondary
プロパティが、上で設定したカスタム リソース取得クエリから戻されます。 構文のテンプレート化の説明については、Handlebars の Web サイトを参照してください。
リソース セル テンプレート:
<div class='resource-card-wrapper {{iif ResourceCellSelected "resource-cell-selected" ""}} {{iif ResourceUnavailable "resource-unavailable" ""}} {{iif IsMatchingAvailability "availability-match" ""}}'>
{{#if imagepath}}
<img class='resource-image' src='{{client-url}}{{imagepath}}' />
{{else}}
<div class='resource-image unknown-resource'></div>
{{/if}}
<div class='resource-info'>
<div class='resource-name primary-text ellipsis' title='{{name}}'>{{name}}</div>
<div class='secondary-text ellipsis'>
{{#if (eq (is-sa-grid-view) false) }}
<div class='booked-duration'>{{BookedDuration}}</div>
<div class='booked-percentage'>
{{BookedPercentage}}%
{{#if lang_primary}}
<span style='color:green;'>✔{{#if lang_secondary}} ✱{{/if}}</span>
{{else if lang_secondary}}
<span style='color:#ffe700;'>✔</span>
{{/if}}
</div>
{{/if}}
</div>
{{#if (eq (is-sa-grid-view) false) }}
<div class='matching-indicator'></div>
{{/if}}
</div>
{{#if (eq (is-sa-grid-view) false) }}
{{> resource-map-pin-template this }}
{{/if}}
</div>
リソース セル テンプレートの更新
- 右上の、言語タブをダブルクリックします
- 右上で、既定の設定を開くをクリックします
- スケジュールの種類セクションまでスクロールして、左のリストでなしを選択します。
- スケジュール アシスタントのリソース セル テンプレート フィールドを見つけて、右のボタンをクリックしてエディターを開きます。
- 上のリソース セル テンプレートで値フィールドを更新して、名前を付けて保存をクリックします
- 名前フィールドに「言語リソース セル テンプレート」と入力して保存をクリックします。 これで、新しい構成レコードが作成され、このスケジュール ボードがレコードにリンクされます。
- ダイアログの下部で、適用をクリックします。
ボードは更新された構成を再ロードします。 リソースがフィルター パネル内の言語制約に一致する様子がリソース セルに表示されるようになります。
サマリー
上記の手順では、言語エンティティにフィルター コントロールを表示するようスケジュール アシスタントのフィルター パネルを修正しました。 また、要件エンティティを参照する新しい言語属性をクエリするように制約取得クエリを修正して、リストにします。 ユーザーが要件レコードの利用可能性の検索を選択すると、キャプチャされた言語制約がフィルター パネルに表示されます。 フィルター パネルからの値はリソース取得クエリ渡され、FetchXML クエリは一致するリソースのみを戻します。