330 lines
No EOL
15 KiB
Transact-SQL
330 lines
No EOL
15 KiB
Transact-SQL
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 CHAR,
|
|
IsNaplozott CHAR,
|
|
IsMobilNaplozott CHAR,
|
|
IsElmaradt CHAR,
|
|
IsOrarendNelkul CHAR,
|
|
OrarendiOraId INT,
|
|
TanitasiOraId INT
|
|
)
|
|
BEGIN
|
|
-- ------------------------------------------------------------------------------------------------------------------
|
|
-- Segédtáblák definiálása
|
|
-- ------------------------------------------------------------------------------------------------------------------
|
|
DECLARE @Naptar TABLE
|
|
(Datum DATETIME, HetirendId INT, HetnapjaId INT, CsengetesiRendId INT, IsTanitasiNap CHAR, IsOrarendiNap CHAR)
|
|
DECLARE @OsztalyCsoportNaptar TABLE
|
|
(Datum DATETIME, HetirendId INT, HetnapjaId INT, CsengetesiRendId INT, IsTanitasiNap CHAR, IsOrarendiNap CHAR, OsztalycsoportId INT)
|
|
DECLARE @KapcsolodoOsztalyCsoportok TABLE
|
|
(OsztalyCsoportId INT PRIMARY KEY)
|
|
-- ------------------------------------------------------------------------------------------------------------------
|
|
-- 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 DISTINCT 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),'F','T'),
|
|
IIF(ISNULL(tr.C_ORARENDINAP,nn.C_ORARENDINAP) = 'T','T','F')
|
|
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),'F','T'),
|
|
IIF(ISNULL(tr.C_ORARENDINAP,nn.C_ORARENDINAP) = 'T','T','F'),
|
|
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,'F','T') AS IsHelyettesitett,
|
|
'F' AS IsNaplozott,
|
|
'F' AS IsMobilNaplozott,
|
|
'F' AS IsElmaradt,
|
|
'F' 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 = 'T'
|
|
AND n.IsOrarendiNap = 'T'
|
|
LEFT JOIN T_HELYETTESITESIIDOSZAK_OSSZES hi
|
|
ON hi.C_HELYETTESITESNAPJA = n.Datum
|
|
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,'F','T') AS IsHelyettesitett,
|
|
'F' AS IsNaplozott,
|
|
'F' AS IsMobilNaplozott,
|
|
'F' AS IsElmaradt,
|
|
'F' 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 = 'T'
|
|
AND n.IsOrarendiNap = 'T'
|
|
LEFT JOIN T_HELYETTESITESIIDOSZAK_OSSZES hi
|
|
ON hi.C_HELYETTESITESNAPJA = n.Datum
|
|
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,'F','T') AS IsHelyettesitett,
|
|
'T' AS IsNaplozott,
|
|
IIF(tno.C_MOBILNAPLOZOTT = 'T','T','F') AS IsMobilNaplozott,
|
|
IIF(tno.C_MEGTARTOTT = 'F','T','F') AS IsElmaradt,
|
|
'T' 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 = 'T',
|
|
r.IsElmaradt = IIF(tno.C_MEGTARTOTT = 'F','T','F'),
|
|
r.TeremId = tno.C_TEREMID,
|
|
r.TanitasiOraId = tno.Id,
|
|
r.IsHelyettesitett = IIF(tno.C_HELYETTESITOTANARID IS NULL,'F','T'),
|
|
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'
|
|
|
|
RETURN
|
|
END
|
|
GO |