6

「出席管理システム」というプロジェクトをやっています

同社には、従業員の出席をチェックしてデータベーステーブルに保存する独自の生体認証フィンガースキャナーがあります。

テーブルは4つのフィールドで構成されています(ID autonumber, EmployeeNo, CheckTime and CheckType)

計時システムは、すべての従業員のログと出席を保存しますが、チェックタイプが「I」か「O」かを指定しません。下の画像を見るとわかるように、従業員がログインするたびに、システムはそれをデータベースに自動的に保存しますが、「I」として保存され、同じ従業員が再度ログインすると、再び「I」として保存されます。

ここに画像の説明を入力してください

私のクライアントはそれを可能な限り自動化することを望んでいます。彼は、従業員が再度ログインしたら、チェックタイプを「O」に変更したいと考えています。

例えば:

私は従業員です。今日の午前8時にログインすると、データベースに次のように保存されます。

今日の午前8時、チェックタイプは「I」です。すでにログインしていることに気付いていないため、午前8時4分に2回目のログインを繰り返しました。システムは、Iと同じように「I」として再度ログインします。午後5時にログアウトする場合、システムはそれを「I」として記録します。

データベースを自動的に更新したいのですが、ユーザーからのパラメーターなしで。プロセスを自動化するために、ストアドプロシージャに含める必要があります。

同じ従業員内で制限する必要があります。例:

Employee1は今日の午前8時にログインしました。(チェックタイプ "I")Employee1は今日の午前11時に再度ログインしました...(チェックタイプ "O")employee1は今日の午後12時に再度ログインしました。(チェックタイプ "I")employee1は今日の午後4時に再度ログインしました(チェックタイプ「O」)

基準はemployeeno、checktimeのみに制限する必要があります。また、指定されたデータに基づいてchecktypeを更新したいと考えています。

古いシステムでは、ログインしたログインを「O」として保存することはできません。純粋に「I」でした。

これを行う方法?私はあなたの入力が必要で、ひどく助けます!お願いします?

ストアドプロシージャを作成しましたが、どこから開始できるかわかりません。また、プロシージャを終了して機能させることもできません。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE AUTOMATIC_OVERRIDE
    @ID INT,
    @EMPLOYEENO NVARCHAR(20),
    @CHECKTIME DATETIME,
    @CHECKTYPE NVARCHAR(1)

AS
    SET NOCOUNT ON;
    WHILE @ID = (SELECT ID FROM CHECKTIME)

        SELECT ID,EMPLOYEENO,CHECKTIME,CHECKTYPE
          FROM CHECKTIME
         GROUP BY ID,EMPLOYEENO,CHECKTIME,CHECKTYPE
         ORDER BY CHECKTIME
GO

この問題を解決するのを手伝ってください。ありがとう。

4

3 に答える 3

6

編集:

中国への解決策:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE AutomaticOverrideByID
    @ID INT,
    @EMPLOYEENO NVARCHAR(20)

AS

    UPDATE CHECKTIME
    SET CHECKTYPE = CASE WHEN (SELECT
    COUNT(ID) AS CountOfLogin
    FROM CHECKTIME
    WHERE CHECKTIME.EMPLOYEENO = @EMPLOYEENO 
    AND CHECKTIME.CheckTime < C.CheckTime) % 2 = 1 THEN 'O' ELSE CHECKTYPE END
    FROM CHECKTIME C
    WHERE C.ID = @ID

GO

Dhennが尋ねたように、既存のデータセットの更新は次のとおりです。

UPDATE CHECKTIME
SET CHECKTYPE = CASE WHEN (SELECT
COUNT(ID) AS CountOfLogin
FROM CHECKTIME
WHERE CHECKTIME.EMPLOYEENO = C.EMPLOYEENO 
AND CHECKTIME.CheckTime < C.CheckTime) % 2 = 1 THEN 'O' ELSE CHECKTYPE END
FROM CHECKTIME C

SQLフィドルが添付されています。

于 2012-08-28T07:32:03.357 に答える
5

このオプション(SQL Fiddleコード)を試してください。MSSQLServer2000で有効です。

そして、ここに完全に機能するコードがあり、SSMSタブにコピーして貼り付けます。プロシージャを作成するために使用します。

DECLARE @Checktime TABLE([ID] int, [EmployeeNo] NVARCHAR(5), [CheckTime] datetime, [CheckType] NVARCHAR(1));

INSERT INTO @Checktime
    ([ID], [EmployeeNo], [CheckTime], [CheckType])
VALUES
(1, '111-1', '20120826 08:00:00', 'I'),
(2, '222-2', '20120826 08:05:00', 'I'),
(3, '333-3', '20120826 08:07:00', 'I'),
(4, '444-4', '20120826 08:09:00', 'I'),
(5, '555-5', '20120826 08:10:00', 'I'),
(6, '666-6', '20120826 08:12:00', 'I'),
(591, '050-71-1', '20120703 13:06:18', 'O'),
(592, '050-71-1', '20120703 13:06:16', 'O'),
(593, '050-71-1', '20120703 12:54:01', 'O'),
(594, '050-71-1', '20120703 12:53:59', 'O'),
(617, '050-71-1', '20120703 07:53:14', 'O'),
(631, '050-71-1', '20120702 17:36:12', 'O'),
(641, '050-71-1', '20120702 12:13:50', 'O'),
(642, '050-71-1', '20120702 12:13:49', 'O'),
(646, '050-71-1', '20120702 12:00:33', 'O'),
(647, '050-71-1', '20120702 12:00:31', 'O'),
(678, '050-71-1', '20120702 08:07:50', 'O'),
(679, '050-71-1', '20120828 18:07:48', 'O');

DECLARE @Employee NVARCHAR(5)='050-71-1'

INSERT INTO @Checktime ([ID], [EmployeeNo], [CheckTime], [CheckType])
SELECT TOP 1 680 'NewId', EmployeeNo, GETDATE(),
       'NewCheck' = CASE 
           WHEN DATEDIFF(dd, CheckTime, GETDATE())>0 THEN 'I'
           WHEN CheckType = 'I' THEN 'O'
           ELSE 'O'
       END
  FROM @Checktime
 WHERE EmployeeNo = @Employee
 ORDER BY CheckTime DES

SELECT * FROM @Checktime

結果:

ID  EmployeeNo          CheckTime          CheckType
1     111-1     2012-08-26 08:00:00.000       I
2     222-2     2012-08-26 08:05:00.000       I
3     333-3     2012-08-26 08:07:00.000       I
4     444-4     2012-08-26 08:09:00.000       I
5     555-5     2012-08-26 08:10:00.000       I
6     666-6     2012-08-26 08:12:00.000       I
7     222-2     2012-08-28 09:37:41.917       O
于 2012-08-28T07:43:31.890 に答える
4

&の代わりにCheckINCheckOutcolumnsを使用する方が良いと思います。CheckTimeCheckType

  • 彼がすでにログインしている場合は、時刻を更新しcheckOutます。

  • 彼がログインしなかった場合は、CheckINCheckOut時間を節約してください。この場合は同じ時間になります。

これより簡単にすることはできません。

于 2012-09-05T05:42:49.957 に答える