lem.mallari 的答案是一个巨大的痛苦,除非您可以假设列表 A 中的金额永远不会改变,因为它没有跟踪项目是否已经添加到总和中。工作流无法遍历 SharePoint 列表,这意味着没有简单的方法来计算多个列表项的总和或平均值。
实现这一点的正确方法将需要一些开发。SharePoint 开发人员培训(2010 年、2013 年)实际上将为您提供大部分的帮助:当在列表 A 和 B 中添加或更改项目时,事件接收器应该触发,使用 SharePoint 的 API 来遍历列表 A 并按名称计算平均值,然后更新列表 B 中的所有(或仅受影响的)项目。或者,您可以使用 JavaScript 显示列表 A 中与列表 B 中的项目同名的所有条目的总和,只要所有数据都显示在您的页。如果您熟悉 XPath 和 InfoPath,则可以将列表 A 作为辅助数据源添加到列表 B 的表单中,并仅选择列表 A 中适用的项目进行汇总。
但如果我们谈论的是工作流程,这里是“仅工作流程”方法。这在 2010 年经过测试并取得成功。使用以下列创建自定义列表 C:
- 标题(字符串,强制,强制唯一值)
- TotalItems(整数,强制,默认 0)
- 总和(数字,小数位随意,必填,默认 0)
- 平均值(计算,=IF(TotalItems=0,0,Sum/TotalItems))(可选)
将列表 A 和 B 中的 Name 列替换为指向列表 C 的查找列。删除列表 B 中的 Amount 列,而不是包括 Sum 列作为附加列。将以下列添加到列表 A,并确保用户不能直接更改它们。这可以通过制作 InfoPath 表单或制作替代视图和编辑表单来限制。
- AmountArchive(数字,与Amount相同,默认0)
- AmountHasBeenSubmitted(是/否,默认否)
创建一个工作流,每次在列表 A 中创建或修改项目时运行。使用这些命令(我使用列表是为了便于阅读;当格式化为代码时它变得很难看):
- 如果 Current Item:Amount 不等于 Current Item:AmountArchive
- 将变量:项目计数设置为(数据源:列表 C;来自源的字段:TotalItems;查找列表项目:字段标题;值:当前项目:名称(返回字段为:查找值(作为文本)))
- 计算变量:ItemCount 加 1(输出到变量:ItemCount)
- 计算列表 C:Sum(与上面类似的设置;一定要使用查找值(作为文本)而不是字符串!)减去当前项:AmountArchive(输出到变量:SumWithoutValue)
- 计算变量:SumWithoutValue 加上当前项目:金额(输出到变量:NewSum)
- 如果 Current Item:AmountHasBeenSubmitted 等于 No
- 将 AmountHasBeenSubmitted 设置为 Yes
- 更新列表 C 中的项目(将 TotalItems 设置为变量:ItemCount;将 Sum 设置为变量:NewSum;以与字段:标题相同的方式查找列表项;值:当前项目:名称(返回字段为:查找值(作为文本) )
- 别的
- 更新列表 C 中的项目(不对 TotalItems 执行任何操作;使用相同的逻辑将 Sum 设置为 Variable:NewSum)
- 将金额设置为当前项目:AmountArchive