データ エンティティの会社間動作

Note

コミュニティの関心グループが Yammer から Microsoft Viva Engage に移行されました。 Viva Engage コミュニティに参加し、最新のディスカッションに参加するには、「 Finance and Operations Viva Engage Community へのアクセスを要求する 」フォームに入力し、参加するコミュニティを選択します。

この記事では、データ エンティティと企業間コンセプトとの関係について説明します。 データ エンティティのこの側面を理解するには、テーブルとビューで会社間の概念がどのように適用されるかを理解する必要があります。 したがって、この記事では、テーブルとビューの概要を説明し、データ エンティティの関連性について説明します。

会社間のテーブルとビューの確認

各テーブルには SaveDataPerCompany プロパティがあり、各ビューには AllowCrossCompany プロパティがあります。 次のテーブルにこれらの 2 つのプロパティを示します。

  Table 表示
プロパティ名 SaveDataPerCompany AllowCrossCompany
関連する CRUD モード CUD R
効果のタイミング 実行時間、デザイン時 ほとんどの場合は実行時。 デザイン時に、この設定によりビューは選択したフィールド リストに dataAreaId を持ちます。 ただし、特定の dataAreaId 値のフィルターが、後の実行時に追加されます。
値の意味 = はい デザイン時には、フィールドがアプリケーション オブジェクト ツリー (AOT) に表示されていなくても、システムはテーブルに dataAreaId フィールドを自動的に追加します。 テーブルのすべてのレコードには、それが所属する会社 (または法人) がタグ付けされています。 システムは自動的に SQL Where 句にフィルターを追加して、返された行セットを 1 つの dataAreaId 値に制限します。 実行時に、システムは、基になる Microsoft SQL Server システムに送信する SQL Select ステートメントの Where 句に dataAreaId のフィルターを自動的に追加できません。 したがって、ビューからの SQL Select ステートメントは、複数の企業のレコードを含む一連のレコードを返すことができます。
値の意味 = いいえ システムは、テーブルに dataAreaId フィールドを追加しません。 正式な会社固有のデータがレコードに含まれていないため、テーブルは共有テーブルです。 システムは自動的に SQL Where 句にフィルターを追加して、返された行セットを 1 つの dataAreaId 値に制限します。 ただし、ビューのルートデータ ソースが共有テーブルである場合、AllowCrossCompany プロパティは無視されます。

AllowCrossCompany 内の比較 = いいえ

次のスクリーンショットでは、CustomerList ビューに 2 つのデータ ソースがあります。

  • ルート – CustTable、SaveDataPerCompany が入っているプロパティを はいにセットします。
  • 非ルート – DirPartyTable、SaveDataPerCompany が入っているプロパティをいいえにセットします。

CustTable と DirPartyTable の 2 つのデータ ソースを示す CustomerList ビューのスクリーンショット。

次のスクリーンショットが示すように、CustomerList 表示は、AllowCrossCompany プロパティをいいえに設定しています。

CustomerList ビューで [AllowCrossCompany] プロパティが [いいえ] に設定されているスクリーンショット。

CustomerList 表示に関する前述の情報が与えられた場合、システムは、SQL 表示の作成ステートメントを生成して実行することによって、基盤となる SQL Server システムに表示を作成します。

CREATE VIEW [dbo].[CUSTOMERLIST] 
AS 
       SELECT T1.accountnum AS ACCOUNTNUM, 
              T1.dataareaid AS DATAAREAID,  -- AllowCrossCompany =No caused this line.
              T1.partition  AS PARTITION, 
              T1.recid      AS RECID, 
              T2.partition  AS PARTITION#2, 
              T2.name       AS NAME 
       FROM   custtable T1 
              CROSS JOIN dirpartytable T2 
       WHERE ( T1.party = T2.recid 
              AND ( T1.partition = T2.partition ) ) 

DirPartyTable をルート データ ソースにする

CustomerList ビューでルート データ ソースとして構成された DirPartyTable のスクリーンショット。

CustomerList ビューの 2 つのデータ ソース テーブルの位置を入れ替えて、DirPartyTable テーブルをルート データ ソースにします。

CREATE VIEW [dbo].[CUSTOMERLISTPARTY] 
AS 
       SELECT T1.name       AS NAME, 
              T1.partition  AS PARTITION, 
              T1.recid      AS RECID, 
              T2.partition  AS PARTITION#2, 
              T2.accountnum AS ACCOUNTNUM 
       FROM   dirpartytable T1 
              CROSS JOIN custtable T2 
       WHERE  ( T2.party = T1.recid 
              AND ( T2.partition = T1.partition ) ) 
go 

この場合、SQL のビューの作成ステートメントは、次の 2 つの相違点を除いて同じです。

  • FROM 句は、最初に DirPartyTable に言及し、次に CustTable に言及します。
  • SELECT 列リストには dataAreaId の行は含まれません (DirPartyTable の SaveDataPerCompany プロパティが [いいえ] に設定されているため)。

テーブルおよびビューの制限

場合によっては、テーブルとビューの会社間コントロール機能では、必要なほど細かい制御が提供されない場合があります。 制限を次に示します。

  • システム dataAreaId フィールド以外の会社または法人フィールドを同じように認識したり、自動的に処理したりすることはできません。
  • 非ルート データソースに dataAreaId フィールドがある場合でも、ビューに対する会社間の動作は、ルート データソースのプロパティにはあまりにも制限されています。

たとえば、この動作は、法人情報が LegalEntityRecId にある場合、または共有テーブルに dataAreaId 列がない場合に発生する可能性があります。

デザイン時間: PrimaryCompanyContext プロパティの設定

データ エンティティは、会社間の機能が関係するテーブルとビューの制限を克服するのに役立ちます。 データ エンティティは PrimaryCompanyContext プロパティがあり、会社 ID に使用するエンティティ フィールドを指定できます。 このプロパティは、次のような方法で柔軟性ときめ細かな制御を提供します。

  • フィールドは、エンティティの任意のデータ ソースに由来することができ、ルート データ ソースのフィールドに限定されません。
  • このフィールドは、DataAreaId 拡張データ型 (EDT) から拡張され、基礎となるシステム dataAreaId フィールドに限定されない任意のフィールドにすることができます。
  • エンティティにデータ ソースとして共有テーブルのみがあるときであっても、ユーザーの特定の状況にかなう場合は、PrimaryCompanyContext プロパティを使用することができます。

次のスクリーンショットは、FMCustGroupEntity エンティティの PrimaryCompanyContext プロパティに設定された値を示しています。

FMCustGroupEntity エンティティで設定された PrimaryCompanyContext プロパティのスクリーンショット。

PrimaryCompanyContext 値が空でない値に設定されている場合、エンティティは共有エンティティとして動作できません。 dataAreaId フィールドは、SQL Create View ステートメントに追加されます。

CREATE VIEW [dbo].[FMCUSTGROUPENTITY] 
AS 
       SELECT T1.custgroup   AS GROUPNAME, 
              T1.description AS DESCRIPTION, 
              T1.dataareaid  AS DATAAREAID,   -- dataAreaId is added. 
              T1.recversion  AS RECVERSION, 
              T1.partition   AS PARTITION, 
              T1.recid       AS RECID 
       FROM   fmcustgroup T1 

実行時: 会社間のデータ エンティティの動作

X++ コードのコンテキストでは、データ エンティティの会社間の動作はテーブルの動作に似ています。 エンティティの PrimaryCompanyContext プロパティが値を持たないおよびが空白の場合、エンティティが共有テーブルと同様に動作します。

X++ PrimaryCompanyContext が設定されている場合

次のテーブルは、PrimaryCompanyContext プロパティがフィールド値に設定されている場合の CRUD アクセスでのデータ エンティティの動作を示しています。 X++ と OData の両方のアクセスについて説明します。

  X++ OData
読み取り (R) 既定では、結果は常にdataAreaId = 現在の会社によってフィルター処理され、会社間データは会社間オプションを使用して取得できます。 結果は、dataAreaId によってフィルター処理されません。 コンシューマーは明示的にフィルター処理する必要があります。
書き込み (CUD) データ エンティティへの CUD アクセスは、常に現在の会社のコンテキストで行われます。 エンティティへの会社間 CUD アクセスが必要である場合、changeCompany キーワードを使用します。 コンシューマーは、 PrimaryCompanyContext(myDataAreaId) フィールドの値を設定することで、任意の会社のエンティティへの CUD アクセスを実現できます。 フレームワークは必要な ChangeCompany アクションを処理します。

次の X++ コード例は、PrimaryCompanyContext プロパティが dataAreaId に設定されている、FMCustGroupEntity にアクセスします。

FMCustGroupEntity の DataAreaId に設定された PrimaryCompanyContext プロパティのスクリーンショット。

FMCustGroupEntity にアクセスする X++ コード例のスクリーンショット。

X++ PrimaryCompanyContext が空の場合

データ エンティティに関して PrimaryCompanyContext プロパティが設定されていると、ビュー スキーマに dataAreaId フィールドが作成され、PrimaryCompanyContext フィールドにマップされます。 次のテーブルは、PrimaryCompanyContext プロパティが空の場合の CRUD アクセスでのデータ エンティティの動作を示しています。 X++ と OData の両方のアクセスについて説明します。

  X++ OData
読み取り (R) システム dataAreaId フィールドがビュー スキーマに作成されないため、結果はフィルター処理されません。 (R with X++ の場合と同じ)
書き込み (CUD) 設定する主要な会社のコンテキストはありません。 そのため、エンティティへの CUD アクセスは、常に現在の会社のコンテキストで行われます。 (CUD with X++ の場合と同じ)

現在の例では、FMCustomerGroupGlobalEntity エンティティで PrimaryCompanyContext プロパティに割り当てられている値はありません。

PrimaryCompanyContext プロパティに値が割り当てられていない FMCustomerGroupGlobalEntity エンティティのスクリーンショット。

ただし、FMCustGroup テーブルの dataAreaId フィールドは、LegalEntity という名前の通常のフィールドとして FMCustomerGroupGlobalEntity にマップされます。 この例では、FMCustGroup テーブルは FMCustomerGroupGlobalEntity のルート データ ソースです。 ただし、システムの自動メカニズムをバイパスする非公式な方法でこの dataAreaId フィールドを使用しています。 これらすべての詳細は法人フィールドの次のスクリーンショットに表示されます。

FMCustomerGroupGlobalEntity エンティティの dataAreaId フィールドからマップされた LegalEntity フィールドのスクリーンショット。

Note

法人エンティティおよびデータ エンティティの両方がエンティティという語を使用していますが、混合しないでください。 法人およびデータ エンティティは、まったく異なる 2 つの概念です。 PrimaryCompanyContext プロパティが空のとき、SQL の ビューの作成 ステートメントには、通常、システムの dataAreaId 列についての記述は含まれていません。 ただし、現在の例では、データ エンティティの LegalEntity 通常フィールドが原因で dataAreaId が「半参照」になります。 次の SQL ステートメントは、このフィールドを示しています。

CREATE VIEW [dbo].[FMCUSTOMERGROUPGLOBALENTITY] 
AS 
       SELECT T1.custgroup   AS NAME, 
              T1.description AS DESCRIPTION, 
              T1.dataareaid  AS LEGALENTITY,   -- dataAreadId is named LegalEntity. 
              T1.recversion  AS RECVERSION, 
              T1.partition   AS PARTITION, 
              T1.recid       AS RECID 
       FROM   fmcustgroup T1 

この例の目的

この例では、2 つの目的があります。

  • バッキング テーブルが会社固有だとしても、共有データを既定で表示します。
  • 必要に応じて、LegalEntity という名前の標準フィールドを使用して、データ エンティティのコンシューマーが dataAreaId をフィルター処理または適用できるようにします。

テスト データ

テーブル ブラウザー ページの次のスクリーンショットは、X++ テスト コードを実行する前の FMCustomerGroupGlobalEntity エンティティにあるテスト データを示しています。

FMCustomerGroupGlobalEntity エンティティのテスト データを示す [テーブル ブラウザー] ページのスクリーンショット。

X++ コード

共有エンティティと共に X++ テスト コードがどのように機能するかを次に示します。

  • 読み取りのために共有モードでデータ エンティティにアクセスします。
  • 新しいレコードが作成されたときに、1 つの特定の会社があるデータ エンティティにアクセスします。

読み取り用に共有エンティティにアクセスし、特定の会社でレコードを作成する X++ テスト コードのスクリーンショット。