このステップ バイ ステップ ガイドは、Universal Resource Scheduling でのリソース照合の理解とカスタマイズのコンパニオンです
このステップ バイ ステップ ガイドでは、 Language
制約を使用して Universal Resource Scheduling リソースを拡張します。 たとえば、話す言語でリソースをフィルタリングしたいと考えている組織について考えてみます。 また、ジョブに必要な言語を Requirement
レコードにキャプチャすることも望んでいます。 この制約は、組み込みの Territory
制約と同様のパターンに従います。 新しいメイン エンティティは、リソースが話すことができるさまざまな言語を格納する Language
。 その後、 Resource
レコードは、多対多の関連付けエンティティを通じて多くの Languages
に関連付けることができます。 Requirement
エンティティでは、Primary Language
と Secondary Language
という 2 つの新しいルックアップ属性を作成することで、これをモデル化します。 システムが要件に使用可能なリソースを検索すると、 Primary Language
または Secondary Language
に関連付けられているリソースのみが表示されます。
新しいエンティティとリレーションシップの作成
このセクションでは、メイン Language
エンティティの新しいスキーマを作成し、新しい Language
エンティティに対応するリレーションシップを使用して Resource
エンティティと Requirement
エンティティを更新します。
新しいパブリッシャーを作成する
Dynamics 365 の [カスタマイズ] で、新しい Publisher を作成します。
新しいパブリッシャーフォームに以下の詳細を記入します。
フィールド 価値 表示される名前 言語 名前 言語 接頭辞 ラング 保存して閉じる を選択します。
新しいソリューションを作成する
Dynamics 365 の [カスタマイズ] で、新しいソリューションを作成します。
新しいソリューションフォームに以下の詳細を記入してください。
フィールド 価値 表示される名前 言語 名前 言語 発行者 言語 バージョン 1.0.0.0 保存 を選択します。
言語エンティティを作成する
言語ソリューションで、新しいエンティティを作成します。
「新規エンティティ」フォームに以下の詳細を記入します。
フィールド 価値 表示される名前 言語 複数名 言語 名前 lang_language ( lang_
プレフィックスは自動入力され、読み取り専用になります)[保存] を選択します。
Resource エンティティと Language エンティティの間に多対多のリレーションシップを作成します。
言語エンティティで、新しい多対多の関連付けを作成します。
「新規リレーション」フォームに以下の詳細を記入してください。
フィールド 価値 現在のエンティティ 表示オプション 複数形の名前を使用 その他のエンティティ エンティティ名 予約可能リソースです 保存して閉じる を選択します。
言語エンティティフォームを閉じます。
要件エンティティから言語エンティティへの関連付けを作成します
言語ソリューションで、既存のリソース要件エンティティをソリューションに追加します。 「不足している必須コンポーネント」ダイアログが表示された場合は、「いいえ、必要なコンポーネントを含めません」を選択します。
リソース要件エンティティで、新しいフィールドを作成します。
「新規フィールド」フォームに以下の詳細を記入します。
フィールド 価値 表示される名前 第一言語 データ型 参照 対象レコードの種類 言語 保存して閉じる を選択します。
リソース要件エンティティで、新しいフィールドを作成します。
「新規フィールド」フォームに以下の詳細を記入します。
フィールド 価値 表示される名前 第二言語 データ型 参照 対象レコードの種類 言語 保存して閉じる を選択します。
要件のメイン フォームの更新
- リソース要件エンティティで、既存の情報フォームをエンティティのサブコンポーネントに追加します。 「不足している必須コンポーネント」ダイアログが表示された場合は、「いいえ、必要なコンポーネントを含めません」を選択します。
- [情報] フォームで、フィールド エクスプローラーを使用して 2 つの新しい属性 (1 次言語と 2 次言語) をフォームに追加し、ユーザーが要件を作成するときにこの情報を入力できるようにします。
- 保存 を選択します。
- 公開を選択します。
概要
上記の手順では、新しい Language エンティティを作成しました。 次に、Resource エンティティと Requirement エンティティとの新しいリレーションシップを追加しました。 リソースは、言語とリソースの間に多対多の関係を追加したため、複数の言語に関連付けることができます。 要件エンティティに新しい言語エンティティを指す 2 つの検索属性を追加したため、要件を 2 つの言語に関連付けることができます。
データの追加
高度な検索を使用して、言語エンティティに新しいレコードを追加します。 その後、リソース レコードを開き、ナビゲーション バーで 言語 リレーションシップに移動することで、リソース レコードを新しい言語レコードに関連付けることができます。 要件レコードの場合、要件フォームの新しい [第一言語] フィールドと [第二言語] フィールドに入力できます。
スケジュール ボードのカスタマイズ
新しい言語制約を使用してスケジュール ボードのリソースをフィルター処理するには、リソース取得クエリとフィルター レイアウト構成レコードを更新します。
注
これらのスケジュール ボードのカスタマイズは、すべてのタブに一律に適用され、タブごとに個別に設定することはできません。これは、 Schedule Assistant Filter Layout、「 Schedule Assistant Retrieve Resources Query」、「 Schedule Assistant Resource Cell Template」、および 「Schedule Assistant Retrieve Constraints Query」に適用されます。
フィルターレイアウト構成
ヒント
次の手順では、XML 構文の強調表示をサポートするテキスト エディターを使用して変更を加え、変更を Universal Resource Scheduling エディターに貼り付けると便利です。
フィルター・レイアウト構成は、フィルター・パネルのレイアウトをカスタマイズするための XML レイアウト定義です。
注
この演習では、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 |
1 つまたは複数のレコードを選択できるようにドロップダウンを構成します |
フィルターレイアウト:
<?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 の上部のナビゲーション バーで、 リソース スケジュール>スケジュール ボード に移動します。
- 右上の + 記号を選択して、新しいボードを作成します。
- 新しいボードの言語に名前を付けます。
- ダイアログの下部にある [追加] を選択します。 新しいボードが作成されます。
スケジュール ボード フィルター レイアウトの更新
次に、スケジュール ボードで使用されるフィルター レイアウトとクエリを格納する新しい構成レコードを作成し、新しく作成したスケジュール ボードを新しい構成レコードにリンクします。 これを行うには複数の方法がありますが、最も簡単な方法は次のとおりです。
- [言語] タブを選択します。
- [一般設定] >[その他の設定] まで下にスクロールします。
- [フィルター レイアウト] フィールドを見つけ、右側のボタンを選択してエディターを開きます
- 上記の [フィルター レイアウト] コードで [値] フィールドを更新し、[名前を付けて保存] を選択します。
- 「名前」フィールドに「Language Filter Layout」と入力し、「保存」を選択します。 これにより、新しい構成レコードが作成され、このスケジュール ボードがレコードにリンクされます。
- ダイアログの下部にある [適用] を選択します
ボードが再読み込みされ、左側に新しいレイアウトのフィルターパネルが表示されます。「言語」フィルターのみを使用できます。 新しいフィルターを利用するには、リソース取得クエリを更新する必要があるため、フィルタリングはまだ機能しません。
リソースの取得クエリ構成
ヒント
次の手順では、XML 構文の強調表示をサポートするテキスト エディターを使用して変更を加え、変更を Universal Resource Scheduling エディターに貼り付けると便利です。
Retrieve Resources Query 設定は、Resource Matching 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
要素を使用して、フィルター パネルで選択した言語レコードに関連付けられているリソースのみを返します。 一致した言語の表示と、主言語または第 2 言語による順序付けをサポートするために、後述の「 リソース セル テンプレート」で説明するように、複数の link-entity
結合を使用しています。
各 element
と attribute
の説明は次のとおりです。
名前 | 説明 |
---|---|
link-entity |
リソース エンティティと言語エンティティ間の多対多関連付けに対する結合の作成 |
ufx:if |
この FetchXML 要素 (link-entity ) を出力するのは、この属性の XPath 式が値を返した場合のみです |
attribute |
一致した第一言語または第二言語を返します |
filter と condition |
多対多の関連付けレコードをフィルター処理して、指定した言語 ID に一致するレコードのみにします |
ufx:value と select |
XPath 式の結果を select 属性に出力します |
ufx:apply と select |
XPath 式から返される各結果の子 FetchXML エレメントを select 属性に出力します |
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 |
FetchXML クエリから返される各リソースに新しいプロパティを作成します。 lang_order |
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 リストを並べ替えるために使用されます。 |
注
Universal Resource Scheduling に付属するデフォルトのリソース取得クエリは、Universal Resource Scheduling に含まれるすべてのリソース制約をサポートする大規模なクエリです。 この演習では、既定のクエリのサブセットのみを使用し、唯一のフィルターとして Languages を追加します。
<?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>
スケジュール ボードのリソース取得クエリを更新する
- 右上の「言語」タブをダブルクリックします
- [一般設定] > [その他の設定]まで下にスクロールします
- [リソースの取得クエリ] フィールドを見つけ、右側のボタンを選択してエディターを開きます
- 上記の Retrieve Resources Query コードで Value フィールドを更新し、Save As を選択します
- [名前] フィールドに「Language Resources Query」と入力し、[保存] を選択します。 これにより、新しい構成レコードが作成され、このスケジュール ボードがレコードにリンクされます。
- ダイアログの下部にある [適用] を選択します
ボードは更新された構成でリロードされます。 フィルタリングが機能するようになりました。 言語レコードを作成し、それらをリソース レコードに関連付けた場合、関連付けられた言語でリソースをフィルター処理できるようになりました。
概要
上記の手順では、Language エンティティのフィルター コントロールを表示するように [フィルター] パネルを変更しました。 また、選択した言語レコードに関連付けられたリソースに一致するように、リソース取得クエリも変更しました。 ユーザーがフィルター コントロールで値を選択し、[検索] を選択すると、値がクエリに渡され、FetchXML クエリは一致するリソースのみを返します。
スケジュールアシスタントのカスタマイズ
スケジュール アシスタントのフィルター レイアウトと制約クエリの取得構成をカスタマイズして、スケジュール アシスタントの新しい言語制約を使用する必要があります。
各ボードを個別にカスタマイズできるスケジュール ボードのカスタマイズとは異なり、スケジュール アシスタントのカスタマイズは、スケジュール アシスタントが使用されるすべてのボードに影響します。 スケジュール アシスタントのカスタマイズは、スケジュール可能なタイプに固有にすることも、すべてのタイプに固有にすることもできます。 この例では、すべてのタイプのスケジュールアシスタントをカスタマイズします。
スケジュールアシスタントフィルターレイアウト構成
ヒント
次の手順では、XML 構文の強調表示をサポートするテキスト エディターを使用して変更を加え、変更を Universal Resource Scheduling エディターに貼り付けると便利です。
Schedule Assistant Filter Layout 設定は、Schedule Board Filter Layout と同様に、Filter パネルのコントロールのレイアウトを定義します。 スケジュールアシスタントは、開始時間、終了時間、期間など、スケジュールボードよりも多くのフィルターを使用するため、異なるレイアウトが使用されます。
注
この演習では、スケジュール アシスタント フィルター レイアウト構成から 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>
スケジュール アシスタントのフィルター レイアウトの更新
- 右上の「言語」タブをダブルクリックします
- 右上の [既定の設定を開く] を選択します
- [スケジュールの種類] セクションまでスクロールし、左側のリストで [なし] を選択します
- [Schedule Assistant Filter Layout] フィールドを見つけ、右側のボタンを選択してエディターを開きます
- 上記のスケジュールアシスタントフィルターレイアウトコードで[値]フィールドを更新し、[名前を付けて保存]を選択します
- 「名前」フィールドに「Language Schedule Assistant Filter Layout」と入力し、「保存」を選択します。 これにより、新しい構成レコードが作成され、このスケジュール ボードがレコードにリンクされます。
- ダイアログの下部にある [適用] を選択します
ボードがリロードされます。 次に、新しい言語制約でスケジュール アシスタントを使用する前に、制約クエリを取得して、要件に設定された言語がスケジュール アシスタント検索の一部になるようにする必要があります。
制約クエリ設定の取得
ヒント
次の手順では、XML 構文の強調表示をサポートするテキスト エディターを使用して変更を加え、変更を Universal Resource Scheduling エディターに貼り付けると便利です。
Retrieve Constraints Query 設定は、Retrieve Requirement Constraints API によって使用される UFX クエリ です。 これは、要件レコード (UI で選択) の ID を入力として受け取り、要件レコードとそのすべての子レコードを返します。
注
Universal Resource Scheduling に付属する既定の制約取得クエリは、Universal Resource Scheduling に含まれるすべての要件制約をサポートする大規模なクエリです。 この演習では、既定のクエリのサブセットのみを使用し、唯一のフィルターとして Languages を追加します。
<Languages ufx:select="lookup-to-list(Requirement/lang_primarylanguage, Requirement/lang_secondarylanguage)" />
UFX クエリは順番に処理されます。 制約取得クエリは、FetchXML を使用して Requirement (msdyn_resourcerequirement)
エンティティをクエリし、結果である要件レコードを Requirement
プロパティに割り当てます。 制約プロパティ バッグに、プライマリ言語とセカンダリ言語の両方の属性を 1 つのエンティティ リスト (EntityCollection) に結合する新しいプロパティ Languages
を追加しています。 これは、フィルター パネルの 言語 コントロールをレコードの一覧として表示しているため、必要です。 別の方法として、フィルター パネルに 2 つの属性に対して 2 つの個別のコントロールを作成することもできます。
各 element
と attribute
の説明は次のとおりです。
名前 | 説明 |
---|---|
Languages |
結果制約プロパティ バッグに新しいプロパティを作成します。 Languages |
ufx:select |
この属性の XPath 式の結果を Languages プロパティに割り当てます。 クエリの前半で取得され、Requirement プロパティで使用できる lang_primarylanguage プロパティと lang_secondarylanguage プロパティは、lookup-to-list XPath 関数に渡され、複数の lookup プロパティを 1 つに変換しますlist (EntityCollection) |
制約クエリの取得:
<?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>
制約取得クエリの更新
- 右上の「言語」タブをダブルクリックします
- 右上の [既定の設定を開く] を選択します
- [スケジュールの種類] セクションまでスクロールし、左側のリストで [なし] を選択します
- Schedule Assistant Retrieve Constraints Query フィールドを見つけ、右側のボタンを選択してエディターを開きます
- 上記の Retrieve Resources Query コードで Value フィールドを更新し、Save As を選択します
- [名前] フィールドに「Language Constraints Query」と入力し、[保存] を選択します。 これにより、新しい構成レコードが作成され、このスケジュール ボードがレコードにリンクされます。
- Schedule Assistant Retrieve Resources Query フィールドを見つけて、Schedule Board のカスタマイズ用に以前に作成した言語リソース クエリを選択します
- ダイアログの下部にある [適用] を選択します
ボードは更新された構成でリロードされます。 スケジュールアシスタントのフィルタリングが機能するようになりました。 言語レコードを作成し、それらを要件レコードに関連付けた場合、スケジュール ボードの下部で要件レコードを選択し、空き状況の検索 を選択してスケジュール アシスタントを起動し、要件に保存された言語に一致するリソースのみを表示できるようになりました。
リソースセルテンプレートの設定
ヒント
以下の手順では、HTML 構文の強調表示をサポートするテキスト エディターを使用して変更を加え、変更を 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>
リソースセルテンプレートの更新
- 右上の「言語」タブをダブルクリックします
- 右上の [既定の設定を開く] を選択します
- [スケジュールの種類] セクションまでスクロールし、左側のリストで [なし] を選択します
- 「Schedule Assistant Resource Cell Template」フィールドを見つけ、右側のボタンを選択してエディターを開きます
- 上記のリソースセルテンプレートコードで[値]フィールドを更新し、[名前を付けて保存]を選択します
- 「名前」フィールドに「Language Resource Cell Template」と入力し、「保存」を選択します。 これにより、新しい構成レコードが作成され、このスケジュール ボードがレコードにリンクされます。
- ダイアログの下部にある [適用] を選択します
ボードは更新された構成でリロードされます。 リソースセルは、リソースがフィルターパネルの言語制約にどのように一致したかを示します。
概要
上記の手順では、スケジュール アシスタントの フィルター パネルを変更して、Language エンティティのフィルター コントロールを表示しました。 また、Requirement エンティティに関連する新しい言語属性をクエリし、それらをリストに整形するように、制約取得クエリも変更しました。 ユーザーが要件レコードの可用性を検索することを選択すると、フィルター パネルにキャプチャされた言語制約が表示されます。 [フィルタ] パネルの値は [リソースの取得] クエリに渡され、FetchXML クエリは一致するリソースのみを返します。