Как вставить противоположное значение (предыдущего значения столбца), если в SQL-сервере выполняется условие? - PullRequest
0 голосов
/ 31 января 2019

Я работаю над проектом учета посещаемости магазина с 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? Это действительно хорошо, но яне знаю, как это реализовать.

Спасибо за потраченное время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...