公式、 计算、 汇总和 提示 列使用户无需手动执行计算并专注于其工作。 系统管理员可以定义一个字段来包含许多常见计算的值,而无需与开发人员合作。 开发人员还可以使用平台功能来执行这些计算,而不是使用代码。
本文重点介绍如何在列定义和 API 中定义这些列,以便与汇总列进行交互。 不支持使用代码定义公式。 需要使用Power Apps设置相应列类型的公式。 了解如何操作:
常见元素和特征
公式列、计算列和汇总列具有一些共同的元素和特征,例如:
- 它们是只读的。
- 它们不特定于用户。
计算使用系统用户账户执行,因此,这些值可能基于用户原本无权查看的记录,例如启用了字段级安全控制的列。
继承自 AttributeMetadata 的所有列都有一个 SourceType 属性,该属性可以包含下表中显示的值。
| 价值 | Description |
|---|---|
| Null | 不是可作为公式列、计算列或汇总列的有效列类型。 |
| 0 | 简单列。 该列未定义为公式、计算列或汇总列。 |
| 1 | 计算列 |
| 2 | 汇总列 |
| 3 | 公式列 |
| 4 | 提示列 |
公式列、计算列、汇总列和提示列基于继承自 AttributeMetadata 的现有列类型。 下表显示了可用的列类型以及支持哪些源类型:
| 类型 | 受支持的源类型 |
|---|---|
| BooleanAttributeMetadata | 公式、计算和汇总 |
| DateTimeAttributeMetadata | 公式、计算和汇总 |
| DecimalAttributeMetadata | 公式、计算结果和汇总 |
| StringAttributeMetadata | 公式、计算结果、汇总和提示 |
| IntegerAttributeMetadata | 仅限计算和汇总 |
| MoneyAttributeMetadata | 仅计算和汇总 |
| PicklistAttributeMetadata | 仅限计算和汇总 |
每种类型的列都有以下属性来支持公式、计算和汇总。
| 资产 | 定义 |
|---|---|
FormulaDefinition |
包含用于执行计算或汇总的公式的定义。 公式列是使用 YAML 定义的。 使用 XAML 定义计算列和汇总列。 更改此值的唯一支持方法是通过Power Apps编辑器。 |
SourceTypeMask |
此只读属性的位掩码值表示列公式中使用的源类型,或列公式是否无效。 - 0: Undefined. 简单列和汇总列的默认值。- 1: Simple. 公式或计算列引用同一记录中的列。- 2: Related. 公式或计算列引用相关记录中的列。- 4: Logical。 公式或计算列引用的是同一条记录中、但存储在另一数据库表中的列。 详细信息:逻辑列- 8: Calculated。 公式或计算列引用另一个公式或计算列。- 16: Rollup。 公式或计算列引用了汇总列。- 32: Invalid。 公式、计算列或汇总列无效。通常,当列引用不再存在的列时,该列无效。 注意:对于任何计算列或汇总列,这些条件中的一个或多个都可能为真。 由于这是位掩码值,因此在执行按位操作时,您可能会发现它对于使用 SourceTypeMasks 枚举很有用。 |
公式和计算列
检索公式和计算列时,将实时计算这些列。 公式和计算可以使用不同的数据类型进行组合。 例如,整数计算列可以引用十进制或货币列中的值。
在检索插件管道中,只有计算列的值可用。 表记录更新或创建的发布图像包含阶段 40 中的计算列值。 详细信息: 事件执行管道 和 实体映像
公式列限制
- 当具有移动客户端的用户处于脱机状态时,公式列没有值。
- 不能对公式列设置
MaxValue和MinValue列定义属性。 详细信息: 指南和限制
计算列限制
不能在同一表中的 逻辑值 上使用计算列中的值对查询返回的数据进行排序。 尽管查询可以指定应使用计算列对结果进行排序,但排序方向将被忽略,不会引发错误。 如果计算列仅引用同一记录中的简单值,则排序工作正常。 可以使用列定义上的 SourceTypeMask 属性来确定计算列所使用的来源。
- 只能在计算列中使用直接父表中的列。
- 保存的查询、图表和可视化效果最多可以包含 50 个唯一计算列。
- 计算列可以引用其公式中的其他计算列,但无法引用自身。
- 当具有移动客户端的用户处于脱机状态时,计算列没有值。
-
MaxValue和MinValue列定义属性不能在计算列上设置
汇总列
由于汇总列存在于数据库中,因此它们可以像常规列一样用于筛选或排序。 任何类型的进程或插件都使用列的最新计算值。 系统作业异步计算汇总列值。 管理员设置作业何时运行或暂停作业。 默认情况下,每个列每小时更新一次。
创建或更新汇总列时,系统会计划在 12 小时后运行 批量计算汇总字段 作业。 12 小时延迟旨在在影响用户最少的时间执行此资源密集型操作。 作业完成后,下一次计划运行的时间将是未来 10 年。 如果计算出现问题,将随系统作业一并报告该问题。 找到该系统作业,以查找与汇总字段有关的任何错误。 若要查找系统作业,请参阅 “查看汇总作业”。
小窍门
作为在开发环境中测试解决方案的开发人员,您可能不希望等待 12 小时。 您可以让速度更快。 在系统作业列表中,使用定期系统作业视图筛选列表,找到批量计算汇总字段作业。 选择作业后,使用更多操作>推迟,将时间设置为更快发生的时间。
如果要以编程方式触发创建新的批量计算汇总字段作业,请使用RetrieveAttributeRequest检索汇总列的AttributeMetadata,并使用UpdateAttributeRequest在不进行任何实际更改的情况下更新该列。
导入包含汇总列的解决方案后,会立即运行 批量计算汇总字段 作业。 这是在不会对用户造成负面影响的时间段内仅安装解决方案的另一个原因。
对于表中的每个汇总列,还将包含两个用于该汇总列的辅助列:
-
<attribute SchemaName>
_Date:DateTime – 上次计算汇总的时间。 -
<attribute SchemaName>
_State:Integer – 汇总计算的状态。 详细信息:汇总状态值
汇总状态值
汇总列计算的状态可在相应的 <属性 SchemaName>_State 列中以及在 CalculateRollupFieldResponse 中获取。
FieldState 属性。 下表显示了指示状态的值。
| 状态值 | Description |
|---|---|
| 0 |
NotCalculated:列值尚待计算。 |
| 1 |
Calculated:列值是根据 <attribute SchemaName>_Date 列中的最后更新时间计算得出的。 |
| 2 |
OverflowError:列值计算会导致溢出错误。 |
| 3 |
OtherError:列值计算由于内部错误而失败,下一次运行计算作业可能会修复它。 |
| 4 |
RetryLimitExceeded:列值计算失败,因为在计算该值时已超过最大重试次数,这可能是由于高并发和锁冲突所致。 |
| 5 |
HierarchicalRecursionLimitReached:列值计算失败,因为达到了计算的最大层次结构深度限制。 |
| 6 |
LoopDetected:列值计算失败,因为记录的层次结构中检测到递归循环。 |
立即获取计算汇总列的值
汇总列支持一种 CalculateRollupField 消息,开发人员可使用该消息按需计算汇总列值。 对于 SDK,请使用 CalculateRollupFieldRequest 类 ,对于 Web API,请使用 CalculateRollupField 函数
该消息是仅针对请求中标识列的同步操作。 如果该记录的值被纳入其他汇总列的计算中,那么在执行这些计算的按计划定期运行的异步作业发生之前,这些列的值不会将调用此方法可能导致的值变化计算在内。
汇总列限制
- 汇总列不能用作工作流事件或等待条件。 这些列不会引发事件以触发工作流。
- 更新汇总列时,表的
ModifiedBy列和ModifiedOn列不会随之更新。 - 一个组织中最多可以定义 100 个汇总列。 每个表最多只能有 10 个汇总列。
- 汇总列公式不能引用另一个汇总列。
- 汇总列公式不能引用复杂计算列或公式列。 只有引用同一记录中简单列的计算列或公式列可用于汇总。
- 汇总列公式不能包含多对多 (N:N) 关系中的记录。 它只能包含一对多 (1:N) 关系中的记录。
- 汇总列公式不能使用与
ActivityPointer表或ActivityParty表之间的一对多(1:N)关系。
提示列
创建记录时以及更新输入列值时,将填充提示列值。 将提示列添加到包含记录的表中时,不会自动填充现有记录的新提示列。 输出保留在数据库中,可用于筛选和排序,如常规列。
提示列限制
- 目前不支持使用 API 创建和更新提示列。
- 目前不支持导入和导出包含提示列的解决方案。
SourceTypeMasks 枚举
对于支持计算列和汇总列的那些列,其 SourceTypeMask 属性包含一个位掩码值。 若要从值中提取相关信息,在执行按位操作时,它帮助使用枚举。 比较 SourceTypeMasks 属性值时,使用以下 SourceTypeMask 枚举。
public enum SourceTypeMasks
{
/// <summary>
/// Undefined: 0 - The default value for simple and rollup columns.
/// </summary>
Undefined = 0,
/// <summary>
/// Simple: 1 - The calculated or formula column refers to a column in the same record.
/// </summary>
Simple = 1,
/// <summary>
/// Related: 2 - The calculated or formula column refers to a column in a related record.
/// </summary>
Related = 2,
/// <summary>
/// Logical: 4 - The calculated or formula column refers to a logical column.
/// </summary>
Logical = 4,
/// <summary>
/// Calculated: 8 - The calculated or formula column refers to another calculated column.
/// </summary>
Calculated = 8,
/// <summary>
/// Rollup: 16 - The calculated or formula column refers a rollup column.
/// </summary>
Rollup = 16,
/// <summary>
/// Invalid: 32 - The calculated,formula, or rollup column is invalid.
/// Typically this would be where a field refers to a column that no longer exists.
/// </summary>
Invalid = 32
}