员工时钟的存储过程 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#),让员工签入和签出。
流程是:当员工想要签到时,他们将输入他们的 EmpID
和 Password
,然后点击 Enter。在后端,应用程序将 运行 一个存储过程,该过程输入 EmpID, Password, EmpName
的值(将根据 EmpID
从 Employee
table 中检索),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
我一直在存储过程中胡思乱想,但没有得到我想要的结果。感谢您的帮助。
在时钟 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
我有一个 Employee Clock
table 包含这些列:
EmpID nvarchar(200) (FK)
EmpName nvarchar(100)
Password nvarchar(100)
punchTime datetime
punchType bit
我打算设计一个应用程序(使用 C#),让员工签入和签出。
流程是:当员工想要签到时,他们将输入他们的 EmpID
和 Password
,然后点击 Enter。在后端,应用程序将 运行 一个存储过程,该过程输入 EmpID, Password, EmpName
的值(将根据 EmpID
从 Employee
table 中检索),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
我一直在存储过程中胡思乱想,但没有得到我想要的结果。感谢您的帮助。
在时钟 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