DROP PROCEDURE IF EXISTS uspOrarendekTorlese GO CREATE PROCEDURE uspOrarendekTorlese @pTanevId int ,@pUserId int ,@pIntervallumKezdete datetime ,@pIntervallumVege datetime ,@pNezetTipus int ,@pFeladatellatasiHelyJson nvarchar(max) = NULL ,@pOsztalyJson nvarchar(max) = NULL ,@pCsoportJson nvarchar(max) = NULL AS BEGIN SET NOCOUNT ON CREATE TABLE #OrarendiOrak (Id int, ErvenyessegKezdete datetime, ErvenyessegVege datetime, Oraszam int) INSERT INTO #OrarendiOrak EXEC uspGetOrarendiOrakForOrarendekTorlese @pTanevId, @pIntervallumKezdete, @pIntervallumVege, @pNezetTipus, @pFeladatellatasiHelyJson, @pOsztalyJson, @pCsoportJson -- Jelmagyarázat: -- D1: Intervallum kezdete -- D2: Intervallum vége -- ÉK: Órarend érvényességének kezdete -- ÉV: Órarend érvényességének vége UPDATE oo SET oo.C_ORAERVENYESSEGKEZDETE = CASE -- Ha ÉK < D1 <= ÉV <= D2, akkor az ÉV-t kell D1-re módosítani WHEN updateOrak.ErvenyessegKezdete < @pIntervallumKezdete AND @pIntervallumKezdete <= updateOrak.ErvenyessegVege AND updateOrak.ErvenyessegVege <= @pIntervallumVege THEN updateOrak.ErvenyessegKezdete -- Ha D1 <= ÉK <= D2 < ÉV, akkor az ÉK-t kell D2+1 napra módosítani WHEN @pIntervallumKezdete <= updateOrak.ErvenyessegKezdete AND updateOrak.ErvenyessegKezdete <= @pIntervallumVege AND @pIntervallumVege < updateOrak.ErvenyessegVege THEN DATEADD(day, 1, @pIntervallumVege) -- Ha ÉK < D1 <= D2 < ÉV, akkor az ÉV-t kell D1-ra módosítani WHEN updateOrak.ErvenyessegKezdete < @pIntervallumKezdete AND @pIntervallumVege < updateOrak.ErvenyessegVege THEN updateOrak.ErvenyessegKezdete ELSE oo.C_ORAERVENYESSEGKEZDETE END ,oo.C_ORAERVENYESSEGVEGE = CASE -- Ha ÉK < D1 <= ÉV <= D2, akkor az ÉV-t kell D1-re módosítani WHEN updateOrak.ErvenyessegKezdete < @pIntervallumKezdete AND @pIntervallumKezdete <= updateOrak.ErvenyessegVege AND updateOrak.ErvenyessegVege <= @pIntervallumVege THEN @pIntervallumKezdete -- Ha D1 <= ÉK <= D2 < ÉV, akkor az ÉK-t kell D2+1 napra módosítani WHEN @pIntervallumKezdete <= updateOrak.ErvenyessegKezdete AND updateOrak.ErvenyessegKezdete <= @pIntervallumVege AND @pIntervallumVege <= updateOrak.ErvenyessegVege THEN updateOrak.ErvenyessegVege -- Ha ÉK < D1 <= D2 < ÉV, akkor az ÉV-t kell D1-ra módosítani WHEN updateOrak.ErvenyessegKezdete < @pIntervallumKezdete AND @pIntervallumVege < updateOrak.ErvenyessegVege THEN @pIntervallumKezdete ELSE oo.C_ORAERVENYESSEGVEGE END -- Ha az óra érvényessége teljesen a D1 és D2 között van (D1 <= ÉK <= ÉV <= D2), akkor a teljes elemet törölni kell -- vagy ha D1 <= ÉK <= D2 < ÉV és ÉV = D2+1 nappal ,oo.TOROLT = IIF((@pIntervallumKezdete <= updateOrak.ErvenyessegKezdete AND updateOrak.ErvenyessegVege <= @pIntervallumVege) OR (@pIntervallumKezdete <= updateOrak.ErvenyessegKezdete AND updateOrak.ErvenyessegKezdete <= @pIntervallumVege AND @pIntervallumVege < updateOrak.ErvenyessegVege AND updateOrak.ErvenyessegVege = DATEADD(day, 1, @pIntervallumVege)), 'T', oo.TOROLT) ,oo.LASTCHANGED = GETDATE() ,oo.MODIFIER = @pUserId FROM T_ORARENDIORA_OSSZES oo INNER JOIN #OrarendiOrak updateOrak ON updateOrak.Id = oo.ID DECLARE @insertId int, @insertErvenyessegKezdete datetime, @insertErvenyessegVege datetime, @insertOraszam int -- Kell egy új órarendi elem is azonos GROUPID-val D2+1 naptól ÉV-ig DECLARE insertCursor CURSOR FOR SELECT Id ,DATEADD(day, 1, @pIntervallumVege) ,ErvenyessegVege ,Oraszam FROM #OrarendiOrak WHERE ErvenyessegKezdete < @pIntervallumKezdete AND @pIntervallumVege < ErvenyessegVege OPEN insertCursor FETCH NEXT FROM insertCursor INTO @insertId, @insertErvenyessegKezdete, @insertErvenyessegVege, @insertOraszam WHILE @@FETCH_STATUS = 0 BEGIN EXEC uspCopyOrarendiElem @insertId, NULL, @insertOraszam, @insertErvenyessegKezdete, @insertErvenyessegVege, 0 FETCH NEXT FROM insertCursor INTO @insertId, @insertErvenyessegKezdete, @insertErvenyessegVege, @insertOraszam END CLOSE insertCursor DEALLOCATE insertCursor DECLARE @intezmenyId int = (SELECT TOP 1 C_INTEZMENYID FROM T_TANEV_OSSZES WHERE TOROLT = 'F' AND ID = @pTanevId) EXEC uspGenerateOrarend @intezmenyId, @pTanevId END GO