循环数据集一次

时间:2013-02-07 21:24:47

标签: sql sql-server vb.net

我的任务是更新位于SQL 2005数据库中的表中的几个字段。我目前正在使用vb.net 2010(.net 4),我还在学习这些东西,所以请保持温和。如果我错过了什么让我知道,我会尽快得到它。对不起,这太长了,但我很难创建一个描述。

除了包含的表格中显示的字段外,还有其他一些字段,但在整体方案中并不重要。此表用于人工跟踪,因此操作员/用户登录到作业,并填充以下字段:EmployeeWorkID(主键),EmployeeID(从单独的表派生),LoginDatetime(日期时间戳)和状态。填充db表的真实世界示例:

  

运行应用程序之前的表:

EmplWorkID EmplID  LoginDateTime     LogoutDateTime    Status LoggedIn LoggedOut
93464       376    2013-01-31 15:00  2013-01-31 17:25    C       0        0
93466       376    2013-01-31 17:26  2013-01-31 23:00    C       0        0
93468       376    2013-02-01 15:00  2013-02-01 23:00    C       0        0
93484       380    2013-02-01 07:00  2013-02-01 09:17    C       0        0
93485       380    2013-02-01 09:18  2013-02-01 11:22    C       0        0
93486       380    2013-02-01 11:23  NULL                A       0        0
93479       385    2013-01-31 07:03  2013-01-31 09:32    C       0        0
93481       385    2013-01-31 09:33  NULL                A       0        0
93473       385    2013-02-01 07:05  2013-02-01 09:13    C       0        0
93482       385    2013-02-01 09:14  2013-02-01 11:34    C       0        0
93480       385    2013-02-01 11:35  2013-02-01 13:41    C       0        0
93483       385    2013-02-01 13:42  2013-02-01 15:03    C       0        0
93478       394    2013-01-31 23:03  2013-02-01 00:53    C       0        0
93475       394    2013-02-01 00:54  2013-02-01 03:26    C       0        0
93476       394    2013-02-01 03:27  2013-02-01 05:39    C       0        0
93477       394    2013-02-01 05:44  2013-02-01 07:03    C       0        0
  

首次运行后的表:

EmplWorkID EmplID  LoginDateTime     LogoutDateTime    Status LoggedIn LoggedOut
93464       376    2013-01-31 15:00  2013-01-31 17:25    C       1        0
93466       376    2013-01-31 17:26  2013-01-31 23:00    C       0        1
93468       376    2013-02-01 15:00  2013-02-01 23:00    C       1        1
93484       380    2013-02-01 07:00  2013-02-01 09:17    C       1        0
93485       380    2013-02-01 09:18  2013-02-01 11:22    C       0        0
93486       380    2013-02-01 11:23  2013-02-01 15:00    C       0        1
93479       385    2013-01-31 07:00  2013-01-31 09:32    C       1        0
93481       385    2013-01-31 09:33  2013-01-31 15:00    C       0        1
93473       385    2013-02-01 07:00  2013-02-01 09:13    C       1        0
93482       385    2013-02-01 09:14  2013-02-01 11:34    C       0        0
93480       385    2013-02-01 11:35  2013-02-01 13:41    C       0        0
93483       385    2013-02-01 13:42  2013-02-01 15:00    C       0        1
93478       394    2013-01-31 23:00  2013-02-01 00:53    C       1        0
93475       394    2013-02-01 00:54  2013-02-01 03:26    C       0        0
93476       394    2013-02-01 03:27  2013-02-01 05:39    C       0        0
93477       394    2013-02-01 05:44  2013-02-01 07:00    C       0        1
  

第二次运行后的表:

EmplWorkID EmplID  LoginDateTime     LogoutDateTime    Status LoggedIn LoggedOut
93464       376    2013-01-31 15:00  2013-01-31 17:25    C       1        0
93466       376    2013-01-31 15:00  2013-01-31 23:00    C     **1**      1
93468       376    2013-02-01 15:00  2013-02-01 23:00    C       1        1
93484       380    2013-02-01 07:00  2013-02-01 09:17    C       1        0
93485       380    2013-02-01 07:00  2013-02-01 11:22    C     **1**      0
93486       380    2013-02-01 11:23  2013-02-01 15:00    C       0        1
93479       385    2013-01-31 07:00  2013-01-31 09:32    C       1        0
93481       385    2013-01-31 07:00  2013-01-31 15:00    C     **1**      1
93473       385    2013-02-01 07:00  2013-02-01 09:13    C       1        0
93482       385    2013-02-01 07:00  2013-02-01 11:34    C     **1**      0
93480       385    2013-02-01 11:35  2013-02-01 13:41    C       0        0
93483       385    2013-02-01 13:42  2013-02-01 15:00    C       0        1
93478       394    2013-01-31 23:00  2013-02-01 00:53    C       1        0
93475       394    2013-02-01 00:54  2013-02-01 03:26    C       0        0
93476       394    2013-02-01 03:27  2013-02-01 05:39    C       0        0
93477       394    2013-02-01 05:44  2013-02-01 07:00    C       0        1

第二次运行显示错误更新的记录。 Login / LogoutDateTimes以及LoggedIn标志已更新。 我需要我的vb应用程序做的是设置每个员工的第一个LoginDateTime = Time&出勤时钟输入,并设置他们的最后一个LogoutDateTime = T& A时钟输出。包含的图像显示了我的应用程序的第一次和第二次运行,它在必要时设置了LoggedIn和LoggedOut字段。但是,此应用程序将在白天多次运行,并会在添加新记录时更新。问题:(是的,我知道......最后)应用程序的后续运行(参见“第二次运行后的表:”)获取不应更新的额外记录。例如,在应用程序的第二次运行时,将获取EmployeeWorkID = 93466的记录,并将LoginDateTime设置为T& A时钟(看起来像EmployeeWorkID = 93464),并且LoggedIn标志将设置为1我已经通过SQL查询和vb代码尝试了很多方法,但是没有解决方案。这是我在应用程序中进行的主要SQL调用,它可能看起来不漂亮,但它有效(至少运行一次)。

SELECT     
ew2.EmployeeWorkID
, qryID.Empl
, qryID.LoggedIn
, qryID.LoginDateTime
, ew2.LogoutDateTime
, qryID.RoundedInPunchDate
, qryID.RoundedOutPunchDate
, qryID.ScheduledInDateTime
, qryID.ScheduledOutDateTime
FROM         
(
 SELECT     
 ew.EmployeeID
 , stmE.Empl
 , stmE.STM_Employee_id
 , MIN(ew.LoginDateTime) AS LoginDateTime
 , vIO.RoundedInPunchDate
 , vIO.RoundedOutPunchDate
 , vES.ScheduledInDateTime
 , vES.ScheduledOutDateTime
 , ew.LoggedIn
FROM          
  tblEmployeeWork AS ew INNER JOIN
  tblEmployees AS e ON ew.EmployeeID = e.EmployeeID INNER JOIN
  STROMBERG.StrombergTest.dbo.STM_Employee AS stmE ON e.Empl = stmE.Empl INNER JOIN
  STROMBERG.StrombergTest.dbo.v_BI_Employee_InOutPunches_AutoLogout2 AS vIO ON  
    stmE.STM_Employee_id = vIO.STM_Employee_id 
 AND CONVERT(varchar, ew.LoginDateTime, 101) = CONVERT(varchar, vIO.RoundedInPunchDate, 
   101) INNER JOIN
 STROMBERG.StrombergTest.dbo.v_BI_DailyEmplScheduleAndHoursWorked AS vES ON 
   vIO.STM_Employee_id = vES.STM_Employee_id AND 
 CONVERT(varchar, vIO.RoundedInPunchDate, 101) =   
     CONVERT(varchar,vES.ScheduledInDateTime, 101)
WHERE      
  (ew.LogoutDateTime BETWEEN '1/31/2013' AND DATEADD(d, 2, '1/31/2013')) AND     
  (vIO.RoundedInPunchDate BETWEEN '1/31/2013' AND DATEADD(d, 2, '1/31/2013')) AND 
  (ew.LoginDateTime BETWEEN '1/31/2013' AND DATEADD(d, 2, '1/31/2013'))
GROUP BY DAY(CONVERT(varchar, ISNULL(ew.LoginDateTime, vES.ScheduledInDateTime), 101)), 
  ew.EmployeeID, vIO.RoundedOutPunchDate, stmE.Empl, stmE.STM_Employee_id,  
  vIO.RoundedInPunchDate, vES.ScheduledInDateTime, vES.ScheduledOutDateTime, stmE.Empl, 
  ew.LoggedIn) AS qryID INNER JOIN
tblEmployeeWork AS ew2 ON qryID.EmployeeID = ew2.EmployeeID AND qryID.LoginDateTime = 
   ew2.LoginDateTime
ORDER BY ew2.EmployeeID

1 个答案:

答案 0 :(得分:0)

我想我明白你要做什么了。您希望在LoggedIn字段中将当天的第一次签到设置为1,并在LoggedOut字段中将当天的最后一次签出设置为1.

此查询将为您提供当天的所有首次登记,以及每位员工和每天的最后一次结帐。

select EmplID, min(LoginDateTime), max(LogoutDateTime)
group by EmplID, year(LoginDateTime), month(LoginDateTime), day(LoginDateTime)

嗯,不完全是。只有在午夜没有员工办理登机手续时,它才有效。否则,退出时间将是从指定日期开始退出的时间。

因此,VB代码可用于将此结果中的所有值设置为1,将其他所有值设置为0。

对同一数据进行多次运行将设置与以前相同的值。如果添加了更多数据,结果将修复数据,只要代码将值设置回0。

可以通过添加where子句来处理性能,该子句仅更改过去N天的数据。在过去的7天里,

where LoginDateTime >= DATEADD(day, -7, GETDATE())