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