0

SQL2005データベースにあるテーブルのいくつかのフィールドを更新する必要があります。私は現在vb.net2010(.net 4)を使用していますが、まだこのことを学んでいますので、優しくしてください。私が何かを逃したならば、私に知らせてください、そして、私はそれをできるだけ早く手に入れます。最後に、申し訳ありませんが、これは非常に長いですが、そうでなければ説明を作成するのは難しいでしょう。

含まれている表に示されているフィールドの他に、いくつかありますが、これの全体的なスキームでは重要ではありません。このテーブルは労働追跡に使用されるため、オペレーター/ユーザーはジョブにログインし、EmployeeWorkID(主キー)、EmployeeID(別のテーブルから派生)、LoginDatetime(日時スタンプ)、およびStatusのフィールドにデータが入力されます。入力された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

2回目の実行後のテーブル:

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

2回目の実行では、誤って更新されたレコードが表示されます。Login/LogoutDateTimesとLoggedInフラグが更新されました。vbアプリで行う必要があるのは、各従業員の最初のLoginDateTime = Time&Attendanceクロックインを設定し、最後のLogoutDateTime = T&Aクロックアウトを設定することです。含まれている画像は、必要に応じてLoggedInフィールドとLoggedOutフィールドを設定するアプリの1回目と2回目の実行を示しています。ただし、このアプリは1日の間に数回実行され、新しいレコードが追加されると更新されます。問題:(ええ、私は知っています...最後に)アプリケーションの後続の実行(「2回目の実行後の表:」を参照)は、更新されるべきではない余分なレコードを取得します。たとえば、アプリの2回目の実行時に、EmployeeWorkID = 93466のレコードが取得され、LoginDateTimeがT&に設定されます。クロックイン(EmployeeWorkID = 93464のようになります)で、LoggedInフラグが1に設定されます。SQLクエリとvbコードの両方でこれを行う多くの方法を試しましたが、解決策がありません。これが私がアプリ内で行う主なSQL呼び出しです。見た目は良くないかもしれませんが、効果的です(少なくとも1回の実行では)。

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
4

1 に答える 1

0

私はあなたがやろうとしていることを見ていると思います。その日の最初のチェックインを LoggedIn フィールドで 1 に設定し、その日の最後のチェックアウトを LoggedOut フィールドで 1 に設定するとします。

このクエリは、すべての従業員の毎日の最初のチェックインと最後のチェックアウトをすべて提供します。

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

まあ、正確ではありません。真夜中に従業員がチェックインしていない場合にのみ機能します。それ以外の場合、ログアウト時刻は、指定された日の開始からログアウトした時刻になります。

したがって、VB コードを使用して、この結果のすべての値を 1 に設定し、それ以外のすべての値を 0 に設定できます。

同じデータに対して複数回実行すると、以前と同じ値が設定されます。さらにデータを追加すると、コードが値を 0 に戻す限り、結果はデー​​タを修正します。

パフォーマンスは、過去 N 日間のデータのみを変更する where 句を追加することで対処できます。過去 7 日間、

where LoginDateTime >= DATEADD(day, -7, GETDATE())
于 2013-02-07T22:07:17.157 に答える