员工时钟表的存储过程
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# 编写),让员工签入和签出。
流程是:当员工要签到时,他们会输入他们的EmpID
和Password
,然后点击Enter。在后端,应用程序将运行一个存储过程,输入EmpID, Password, EmpName
的值(将根据EmpID
从Employee
表中检索)、punchTime
和punchType
(= 1 表示签入,0结帐)。
签出的过程和签入完全一样,员工只需输入他们的EmpID
和Password
,然后点击Enter。
我正在寻找可以执行以下操作的存储过程:
当keyEnter.hit
(来自C#)=> 运行存储过程:
max(EmpID)
有punch = 1
(员工已经签到),则将punch = 0
设置为提供的punchTime
和EmpID
否则,如果max(EmpID)
有punch = 0
(员工已签出),则将punch = 1
设置为punchTime
和EmpID
我一直在搞乱存储过程,但没有得到我想要的结果。感谢您的帮助。
【问题讨论】:
向我们展示您迄今为止所做的尝试。 另外一个 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 创建一个新表并在这种情况下插入一条记录。以上是关于员工时钟表的存储过程的主要内容,如果未能解决你的问题,请参考以下文章