SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO DROP PROCEDURE IF EXISTS [dbo].[uspUpdateTanoraEvesSorszam] GO CREATE PROCEDURE [dbo].[uspUpdateTanoraEvesSorszam] @pIntezmenyId int ,@pTanevId int ,@pTantargyId int = null ,@pOsztalyCsoportId int = null ,@pTanitasiOraId int = null AS SET NOCOUNT ON; DECLARE @tanarSzamit bit ,@osztalybontasEgybe bit; DECLARE @UpdateLista TABLE(Id int NOT NULL, EvesSorszam INT NULL); CREATE TABLE #OraLista (Id INT NOT NULL, EvesSorszam INT NULL); SET @tanarSzamit = dbo.fnGetRendszerbeallitasEnumBool(3075, @pIntezmenyId, @pTanevId); SET @osztalybontasEgybe = dbo.fnGetRendszerbeallitasEnumBool(3078, @pIntezmenyId, @pTanevId); -- a ha a tanóra törölt, nem megtartott vagy nem sorszámozandó, akkor hozzáadjuk a listához IF @pTanitasiOraId > 0 INSERT INTO @UpdateLista(Id, EvesSorszam) SELECT ID, NULL FROM T_TANITASIORA_OSSZES t WHERE t.C_INTEZMENYID = @pIntezmenyId AND t.C_TANEVID = @pTanevId AND t.ID = @pTanitasiOraId AND (t.TOROLT = 'T' OR t.C_MEGTARTOTT = 'F' OR t.C_SORSZAMOZANDO = 'F'); -- IDEIGLENESEN, amíg BE oldalról meg nem kapjuk a @pTanitasiOraId-t IF @pTanitasiOraId IS NULL INSERT INTO #OraLista(ID, EvesSorszam) SELECT t.ID, NULL FROM T_TANITASIORA_OSSZES t WHERE t.C_INTEZMENYID = @pIntezmenyId AND t.C_TANEVID = @pTanevId AND (t.TOROLT = 'T' OR t.C_MEGTARTOTT = 'F' OR t.C_SORSZAMOZANDO = 'F'); -- sorszámozás halmaz alá tartozó órák INSERT INTO #OraLista(ID, EvesSorszam) SELECT t.ID AS Id ,ROW_NUMBER() OVER ( PARTITION BY ossz.C_ORASORSZAMOZASHALMAZID, CASE WHEN ossz.C_KOZOSORASORSZAMOZASELTEROTAN = 'T' THEN t.C_TANARID ELSE 0 END ORDER BY t.C_ORAKEZDETE, t.C_OSZTALYCSOPORTID, t.ID ) + ossz.KEZDOERTEK AS EvesSorszam FROM ( SELECT h.C_INTEZMENYID, h.C_TANEVID, h.ID AS C_ORASORSZAMOZASHALMAZID, h.C_KOZOSORASORSZAMOZASELTEROTAN, ISNULL(h.C_KEZDOERTEK - 1, 0) AS KEZDOERTEK, oh.C_TANTARGYID, oh.C_OSZTALYCSOPORTID FROM T_ORASORSZAMOZASHALMAZ_OSSZES h INNER JOIN T_ORASORSZAMOZASHALMAZOSSZEREN_OSSZES oh ON h.ID = oh.C_ORASORSZAMOZASHALMAZID WHERE h.C_INTEZMENYID = @pIntezmenyId AND h.C_TANEVID = @pTanevId AND h.TOROLT = 'F' AND oh.TOROLT = 'F' ) ossz INNER JOIN T_TANITASIORA_OSSZES t ON t.C_TANTARGYID = ossz.C_TANTARGYID AND t.C_OSZTALYCSOPORTID = ossz.C_OSZTALYCSOPORTID AND t.C_INTEZMENYID = ossz.C_INTEZMENYID AND t.C_TANEVID = ossz.C_TANEVID WHERE 0 = 0 AND t.C_MEGTARTOTT = 'T' AND t.C_SORSZAMOZANDO = 'T' AND t.TOROLT = 'F'; -- nem sorszámozási halmaz alá tartozó órák IF @osztalybontasEgybe = 0 BEGIN -- osztályok és csoportok külön sorszámozottak INSERT INTO #OraLista(Id, EvesSorszam) SELECT t.ID AS Id ,ROW_NUMBER() OVER ( PARTITION BY t.C_TANTARGYID, t.C_OSZTALYCSOPORTID, CASE WHEN @tanarSzamit = 1 THEN t.C_TANARID ELSE 0 END ORDER BY t.C_ORAKEZDETE, t.ID ) AS EvesSorszam FROM T_TANITASIORA_OSSZES t WHERE t.C_INTEZMENYID = @pIntezmenyId AND t.C_TANEVID = @pTanevId AND t.C_MEGTARTOTT = 'T' AND t.C_SORSZAMOZANDO = 'T' AND t.TOROLT = 'F' AND NOT EXISTS(SELECT * FROM T_ORASORSZAMOZASHALMAZOSSZEREN_OSSZES ossz WHERE ossz.C_TANTARGYID = t.C_TANTARGYID AND ossz.C_OSZTALYCSOPORTID = t.C_OSZTALYCSOPORTID AND ossz.TOROLT = 'F'); END ELSE BEGIN -- osztályok és kapcsolódó csoportok együtt sorszámozottak INSERT INTO #OraLista(Id, EvesSorszam) SELECT t.ID AS Id ,ROW_NUMBER() OVER ( PARTITION BY t.C_TANTARGYID, ISNULL(ocs.C_OSZTALYBONTASID, t.C_OSZTALYCSOPORTID), CASE WHEN @tanarSzamit = 1 THEN t.C_TANARID ELSE 0 END ORDER BY t.C_ORAKEZDETE, t.ID ) AS EvesSorszam FROM T_TANITASIORA_OSSZES t LEFT JOIN ( SELECT cs.ID, cs.C_OSZTALYBONTASID FROM T_CSOPORT_OSSZES cs WHERE cs.C_ALINTEZMENYID = @pIntezmenyId AND cs.C_ALTANEVID = @pTanevId AND cs.TOROLT = 'F' AND cs.C_OSZTALYBONTASID IS NOT NULL ) ocs ON ocs.ID = t.C_OSZTALYCSOPORTID WHERE t.C_INTEZMENYID = @pIntezmenyId AND t.C_TANEVID = @pTanevId AND t.C_SORSZAMOZANDO = 'T' AND t.C_MEGTARTOTT = 'T' AND t.TOROLT = 'F' AND NOT EXISTS(SELECT * FROM T_ORASORSZAMOZASHALMAZOSSZEREN ossz WHERE ossz.C_TANTARGYID = t.C_TANTARGYID AND ossz.C_OSZTALYCSOPORTID = t.C_OSZTALYCSOPORTID AND ossz.TOROLT = 'F'); END; INSERT INTO @UpdateLista(Id, EvesSorszam) SELECT ol.Id, ol.EvesSorszam FROM #OraLista ol INNER JOIN T_TANITASIORA_OSSZES t ON t.ID = ol.Id WHERE ISNULL(ol.EvesSorszam, 0) <> ISNULL(t.C_ORAEVESSORSZAMA, 0); --select * from @UpdateLista order by Id; --return; -- éves sorszámok frissítése UPDATE t SET t.C_ORAEVESSORSZAMA = l.EvesSorszam FROM @UpdateLista l INNER JOIN T_TANITASIORA t WITH (ROWLOCK) on t.ID = l.Id OPTION (FORCE ORDER); GO