1.场景描述
用云表实现公司的考勤记录登录,填写年份和月份,选择当月所属的礼拜类型,填写本月的节日设置后,单击【设置】按钮,生成“工作日历”明细和“考勤管理”明细,当月的公休日和节假日标注出来,自动计算“本月工作日数”和“本月休息日数”;选择员工具体的天数选择“出勤/未出勤”,自动计算员工当月的出勤天数。

2.实现步骤分析
①员工数据存储在《员工》模板中,为《考勤日历》模板提供员工数据(不展示);
②单击【设置】时生成“工作日历”明细,该明细中只包含:日期,星期,工作类型3个数据项,并根据礼拜类型,和“本月节日设置”填写“工作类型”是“工作日”或“公休日”或“节假日”;
③单击【设置】自动填写“考勤管理”,它是一个动态的交叉表,行列的数据由填表公式动态插入,日历列和员工行标题;
④填写员工的出勤状态,自动合计员工的出勤天数;
3.模板设计
3.1模板样式
它有3个表格组成:基本信息,工作日历和考勤管理,有2个明细表:节日明细和日历明细,有1个动态交叉表出勤明细。(为了方便将工作日历和考勤管理表格分为上下2个表格显示)

3.2数据项定义
①基本信息中设置了辅助数据项:辅助日期和月天数;

②节日明细,填写“节日开始日期”和“节日结束日期”时,自动生成“节日天数”;

③日历明细

④出勤明细:交叉表,标题行3行(日期、星期、工作类型),标题列2列(用户、出勤天数),数值区(出勤状态)组成,其中出勤状态数据项设置了填写规范,它是一个固定的下拉列表,方便考勤管理员手动选择填写考勤状态。

4.公式设置
①生成从月初值到月末值的日期列表,从月初值到月末值,首先需要先计算出他们之间的间隔天数,再利用数据源生成一个从开始日期到结束日期列表,用“辅助日期”记录每次生成的日期,并判断是否为“公休日”或“节假日”。
a、计算一个月有多少天,赋值给“月天数”。利用函数“日期间隔”,计算所选年月的月初值和月末值的间隔天数,利用函数“月初值”和“月末值”得到所选年月的月初值和月末值;公式为:
日期间隔( "dd" , 月初值(本表单.年 , 本表单.月) , 月末值( 本表单.年 , 本表单.月 ) )
;
b、生成辅助日期。利用“全局.序号列表”生成从开始序号到结束序号的一系列序号(1,2,3,4,5......),再利用函数“日期加减”生成从月初值开始增加1天,2天,3天.....的日期;

c、判断日期是“工作日”还是“公休日”。当“辅助日期”被赋值后,对“日历明细”更新数据(注意:不能使用插入数据,序号列表中有多少条记录,这个公式将会执行多少次,如果插入前删除所有的数据,则只会有最后一个日期),工作类型调用函数:if,判断大小礼拜的情况。表达式为:
IF( (本表单.礼拜类型 = "大礼拜" 并且 ( 本表单.日历明细.星期 = "星期六" 或者 本表单.日历明细.星期 = "星期日" ) ) 或者 ( 本表单.礼拜类型 = "小礼拜" 并且 本表单.日历明细.星期 = "星期日" ), "公休日" , "工作日" )
;

d、判断节假日。利用“节日明细”作为数据源,过滤出数据源中包含“辅助日期”的节日,若节日包含辅助日期,则给辅助日期对应的“日历明细”中的日期更新为“节假日”,否则使用原本的工作类型“本表单.工作类型”;

②计算本月工作日数和本月休息日数。先清空“本月休息日数”,再累积。累积时,将“日历明细”作为数据源,过滤出公休日和节假日的数据,执行累加,得到“本月休息日数”。根据“月天数”和“本月休息日数”计算“工作日数”。

③自动填写动态考勤明细。
a、利用《员工》模板的“员工列表”插入交叉表的行标题

b、利用“日历明细”作为数据源,插入交叉表的多列列标题;

c、更新出勤交叉明细表中的“公休日”和“节假日”的信息,并将出勤状态赋值为日期的工作类型。

④填写考勤时,合计自动合计出勤天数。
a、先清空出勤天数,(注意此时需要填写执行条件,“公休日”和“节假日”时不执行,提高运行效率),在交叉表中针对明细表更新时,需要填写匹配条件,若不填写,则不执行。

b、累积出勤天数。将“出勤明细”作为数据源,过滤出那些“出勤”的记录,再针对用户进行累积“出勤天数”;

使用效果:
填写年、月,选择礼拜类型,设置本月的节日,单击【设置】,自动填写“工作日历”和“考勤管理”,本月工作日数,本月休息日数;填写员工的考勤状态,自动合计出勤天数。

本文案例源自云粉的功能演示
手工考勤与统计