Я работаю над проектом учета посещаемости магазина с 11 сотрудниками.Сотрудники будут приходить и уходить в заранее установленное время.У меня проблема со сменами.Я хочу найти способ для системы выяснить, была ли последняя записанная строка в утренней смене, следующая строка должна быть в вечерней смене и наоборот.
Структура моей программы такова: IВ моей программе есть кнопка, чтобы сотрудники определяли утреннюю или вечернюю смену с помощью логической переменной.У меня есть текстовое поле, которое, когда employeeId / memberId вводится в него и нажимается ввод, будет обрабатывать право этого memberId с помощью хранимой процедуры с этой логикой: memberIds, которые 1. имеют clockedIn, но не ClockedOut (союз с)2.члены, которые обычно находятся в наших tbl_attendanceMembers, но не вошли в лист посещаемости, имеют право быть введенными в текстовое поле.Сохраните эти два в средней таблице с именем tbl_availableMembers.
CREATE PROCEDURE duplicateCheck3
@inputdate date
AS
BEGIN
DELETE FROM tbl_availableMembers
Insert into tbl_availableMembers SELECT memberId
FROM tbl_attendancemembers
WHERE memberId NOT IN
(SELECT memberId
FROM tbl_attendanceSheet
WHERE DATE = @InputDate)
UNION
SELECT memberId from tbl_attendancesheet
WHERE [date] = @InputDate
AND [clockin] IS NOT NULL
AND [clockout] IS NULL
END
Затем в C # я буду читать значения tbl_availableMembers каждый раз, когда memberId вводит текстовое поле следующим образом:
bool member_available = false;
SqlCommand sqlcmdread_availablemembers = new SqlCommand("select * from tbl_availablemembers", sqlcon);
SqlDataReader sqldr_availablemembers = sqlcmdread_availablemembers.ExecuteReader();
while (sqldr_availablemembers.Read())
{
if (sqldr_availablemembers[1].ToString() == textBoxX1.Text)
{
member_available = true;
break;
}
}
И есливведенный идентификатор в текстовом поле равен тем, которые читаются, он проходит через хранимую процедуру следующим образом:
CREATE PROCEDURE InputClockStacks
@QmemberId nvarchar(20),
@InputName nvarchar(20),
@DateString nvarchar(100),
@InputDate date,
@InputShift Bit,
@InputTime time(7),
@EnterDist nvarchar(50),
@EnterDelay time(7),
@ExitDist nvarchar(50),
@ExitDelay time(7)
AS
UPDATE [dbo].[tbl_attendanceSheet]
SET [clockout] = @InputTime, [exitdelay]=@ExitDelay, ExitDist=@ExitDist
WHERE MemberId = @QmemberId
AND [date] = @InputDate
AND [clockin] IS NOT NULL
AND [clockout] IS NULL
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO tbl_attendanceSheet(MemberId,name,datestring,date,morning_shift,clockIn,EnterDist,EnterDelay)
VALUES (@QmemberId, @InputName,@DateString, @InputDate, @InputShift, @InputTime,@EnterDist,@EnterDelay)
END
В принципе, он имеет следующую логику: если столбец ClockOut равен нулю, а столбец clockInне является нулевым, это означает, что сотрудник должен покинуть только свое рабочее место, поэтому система должна вставить время в столбец ClockOut.В противном случае это означает, что сотрудник даже не пришел на работу, поэтому ему следует вставить новую строку с clockIn и ClockOut.
В логике tbl_availableMembers есть проблема.Проблема в том, что если участник имеет clockedIn и вышел в утреннюю смену, хранимая процедура duplicateCheck3
не позволит ему / ей перейти в clockIn в вечернюю смену.
Я хочу реализовать логику, подобную этой:
SELECT * FROM tbl_attendanceSheet
WHERE date = @inputDate // to get all users who have clocked in and(or) out
in the given date or current date.
IF morning_shif is true, only allow him/ her to ClockIn in the evening shift
или эта логика: разрешить каждому сотруднику занимать только две строки в таблице посещаемости.один для включения и выключения в утреннюю смену и один для включения и выключения в вечернюю смену.
или эта логика: найдите способ для системы выяснить, была ли последняя записанная строка утромshift, следующая строка должна быть в вечернюю смену и наоборот.
Наконец, я хочу поблагодарить вас всех за ваши напоминания о SQL-инъекции, я исправлю это позже.и спасибо за ваше время
Мои столы:
CREATE TABLE [dbo].[tbl_attendanceSheet] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[MemberId] INT NULL,
[name] NVARCHAR (20) NULL,
[date] DATE NULL,
[datestring] NVARCHAR (100) NULL,
[morning_shift] BIT NOT NULL,
[clockin] TIME (7) NULL,
[clockout] TIME (7) NULL,
[HouresWorked] AS (CONVERT([time],dateadd(millisecond,datediff(second,[clockin],[clockout])*(1000),(0)))),
[EnterDist] NVARCHAR (50) NULL,
[EnterDelay] TIME (7) NULL,
[ExitDist] NVARCHAR (50) NULL,
[ExitDelay] TIME (7) NULL,
[desc] NVARCHAR (150) NULL,
PRIMARY KEY CLUSTERED ([Id] ASC),
FOREIGN KEY ([MemberId]) REFERENCES [dbo].[tbl_attendanceMembers] ([memberId])
);
и
CREATE TABLE [dbo].[tbl_attendanceMembers] (
[memberId] INT IDENTITY (101000, 10) NOT NULL,
[name] NVARCHAR (20) NULL,
[branchId] INT NULL,
[isOpener] BIT NULL,
[cellularphone] NVARCHAR (20) NULL,
[exp] NVARCHAR (100) NULL,
[address] NVARCHAR (100) NULL,
CONSTRAINT [PK_tbl_attendanceMembers] PRIMARY KEY CLUSTERED ([memberId] ASC)
);
и
CREATE TABLE [dbo].[tbl_availableMembers] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[memberId] INT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
То, что я искал, сам:
Измените значение в столбце с 2 значениями на его противоположное, только если условие в другом столбце выполнено Оно отличается, но имеетпохожая идея Но я не могу понять ответ, который он пометил как решение.
Есть ли элегантный способ инвертировать битовое значение в операторе вставки SQL? Это действительно хорошо, но яне знаю, как это реализовать.
Спасибо за потраченное время.