計算列とロールアップ列

計算列 および ロールアップ列 を使用すると、ユーザーは手動で計算を実行する必要がなくなり、作業に集中できます。 システム管理者は、開発者と協力しないで、多くの共通計算の値を含むフィールドを定義できるようになりました。 開発者も、自分のコード内ではなく、プラットフォーム機能を活用してこれらの計算を実行できます。

注意

エンティティとテーブルの違いがわかりませんか? Microsoft Dataverse で「開発者: 用語を理解する」を参照してください。

共通の要素と特性

計算列とロールアップ列には、次のような共通の要素と特性があります:

  • 読み取り専用です。
  • ユーザー固有ではありません。 計算はシステム ユーザー アカウントを使用して実行されるため、その値は、フィールド レベルのセキュリティが有効な列など、ユーザーが表示する特権を持たないレコードに基づく場合があります。

AttributeMetadata を受け継ぐすべての列は SourceType プロパティを持ち、このプロパティには以下の表に示す値を格納することができます。

内容
Null 計算列やロールアップ列としては、有効なタイプではありません。
0 単純な列。 この列は、計算列やロールアップ列として定義されていません。
1 計算列
2 ロールアップ列

計算列とロールアップ列は、AttributeMetadata を引き継いだ既存の列タイプをベースにしています。 次の種類の列には、新しいプロパティがあります。

これらの種類の列には、それぞれ計算とロールアップをサポートする以下のプロパティがあります。

プロパティ 定義
FormulaDefinition 計算やロールアップの実行時に使用される数式の XAML 定義が含まれます。 この値を変更できる唯一の方法は、アプリケーション数式エディターを使用する方法です。

これらの列の計算式の設定については、カスタマイズ ガイドの次のトピックを参照してください : ロールアップ列の定義計算列の定期
SourceTypeMask この読み取り専用のプロパティのビットマスク値は、計算列の式で使用されるソースの種類、または計算列やロールアップ列の式が有効でない場合に記述されます。

- 0: Undefined。 単純な列とロールアップ列の既定値です。
- 1: Simple。 計算された列は、同じレコード内の列を参照します。
- 2: Related。 計算された列は、関連するレコード内の列を参照します。
- 4: Logical。 計算された列とは、同じレコードの中で、実際には別のデータベーステーブルに格納されているカラムを指します。 詳細情報: 論理列
- 8 Calculated 計算された列は、別の計算された列を参照します。
- 16: Rollup。 計算列、ロールアップ列を参照します。
- 32: Invalid。 計算またはロールアップ列が無効です。
一般的には、列がすでに存在しない列を参照している場合に起こります。

注意: これらの条件の 1 つ以上が計算またはロールアップ列にあてはまる場合があります。 これはビットマスク値であるため、ビットごとの操作を実行する際には SourceTypeMasks 列挙体 を使用すると便利な場合があります。

計算列

計算列は、取得時にリアルタイムで計算されます。 計算列は、異なるデータの種類を使用して構成できます。 たとえば、整数の計算列は、小数または通貨列から値を参照できます。 詳しくは、計算列の定義を参照してください。

計算属性の列は、取得プラグイン パイプラインで使用できます。 テーブル レコードの更新または作成のポスト イメージには、ステージ 40 の計算列の値が含まれます。 詳細情報: イベント実行パイプラインエンティティ イメージ

制限

同じテーブルの logical 値 上の計算列の値を使って、クエリで返されたデータを並べ替えることはできません。 クエリでは、計算された列を使用して結果を並べるように指定することができますが、並べ替えの指定は無視され、エラーは発生しません。 計算列が同じレコード内の単純な値のみを参照する場合、並べ替えは正常に機能します。 計算列で使用されているソースを確認するには、列の定義に対して SourceTypeMask プロパティを使用します。 詳細情報: 論理列

  • 計算列に使用できるのは、直接の親テーブルの列のみです。
  • 保存されたクエリ、グラフ、ビジュアル化には、固有の計算属性を最大 50 まで含めることができます。
  • 計算列は、その計算式の中で他の計算列を参照することができますが、自分自身を参照することはできません。
  • Dynamics 365 for Outlook のユーザーがオフラインの際、計算列に値がないという問題がありました。
  • MaxValueMinValue 列に、列定義プロパティを設定することはできません

ロールアップ列

ロールアップ列はデータベースで保持されるため、通常の列と同様にフィルタリングや並べ替えに使用できます。 どの種類のプロセスやプラグインも、最後に計算した列の値を使用します。 ロールアップ列の値はスケジュールしたシステム ジョブで非同期に計算されます。 管理者がジョブを実行またはジョブを一時停止する時を設定します。 既定では、各列は毎時間更新されます。 詳しくは、ロールアップ列の定義を参照してください。

ロールアップ列の作成または更新時に、ロールアップ フィールドの一括計算 ジョブは 12 時間以内に実行するようにスケジュールされます。 12 時間の遅れは、リソースを大量に必要とするこの操作をユーザーに影響しない時に実行するのが目的です。 ジョブが完了すると、このジョブは、次回は約 10 年後に実行されるように自動的にスケジュールされます。 計算に問題がある場合は、システム ジョブとして報告されます。 設定 > システム ジョブ にあるシステム ジョブで、ロールアップ フィールドでのエラーを探します。

ヒント

展開環境のソリューションをテストする開発者の中には、12 時間も待ちたくない開発者もいます。 もっと早く実行すことも可能です。 システム ジョブ 一覧で 定期システム ジョブ ビューを使用して、一覧をフィルター処理し、ロールアップ フィールドの一括計算 ジョブを見つけます。 ジョブを選択して、その他の操作 > 延期 を使用して、もっと早い時間に設定します。

新しい ロールアップ フィールドの一括計算 ジョブの作成をプログラムでトリガーする場合は、RetrieveAttributeRequest を使ってロールアップ列の AttributeMetadata を取得し、UpdateAttributeRequest を使って実際の変更を行わずに列を更新します。

ロールアップ フィールドの一括計算 ジョブは、ロールアップ列を含むソリューションがインポートされるとすぐに実行されます。 これは、ユーザーに悪影響を与えない時間にソリューションをインストールすることが前提です。

テーブルの各ロールアップ列には、そのロールアップ列に対応する 2 つの列も含まれます。

  • <attribute SchemaName>_Date : DateTime – ロールアップが最後に計算された日時。
  • <attribute SchemaName> _State: Integer – ロールアップ計算の状態。 詳細: ロールアップ状態値

ロールアップ状態値

ロールアップ列の計算の状態は、対応する <attribute SchemaName>_State 列と CalculateRollupFieldResponse.FieldState で確認できます プロパティに設定します。 状態を示す値を次の表に示します。

状態値 内容
0 NotCalculated: 列の値はまだ計算されていません。
1 Calculated: 列の値は、<attribute SchemaName>_Date 列の最終更新時刻ごとに計算されます。
2 OverflowError: 列の値計算がオーバフロー エラーの原因になりました。
3 OtherError: 列の値計算は、内部エラーが原因で発生しました。次回の計算ジョブの実行で修正される可能性があります。
4 RetryLimitExceeded: 列の値の計算に失敗しました。これは、同時実行数とロックの競合が多いため、値の計算を再試行する最大数を超過しました。
5 HierarchicalRecursionLimitReached: 計算が最大限度の階層の深さに到達したため、属性値の計算に失敗しました。
6 LoopDetected: レコードの階層に再帰的なループが検出されたため、列の値の計算に失敗しました。

計算ロールアップ列の値をすぐに取得する

ロールアップ列は、開発者が必要に応じてロールアップカラムの値を計算するために使用できる CalculateRollupField メッセージに対応しています。 要求と応答をメンバーと共に、次の表に示します。

要求/応答 メンバー
CalculateRollupFieldRequest Target: レコードのEntityReference

FieldName: 列の論理名を表す文字列。
CalculateRollupFieldResponse Entity : Entity には、ロールアップ列とそれに対応する <attribute SchemaName>_Date<attribute SchemaName>_Stateの列を含みます。

このメッセージは、要求で指定した列のみの同期操作です。 そのレコードの値が他のロールアップ列の一部として含まれている場合、それら列の値は計算を実行する定期的な非同期ジョブが発生するまで、このメソッドを呼び出したことによる値の変化を考慮しません。

制限

  • ロールアップ列は、ワークフロー イベントまたは待機状態として使用することはできません。 これらの列は、ワークフローをトリガーするイベントを発生させません。
  • ロールアップの列が更新されても、テーブルの ModifiedBy および ModifiedOn の列が更新されません。
  • ロールアップ列は最大 100 まで組織内で定義できます。 各テーブルには 10 未満のロールアップ列を設定できます。
  • ロールアップ列の式は、他のロールアップ列を参照できません。
  • ロールアップ列の式は、複雑な計算列を参照できません。 同じレコードの簡単な列を参照する計算列だけが、ロールアップで使用できます。
  • ロールアップ列の式には、多対多 (N: N) の関連付けのレコードを含めることはできません。 一対多 (1: N) の関連付けのレコードのみを含めることができます。
  • ロールアップ列の式では、 ActivityPointer または ActivityParty のテーブルとの一対多 (1:N) の関係を使用できません。

SourceTypeMasks リスト

計算列やロールアップ列をサポートしている列の SourceTypeMask プロパティには、ビットマスク値が含まれています。 値から関連情報を取得するには、ビットごとの操作を実行する際に、列挙体があると便利です。 SourceTypeMask プロパティ値を比較する際は、次の SourceTypeMasks 列挙体を使用します。

 public enum SourceTypeMasks  
{  
    /// <summary>  
    /// Undefined: 0 - The default value for simple and rollup columns.  
    /// </summary>  
    Undefined = 0,  
    /// <summary>  
    /// Simple: 1 - The calculated column refers to a column in the same record.  
    /// </summary>  
    Simple = 1,  
    /// <summary>  
    /// Related: 2 - The calculated column refers to a column in a related record.  
    /// </summary>  
    Related = 2,  
    /// <summary>  
    /// Logical: 4 - The calculated column refers to a logical column.  
    /// </summary>  
    Logical = 4,  
    /// <summary>  
    /// Calculated: 8 - The calculated column refers to another calculated column.  
    /// </summary>  
    Calculated = 8,  
    /// <summary>  
    /// Rollup: 16 - The calculated column refers a rollup column.   
    /// </summary>  
    Rollup = 16,  
    /// <summary>  
    /// Invalid: 32 - The calculated or rollup column is invalid.  
    /// Typically this would be where a field refers to a column that no longer exists.   
    /// </summary>  
    Invalid = 32  
}  

参照

列の定義
計算列を定義する
ロールアップ列を定義する
サンプル: 特定のレコードに関連付けられているロールアップ レコード

注意

ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)

この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。