员工时钟的存储过程 table

Stored Procedure for Employee Clock table

我有一个 Employee Clock table 包含这些列:

EmpID         nvarchar(200)    (FK)
EmpName       nvarchar(100)
Password      nvarchar(100)
punchTime     datetime
punchType     bit

我打算设计一个应用程序(使用 C#),让员工签入和签出。

流程是:当员工想要签到时,他们将输入他们的 EmpIDPassword,然后点击 Enter。在后端,应用程序将 运行 一个存储过程,该过程输入 EmpID, Password, EmpName 的值(将根据 EmpIDEmployee table 中检索),punchTimepunchType(= 1 表示签入,0 表示签出)。

签出过程与签入完全相同,员工只需输入他们的 EmpIDPassword,然后按 Enter .

我正在寻找可以执行以下操作的存储过程:

keyEnter.hit(来自 C#)=> 运行 存储过程:

我一直在存储过程中胡思乱想,但没有得到我想要的结果。感谢您的帮助。

在时钟 in/out 系统上工作过,我现在可以警告你,它并不像你想象的那么简单。如果用户错过了上班或下班打卡时间,您将不得不手动插入一条新记录,然后在该时间点之后更正所有打卡类型……准备好在开始生产之前编写该存储过程!此外,我将忽略 EmployeeClock table 的奇怪格式 - 为什么要在其中存储密码?无论如何,您的问题是关于存储过程的,所以我们来处理一下。

我假设有一个 Employee table 存储名称和密码。在 EmployeeClock 中创建任何记录之前应验证密码,所以我会这样做。接下来,您应该查看 EmployeeClock 中是否存在该员工的现有记录 - 这可能是他们第一次登录。最后,如果 EmployeeClock 中存在现有记录,请创建一个新记录记录并翻转 punchType 的位。最后,您可能想要 return 一个结果,以便您知道它是否成功。此外,您可能希望在某处记录错误尝试的信息(我不会显示)。把这些放在一起:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE dbo.EmployeeClockInOut
    @EmpID NVARCHAR(200), 
    @Password NVARCHAR(100)
AS
BEGIN   
    SET NOCOUNT ON;
    -- you should make sure that the employee password is 
    -- correct before you do anything... assume you have a 
    -- Employee table that you can look up
    IF EXISTS(SELECT 1 FROM dbo.Employee WHERE EmpId = @EmpID AND [Password] = @Password)
    BEGIN
        -- have they ever clocked in?
        IF EXISTS(SELECT 1 FROM dbo.EmployeeClock WHERE EmpID = @EmpID)
        BEGIN
            -- they have clocked in at least once - flip the punch type
            -- from their last clock in
            INSERT INTO dbo.EmployeeClock(EmpID, EmpName, [Password], punchTime, punchType)
            SELECT TOP(1) @EmpID, e.EmpName, @Password, GETDATE(), 
            CASE WHEN c.punchType = 1 THEN 0 ELSE 1 END
            FROM dbo.Employee AS e 
            INNER JOIN dbo.EmployeeClock AS c ON e.EmpID = c.EmpID 
            WHERE e.EmpID = @EmpID 
            ORDER BY c.punchTime DESC;
        END
        ELSE
        BEGIN
            -- there is no clock in record - create first clock in entry
            INSERT INTO dbo.EmployeeClock(EmpID, EmpName, [Password], punchTime, punchType)
            SELECT @EmpID, EmpName, @Password, GETDATE(), 1 FROM dbo.Employee WHERE EmpID = @EmpID 
        END

        SELECT 'Clock in/out successful' AS [Result];
    END
    ELSE
    BEGIN
        -- log the attempt or alert the user...
        SELECT 'EmpID or Password was invalid' AS [Result];
    END
END
GO