2.3.12 月度考勤表计算设计
根据订餐汇总表的加工逻辑设计,使用功能构件表达式可以映射地如下表示,并做详细注解:
(1)清除原有内容
删除命令:|Z
本表的行:{:,:}
删除原有的全部内容:{?,:}
公式:{?,:}=|Z{?,:};(或{?,:}=|Z{:,:};)
(2)获取原始考勤大数据
誊抄拼接记录(整表取)命令:|U
当月考勤大数据信息:QBKQ00[?,:]
预清空:|U…!OZ;
对应关系是:
月度考勤表:员工编码,日期
考勤大数据:员工编码,考勤时间
获取当月信息:指定月份为当年当月,表达式为VAL(LEFT(QBKQ00[?,12],2))=_NMM.AND.VAL(SUBSTR(QBKQ00[?,12],7,4))=_NYY
公式:{?,:}=|UQBKQ00[?,:]!FVAL(LEFT(QBKQ00[?,12],2))=_NMM.AND.VAL(SUBSTR(QBKQ00[?,12],7,4))=_NYY!OZ;
条件中的对应关系是:
{?,3},{?,4}=
[?,2],[?,12]
(3)按员工和考勤时间排序(并排除重复)
排序(一般取键值从小到大):|P...!OS;
排序关键栏目:(本表)员工+考勤时间,即{?,3}+DTOC(CTOD({?,4}))
公式:{?,:}=|P{?,3}+DTOC(CTOD({?,4}))!OS;
(4)获取下班时间(同一天内最晚)
排序(倒排时取键值从大到小):|P...!OFS;
排序关键栏目:(本表)员工+考勤时间,即{?,3}+LEFT({?,4},10),一般理解,一天中考勤两次的,前一次为上班,后一次为下班,倒排序后,下班的时间便排在了最前面。此时倘排除重复,只取第一个,相当于获得了下班时间
下班时间需要在草稿上暂存,草稿可为与本表同格式的上月表:KQB101[?,:]
公式:KQB101[?,:]=|P{?,3}+LEFT({?,4},10)!OFS;
注释:*,表示为暂存草稿表
(5)获取上班时间(同一天内最早)
排序(一般取键值从小到大):|P...!OS;
排序关键栏目:(本表)员工+考勤时间,即{?,3}+LEFT({?,4},10),一般理解,一天中考勤两次的,前一次为上班,后一次为下班,上班的时间排在最前面,通过排除重复,只取第一个,相当于获得了上班时间
公式:{?,:}=|P{?,3}+LEFT({?,4},10)!OS;
(6)整理上班时间
赋值:将第四栏{?,4}日期上取得的上班时间,赋值到第五栏“上班时间” 栏目{?,5}
公式:{?,5}={?,4}
(7)整理下班时间
跨表对应取数:|B
本表下班时间:{?,6}
草稿表上的下班时间:KQB101[?,4]
对应条件:员工编码相同,日期相同,即{?,3}+LEFT({?,4},10)=KQB101[?,3]+LEFT(KQB101[?,4],10)
公式:{?,6}=|BKQB101[?,4]!F{?,3}+LEFT({?,4},10)=KQB101[?,3]+LEFT(KQB101[?,4],10);
(8)整理下班时间为空白(漏勤)
本表下班时间:{?,6}
判定条件:上下班时间相同的,应为没有考勤,下班时间定义为空白,为区别于缺勤,此种情况定义为漏勤
公式:{?,6}=''
公式条件:{?,5}={?,6}
(9)获取部门姓名
跨表对应取数:|B
员工信息:YGKP00[?,:]
对应条件:员工编码相同,即本表员工编码=人员信息及充值卡片上的员工编码,也即{?,3}=YGKP00[?,7],或者YGKP00[?,7]={?,3}
姓名与部门对应关系:本表姓名、部门=人员信息及充值卡片上的姓名、部门,也即{?,2},{?,1}=[?,6],[?,10]
公式:{?,2}({?,2},{?,1}=[?,6],[?,10])=|BYGKP00[?,6]!FYGKP00[?,7]={?,3};
(10)考勤情况
出勤情况:上班时间晚于8:30,为迟到,缺下班考勤(只有一次考勤),为漏勤,下班时间早于16:15,为早退,其余为正常出勤
公式:{?,7}=IIF(DTOC(CTOD({?,5}))>LEFT(DTOC(CTOD({?,4})),10)+'08'+CHR(58)+'30'+CHR(58)+'00','迟到','')++''+IIF({?,6}='','漏勤',IIF(DTOC(CTOD({?,6}))<LEFT(DTOC(CTOD({?,4})),10)+'16'+CHR(58)+'15'+CHR(58)+'00','早退',''))
(11)整理日期为中文习惯表达
中文表达:指某年某月某日格式
公式:{?,4}=RIGHT(LEFT({?,4},10),4)+'年'+LEFT({?,4},2)+'月'+SUBSTR({?,4},4,2)+'日'
(12)按部门员工排序
排序(一般取键值从小到大):|P;
排序关键栏目:(本表)部门+员工,即{?,1}+{?,2}
公式:{?,:}=|P{?,1}+{?,2};
将上述公式整理,便形成表2-12的加工逻辑数据字典。在录入修改界面中单击“计算”按钮,可打开计算公式的编辑设计菜单进行设计,如图2-54所示。
严格来讲,上述计算公式还存在一个重大缺陷,因为所有的考勤分析均来自考勤消费打卡机的上下班考勤,一旦某位员工当天没有来考勤,意味着考勤大数据中缺乏该员工的记录信息,因此,就不会有他的“缺勤”信息,这是不符合人事管理规定的。因此还需要在之前12步计算公式的基础上,继续依据人员信息及充值卡片上的全员信息做进一步的分析与计算。
表2-12 加工逻辑字典:DCXX_JSS,订餐汇总表,日报

续表


图2-54 月度考勤表计算公式的编辑界面
(13)获取本月的上班日清单(草稿)
排序(一般取键值从小到大):|P...!OS;
排序关键栏目:(本表)日期,即{?,4}
上班日:由之前12步形成的上班日记录,排除重复
草稿:KQB101[?,:],备注带*
公式:KQB101[?,:]=|P{?,4}!OS;
(14)预备按上班日获取全员名单(草稿)
誊抄拼接记录(整表取)命令:|U…!OZ;
当月考勤日期信息:{?,4}
人员信息及充值卡片对应日期暂存:YGKP10[?,9],草稿,备注带*
对应关系是:
人员信息及充值卡片:日期(暂存)
本表考勤大数据:日期
公式:YGKP10[?,:]=|UKQB101[?,:]!OZ;
条件中的对应关系是:
[?,9]=
{?,4}
(15)根据上班日获取全员名单(草稿)
誊抄拼接记录(整表取)命令:|U…!OZ;
按考勤日期获取全员信息:!OK(9),即以上一步的第9栏日期为依据,每一个日期匹配全员名单,形成一个日期总数*员工总数的新列表
对应关系是:
人员卡片草稿:员工编码,部门,姓名,日期(作为关键栏目保留,倍增全员信息)
人员卡片:员工编码,部门,姓名,日期
公式:YGKP10[?,:]=|UYGKP00[?,:]!OK(9)Z;
条件中的对应关系是:
[?,7],[?,10],[?,6],[?,9]=
[?,7],[?,10],[?,6],[?,9]
备注:草稿,带*
(16)整理全员全月的完整考勤花名册
誊抄拼接记录(整表取)命令:|U…!OZ;
月度考勤表草稿:KQB101[?,:]
按日期全员花名册:YGKP10[?,:]
对应关系是:
月度考勤表草稿:部门,姓名,员工编码,日期
人员卡片草稿:部门,姓名,员工编码,日期
公式:KQB101[?,:]=|UYGKP10[?,:]!OZ;
条件中的对应关系是:
[?,1],[?,2],[?,3],[?,4]=
[?,10],[?,6],[?,7],[?,9]
备注:草稿,带*
(17)判断是否已经考勤
跨表对应取数:|B
本表员工考勤信息:姓名+日期
月度考勤表草稿员工花名册信息:姓名+日期
对应条件:本表的姓名+日期=月度考勤表草稿员工花名册的姓名+日期,也即{?,2}+{?,4}=KQB101[?,2]+KQB101[?,4]
判断信息:暂存于月度考勤表草稿的考勤状况栏
公式:KQB101[?,7]=|B{?,2}!F{?,2}+{?,4}=KQB101[?,2]+KQB101[?,4];
备注:草稿,带*
(18)删除已经考勤的记录
删除命令:|Z
月度考勤表草稿:KQB101[:,:]
删除在本表中已有考勤的员工记录:月度考勤表草稿考勤状况栏不为空白
公式:KQB101[?,:]=|ZKQB101[:,:]!F.NOT.EMPTY(KQB101[?,7]);
备注:草稿,带*
(19)剩余未有考勤记录的即为缺勤(休息)
月度考勤表草稿考勤状况栏:KQB101[?,7]
剩余的月度考勤表草稿考勤状况值:缺勤(休息)
公式:KQB101[?,7]='缺勤(休息)'
备注:草稿,带*
(20)与之前的考勤分析结果合并
誊抄拼接记录(整表取)命令:|U…!OA;
月度考勤表草稿:KQB101[?,:]
本表月度考勤表:{?,:}
对应关系是:完全对应
公式:{?,:}=|UKQB101[?,:]!OA;
(21)按部门员工日期重新排序
排序(一般取键值从小到大):|P
排序关键栏目:(本表)部门+员工+考勤日期
公式:{?,:}=|P{?,1}+{?,2}+{?,4};
至此,月度考勤分析才能获得较为满意的结果。这种精益求精的精神,是每一个职业岗位的人都应该遵守并落实到行动的。