实际上你问题可以这样描述一下:
if 工人在规定的时间内没有打卡(这称为考勤规则) then
begin
if 工人请假 then 请假原因
else
考勤结论(迟到,矿工,早退等)
end
也就是说,不管请没请假,都假设员工要打卡,只是他没打卡的时候才去判断请假没有,再
根据实际情况下结论
下面有个函数是判断请假情况的,你可以参考:
qjbt:请假表
dtstr:打卡日期
timstr:规定迟到的时间
function pandj(dtstr,timstr:string):string;//判断请假处理
var
qjbtime1,qjbtime2,qjbt1,qjbt2:string;
begin
{建议算法:增加一参数kahstr,用来传递卡号,判断是否请假时,先选出卡卡号为kahstr的记录,如果记录数为零,
则未请假,否则,比较请假时间再下结论}
//如果请假,按请假处理
dm.qjbt.first;
pandj:='';
while not dm.qjbt.eof do
begin
if dm.qjbt.fields[1].asstring=dm.rjl_temp.fields[0].asstring then
begin
qjbtime1:=copy(dm.qjbt.fields[2].asstring,5,4);//请假日期
qjbtime2:=copy(dm.qjbt.fields[3].asstring,5,4);
qjbt1:=copy(dm.qjbt.fields[2].asstring,9,4);//请假时分
qjbt2:=copy(dm.qjbt.fields[3].asstring,9,4);
if (copy(dtstr,5,4)>qjbtime1)and(copy(dtstr,5,4)<qjbtime2) then
begin//理论上打卡日期在请假日期范围内,(跨天假,不含当天)
pandj:=dm.qjbt.fields[4].asstring;//返回请假原因
exit;
end
else
begin
if (copy(dtstr,5,4)=qjbtime1) then
begin //只请了当天假 或在请跨天假的第一天
//判断半天
if (timstr<=qjbt2) then//理论上打卡时间内未打卡,则判断是否请了假
pandj:=dm.qjbt.fields[4].asstring //请了,返回请假原因
else
pandj:='旷工';
exit;
end
else
begin//在请跨天假的最后一天
if (copy(dtstr,5,4)=qjbtime2) then
begin
if (timstr<=qjbt2) then
pandj:=dm.qjbt.fields[4].asstring
else
pandj:='旷工';
exit;
end
else//未请假
begin
pandj:='旷工';
end;
end;
end;
end;
dm.qjbt.next;
end;
end;