如何计算去除法定节假日及周末的请假天数?
1. 简介
1.1 案例简介
本文将介绍,在考勤请假的场景中,如何实现请假天数自动去除法定节假日和周末,并自动添加周末调休天数,准确计算出实际请假天数,可用于考勤计算、薪资计算等。
1.2 设计思路
1)在「法定日期记录表」中,提前录入当年所有的法定节假日日期,通过函数判断出该日期是否为周末,并添加标记;
2)在「调休日期记录表」中,提前录入当年所有的周末调休日期,并对日期添加标记;
3)在「请假申请表」中,利用 NETWORKDAYS 函数计算出请假开始日期到请假结束日期之间完整的工作日天数,扣除非周六/日的国家假日,再加上需要调休上班的日期,即计算出实际请假天数。
1.3 预期效果
以五一期间的请假为例,已知五一期间法定节假日期为~,调休日期为和。如在~期间请假,则实际请假天数为 9,效果如下:
2. 设置步骤
在学习之前建议安装 请假天数计算 应用模板,本文将按照模板中的示例数据进行讲解。
2.1 表单搭建
1)新建「请假申请表」表单,字段设置如下:
字段名称 | 字段类型 |
请假开始时间 | 日期时间 |
请假结束时间 | 日期时间 |
实际请假天数 | 数字 |
子表单行数 | 数字 |
子表单 | 子表单 |
序号 | 子字段-单行文本 |
日期时间 | 子字段-日期时间 |
法定节假日判断 | 子字段-数字 |
调休判断 | 子字段-数字 |
2)新建「法定日期记录表」表单,字段设置如下:
字段名称 | 字段类型 |
日期时间 | 日期时间 |
法定节假日标记 | 数字 |
3)新建「调休日期记录表」表单,字段设置如下:
字段名称 | 字段类型 |
调休日期 | 日期时间 |
调休标记 | 数字 |
4)新建「子表单基础表」辅助表单,字段设置如下:
字段名称 | 字段类型 |
总行数 | 数字 |
子表单 | 子表单 |
序号 | 子字段-单行文本 |
数字 | 子字段-数字 |
2.2 设置辅助表单
2.2.1 法定日期记录表
法定节假日记录表中,需要提前录入当年所有的法定节假日日期,并判断该日期是否为周末。
1)选中「法定节假日标记」字段,在「字段属性 >> 默认值」处,设置默认值为「公式编辑」,点击下方「编辑公式」:
2)在公式编辑页面,设置「法定节假日标记」的公式为:IF(OR(TEXT(DATE(日期时间),'E')==0,TEXT(DATE(日期时间),'E')==6),0,1),表示当节假日的日期为星期日或星期六时,该字段标记为 0,否则标记为 1。设置好后点击「确定」保存。
3)进入「数据管理」,在表单中录入当年所有的法定节假日日期:
2.2.2 调休日期记录表
调休日期记录表中,需要提前录入当年所有的调休上班日期,并为该日期添加标记,便于后续计算实际请假日期。
1)选中「调休标记」字段,在「字段属性 >> 默认值」处,设置默认值为「自定义」,在输入框中设置默认值为 1:
2)进入「数据管理」,在表单中录入当年所有的调休日期:
2.2.3 子表单基础表
1)在「子表单基础表 >> 数据管理 >> 导入」处导入附件中的示例数据:200行子表单基础表序号全集.xlsx。
2)导入数据时需确认示例数据和表单字段的关联关系如下:
2.3 设置数据联动
1)进入「请假申请表」表单,选中整个「子表单」,在「字段属性 >> 默认值」处,设置选项为「数据联动」,点击「数据联动设置」:
2)进入数据联动设置页面,设置内容如下:
- 联动表单:「子表单基础表」;
- 条件设置为:「总行数」等于「子表单行数」;
- 触发联动:
- 「子表单」字段显示「子表单」字段的值;
- 添加「序号」子字段,显示为「序号」子字段的值;
设置完成点击「确定」。
3)同理,设置「子表单.法定节假日判断」字段的数据联动如下:
- 联动表单:「法定日期记录表」;
- 条件设置为:「日期时间」等于「子表单.日期时间」;
- 触发联动:「子表单--法定节假日判断」字段显示「法定节假日标记」字段的值;
设置完成点击「确定」。
4)同样的方法,设置「子表单.调休判断」字段的数据联动如下:
- 联动表单:「调休日期记录表」;
- 条件设置为:「日期时间」等于「子表单.日期时间」;
- 触发联动:「子表单--调休判断」字段显示「调休标记」字段的值;
设置完成点击「确定」。
2.4 设置公式
1)进入「请假申请表」,选中「子表单行数」字段,在「字段属性 >> 默认值」处,设置默认值为「公式编辑」,点击下方「编辑公式」:
2)在公式编辑页面,设置「子表单行数」的公式为:DAYS(请假结束时间,请假开始时间)+1,用于计算从请假开始到结束一共多少天,作为子表单的行数。
设置好点击「确定」保存。
3)按照同样的方法,设置其他字段的公式如下:
- 子表单.日期时间:IF(子表单.序号=='1',请假开始时间,IF((VALUE(子表单.序号)<=子表单行数+1),DATE(YEAR(请假开始时间),MONTH(请假开始时间),DAY(请假开始时间)+VALUE(子表单.序号)-1),' ')),表示当子表单中序号为 1 时,第一行的日期为请假开始时间,后续的日期依次在前一个日期基础之上加上一天,直至子表单行数用完;
- 实际请假天数:NETWORKDAYS(请假开始时间,请假结束时间)-SUM(子表单.法定节假日判断)+SUM(子表单.调休判断)},即计算出请假时间中除去周末的工作日天数,再减去法定节假日不在周末的天数,加上调休上班在周末的天数,最终得出实际请假天数。
2.5 设置字段显隐规则
1)对于表单中的辅助字段「子表单行数」和「子表单」,可以在「字段属性 >> 字段权限」处设置字段为不可见:
2)设置辅助字段不可见后,需在「表单属性 >> 不可见字段赋值」处,设置赋值规则为「始终重新计算」:
2.6 效果演示
效果演示参见本文【1.3 预期效果】。