次の方法で共有


サンプル: カスタム言語制約による Universal Resource Scheduling の拡張

この記事は、 ユニバーサル リソース スケジューリングでのリソース マッチングの理解とカスタマイズに関する記事です。

このステップ バイ ステップ ガイドでは、 Language 制約を使用して Universal Resource Scheduling リソースを拡張します。 たとえば、話す言語でリソースをフィルタリングしたいと考えている組織について考えてみます。 また、ジョブに必要な言語を Requirement レコードにキャプチャすることも望んでいます。 この制約は、組み込みの Territory 制約と同様のパターンに従います。 新しいメイン エンティティは、リソースが話すことができるさまざまな言語を格納する Language 。 その後、 Resource レコードは、多対多の関連付けエンティティを通じて多くの Languages に関連付けることができます。 Requirementエンティティでは、Primary LanguageSecondary Language という 2 つの新しいルックアップ属性を作成することで、これをモデル化します。 システムが要件に使用可能なリソースを検索すると、 Primary Language または Secondary Language に関連付けられているリソースのみが表示されます。

ヒント

エンティティはテーブルとも呼ばれます。

新しいテーブルとリレーションシップを作成する

メイン Language テーブルの新しいスキーマを作成し、新しいResource テーブルへの対応するリレーションシップでRequirementテーブルとLanguage テーブルを更新します。

新しいパブリッシャーを作成する

  1. Power Platform 環境設定アプリにアクセスします。 > Publishers を選択し、新しいパブリッシャーを作成します。 詳細については、 パブリッシャーの作成に関するページを参照してください

  2. 次の情報を入力してください。

    Field 価値
    表示名称 Language
    名前 Language
    接頭辞 lang
  3. 保存 を選択します。

新しいソリューションの作成

  1. [カスタマイズ]>[ソリューション]を選択し、新しいソリューションを作成します。 詳細については、「 ソリューションの作成」を参照してください

  2. 次の情報を入力してください。

    Field 価値
    表示される名前 Language
    名前 Language
    発行者 Language
    Version 1.0.0.0
  3. を選択してを作成します。

言語テーブルを作成する

  1. 言語ソリューションを開き、 新規>Table>Table (詳細プロパティ) を選択します。 詳細については、 新しいテーブルの作成に関するページを参照してください。

  2. 次の情報を入力してください。

    Field 価値
    表示される名前 Language
    複数名 言語

    [詳細オプション] の下のスキーマ名が自動的に入力されます|lang_Language。 lang_ プレフィックスは読み取り専用です。

  3. 保存 を選択します。

リソース テーブルから Language テーブルへの多対多リレーションシップを作成する

  1. Language テーブルを開き、New>Relationship>、Many-to-many を選択します。 詳細については、 多対多テーブル リレーションシップの作成に関するページを参照してください。
  2. [関連 (複数) テーブル] で、[予約可能リソース] を選択します。
  3. 完了を選択します。
  4. 言語テーブルを閉じます。

既存の要件テーブルから Language テーブルへのリレーションシップを作成する

  1. 言語ソリューションを開き、[既存の追加] テーブル資源要件 を選択します。

  2. [不足している必須コンポーネント] ダイアログボックスが表示された場合は、[ いいえ] を選択し、必要なコンポーネントは含めないでください。

  3. [] を選択し、[] を追加します。

  4. リソース要件テーブルで、新しい列を作成します。

  5. 次の情報を入力してください。

    Field 価値
    表示名称 第一言語
    データの種類 参照
    関連テーブル Language
  6. 保存 を選択します。

  7. リソース要件テーブルで、新しい列を作成します。

  8. 次の情報を入力してください。

    Field 価値
    表示名称 第二言語
    データの種類 参照
    関連テーブル Language
  9. 保存 を選択します。

要件のメイン フォームの更新

  1. [リソース要件] テーブルで、[ フォーム] を選択します。
  2. 既存フォームを追加>情報追加を選択します。 [必要なコンポーネントがありません] ダイアログが表示された場合は、[ いいえ] を選択し、必要なコンポーネントは含めないでください。
  3. 情報フォームを開き、2 つの新しい属性 (プライマリ言語と第 2 言語) をフォームに追加して、ユーザーが要件を作成する場合にこの情報を入力できるようにします。
  4. 保存して公開するを選択します。

リソースと要件に言語データを追加する

Language テーブルに新しいレコードを追加します。 リソース レコードを新しい言語レコードに関連付けるには、リソース レコードを開き、ナビゲーション バーで言語リレーションシップに移動します。 要件レコードの場合は、[要件] フォームの新しい [第 1 言語] フィールドと [第 2 言語] フィールドに入力できます。

スケジュール ボードをカスタマイズする

新しい言語制約を使用してスケジュール ボード内のリソースをフィルター処理するには、リソースの取得クエリとフィルター レイアウト構成レコードを更新します。

これらのスケジュール ボードのカスタマイズは、すべてのタブに均一に適用され、タブごとに個別に設定することはできません。このカスタマイズは、 スケジュール アシスタントのフィルター レイアウト"スケジュール アシスタントのリソースの取得クエリスケジュール アシスタントリソース セル テンプレートスケジュール アシスタントの制約の取得クエリ" に適用されます

フィルター レイアウトを構成する

以下の手順では、XML の構文強調表示に対応したテキスト エディタを使用して変更を加え、その後、変更内容をユニバーサル リソース スケジュール エディタに貼り付けてください。

フィルター・レイアウト構成は、フィルター・パネルのレイアウトをカスタマイズするための XML レイアウト定義です。

[フィルター] パネルからユニバーサル リソース スケジュールに付属するすべての既定のフィルターを削除し、使用可能な唯一のフィルターとして言語を追加します。

<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>

新しい言語ボードを作成する

これらの変更を分離したままにするには、別のスケジュール ボードを作成し、変更を実装します。 これらの変更は、他のスケジュール ボードが自動的に継承できるように、既定のスケジュール ボードでいつでも行うことができます。

  1. リソース スケジュール アプリに移動し、[スケジュール ボード] を選択します。
  2. +記号を選択して、新しいボードを作成します。
  3. 新しいボードの言語に名前を付けます。
  4. ダイアログの下部にある [追加] を選択します。 新しいボードが作成されました。

スケジュール ボード フィルター レイアウトを構成する

次に、スケジュール ボードで使用されるフィルター レイアウトとクエリを格納する新しい構成レコードを作成します。 次に、新しく作成されたスケジュール ボードを新しい構成レコードにリンクします。 これを行うには複数の方法がありますが、最も簡単な方法を次に示します。

  1. スケジュール ボードで、右上の省略記号 (...) と Scheduler の設定を選択します。
  2. ウィンドウの下部にある [ すべてのボード設定 ] を選択します。 次に、[ その他] を選択します。
  3. [フィルター レイアウト] フィールドを探し、鉛筆アイコンを選択してエディターを開きます。
  4. [名前] フィールドに「言語フィルター レイアウト」と入力し、フィルター レイアウト コードを追加し、[新規として保存] を選択します。
  5. 保存 を選択します。 このスケジュール ボードをレコードにリンクする新しい構成レコードが作成されます。
  6. フィルターを選択します。 [フィルター] パネルが新しいレイアウトと共に表示されます。 言語フィルターのみが使用できます。 フィルター処理は、リソースの取得クエリを更新するまで機能しません。

リソース取得クエリを更新する

以下の手順では、XML の構文強調表示に対応したテキスト エディタを使用して変更を加え、その後、変更内容をユニバーサル リソース スケジュール エディタに貼り付けてください。

リソースの取得クエリ構成は、リソース照合 API で使用される ユニバーサル FetchXML (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のセクションで説明されているように、複数の結合を使用して、一致する言語と、プライマリ言語またはセカンダリ言語別の順序を表示します。

elementattributeの説明は次のとおりです。

名前 説明
link-entity リソース エンティティと言語エンティティ間の多対多関連付けに対する結合の作成
ufx:if この FetchXML 要素 (link-entity) を出力するのは、この属性の XPath 式が値を返した場合のみです
attribute 一致した第一言語または第二言語を返します
filtercondition 多対多の関連付けレコードをフィルター処理して、指定した言語 ID に一致するレコードのみにします
ufx:valueselect XPath 式の結果を select 属性に出力します
ufx:applyselect 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>

elementattributeの説明:

名前 説明
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 プロパティに再割り当てします。

elementattributeの説明:

名前 説明
Resources Resourcesプロパティの再割り当て
ufx:select この属性の XPath 式の結果を Resources プロパティに割り当てます。 XPath order 関数は、Resources プロパティの lang_order リストを並べ替えるために使用されます。

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>

スケジュール ボードのリソース取得クエリを更新する

  1. スケジュール ボードで、右上の省略記号 (...) と Scheduler の設定を選択します。
  2. ウィンドウの下部にある [ すべてのボード設定 ] を選択します。 次に、[ その他] を選択します。
  3. [ リソースの取得クエリ ] フィールドを探し、鉛筆アイコンを選択してエディターを開きます。
  4. [名前] フィールドに「言語リソース クエリ」と入力し、[リソース クエリの取得] コードを追加して、[新規として保存] を選択します。
  5. 保存 を選択します。 このスケジュール ボードをレコードにリンクする新しい構成レコードが作成されます。

ボードは更新された構成を再読み込みします。 フィルター処理が機能します。 言語レコードを作成してリソース レコードに関連付けている場合、それらに関連付けられた言語でリソースをフィルター処理することができるようになります。

スケジュール アシスタントをカスタマイズする

スケジュール アシスタントのフィルター レイアウトと制約の取得クエリ構成をカスタマイズして、スケジュール アシスタントの新しい言語制約を使用します。

各ボードを個別にカスタマイズできるスケジュール ボードのカスタマイズとは異なり、スケジュール アシスタントのカスタマイズは、スケジュール アシスタントが使用されるすべてのボードに影響します。 スケジュール アシスタントのカスタマイズは、スケジュール可能なタイプに固有にすることも、すべてのタイプに固有にすることもできます。 この例では、すべてのタイプのスケジュールアシスタントをカスタマイズします。

スケジュール アシスタントのフィルター レイアウトを構成する

以下の手順では、XML の構文強調表示に対応したテキスト エディタを使用して変更を加え、その後、変更内容をユニバーサル リソース スケジュール エディタに貼り付けてください。

Schedule Assistant Filter Layout 設定は、Schedule Board Filter Layout と同様に、Filter パネルのコントロールのレイアウトを定義します。 スケジュール アシスタントでは、開始時刻、終了時刻、期間など、スケジュール ボードよりも多くのフィルターが使用されるため、別のレイアウトが使用されます。

この演習では、スケジュール アシスタント フィルター レイアウトの構成に由来するユニバーサル リソース スケジュール で出荷された既定のフィルターのサブセットのみを再使用し、言語ドロップダウンを唯一使用可能なフィルターとして追加します。

レイアウトに追加するフィルターは、「 スケジュール ボード フィルター レイアウトの構成」のフィルターと同じです。 その他のコントロールは、スケジュール アシスタントの検索パラメーターを変更するために必要です。

完全なスケジュールアシスタントフィルターレイアウト

<?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>

スケジュール アシスタントのフィルター レイアウトの更新

  1. スケジュール ボードで、右上の省略記号 (...) と Scheduler の設定を選択します。
  2. ウィンドウの下部にある [ すべてのボード設定 ] を選択します。
  3. [ スケジュールの種類] までスクロールし、[なし] を選択 します
  4. 下部にある [既定値の編集] を選択します。
  5. スケジュール アシスタントのフィルター レイアウト フィールドを見つけ、鉛筆アイコンを選択してエディターを開きます。
  6. [名前] フィールドに「言語スケジュール アシスタントのフィルター レイアウト」と入力します。
  7. スケジュール アシスタントのフィルター レイアウト フィールドをコードで更新し、[ 新規として保存] を選択します。 このスケジュール ボードをレコードにリンクする新しい構成レコードが作成されます。
  8. [ボード設定]ダイアログボックスの下部にある[ 保存]を選択します。

ボードが再読み込みされます。 制約の取得クエリを変更して、スケジュール アシスタント検索の要件に設定されている言語を含めます。

制約の取得クエリを構成する

以下の手順では、XML の構文強調表示に対応したテキスト エディタを使用して変更を加え、その後、変更内容をユニバーサル リソース スケジュール エディタに貼り付けてください。

Retrieve Constraints Query 設定は、Retrieve Requirement Constraints API によって使用される UFX クエリ です。 これは、要件レコード (UI で選択) の ID を入力として受け取り、要件レコードとそのすべての子レコードを返します。

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 つの個別のコントロールを作成することもできます。

elementattributeの説明:

名前 説明
Languages 結果制約プロパティ バッグに新しいプロパティを作成します。 Languages
ufx:select この属性の XPath 式の結果を Languages プロパティに割り当てます。 クエリの前半で取得され、lang_primarylanguage プロパティで使用できる lang_secondarylanguage プロパティと Requirement プロパティは、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>

制約取得クエリの更新

  1. スケジュール ボードで、右上の省略記号 (...) と Scheduler の設定を選択します。
  2. ウィンドウの下部にある [ すべてのボード設定 ] を選択します。
  3. [ スケジュールの種類] までスクロールし、[なし] を選択 します
  4. [ 既定値の編集] を選択します
  5. スケジュール アシスタントの [制約の取得] クエリ フィールドを探し、鉛筆アイコンを選択してエディターを開きます。
  6. [名前] フィールドに「言語制約クエリ」と入力します。
  7. スケジュール アシスタントの [制約の取得] クエリ フィールドを [制約の取得] クエリ コードで更新し、[ 新規として保存] を選択します。
  8. 保存 を選択します。 このスケジュール ボードをレコードにリンクする新しい構成レコードが作成されます。
  9. スケジュール アシスタントの [リソースの取得] クエリ フィールドを見つけて、[スケジュール ボードのカスタマイズ] 用に作成した言語リソース クエリを選択します。
  10. ダイアログの下部にある [保存] を選択 します

ボードは更新された構成を再読み込みします。 スケジュール アシスタントのフィルター処理が機能するようになります。 言語レコードを作成して要件レコードに関連付ける場合は、スケジュール ボードの下部にある要件レコードを選択し、[ 利用可能時間の検索 ] を選択して、要件に保存されている言語と一致するリソースのみを表示できます。

リソース セル テンプレートの構成

以下の手順では、HTML の構文強調表示に対応したテキスト エディタを使用して変更を加え、その後、変更内容をユニバーサル リソース スケジュール エディタに貼り付けてください。

リソースセルテンプレート設定は、リソースセル内のコンテンツをレンダリングするために使用される Handlebars テンプレートです。 リソース取得クエリからの出力は、テンプレートで使用できます。

既定のリソース テンプレートを変更して、リソースが第一言語と第二言語と一致した場合は緑色の ✔ ✱ インジケーター、リソースが第一言語のみと一致した場合は緑色の✔ インジケーター、リソースが第二言語のみと一致した場合は黄色✔のインジケーターを表示するようにしています。

{{#if lang_primary}}
<span style='color:green;'>&#10004;{{#if lang_secondary}} &#10033;{{/if}}</span>
{{else if lang_secondary}}
<span style='color:#ffe700;'>&#10004;</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;'>&#10004;{{#if lang_secondary}} &#10033;{{/if}}</span>
        {{else if lang_secondary}}
        <span style='color:#ffe700;'>&#10004;</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>

リソースセルテンプレートの更新

  1. スケジュール ボードで、右上の省略記号 (...) と Scheduler の設定を選択します。
  2. ウィンドウの下部にある [ すべてのボード設定 ] を選択します。
  3. [ スケジュールの種類] までスクロールし、[なし] を選択 します
  4. [ 既定値の編集] を選択します
  5. スケジュール アシスタントの [リソース セル テンプレート] フィールドを探し、鉛筆アイコンを選択してエディターを開きます。
  6. [名前] フィールドに「言語リソース セル テンプレート」と入力します。
  7. [リソース セル テンプレート] フィールドを [リソース セル テンプレート] コードで更新し、[ 新規として保存] を選択します。
  8. 保存 を選択します。 このスケジュール ボードをレコードにリンクする新しい構成レコードが作成されます。
  9. スケジュール アシスタントの [リソースの取得] クエリ フィールドを見つけて、[スケジュール ボードのカスタマイズ] 用に作成した言語リソース クエリを選択します。
  10. ダイアログの下部にある [保存] を選択 します

ボードは更新された構成を再読み込みします。 リソース セルは、リソースがフィルター パネルの言語制約にどのように一致するかを示します。

その他のリソース

ユニバーサルフェッチXML