316 lines
13 KiB
Transact-SQL
316 lines
13 KiB
Transact-SQL
DROP PROCEDURE IF EXISTS uspGenerateOrarend
|
|
GO
|
|
|
|
CREATE PROCEDURE uspGenerateOrarend
|
|
@pIntezmenyId int
|
|
,@pTanevId int
|
|
,@pIdoszakKezdete datetime = NULL
|
|
,@pIdoszakVege datetime = NULL
|
|
,@pOrarendiOraId int = NULL
|
|
,@pOsztalycsoportId int = NULL
|
|
,@pIsTeljesTanev BIT = 0
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
|
|
DECLARE
|
|
@sql nvarchar(max) = N''
|
|
,@aktivCsengetesirend int;
|
|
|
|
SELECT
|
|
@pIdoszakKezdete = ISNULL(@pIdoszakKezdete, C_KEZDONAP)
|
|
,@pIdoszakVege = ISNULL(@pIdoszakVege, C_UTOLSONAP)
|
|
FROM T_TANEV
|
|
WHERE ID = @pTanevId
|
|
|
|
SELECT @aktivCsengetesirend = ID
|
|
FROM T_CSENGETESIREND
|
|
WHERE C_TANEVID = @pTanevId
|
|
AND TOROLT = 'F'
|
|
AND C_AKTIV = 'T'
|
|
|
|
IF @pOrarendiOraId IS NOT NULL BEGIN
|
|
IF (SELECT TOROLT FROM T_ORARENDIORA_OSSZES WHERE ID = @pOrarendiOraId) = 'T' BEGIN
|
|
DELETE orr
|
|
FROM T_ORAREND_OSSZES orr
|
|
WHERE orr.C_ORARENDIORAID = @pOrarendiOraId
|
|
END
|
|
ELSE BEGIN
|
|
DELETE orr
|
|
FROM T_ORAREND_OSSZES orr
|
|
WHERE orr.C_ORARENDIORAID = @pOrarendiOraId
|
|
AND (C_DATUM < @pIdoszakKezdete OR C_DATUM >= @pIdoszakVege)
|
|
END
|
|
END
|
|
ELSE BEGIN
|
|
DELETE orr
|
|
FROM T_ORAREND_OSSZES orr
|
|
INNER JOIN T_ORARENDIORA_OSSZES oo ON oo.ID = orr.C_ORARENDIORAID
|
|
WHERE oo.TOROLT = 'T' AND oo.C_TANEVID = @pTanevId
|
|
END
|
|
|
|
SET @sql += N'
|
|
|
|
CREATE TABLE #Osztalycsoport (
|
|
Id int
|
|
,IdoszakVege datetime
|
|
,TanevId int
|
|
,IsVegzos char(1)
|
|
)
|
|
|
|
DECLARE @VegzosUtolsoTanitasiNap datetime;
|
|
SELECT @VegzosUtolsoTanitasiNap = MIN(C_DATUM)
|
|
FROM T_TANEVRENDJE_OSSZES
|
|
WHERE TOROLT = ''F''
|
|
AND C_TANEVID = @pTanevId
|
|
AND C_NAPTIPUSA IN (1402, 7600, 7601, 7602, 7603, 1395)
|
|
AND C_OSSZESCSOPORTRAVONATKOZIK = ''T''
|
|
|
|
--PRINT ''Osztálycsoport insert''
|
|
|
|
INSERT INTO #Osztalycsoport (Id, IdoszakVege, TanevId, IsVegzos)
|
|
SELECT ocs.ID, IIF(C_VEGZOSEVFOLYAM = ''T'' AND @pIsTeljesTanev = 0 , @VegzosUtolsoTanitasiNap, @pIdoszakVege), ocs.C_TANEVID, C_VEGZOSEVFOLYAM
|
|
FROM T_OSZTALYCSOPORT_OSSZES ocs
|
|
' + IIF(@pOrarendiOraId IS NULL, '', 'INNER JOIN T_ORARENDIORA_OSSZES oo ON oo.C_OSZTALYCSOPORTID = ocs.ID AND (oo.TOROLT = ''F'' OR (oo.TOROLT = ''T'' AND oo.C_KOZPONTILAGTOROLTORAGROUPID IS NOT NULL)) AND oo.ID = @pOrarendiOraId') + '
|
|
WHERE ocs.TOROLT = ''F'' ' + IIF(@pOsztalycsoportId IS NULL, '', 'AND ocs.ID = @pOsztalycsoportId') + '
|
|
|
|
--PRINT ''Osztálycsoport update''
|
|
IF(@pIsTeljesTanev = 0) BEGIN
|
|
UPDATE ocs SET
|
|
ocs.IdoszakVege = NewVegeDatum
|
|
FROM #OsztalyCsoport ocs
|
|
INNER JOIN (
|
|
SELECT MIN(tr.C_DATUM) AS NewVegeDatum, ocstr.C_OSZTALYCSOPORTID
|
|
FROM T_TANEVRENDJE_OSSZES tr
|
|
INNER JOIN T_OSZTALYCSOPORT_TANEVRENDJE ocstr ON ocstr.C_TANEVRENDJEID = tr.ID
|
|
WHERE tr.C_OSSZESCSOPORTRAVONATKOZIK = ''F''
|
|
AND tr.TOROLT = ''F''
|
|
AND tr.C_NAPTIPUSA IN (1402, 7600, 7601, 7602, 7603)
|
|
AND tr.C_TANEVID = @pTanevId
|
|
GROUP BY ocstr.C_OSZTALYCSOPORTID
|
|
) x ON x.C_OSZTALYCSOPORTID = ocs.Id
|
|
WHERE ocs.IsVegzos = ''T''
|
|
END;'
|
|
|
|
IF @pOsztalycsoportId IS NOT NULL OR @pOrarendiOraId IS NOT NULL BEGIN
|
|
SET @sql += N'
|
|
CREATE TABLE #OrarendiOra (
|
|
Id int primary key
|
|
);
|
|
|
|
--PRINT ''OrarendiOraTemp insert''
|
|
INSERT INTO #OrarendiOra (id)
|
|
SELECT ID
|
|
FROM T_ORARENDIORA_OSSZES oo
|
|
WHERE (oo.TOROLT = ''F'' OR (oo.TOROLT = ''T'' AND oo.C_KOZPONTILAGTOROLTORAGROUPID IS NOT NULL))
|
|
' + IIF(@pOsztalycsoportId IS NULL, '', 'AND oo.C_OSZTALYCSOPORTID = @pOsztalycsoportId')
|
|
+ IIF(@pOrarendiOraId IS NULL, '', 'AND ID = @pOrarendiOraId') + '
|
|
'
|
|
END
|
|
SET @sql += N'
|
|
CREATE TABLE #NaptariNap (
|
|
C_TANEVID int
|
|
,C_INTEZMENYID int
|
|
,C_NAPDATUMA datetime
|
|
,C_HETNAPJA int
|
|
,C_HETIREND int
|
|
,C_EGYEDINAP char(1) COLLATE Hungarian_CI_AI
|
|
,C_CSENGETESIRENDID int
|
|
,INDEX IX_001 CLUSTERED (C_TANEVID, C_HETNAPJA, C_INTEZMENYID, C_NAPDATUMA)
|
|
)
|
|
|
|
INSERT INTO #NaptariNap (
|
|
C_TANEVID
|
|
,C_INTEZMENYID
|
|
,C_NAPDATUMA
|
|
,C_HETNAPJA
|
|
,C_HETIREND
|
|
,C_EGYEDINAP
|
|
,C_CSENGETESIRENDID
|
|
) SELECT
|
|
nn.C_TANEVID
|
|
,nn.C_INTEZMENYID
|
|
,nn.C_NAPDATUMA
|
|
,nn.C_HETNAPJA
|
|
,IIF(nn.C_HETIREND = 1554, nh.C_HETIREND, nn.C_HETIREND)
|
|
,ISNULL(tr.C_EGYEDINAP, ''F'')
|
|
,nn.C_AKTIVCSENGETESIRENDID
|
|
FROM T_NAPTARINAP_OSSZES nn
|
|
LEFT JOIN T_TANEVRENDJE_OSSZES tr ON tr.C_DATUM = nn.C_NAPDATUMA AND tr.C_TANEVID = nn.C_TANEVID AND tr.C_OSSZESCSOPORTRAVONATKOZIK = ''T'' AND tr.TOROLT = ''F''
|
|
INNER JOIN T_NAPTARIHET_OSSZES nh ON nn.C_NAPDATUMA BETWEEN C_HETKEZDONAPJA AND C_HETUTOLSONAPJA AND nn.C_TANEVID = nh.C_TANEVID
|
|
WHERE nn.C_TANEVID = @pTanevId AND nn.TOROLT = ''F''
|
|
AND (@pIsTeljesTanev = 1 OR nn.C_ORARENDINAP = ''T'')
|
|
AND nn.C_NAPDATUMA BETWEEN @pIdoszakKezdete AND @pIdoszakVege
|
|
' + IIF(@pOrarendiOraId IS NULL, '', 'AND nn.C_HETNAPJA = (SELECT C_HETNAPJA FROM T_ORARENDIORA_OSSZES WHERE ID = @pOrarendiOraId)') + '
|
|
|
|
CREATE TABLE #NaptariNapOsztalycsoport (
|
|
C_TANEVID int
|
|
,C_INTEZMENYID int
|
|
,C_NAPDATUMA datetime
|
|
,C_HETNAPJA int
|
|
,C_HETIREND int
|
|
,C_EGYEDINAP char(1) COLLATE Hungarian_CI_AI
|
|
,C_OSZTALYCSOPORTID int
|
|
,C_CSENGETESIRENDID int
|
|
,INDEX IX_001 CLUSTERED (C_TANEVID, C_HETNAPJA, C_INTEZMENYID, C_NAPDATUMA, C_OSZTALYCSOPORTID)
|
|
)
|
|
IF(@pIsTeljesTanev = 0) BEGIN
|
|
INSERT INTO #NaptariNapOsztalycsoport (
|
|
C_TANEVID
|
|
,C_INTEZMENYID
|
|
,C_NAPDATUMA
|
|
,C_HETNAPJA
|
|
,C_HETIREND
|
|
,C_EGYEDINAP
|
|
,C_OSZTALYCSOPORTID
|
|
,C_CSENGETESIRENDID
|
|
) SELECT
|
|
tr.C_TANEVID
|
|
,tr.C_INTEZMENYID
|
|
,tr.C_DATUM
|
|
,tr.C_HETNAPJA
|
|
,IIF(tr.C_HETIREND = 1554, nh.C_HETIREND, tr.C_HETIREND)
|
|
,tr.C_EGYEDINAP
|
|
,ocstr.C_OSZTALYCSOPORTID
|
|
,tr.C_CSENGETESIRENDID
|
|
FROM T_TANEVRENDJE_OSSZES tr
|
|
INNER JOIN T_OSZTALYCSOPORT_TANEVRENDJE ocstr ON ocstr.C_TANEVRENDJEID = tr.ID
|
|
INNER JOIN T_NAPTARIHET_OSSZES nh ON tr.C_DATUM BETWEEN C_HETKEZDONAPJA AND C_HETUTOLSONAPJA AND tr.C_TANEVID = nh.C_TANEVID
|
|
WHERE tr.C_TANEVID = @pTanevId
|
|
AND tr.TOROLT = ''F''
|
|
AND tr.C_ORARENDINAP = ''T''
|
|
AND tr.C_OSSZESCSOPORTRAVONATKOZIK = ''F''
|
|
AND tr.C_DATUM BETWEEN @pIdoszakKezdete AND @pIdoszakVege
|
|
' + IIF(@pOsztalycsoportId IS NULL, '', 'AND ocstr.C_OSZTALYCSOPORTID = @pOsztalycsoportId' ) + '
|
|
END;'
|
|
|
|
SET @sql += N'
|
|
CREATE TABLE #Orarend (
|
|
Datum datetime
|
|
,OrarendiOraId int
|
|
,PRIMARY KEY CLUSTERED (Datum, OrarendioraId)
|
|
);
|
|
|
|
--PRINT ''NaptárinapTemp insert''
|
|
INSERT INTO #Orarend (
|
|
Datum
|
|
,OrarendiOraId
|
|
)'
|
|
SET @sql += N'
|
|
SELECT nn.C_NAPDATUMA, oo.ID
|
|
FROM #NaptariNap nn
|
|
INNER JOIN T_ORARENDIORA_OSSZES oo ON oo.C_HETNAPJA = nn.C_HETNAPJA
|
|
AND (oo.C_HETIREND = 1554 OR oo.C_HETIREND = nn.C_HETIREND)
|
|
AND nn.C_EGYEDINAP = oo.C_EGYEDINAP
|
|
AND (oo.TOROLT = ''F'' OR (oo.TOROLT = ''T'' AND oo.C_KOZPONTILAGTOROLTORAGROUPID IS NOT NULL))
|
|
AND oo.C_TANEVID = nn.C_TANEVID
|
|
AND oo.C_INTEZMENYID = nn.C_INTEZMENYID
|
|
AND oo.C_ORAERVENYESSEGKEZDETE <= nn.C_NAPDATUMA AND oo.C_ORAERVENYESSEGVEGE > nn.C_NAPDATUMA
|
|
INNER JOIN #Osztalycsoport ocs ON ocs.Id = oo.C_OSZTALYCSOPORTID AND ocs.IdoszakVege >= nn.C_NAPDATUMA
|
|
'+IIF(@pOrarendiOraId IS NULL AND @pOsztalyCsoportId IS NULL, '', 'INNER JOIN #OrarendiOra oo2 ON oo2.Id = oo.ID') + '
|
|
WHERE NOT EXISTS (
|
|
SELECT 1 FROM T_TANEVRENDJE_OSSZES tr2
|
|
INNER JOIN T_OSZTALYCSOPORT_TANEVRENDJE ocstr ON tr2.ID = ocstr.C_TANEVRENDJEID
|
|
WHERE tr2.C_OSSZESCSOPORTRAVONATKOZIK = ''F'' AND tr2.TOROLT = ''F''
|
|
AND ocs.Id = ocstr.C_OSZTALYCSOPORTID AND nn.C_NAPDATUMA = tr2.C_DATUM)
|
|
AND (EXISTS (SELECT 1 FROM T_CSENGETESIRENDORA_OSSZES csro WHERE csro.C_CSENGETESIRENDID = ISNULL(nn.C_CSENGETESIRENDID, oo.C_CSENGETESIRENDID) AND oo.C_ORASZAM = csro.C_ORASZAM AND csro.TOROLT = ''F'') OR oo.C_CSENGETESIRENDID IS NULL)
|
|
|
|
UNION ALL
|
|
|
|
SELECT nn.C_NAPDATUMA, oo.ID
|
|
FROM #NaptariNap nn
|
|
INNER JOIN T_ORARENDIORA_OSSZES oo ON oo.C_HETNAPJA = nn.C_HETNAPJA
|
|
AND (oo.C_HETIREND = 1554 OR oo.C_HETIREND = nn.C_HETIREND)
|
|
AND nn.C_EGYEDINAP = oo.C_EGYEDINAP
|
|
AND (oo.TOROLT = ''F'' OR (oo.TOROLT = ''T'' AND oo.C_KOZPONTILAGTOROLTORAGROUPID IS NOT NULL))
|
|
AND oo.C_TANEVID = nn.C_TANEVID
|
|
AND oo.C_INTEZMENYID = nn.C_INTEZMENYID
|
|
AND oo.C_ORAERVENYESSEGKEZDETE = nn.C_NAPDATUMA AND oo.C_ORAERVENYESSEGVEGE = nn.C_NAPDATUMA
|
|
INNER JOIN #Osztalycsoport ocs ON ocs.Id = oo.C_OSZTALYCSOPORTID AND ocs.IdoszakVege >= nn.C_NAPDATUMA
|
|
'+IIF(@pOrarendiOraId IS NULL AND @pOsztalyCsoportId IS NULL, '', 'INNER JOIN #OrarendiOra oo2 ON oo2.Id = oo.ID') + '
|
|
WHERE NOT EXISTS (
|
|
SELECT 1 FROM T_TANEVRENDJE_OSSZES tr2
|
|
INNER JOIN T_OSZTALYCSOPORT_TANEVRENDJE ocstr ON tr2.ID = ocstr.C_TANEVRENDJEID
|
|
WHERE tr2.C_OSSZESCSOPORTRAVONATKOZIK = ''F'' AND tr2.TOROLT = ''F''
|
|
AND ocs.Id = ocstr.C_OSZTALYCSOPORTID AND nn.C_NAPDATUMA = tr2.C_DATUM)
|
|
AND (EXISTS (SELECT 1 FROM T_CSENGETESIRENDORA_OSSZES csro WHERE csro.C_CSENGETESIRENDID = ISNULL(nn.C_CSENGETESIRENDID, oo.C_CSENGETESIRENDID) AND oo.C_ORASZAM = csro.C_ORASZAM AND csro.TOROLT = ''F'') OR oo.C_CSENGETESIRENDID IS NULL)
|
|
|
|
UNION ALL'
|
|
|
|
SET @sql += N'
|
|
SELECT nn.C_NAPDATUMA, oo.ID
|
|
FROM #NaptariNapOsztalycsoport nn
|
|
INNER JOIN T_ORARENDIORA_OSSZES oo ON oo.C_HETNAPJA = nn.C_HETNAPJA
|
|
AND (oo.C_HETIREND = 1554 OR oo.C_HETIREND = nn.C_HETIREND)
|
|
AND nn.C_EGYEDINAP = oo.C_EGYEDINAP
|
|
AND (oo.TOROLT = ''F'' OR (oo.TOROLT = ''T'' AND oo.C_KOZPONTILAGTOROLTORAGROUPID IS NOT NULL))
|
|
AND oo.C_TANEVID = nn.C_TANEVID
|
|
AND oo.C_INTEZMENYID = nn.C_INTEZMENYID
|
|
AND oo.C_ORAERVENYESSEGKEZDETE <= nn.C_NAPDATUMA AND oo.C_ORAERVENYESSEGVEGE > nn.C_NAPDATUMA
|
|
AND oo.C_OSZTALYCSOPORTID = nn.C_OSZTALYCSOPORTID
|
|
INNER JOIN #Osztalycsoport ocs ON ocs.Id = nn.C_OSZTALYCSOPORTID AND ocs.IdoszakVege >= nn.C_NAPDATUMA
|
|
'+IIF(@pOrarendiOraId IS NULL AND @pOsztalyCsoportId IS NULL, '', 'INNER JOIN #OrarendiOra oo2 ON oo2.Id = oo.ID') + '
|
|
WHERE (EXISTS (SELECT 1 FROM T_CSENGETESIRENDORA_OSSZES csro WHERE csro.C_CSENGETESIRENDID = ISNULL(nn.C_CSENGETESIRENDID, oo.C_CSENGETESIRENDID) AND oo.C_ORASZAM = csro.C_ORASZAM AND csro.TOROLT = ''F'') OR oo.C_CSENGETESIRENDID IS NULL)
|
|
|
|
UNION ALL
|
|
|
|
SELECT nn.C_NAPDATUMA, oo.ID
|
|
FROM #NaptariNapOsztalycsoport nn
|
|
INNER JOIN T_ORARENDIORA_OSSZES oo ON oo.C_HETNAPJA = nn.C_HETNAPJA
|
|
AND (oo.C_HETIREND = 1554 OR oo.C_HETIREND = nn.C_HETIREND)
|
|
AND nn.C_EGYEDINAP = oo.C_EGYEDINAP
|
|
AND (oo.TOROLT = ''F'' OR (oo.TOROLT = ''T'' AND oo.C_KOZPONTILAGTOROLTORAGROUPID IS NOT NULL))
|
|
AND oo.C_TANEVID = nn.C_TANEVID
|
|
AND oo.C_INTEZMENYID = nn.C_INTEZMENYID
|
|
AND oo.C_ORAERVENYESSEGKEZDETE = nn.C_NAPDATUMA AND oo.C_ORAERVENYESSEGVEGE = nn.C_NAPDATUMA
|
|
AND oo.C_OSZTALYCSOPORTID = nn.C_OSZTALYCSOPORTID
|
|
INNER JOIN #Osztalycsoport ocs ON ocs.Id = nn.C_OSZTALYCSOPORTID AND ocs.IdoszakVege >= nn.C_NAPDATUMA
|
|
'+IIF(@pOrarendiOraId IS NULL AND @pOsztalyCsoportId IS NULL, '', 'INNER JOIN #OrarendiOra oo2 ON oo2.Id = oo.ID') + '
|
|
WHERE (EXISTS (SELECT 1 FROM T_CSENGETESIRENDORA_OSSZES csro WHERE csro.C_CSENGETESIRENDID = ISNULL(nn.C_CSENGETESIRENDID, oo.C_CSENGETESIRENDID) AND oo.C_ORASZAM = csro.C_ORASZAM AND csro.TOROLT = ''F'') OR oo.C_CSENGETESIRENDID IS NULL)
|
|
'
|
|
|
|
SET @sql += N'
|
|
--PRINT ''MERGE''
|
|
MERGE T_ORAREND_OSSZES trg
|
|
USING #Orarend src ON
|
|
trg.C_ORARENDIORAID = src.OrarendioraId AND src.Datum = trg.C_DATUM
|
|
WHEN NOT MATCHED BY TARGET THEN
|
|
INSERT (
|
|
C_ORARENDIORAID
|
|
,C_DATUM
|
|
,C_TANEVID
|
|
,C_INTEZMENYID
|
|
) VALUES (
|
|
src.OrarendiOraId
|
|
,src.Datum
|
|
,@pTanevId
|
|
,@pIntezmenyId
|
|
)
|
|
WHEN NOT MATCHED BY SOURCE AND trg.C_TANEVID = @pTanevId AND trg.C_DATUM BETWEEN @pIdoszakKezdete AND @pIdoszakVege
|
|
' + IIF(@pOrarendiOraId IS NULL AND @pOsztalyCsoportId IS NULL, '', 'AND trg.C_ORARENDIORAID IN (SELECT Id FROM #OrarendiOra)') + '
|
|
THEN
|
|
DELETE
|
|
--OUTPUT $action, DELETED.C_DATUM, DELETED.C_ORARENDIORAID, INSERTED.C_DATUM, INSERTED.C_ORARENDIORAID
|
|
;
|
|
'
|
|
EXEC sp_executesql @sql,N'
|
|
@pIntezmenyId int
|
|
,@pTanevId int
|
|
,@pIdoszakKezdete datetime
|
|
,@pIdoszakVege datetime
|
|
,@pOrarendiOraId int
|
|
,@pOsztalycsoportId int
|
|
,@aktivCsengetesirend int
|
|
,@pIsTeljesTanev BIT'
|
|
,@pIntezmenyId = @pIntezmenyId
|
|
,@pTanevId = @pTanevId
|
|
,@pIdoszakKezdete = @pIdoszakKezdete
|
|
,@pIdoszakVege = @pIdoszakVege
|
|
,@pOrarendiOraId = @pOrarendiOraId
|
|
,@pOsztalycsoportId = @pOsztalycsoportId
|
|
,@aktivCsengetesirend = @aktivCsengetesirend
|
|
,@pIsTeljesTanev = @pIsTeljesTanev;
|
|
EXEC uspGenerateTeljesOrarend @pIntezmenyId, @pTanevId, @pOrarendiOraId;
|
|
|
|
END
|
|
GO
|