Ms access MS Access将行信息转换为列信息
我花了好几个小时想弄明白这一点。这是为一家制造厂准备的 车间人员使用计算机系统在不同的机器上记录他们的活动,该计算机系统生成如下数据:Ms access MS Access将行信息转换为列信息,ms-access,vba,rows,Ms Access,Vba,Rows,我花了好几个小时想弄明白这一点。这是为一家制造厂准备的 车间人员使用计算机系统在不同的机器上记录他们的活动,该计算机系统生成如下数据: Empnbr Datestamp Shift Machnbr Time 00090 6/30/2010 1 0354 11:10 00090 6/30/2010 1 S 12:00 00098 6/30/2010 1 0920 7:00 00098 6/30/2010 1 0143
Empnbr Datestamp Shift Machnbr Time
00090 6/30/2010 1 0354 11:10
00090 6/30/2010 1 S 12:00
00098 6/30/2010 1 0920 7:00
00098 6/30/2010 1 0143 7:30
00098 6/30/2010 1 S 15:00
00101 6/30/2010 1 0920 7:00
00101 6/30/2010 1 0247 7:30
00101 6/30/2010 1 0147 7:40
00101 6/30/2010 1 S 15:00
00107 6/30/2010 1 0585 7:00
00107 6/30/2010 1 0143 12:00
00107 6/30/2010 1 S 15:00
00109 6/30/2010 1 0920 7:00
00109 6/30/2010 1 0154 7:30
00109 6/30/2010 1 0154 9:00
00109 6/30/2010 1 0154 9:43
00109 6/30/2010 1 0254 10:49
00109 6/30/2010 1 0154 12:30
00109 6/30/2010 1 S 15:00
00111 6/30/2010 1 0591 5:00
00111 6/30/2010 1 S 17:00
00114 6/30/2010 2 0585 15:00
00114 6/30/2010 2 S 23:00
Public Sub BuildReportTable()
Dim prevEmp As Integer
Dim prevDate As Date
Dim prevTime As Date
Dim prevMachine As String
Dim prevShift As Integer
Dim rs As Recordset
'Empty report table
CurrentDb.Execute "delete from tblHourReport"
'Open the data table
Set rs = CurrentDb.OpenRecordset("tblHours", dbOpenDynaset)
If Not rs.EOF Then rs.MoveFirst
'Loop over each data record and create the report record
prevEmp = 0
Do While Not rs.EOF
If prevEmp <> 0 And prevMachine <> "S" Then
DoCmd.SetWarnings False
DoCmd.RunSQL "insert into tblHourReport values (" _
& prevEmp & ", '" _
& prevDate & "', '" _
& prevMachine & "', " _
& prevShift & ", '" _
& prevTime & "', '" _
& rs!Time & "');"
DoCmd.SetWarnings True
End If
prevDate = rs!Date
prevShift = rs!shift
prevEmp = rs!employee
prevTime = rs!Time
prevMachine = rs!machine
rs.MoveNext
Loop
End Sub
我要写的报告需要这样一种形式的信息
Empnbr Datestamp Shift Time Start Time End Machine
这将允许我计算每人每天在每台机器上花费的时间量。基本上,Access需要查看员工编号、日期戳和班次,并在第一次看到时进行查看。然后需要获取下一次看到的时间,并在第一次输入时将该时间归因于机器。这种情况持续发生,直到访问遇到机器S,这意味着注销
现在是时候吃点止痛药了-谢谢你的帮助 我会用一张临时桌子。要显示报告时,请使用VBA代码浏览输入表、生成报告数据并填充临时表。然后使用临时表中的数据显示报告。填充报告表的函数如下所示:
Empnbr Datestamp Shift Machnbr Time
00090 6/30/2010 1 0354 11:10
00090 6/30/2010 1 S 12:00
00098 6/30/2010 1 0920 7:00
00098 6/30/2010 1 0143 7:30
00098 6/30/2010 1 S 15:00
00101 6/30/2010 1 0920 7:00
00101 6/30/2010 1 0247 7:30
00101 6/30/2010 1 0147 7:40
00101 6/30/2010 1 S 15:00
00107 6/30/2010 1 0585 7:00
00107 6/30/2010 1 0143 12:00
00107 6/30/2010 1 S 15:00
00109 6/30/2010 1 0920 7:00
00109 6/30/2010 1 0154 7:30
00109 6/30/2010 1 0154 9:00
00109 6/30/2010 1 0154 9:43
00109 6/30/2010 1 0254 10:49
00109 6/30/2010 1 0154 12:30
00109 6/30/2010 1 S 15:00
00111 6/30/2010 1 0591 5:00
00111 6/30/2010 1 S 17:00
00114 6/30/2010 2 0585 15:00
00114 6/30/2010 2 S 23:00
Public Sub BuildReportTable()
Dim prevEmp As Integer
Dim prevDate As Date
Dim prevTime As Date
Dim prevMachine As String
Dim prevShift As Integer
Dim rs As Recordset
'Empty report table
CurrentDb.Execute "delete from tblHourReport"
'Open the data table
Set rs = CurrentDb.OpenRecordset("tblHours", dbOpenDynaset)
If Not rs.EOF Then rs.MoveFirst
'Loop over each data record and create the report record
prevEmp = 0
Do While Not rs.EOF
If prevEmp <> 0 And prevMachine <> "S" Then
DoCmd.SetWarnings False
DoCmd.RunSQL "insert into tblHourReport values (" _
& prevEmp & ", '" _
& prevDate & "', '" _
& prevMachine & "', " _
& prevShift & ", '" _
& prevTime & "', '" _
& rs!Time & "');"
DoCmd.SetWarnings True
End If
prevDate = rs!Date
prevShift = rs!shift
prevEmp = rs!employee
prevTime = rs!Time
prevMachine = rs!machine
rs.MoveNext
Loop
End Sub
分组查询不适合的原因有哪些?例如:
SELECT Empnbr, Datestamp, Shift, Machnbr,
Min(CDate([datestamp] & " " & [Time])) AS TimeStart,
Max(CDate([datestamp] & " " & [Time])) AS TimeEnd
FROM MachineLog
GROUP BY Empnbr, Datestamp, Shift, Machnbr
编辑再评论
也许:
SELECT m.Empnbr, m.Datestamp, m.Shift, m.Machnbr,
Nz((SELECT Max(CDate([datestamp] & " " & [Time]))
FROM MachineLog x WHERE x.Empnbr=m.Empnbr
AND x.Machnbr<m.Machnbr),CDate([datestamp] & " 08:00")) AS st,
Max(CDate([datestamp] & " " & [Time])) AS TimeEnd
FROM MachineLog m
GROUP BY m.Empnbr, m.Datestamp, m.Shift, m.Machnbr
因为结束时间将具有不同的机器编号。一台机器的开始时间是前一台机器的结束时间。