Таблица SQL усекается при использовании триггера для соединения. Требовать обходной путь - PullRequest
0 голосов
/ 04 января 2019

У меня есть две таблицы. Один содержит список сотрудников и их информацию

EmployeeID  | Name  |  Start Date |HoursCF | HoursTaken
------------+-------+-------------+--------+------------
1           | Conor | 15/10/2018  | 0      |0
2           | Joe   | 01/05/2018  | 0      |0
3           | Tom   | 01/01/2019  | 0      |0

Другой содержит запрос на отпуск, введенный сотрудниками

EmployeeID  | HoursTaken     |  
------------+----------------+
1           | 8              |     
2           | 16             |     
3           | 8              | 
2           | 8              |
1           | 16             |

Я хочу, чтобы при создании, удалении или обновлении нового запроса на праздничные дни в моей таблице запросов на праздничные дни он обновлялся на моей таблице сотрудников, например

EmployeeID  | Name  |  Start Date |HoursCF | HoursTaken
 -----------+-------+-------------+--------+------------
 1          | Conor | 15/10/2018  | 0      |24
 2          | Joe   | 01/05/2018  | 0      |24
 3          | Tom   |01/01/2019   | 0      |8 

Я пытался создать представление

CREATE VIEW vw_HoursTakenPerEmployee AS
SELECT e.[EmployeeID], 
       COALESCE(SUM(hr.[HoursTaken]), 0) AS HoursTaken
FROM [dbo].[Employees] e LEFT JOIN
     [dbo].[HolidayRequests] hr
      ON e.[EmployeeID] = hr.[EmployeeID]
GROUP BY e.[EmployeeID];

Затем с помощью триггера вставьте новые данные, введенные в таблицу запроса на отпуск, в таблицу сотрудников

ALTER trigger Inserttrigger on [dbo].[HolidayRequestForm]
after INSERT, UPDATE, DELETE 
as
begin
TRUNCATE TABLE [dbo].[HoursTakenPerEmployee]
INSERT INTO [dbo].[HoursTakenPerEmployee] ([EmployeeID],[HoursTaken])
SELECT * FROM vw_HoursTakenPerEmployee;
end

Я знаю, что проблема в том, что оператор усечения работает нормально, если у всех сотрудников уже есть запись в таблице запросов на праздничные дни. Если они этого не делают, они усекаются из таблицы сотрудников в любое время, когда делается новый праздничный запрос, который не принадлежит им.

Есть мысли?

1 Ответ

0 голосов
/ 04 января 2019

Вы уже сделали всю работу:

CREATE VIEW vw_HoursTakenPerEmployee AS
SELECT e.*, 
       COALESCE(SUM(hr.[HoursTaken]), 0) AS HoursTaken
FROM [dbo].[Employees] e LEFT JOIN
     [dbo].[HolidayRequests] hr
      ON e.[EmployeeID] = hr.[EmployeeID]
GROUP BY e.[EmployeeID];

Удалить столбец часов, взятых из таблицы EmployeeTable. В любое время, когда вы хотите узнать, сколько часов занял работник в отпуске, запросите представление. Запрос на просмотр будет повторяться при каждом запросе на просмотр, поэтому он будет обновлен

Помните, что ваша система будет работать только год. Я рекомендую вам добавить индикатор года в таблицу HolidayRequests, чтобы вы могли предоставлять сотрудникам новые надбавки за каждый новый финансовый / праздничный год, в котором они работают в компании.

Кроме того, если сотрудник начинает работать неполный год, вы можете рассчитать, сколько часов он имеет право:

CREATE VIEW vw_HoursTakenPerEmployee AS
SELECT 
    e.*,
    hr.*, 
    DATEDIFF(HOUR, e.HolEntitleFrom, e.HolEntitleTo) / e.HolidayEntitlementHours as HoursEarnedSoFar, 
    COALESCE(hr.HoursTaken), 0) AS HoursTaken
FROM 
    (
        SELECT *,
            --change "Start Date" column name so it doesn't have a space in it!
            CASE WHEN [Start Date] < d.HolidayYearStart THEN d.HolidayYearStart ELSE [Start Date] END as HolEntitleFrom,
            CASE WHEN TerminationDate IS NULL THEN GetDate() ELSE TerminationDate as HolEntitleTo,
        FROM
            [dbo].[Employees]
            --useful constants can go here, like when holiday year starts from
            CROSS JOIN 
            (SELECT DATEFROMPARTS(YEAR(GETDATE()), 1, 1) as HolidayYearStart) d
    ) e
    LEFT JOIN
    (
        SELECT employeeid, HolidayYear, SUM(HoursTaken) AS HoursTaken
        FROM [dbo].[HolidayRequests] 
        GROUP BY EmployeeID, holidayyear
    ) hr
    ON hr.EmployeeID = e.EmployeeID AND
       hr.holidayYear = YEAR(e.HolEntitleFrom) --this year's holiday requests
        ;

в качестве примера ..

  • Поместите столбец HolidayYear в HolidayRequests, чтобы отслеживать, в каком праздничном году был сделан запрос. INT, данные, например, 2018, 2019 ..
  • Поместите HolidayEntitlementHours в Employee, чтобы отслеживать, сколько праздничных часов получает emp в этом году (в большинстве мест есть система, в которой количество отпусков увеличивается за каждый полный год службы, поэтому из года в год). Тип с плавающей запятой / десятичный тип. Или сделать его чем-то, что представление вычисляет из базового надбавки плюс расчет времени в обслуживании
  • Поставьте столбец для даты окончания действия emp, чтобы вы могли получить информацию о том, перерасходовали ли они на свои выходные (если ваше место позволяет занять больше часов, чем было заработано до сих пор). Представьте себе, что в январе Ян прошел 20 дней, а затем заработал год, чтобы заработать. Они вручают уведомление за 1 месяц 1 июня. Установка даты прекращения в 1 июля (примерно через 6 месяцев после начала предоставления права на отпуск) покажет, что они максимально заработали 10 к моменту своего отъезда, поэтому им необходимо вернуть 10
...