基于SSRS FetchXML计算CRM 365两日期间排除周末的天数
D365 Online 自定义报表:计算排除周末与假期的日期差实现思路
针对你的需求,核心思路是结合数据预处理或报表端表达式逻辑——因为FetchXML本身不支持复杂的日期排除计算,下面分两种可行方案说明:
方案一:预处理计算(推荐,报表端更简洁)
直接在Dynamics 365中提前算出目标天数,报表只需读取结果即可:
- 步骤1:创建一个只读数字字段(命名如
WorkingDays),用于存储最终计算结果 - 步骤2:用实时工作流或插件实现计算逻辑,在
StartDate或EndDate字段更新时触发:- 计算两个日期的总天数差:
DATEDIFF(startDate, endDate, Day) - 扣除周末天数:
- 先算总周数:
RoundDown(DATEDIFF(startDate, endDate, Day)/7, 0),每周贡献2天周末 - 再调整首尾日期:如果起始日是周日则减1,结束日是周六则减1(D365中Weekday返回值:1=周日,7=周六)
- 先算总周数:
- 扣除假期天数:查询标准假期表,统计日期落在
[startDate, endDate]区间内的记录总数 - 最终结果 = 总天数差 - 周末天数 - 假期天数,写入
WorkingDays字段
- 计算两个日期的总天数差:
方案二:报表端直接计算(适合临时报表,无需修改实体)
如果不想改动D365实体结构,可在报表(如SSRS)中通过表达式+FetchXML数据拉取实现:
- 步骤1:用FetchXML拉取主实体的
StartDate、EndDate,同时通过link-entity关联假期表,过滤出日期在两个目标日期之间的假期记录 - 步骤2:在报表文本框的表达式中编写VB逻辑:
- 计算总天数差:
DateDiff("d", Fields!StartDate.Value, Fields!EndDate.Value) - 计算周末天数:
Dim totalWeeks As Integer = DateDiff("ww", Fields!StartDate.Value, Fields!EndDate.Value, FirstDayOfWeek.Sunday) Dim weekendDays As Integer = totalWeeks * 2 ' 修正首尾日期的周末计数 If Weekday(Fields!StartDate.Value, FirstDayOfWeek.Sunday) = 1 Then weekendDays -= 1 If Weekday(Fields!EndDate.Value, FirstDayOfWeek.Sunday) = 7 Then weekendDays -= 1 - 计算假期天数:用
LookupSet或聚合函数统计当前记录关联的假期数量 - 最终天数 = 总天数差 - 周末天数 - 假期天数
- 计算总天数差:
关键注意点
- 假期表需包含明确的日期字段,且确保数据覆盖需要计算的日期范围
- 跨年度的日期计算要保证假期表有对应年份的假期数据
- 预处理方案中,工作流/插件需处理日期为空的边界情况,避免计算错误
内容的提问来源于stack exchange,提问作者NDevBrad
相关产品推荐
相关产品推荐

