算法问题(300分)

  • 主题发起人 主题发起人 bigfeng
  • 开始时间 开始时间
B

bigfeng

Unregistered / Unconfirmed
GUEST, unregistred user!
正在做一个考勤系统,里面有一个表,表里有个字段“时间”例(200609061145),每人每天刷4次,要判断每天的迟到早退,其中还有可能有人只有两次或一次都不刷,每个月还要把周六,周日让掉,该怎么做?最好一步一步的教我下,分三块,一个是判断迟到早退,一个是判断周六周日,还有一个是判断有没有刷。每块我出100分
 
说的不清楚,你想从这个字段里面的信息就可以判断出来吗.还是怎么着,还是可以另设其它字段
 
function DayOfWeek(Date: TDateTime): Integer; 此函数可以判断Date是礼拜几 。
 
迟到,早退
一、看时间段,在8-12点之间,判断前面刷几次了,
二、用时间装换求是不是周六周天,
三、存在这个时间就是刷了
 
剛好以前做過這一塊,我說一下我的實現方法吧,首先給每個人分配一個班次(這是針對人數較多,班次和上班時段有很多,必須加以區分,否則會存在時間段亂,如夜班的上班時間是20:45但這可能是白班的加班下班,設立班次就是為區分這些情況設立,如是針對公司班次都一樣則不用給班次),並給定一個刷卡時間段,如辦公室的都定義為班次(102),然后設定具體的刷卡時間段(如102設為上午上班卡是08:00(但規則可設為提前60分鐘打卡),上午下班為12:00(可延遲30分鐘),下午上班卡為12:45-13:00),然后把采集出來的刷卡數據進行處理至一個獨立的表中供查詢用,把取出的數據大於08:00時,把刷卡數據填上去,並把遲到次數+1,並求出遲到分鐘,下班時間類似,當上班時間<08:00是計算上班時間就以08:00算,當沒有找到10:00以前的刷卡數據時,就視為沒刷上班卡,其它筆卡類似,有什么情況再問吧,我們工廠(有兩萬多人)就是這樣處理的,如有什么更好的辦法,可一起討論,,共同進步,然后根據打卡時間求出上班時間和加班時間,及算出異常時間,另外你說的星期幾的情況可根據datepart(dw,..)得來,具體的星期幾可自行寫,因為有時候你得考慮調假及補休還有一些節假日提前下班的情況,另外說一句,我是用一個procedure來處理刷卡數據,把刷卡數據按天插入至考勤表中,
 
就靠这个字段来判断
 
先请解释一下为什么刷4次
我们好像只要刷两次就可以了
知道你的需求再帮你考虑解决的办法
 
呵呵,人家中午也要刷的啊。
比如对某人一个月的考勤做统计。
1、楼上已说,用DayOfWeek去掉星期六和星期日;
2、对查询出每天的打卡时间做个分析函数,次数为零判断为没刷卡。
3、4个对比时间,早上下午上班,早上下午下班,4种情况需要判断,把查询出的时间排序,按次序对比。打卡次数在1-3次之间的可以列入异常情况,或另做分析函数分析。
 
早上来一次
中午回一次
下午来一次
下午下班一次
对巴,就是这4次把
如果你的““时间”例(200609061145),”是表示该人刷卡的时间,不马上计算是早退还是迟到的话:
我想要每天中午1点钟计算。(这时系统比较闲)
首先是正对一个人 ,不同人从头遍历一次
a=0
b:=0
c:=0
if 不是星期六和星期天
begin
if copy(200609061145,9,4) <830
begin
c:=c+1;//表示人到且不迟到次。
end;
next //表示下一条记录

if copy(200609061145,9,4) >830
begin
a:=a+1;//表示迟到多一次。
end;
next //表示下一条记录
if (a> 0)or (c>0) //表示不管咋样,他来了
begin
if copy(200609061145,9,4) <1200
begin
b:=b+1;//表示早退多一次。
end;
end;
end;//if 不是星期六和星期天
if 是星期六和星期天 then
begi
结束//当然,如果以后要扩展功能,可以在这里入手
end;
下午雷同
将结果写道日志中,要用的时候或者一周(或一月) 从日志中统计,原始数据压缩保存.

点评:这种算法分步解决,不难,一般的计算机能完成的,它有原始数据作档案,中间计算不累;;报表可以马上要,也可以以后定时上报。
一个是判断迟到早退,解决
一个是判断周六周日,解决
还有一个是判断有没有刷 如果a=0 and b=0 and c= 0 表示人没有到或人道他没有刷卡 你可以在
if copy(200609061145,9,4) >830
begin
a:=a+1;//表示迟到多一次。
end;
提醒员工,你是迟到还是早退了,若果是早退,要找证人,否则,将视为迟到,而且是太迟了
 
830表示 规定上班时间
1200 规定下班班时间
 
if copy(200609061145,9,4) >1200
begin
d:=d+1;//表示正常下班一次。我建议不要加,只要是正常下班不刷卡最好,这样接生时间,减少卡的磨损,管理上没有漏洞.不过要防止有人早退不刷卡,说自己正常下班.
end;
 
a=0
b:=0
c:=0
if 不是星期六和星期天
begin
if copy(200609061145,9,4) <830
begin
c:=c+1;//表示人到且不迟到次。
next //表示下一条记录
end;

if copy(200609061145,9,4) >830 ,and <1200
begin
a:=a+1;//表示迟到多一次。
next //表示下一条记录
end;
if (a> 0)or (c>0) //表示不管咋样,他来了
begin
if copy(200609061145,9,4) <1200
begin
b:=b+1;//表示早退多一次。
next //表示下一条记录
end;
end;
end;//if 不是星期六和星期天
if 是星期六和星期天 then
begin
结束//当然,如果以后要扩展功能,可以在这里入手
end;
下午雷同
将结果写道日志中,要用的时候或者一周(或一月) 从日志中统计,原始数据压缩保存.

点评:这种算法分步解决,不难,一般的计算机能完成的,它有原始数据作档案,中间计算不累;;报表可以马上要,也可以以后定时上报。
一个是判断迟到早退,解决
一个是判断周六周日,解决
还有一个是判断有没有刷 如果a=0 and b=0 and c= 0 表示人没有到或人道他没有刷卡 你可以在
if copy(200609061145,9,4) >830
begin
a:=a+1;//表示迟到多一次。
end;
提醒员工,你是迟到还是早退了,若果是早退,要找证人,否则,将视为迟到,而且是太迟了

要在当天记录中用,否则速度慢,统计后将当天记录天再加到总记录中,
 
员工表。first
while not 员工表.eof do
begin
xm:=姓名
a=0
b:=0
c:=0

当天纪录表。first;
while not 当天纪录表.eof do
begin
if xm=姓名 then
begin
调用上面的函数//补充一点 每个if 都要加“and xm=姓名”你可以传递参数来实现
else
当天纪录表.next;
end;//if xm=姓名 then

end;
员工表.nest;
end;//while not 员工表.eof do


以上是时间最快的办法,如果不行,你可以分别来统计迟到早退的
 

Similar threads

回复
0
查看
832
不得闲
回复
0
查看
887
不得闲
回复
0
查看
1K
不得闲
回复
0
查看
637
谦行
后退
顶部