IF OBJECT_ID('dbo.fnGetTanorak') IS NOT NULL BEGIN DROP FUNCTION dbo.fnGetTanorak END GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- A Funkció visszaadja egy pedagógus, egy osztály vagy csoport, egy tantárgy vagy egy terem minden -- naplózatlan, naplózott, megtartott és nem-megtartott, helyettesített, vagy akármilyen óráját -- egy megadott időszakra CREATE FUNCTION dbo.fnGetTanorak ( @tanevId INT, -- Kötelezően átadandó @kezdoDatum DATETIME = NULL, -- NULL esetén az adott tanév első napjától vizsgálja @vegDatum DATETIME = NULL, -- NULL esetén az adott tanév utolsó napjáig vizsgálja @tanarId INT = NULL, -- NULL esetén minden pedagógus órái lejönnek @tantargyId INT = NULL, -- NULL esetén minden pedagógus órái lejönnek @teremId INT = NULL, -- NULL esetén minden pedagógus órái lejönnek @osztalycsoportId INT = NULL, -- NULL esetén minden osztály vagy csoport órái lejönnek @isKapcsolodoCsoportok BIT = 0 -- 1 esetén az osztály vagy csoport kapcsolódó osztályait is csoportojait is lehozza, -- csak akkor értelmezhető, ha van @osztalycsoportId is. ) RETURNS @retTable TABLE ( OraDatuma DATETIME, OraKezdete DATETIME, OraVege DATETIME, HetNapjaId INT, CsengetesiRendId INT, CsengetesiRendOraId INT, Oraszam INT, OraTulajdonosId INT, TanarId INT, HelyettesitoId INT, OsztalyCsoportId INT, TantargyId INT, TeremId INT, IsHelyettesitett BIT, IsNaplozott BIT, IsMobilNaplozott BIT, IsElmaradt BIT, IsOrarendNelkul BIT, OrarendiOraId INT, TanitasiOraId INT ) BEGIN -- ------------------------------------------------------------------------------------------------------------------ -- Segédtáblák definiálása -- ------------------------------------------------------------------------------------------------------------------ DECLARE @Naptar TABLE (Datum DATETIME, HetirendId INT, HetnapjaId INT, CsengetesiRendId INT, IsTanitasiNap BIT, IsOrarendiNap BIT) DECLARE @OsztalyCsoportNaptar TABLE (Datum DATETIME, HetirendId INT, HetnapjaId INT, CsengetesiRendId INT, IsTanitasiNap BIT, IsOrarendiNap BIT, OsztalycsoportId INT) DECLARE @KapcsolodoOsztalyCsoportok TABLE (OsztalyCsoportId INT) -- ------------------------------------------------------------------------------------------------------------------ -- Minden hét hetirend ID-jának beállítása -- ------------------------------------------------------------------------------------------------------------------ DECLARE @MindenHetHetirend INT = 1554 -- ------------------------------------------------------------------------------------------------------------------ -- Aktív csengetési rend megkeresése -- ------------------------------------------------------------------------------------------------------------------ DECLARE @AktivCsengetesiRendId INT SELECT TOP 1 @AktivCsengetesiRendId = ID FROM T_CSENGETESIREND_OSSZES WHERE C_TANEVID = @tanevId AND TOROLT = 'F' AND C_AKTIV = 'T' -- ------------------------------------------------------------------------------------------------------------------ -- Kezdődátum megkeresése, ha NULL -- ------------------------------------------------------------------------------------------------------------------ IF (@kezdoDatum IS NULL) BEGIN SELECT @kezdoDatum = C_KEZDONAP FROM T_TANEV_OSSZES WHERE TOROLT = 'F' AND ID = @tanevId END -- ------------------------------------------------------------------------------------------------------------------ -- Végdátum megkeresése, ha NULL -- ------------------------------------------------------------------------------------------------------------------ IF (@vegDatum IS NULL) BEGIN SELECT @vegDatum = C_UTOLSONAP FROM T_TANEV_OSSZES WHERE TOROLT = 'F' AND ID = @tanevId END -- ------------------------------------------------------------------------------------------------------------------ -- Kapcsolódó osztályok és csoportok megkeresése, ha szükséges -- ------------------------------------------------------------------------------------------------------------------ IF (@osztalycsoportId IS NOT NULL) BEGIN IF (@isKapcsolodoCsoportok = 1) BEGIN INSERT INTO @KapcsolodoOsztalyCsoportok (OsztalyCsoportId) SELECT ID FROM dbo.fnGetKapcsolodoOsztalycsoportokByDate(@osztalycsoportId,@kezdoDatum,@vegDatum) END IF (@isKapcsolodoCsoportok = 0) BEGIN INSERT INTO @KapcsolodoOsztalyCsoportok (OsztalyCsoportId) VALUES (@osztalycsoportId) END END -- ------------------------------------------------------------------------------------------------------------------ -- Az alapértelmezett naptári napok betétele a segédtáblába -- ------------------------------------------------------------------------------------------------------------------ INSERT INTO @Naptar (Datum, HetirendId, HetNapjaId, CsengetesiRendId, IsTanitasiNap, IsOrarendiNap) SELECT nn.C_NAPDATUMA, ISNULL(ISNULL(tr.C_HETIREND,nn.C_HETIREND),@MindenHetHetirend), ISNULL(tr.C_HETNAPJA,nn.C_HETNAPJA), ISNULL(tr.C_CSENGETESIRENDID,@AktivCsengetesiRendId), IIF(ISNULL(tr.C_NAPTIPUSA,nn.C_NAPTIPUSA) IN (1386,1387,1389,1391,1392,1396,1397,1398,1399,1401),0,1), IIF(ISNULL(tr.C_ORARENDINAP,nn.C_ORARENDINAP) = 'T',1,0) FROM T_NAPTARINAP_OSSZES nn LEFT JOIN T_TANEVRENDJE_OSSZES tr ON tr.C_DATUM = nn.C_NAPDATUMA AND tr.C_OSSZESCSOPORTRAVONATKOZIK = 'T' AND tr.C_TANEVID = nn.C_TANEVID AND tr.TOROLT = 'F' WHERE nn.C_NAPDATUMA >= @kezdoDatum AND nn.C_NAPDATUMA <= @vegDatum AND nn.C_TANEVID = @tanevId AND nn.TOROLT = 'F' -- ------------------------------------------------------------------------------------------------------------------ -- Az OsztályCsoport-ok esetén érvényes naptári napok betétele a segédtáblába -- ------------------------------------------------------------------------------------------------------------------ INSERT INTO @OsztalyCsoportNaptar (Datum, HetirendId, HetNapjaId, CsengetesiRendId, IsTanitasiNap, IsOrarendiNap, OsztalycsoportId) SELECT nn.C_NAPDATUMA, ISNULL(ISNULL(tr.C_HETIREND,nn.C_HETIREND),@MindenHetHetirend), ISNULL(tr.C_HETNAPJA,nn.C_HETNAPJA), ISNULL(tr.C_CSENGETESIRENDID,@AktivCsengetesiRendId), IIF(ISNULL(tr.C_NAPTIPUSA,nn.C_NAPTIPUSA) IN (1386,1387,1389,1391,1392,1396,1397,1398,1399,1401),0,1), IIF(ISNULL(tr.C_ORARENDINAP,nn.C_ORARENDINAP) = 'T',1,0), ocstr.C_OSZTALYCSOPORTID FROM T_NAPTARINAP_OSSZES nn INNER JOIN T_TANEVRENDJE_OSSZES tr ON tr.C_DATUM = nn.C_NAPDATUMA AND tr.C_OSSZESCSOPORTRAVONATKOZIK = 'F' AND tr.C_TANEVID = nn.C_TANEVID AND tr.TOROLT = 'F' INNER JOIN T_OSZTALYCSOPORT_TANEVRENDJE ocstr ON ocstr.C_TANEVRENDJEID = tr.ID WHERE nn.C_NAPDATUMA >= @kezdoDatum AND nn.C_NAPDATUMA <= @vegDatum AND nn.C_TANEVID = @tanevId AND nn.TOROLT = 'F' -- ------------------------------------------------------------------------------------------------------------------ -- Alapértelmezett órarend összeállítása, az egyedi OsztályCsoportok naptára nélkül -- ------------------------------------------------------------------------------------------------------------------ INSERT INTO @retTable ( OraDatuma, OraKezdete, OraVege, HetNapjaId, CsengetesiRendId, CsengetesiRendOraId, Oraszam, OraTulajdonosId, TanarId, HelyettesitoId, OsztalyCsoportId, TantargyId, TeremId, IsHelyettesitett, IsNaplozott, IsMobilNaplozott, IsElmaradt, IsOrarendNelkul, OrarendiOraId, TanitasiOraId) SELECT -- Időpont adatok n.Datum AS OraDatuma, oo.C_ORAKEZDETE AS OraKezdete, oo.C_ORAVEGE AS OraVege, n.HetNapjaId AS HetNapjaId, oo.C_CSENGETESIRENDID AS CsengetesiRendId, oo.C_CSENGETESIRENDORAID AS CsengetesiRendOraId, oo.C_ORASZAM AS Oraszam, -- Kapcsolati adatok oo.C_ORATULAJDONOSID AS OraTulajdonosId, oo.C_TANARID AS TanarId, hi.C_HELYETTESTANAROKID AS HelyettesitoId, oo.C_OSZTALYCSOPORTID AS OsztalyCsoportId, oo.C_TANTARGYID AS TantargyId, oo.C_TEREMID AS TeremId, -- Egyéb adatok IIF(hi.ID IS NULL,0,1) AS IsHelyettesitett, 0 AS IsNaplozott, 0 AS IsMobilNaplozott, 0 AS IsElmaradt, 0 AS IsOrarendNelkul, oo.ID AS OrarendiOraId, NULL AS TanitasiOraId FROM T_ORARENDIORA_OSSZES oo INNER JOIN @Naptar n ON n.HetNapjaId = oo.C_HETNAPJA AND (n.HetirendId = @MindenHetHetirend OR n.HetirendId = oo.C_HETIREND) AND n.Datum >= oo.C_ORAERVENYESSEGKEZDETE AND n.Datum <= oo.C_ORAERVENYESSEGVEGE AND n.IsTanitasiNap = 1 AND n.IsOrarendiNap = 1 LEFT JOIN T_HELYETTESITESIIDOSZAK_OSSZES hi ON DATEDIFF(day, n.Datum, hi.C_HELYETTESITESNAPJA) = 0 AND hi.C_HELYETTESITETTORARENDID = oo.ID AND hi.C_TANEVID = @tanevid AND hi.TOROLT = 'F' WHERE oo.C_TANEVID = @tanevid AND oo.TOROLT = 'F' AND oo.C_OSZTALYCSOPORTID NOT IN (SELECT OsztalycsoportId FROM @OsztalyCsoportNaptar ocsn WHERE ocsn.Datum = n.Datum) AND (@osztalycsoportId IS NULL OR (oo.C_OSZTALYCSOPORTID IN (SELECT OsztalyCsoportId FROM @KapcsolodoOsztalyCsoportok))) AND (@tantargyId IS NULL OR oo.C_TANTARGYID = @tantargyId) AND (@tanarId IS NULL OR oo.C_TANARID = @tanarId OR hi.C_HELYETTESTANAROKID = @tanarId) -- ------------------------------------------------------------------------------------------------------------------ -- Órarend kiegészítése az egyedi osztályok és csoportok órarendjével -- ------------------------------------------------------------------------------------------------------------------ INSERT INTO @retTable ( OraDatuma, OraKezdete, OraVege, HetNapjaId, CsengetesiRendId, CsengetesiRendOraId, Oraszam, OraTulajdonosId, TanarId, HelyettesitoId, OsztalyCsoportId, TantargyId, TeremId, IsHelyettesitett, IsNaplozott, IsMobilNaplozott, IsElmaradt, IsOrarendNelkul, OrarendiOraId, TanitasiOraId) SELECT -- Időpont adatok n.Datum AS OraDatuma, oo.C_ORAKEZDETE AS OraKezdete, oo.C_ORAVEGE AS OraVege, n.HetNapjaId AS HetNapjaId, oo.C_CSENGETESIRENDID AS CsengetesiRendId, oo.C_CSENGETESIRENDORAID AS CsengetesiRendOraId, oo.C_ORASZAM AS Oraszam, -- Kapcsolati adatok oo.C_ORATULAJDONOSID AS OraTulajdonosId, oo.C_TANARID AS TanarId, hi.C_HELYETTESTANAROKID AS HelyettesitoId, oo.C_OSZTALYCSOPORTID AS OsztalyCsoportId, oo.C_TANTARGYID AS TantargyId, oo.C_TEREMID AS TeremId, -- Egyéb adatok IIF(hi.ID IS NULL,0,1) AS IsHelyettesitett, 0 AS IsNaplozott, 0 AS IsMobilNaplozott, 0 AS IsElmaradt, 0 AS IsOrarendNelkul, oo.ID AS OrarendiOraId, NULL AS TanitasiOraId FROM T_ORARENDIORA_OSSZES oo INNER JOIN @OsztalyCsoportNaptar n ON n.HetNapjaId = oo.C_HETNAPJA AND (n.HetirendId = @MindenHetHetirend OR n.HetirendId = oo.C_HETIREND) AND n.Datum >= oo.C_ORAERVENYESSEGKEZDETE AND n.Datum <= oo.C_ORAERVENYESSEGVEGE AND n.OsztalyCsoportId = oo.C_OSZTALYCSOPORTID AND n.IsTanitasiNap = 1 AND n.IsOrarendiNap = 1 LEFT JOIN T_HELYETTESITESIIDOSZAK_OSSZES hi ON DATEDIFF(day, n.Datum, hi.C_HELYETTESITESNAPJA) = 0 AND hi.C_HELYETTESITETTORARENDID = oo.ID AND hi.C_TANEVID = @tanevid AND hi.TOROLT = 'F' WHERE oo.C_TANEVID = @tanevid AND oo.TOROLT = 'F' AND (@osztalycsoportId IS NULL OR (oo.C_OSZTALYCSOPORTID IN (SELECT OsztalyCsoportId FROM @KapcsolodoOsztalyCsoportok))) AND (@tantargyId IS NULL OR oo.C_TANTARGYID = @tantargyId) AND (@tanarId IS NULL OR oo.C_TANARID = @tanarId OR hi.C_HELYETTESTANAROKID = @tanarId) -- ------------------------------------------------------------------------------------------------------------------ -- Tanítási órák betétele, amikhez nem tartozik órarendi óra -- ------------------------------------------------------------------------------------------------------------------ INSERT INTO @retTable ( OraDatuma, OraKezdete, OraVege, HetNapjaId, CsengetesiRendId, CsengetesiRendOraId, Oraszam, OraTulajdonosId, TanarId, HelyettesitoId, OsztalyCsoportId, TantargyId, TeremId, IsHelyettesitett, IsNaplozott, IsMobilNaplozott, IsElmaradt, IsOrarendNelkul, OrarendiOraId, TanitasiOraId) SELECT -- Időpont adatok tno.C_DATUM AS OraDatuma, tno.C_ORAKEZDETE AS OraKezdete, tno.C_ORAVEGE AS OraVege, tno.C_HETNAPJA AS HetNapjaId, tno.C_CSENGETESIRENDID AS CsengetesiRendId, tno.C_CSENGETESIRENDORAID AS CsengetesiRendOraId, tno.C_ORASZAM AS Oraszam, -- Kapcsolati adatok tno.C_ORATULAJDONOSID AS OraTulajdonosId, tno.C_TANARID AS TanarId, tno.C_HELYETTESITOTANARID AS HelyettesitoId, tno.C_OSZTALYCSOPORTID AS OsztalyCsoportId, tno.C_TANTARGYID AS TantargyId, tno.C_TEREMID AS TeremId, -- Egyéb adatok IIF(tno.C_HELYETTESITOTANARID IS NULL,0,1) AS IsHelyettesitett, 1 AS IsNaplozott, IIF(tno.C_MOBILNAPLOZOTT = 'F',0,1) AS IsMobilNaplozott, IIF(tno.C_MEGTARTOTT = 'F',0,1) AS IsElmaradt, 1 AS IsOrarendNelkul, NULL AS OrarendiOraId, tno.ID AS TanitasiOraId FROM T_TANITASIORA_OSSZES tno WHERE tno.C_TANEVID = @tanevid AND tno.TOROLT = 'F' AND (@osztalycsoportId IS NULL OR (tno.C_OSZTALYCSOPORTID IN (SELECT OsztalyCsoportId FROM @KapcsolodoOsztalyCsoportok))) AND (@tantargyId IS NULL OR tno.C_TANTARGYID = @tantargyId) AND (@tanarId IS NULL OR tno.C_HELYETTESITOTANARID = @tanarId OR tno.C_TANARID = @tanarId) AND 0 = ( SELECT COUNT(1) FROM @retTable r WHERE tno.C_DATUM = r.OraDatuma AND tno.C_ORASZAM = r.Oraszam AND tno.C_ORAKEZDETE = r.OraKezdete AND tno.C_ORAVEGE = r.OraVege AND tno.C_OSZTALYCSOPORTID = r.OsztalyCsoportId AND tno.C_TANTARGYID = r.TantargyId AND tno.C_TANARID = r.TanarId ) -- ------------------------------------------------------------------------------------------------------------------ -- Naplózott órák betétele, ha volt nekik órarendi órájuk -- ------------------------------------------------------------------------------------------------------------------ UPDATE r SET r.IsNaplozott = 1, r.IsElmaradt = IIF(tno.C_MEGTARTOTT = 'F',0,1), r.TeremId = tno.C_TEREMID, r.TanitasiOraId = tno.Id, r.IsHelyettesitett = IIF(tno.C_HELYETTESITOTANARID IS NULL,0,1), r.HelyettesitoId = tno.C_HELYETTESITOTANARID FROM @retTable r INNER JOIN T_TANITASIORA_OSSZES tno ON tno.C_DATUM = r.OraDatuma AND tno.C_ORASZAM = r.Oraszam AND tno.C_ORAKEZDETE = r.OraKezdete AND tno.C_ORAVEGE = r.OraVege AND tno.C_OSZTALYCSOPORTID = r.OsztalyCsoportId AND tno.C_TANTARGYID = r.TantargyId AND tno.C_TANARID = r.TanarId AND tno.C_TANEVID = @tanevid AND tno.TOROLT = 'F' -- ------------------------------------------------------------------------------------------------------------------ -- További "szűrések" -- ------------------------------------------------------------------------------------------------------------------ RETURN END GO