员工时钟表的存储过程

Posted

技术标签:

【中文标题】员工时钟表的存储过程【英文标题】:Stored Procedure for Employee Clock table 【发布时间】:2021-10-09 03:09:21 【问题描述】:

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

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

我将设计一个应用程序(用 C# 编写),让员工签入和签出。

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

签出的过程和签入完全一样,员工只需输入他们的EmpIDPassword,然后点击Enter

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

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

如果max(EmpID)punch = 1(员工已经签到),则将punch = 0 设置为提供的punchTimeEmpID 否则,如果max(EmpID)punch = 0(员工已签出),则将punch = 1 设置为punchTimeEmpID

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

【问题讨论】:

向我们展示您迄今为止所做的尝试。 另外一个 200 个字符的员工 ID 似乎也很有野心。 ;) 您应该向我们展示代码和存储过程。同时向我们展示您想要的结果和您实际看到的结果,否则我们无法帮助您。 这是一大堆文本,但您没有发布您的存储过程代码。您的数据模型也存在问题。您在每笔交易中存储密码。似乎没有办法验证密码是否正确。 【参考方案1】:

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

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

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

【讨论】:

感谢您的建议!我不是故意把密码放在那里的。我的意思是应用程序将在员工上班/下班时验证密码。不在 EmployeeClock 表中存储密码。你能给我一些资源来学习如何记录错误尝试的信息吗? @BDragon 要记录错误的尝试,您可能只需为 LoginAttempt 创建一个新表并在这种情况下插入一条记录。

以上是关于员工时钟表的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

判断员工迟到早退的存储过程

Oracle 存储过程和存储函数 存储函数

MySQL 存储过程,获取使用游标查询的结果集

oracle存储过程(带参数的存储过程)

存储过程 游标

MySQL多表关联查询与存储过程