找高手处理vb+access打卡时间重复

USERINFO 表
USERID NAME deptid
001 张三 1
002 李斯 1

CHECKINOUT表

001 2011-07-01 7:59:28
001 2011-07-01 8:00:21
001 2011-07-01 12:00:03
001 2011-07-01 12:01:03
001 2011-07-01 13:25:04
002 2011-07-01 7:55:00
002 2011-07-01 7:58:00

DEPARTMENTS
deptid USERID
1 生产部
我想用VB
直接连接ado 在datagrid 里面显示成
初期用过datediff(n,a.checktime,b.checktime)>15 就是说时间范围在15分钟内不要
也考虑用groud by 处理 但是都没好办法.请高手们给点思路 或者给点代码. 小弟不胜感激.代码 最好是vb +access
用sql的存储处理也是可以,但是我只有access的表

第1个回答  2011-07-13
CHECKINOUT表添加一个自动编号字段ID(USERINFO中可以USERID为主键、DEPARTMENTS中可以deptid为主键,CHECKINOUT中添加ID为主键,用以标示不同的记录,这是一个良好的数据库使用习惯,也是数据库使用所推荐的)
1、CHECKINOUT中的所有重复记录:
SELECT DISTINCT ID, USERID, CHECKINOUT FROM (SELECT a.ID, a.USERID, a.CHECKINOUT, b.ID AS ID1, b.USERID AS USERID1, b.CHECKINOUT AS CHECKINOUT1 FROM CHECKINOUT AS a, CHECKINOUT AS b WHERE a.ID<>b.ID And a.USERID=b.USERID And Abs(a.CHECKINOUT-b.CHECKINOUT)<15/24/60)

2、CHECKINOUT中的重复记录(不包含第一条,只包含其他重复,即需要剔除的打卡记录):
SELECT DISTINCT ID, USERID, CHECKINOUT FROM (SELECT a.ID, a.USERID, a.CHECKINOUT, b.ID AS ID1, b.USERID AS USERID1, b.CHECKINOUT AS CHECKINOUT1 FROM CHECKINOUT AS a, CHECKINOUT AS b WHERE a.ID<>b.ID And a.USERID=b.USERID And Abs(a.CHECKINOUT-b.CHECKINOUT)<15/24/60 And a.CHECKINOUT>b.CHECKINOUT)

有了上述两条语句,你完全可以自行设计你的代码来实现你的所需。追问

很感谢你,在SQL里面也用过这个方法,但在access用这个不可行,它表里面还是有这些主键.我在access里面的查询视图里面来查也不可以,希望能提供个可以用的办法
EXACTID USERID CHECKTIME
1 1 2011-07-01 7:59:28
2 1 2011-07-01 12:00:28
3 1 2011-07-01 13:25:28
4 1 2011-07-01 17:35:28
5 1 2011-07-01 18:25:28
6 1 2011-07-01 20:35:28
USERID Name
1 张B
2 张A
DEPTID DEPTNAME SUPDEPTID
3 管理部 1

追答

在ACCESS中新建一个查询,粘贴上述语句,把ID修改为EXACTID,把CHECKINOUT修改为CHECKTIME(仅限于修改字段名部分,表名不用改),然后看一下查询结果。

第2个回答  2011-07-13
先说一下 ..我测试建的表只建了两个字段 " id "---Integer型 "time"----Date型
分别用于保存打卡的ID与时间
用Command1的单击事件代替刷卡动作
Private Sub Command1_Click()
Dim t As Date
Adodc1.RecordSource = "Select * from CHECKINOUT where id=1 order by time asc" '先判断是不是15分钟内 _
重复打卡
Adodc1.Refresh
Adodc1.Recordset.MoveLast '移至最后一条记录
t = Adodc1.Recordset.Fields(1).Value '把时间返回到变量方便操作
If Abs(DateDiff("n", t, Now)) < 15 Then '如果少于15分钟则重写时间
Adodc1.Recordset.Fields(1).Value = Now
Adodc1.Recordset.Update
Else '否则写新记录
With Adodc1.Recordset
.AddNew
.Fields("id") = 1
.Fields("time") = Now
.UpdateBatch
End With
End If
第3个回答  2011-07-12
你保存数据的时候筛选啊
"select * from CHECKINOUT where checktime>#" & dateadd("n",-15,time) & "# and userid='" & ID & "'"
搜索当前时间之前的15分钟内是否有记录。判断返回的recordset是否为空 如果为空 则添加数据 否则跳过追问

办法是不错,但是记录是直接采集 已经保存好了,除非是做一个过程 把这个记录重新保存到另一个表 那还需要update 还要很多啊

追答

那这样 程序里添加一个过程 使用两个记录集 每次需要调用数据前 调用该过程就可以了 大概代码如下
private sub Myclear
dim rs1,rs2 '设置两个记录集
sign1:
set rs1=cn.execute("select * from CHECKINOUT")
do until rs1.eof
set rs2=cn.execute("select * from CHECKINOUT where checktime#" & rs.fields("checktime") & "#")
if not rs2.eof then '判断此十五分钟内是否有记录 如果有记录就删除这些记录 并跳转到书签sign1 重新设置rs1记录集
cn.execute("delete * from CHECKINOUT where checktime<=#" & dateadd("n",15,rs.fields("checktime")) & "# and userid='" & rs.fields("userid") & "'")
goto sign1
end if
rs1.movenext
loop
end sub

本回答被提问者采纳
第4个回答  2011-07-12
所有的记录都记录下来不就得了,查询处理的时候根据需要处理啊!一般用子查询实现你的要求
第5个回答  2011-07-12
这个打卡重复是怎么产生的?相隔一分钟的两条记录应该不是机器延时产生的吧?追问

随机产生

追答

你这个不是实际应用吗?仅仅是随机产生的数据……?

追问

也可以这样说,就是员工什么时候去打 就什么时候有记录