174 lines
No EOL
7.8 KiB
Transact-SQL
174 lines
No EOL
7.8 KiB
Transact-SQL
DROP FUNCTION IF EXISTS dbo.fnGetKapcsolodoOsztalyCsoportokByDateRange
|
|
GO
|
|
|
|
CREATE FUNCTION dbo.fnGetKapcsolodoOsztalyCsoportokByDateRange (
|
|
@pOsztalyCsoportId int
|
|
,@pStartDate datetime
|
|
,@pEndDate datetime
|
|
,@pIntezmenyId int
|
|
,@pTanevId int
|
|
)
|
|
RETURNS @Result TABLE (
|
|
Id int primary key NOT NULL
|
|
,Kezdete datetime NOT NULL
|
|
,Vege datetime NOT NULL
|
|
) AS
|
|
BEGIN
|
|
DECLARE
|
|
@tanevStart datetime
|
|
,@tanevEnd datetime
|
|
,@osztalyId int
|
|
|
|
DECLARE @kategoriaId int = (SELECT C_FELADATKATEGORIAID FROM T_OSZTALYCSOPORT_OSSZES WHERE ID = @pOsztalyCsoportId)
|
|
|
|
IF EXISTS (SELECT 1 FROM T_OSZTALY_OSSZES WHERE ID = @pOsztalyCsoportId) BEGIN
|
|
|
|
INSERT INTO @Result (Id, Kezdete, Vege) /* maga az osztály */
|
|
SELECT
|
|
o.Id
|
|
,@pStartDate
|
|
,@pEndDate
|
|
FROM T_OSZTALY_OSSZES o
|
|
WHERE o.ID = @pOsztalyCsoportId
|
|
AND o.C_ALTANEVID = @pTanevID
|
|
AND o.C_ALINTEZMENYID = @pIntezmenyId
|
|
AND o.TOROLT = 'F'
|
|
|
|
UNION ALL
|
|
|
|
SELECT /* Az osztály bontott csoportjai */
|
|
cs.ID
|
|
,@pStartDate
|
|
,@pEndDate
|
|
FROM T_CSOPORT_OSSZES cs
|
|
WHERE C_OSZTALYBONTASID = @pOsztalyCsoportId
|
|
AND cs.TOROLT = 'F'
|
|
AND cs.C_ALTANEVID = @pTanevID
|
|
AND cs.C_ALINTEZMENYID = @pIntezmenyId
|
|
|
|
INSERT INTO @Result (Id, Kezdete, Vege) /* Az osztály tanulóinak más csoportjai */
|
|
SELECT
|
|
tcs.C_OSZTALYCSOPORTID AS Id
|
|
,CASE
|
|
WHEN MIN(tcs.C_BELEPESDATUM) > MIN(oszt.C_BELEPESDATUM) AND MIN(tcs.C_BELEPESDATUM) > @pStartDate THEN MIN(tcs.C_BELEPESDATUM)
|
|
WHEN MIN(oszt.C_BELEPESDATUM) > MIN(tcs.C_BELEPESDATUM) AND MIN(oszt.C_BELEPESDATUM) > @pStartDate THEN MIN(oszt.C_BELEPESDATUM)
|
|
ELSE @pStartDate
|
|
END AS Kezdete -- A három közül a legnagyobb
|
|
,CASE
|
|
WHEN MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) < MAX(ISNULL(oszt.C_KILEPESDATUM, @pEndDate)) AND MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) < @pEndDate THEN MIN(ISNULL(tcs.C_KILEPESDATUM, @pEndDate))
|
|
WHEN MAX(ISNULL(oszt.C_KILEPESDATUM, @pEndDate)) < MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) AND MAX(ISNULL(oszt.C_KILEPESDATUM, @pEndDate)) < @pEndDate THEN MIN(ISNULL(oszt.C_KILEPESDATUM, @pEndDate))
|
|
ELSE @pEndDate -- A három közül a legkisebb
|
|
END AS Vege
|
|
FROM T_TANULOCSOPORT_OSSZES tcs
|
|
INNER JOIN T_TANULOCSOPORT_OSSZES oszt
|
|
ON oszt.C_TANULOID = tcs.C_TANULOID
|
|
AND oszt.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
|
|
AND oszt.C_BELEPESDATUM <= @pEndDate
|
|
AND (oszt.C_KILEPESDATUM > @pStartDate OR oszt.C_KILEPESDATUM IS NULL)
|
|
INNER JOIN T_CSOPORT_OSSZES cs ON cs.ID = tcs.C_OSZTALYCSOPORTID AND cs.C_OSZTALYBONTASID IS NULL
|
|
INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = cs.ID AND ocs.TOROLT = 'F' AND ocs.C_FELADATKATEGORIAID = @kategoriaId
|
|
WHERE tcs.TOROLT = 'F'
|
|
AND oszt.TOROLT = 'F'
|
|
AND tcs.C_TANEVID = @pTanevId
|
|
AND tcs.C_INTEZMENYID = @pIntezmenyId
|
|
AND tcs.C_BELEPESDATUM <= @pEndDate
|
|
AND (tcs.C_KILEPESDATUM > @pStartDate OR tcs.C_KILEPESDATUM IS NULL)
|
|
AND NOT EXISTS (SELECT 1 FROM @Result r WHERE r.ID = tcs.C_OSZTALYCSOPORTID)
|
|
GROUP BY tcs.C_OSZTALYCSOPORTID
|
|
END
|
|
|
|
IF EXISTS (SELECT 1 FROM T_CSOPORT_OSSZES WHERE ID = @pOsztalyCsoportId AND C_OSZTALYBONTASID IS NOT NULL AND TOROLT = 'F') BEGIN
|
|
|
|
SELECT @osztalyId = C_OSZTALYBONTASID FROM T_CSOPORT_OSSZES WHERE ID = @pOsztalyCsoportId
|
|
|
|
INSERT INTO @Result (Id, Kezdete, Vege) /* Az osztály, amelyiknek a bontása */
|
|
SELECT
|
|
@osztalyId
|
|
,@pStartDate
|
|
,@pEndDate
|
|
|
|
UNION ALL
|
|
|
|
SELECT /* Maga a csoport */
|
|
@pOsztalyCsoportId
|
|
,@pStartDate
|
|
,@pEndDate
|
|
|
|
INSERT INTO @Result (Id, Kezdete, Vege) /* Az csoport tanulóinak más csoportjai */
|
|
SELECT
|
|
tcs.C_OSZTALYCSOPORTID AS Id
|
|
,CASE
|
|
WHEN MIN(tcs.C_BELEPESDATUM) > MIN(csop.C_BELEPESDATUM) AND MIN(tcs.C_BELEPESDATUM) > @pStartDate THEN MIN(tcs.C_BELEPESDATUM)
|
|
WHEN MIN(csop.C_BELEPESDATUM) > MIN(tcs.C_BELEPESDATUM) AND MIN(csop.C_BELEPESDATUM) > @pStartDate THEN MIN(csop.C_BELEPESDATUM)
|
|
ELSE @pStartDate
|
|
END AS Kezdete -- A három közül a legnagyobb
|
|
,CASE
|
|
WHEN MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) < MAX(ISNULL(csop.C_KILEPESDATUM, @pEndDate)) AND MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) < @pEndDate THEN MIN(ISNULL(tcs.C_KILEPESDATUM, @pEndDate))
|
|
WHEN MAX(ISNULL(csop.C_KILEPESDATUM, @pEndDate)) < MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) AND MAX(ISNULL(csop.C_KILEPESDATUM, @pEndDate)) < @pEndDate THEN MIN(ISNULL(csop.C_KILEPESDATUM, @pEndDate))
|
|
ELSE @pEndDate
|
|
END AS Vege -- A három közül a legkisebb
|
|
FROM T_TANULOCSOPORT_OSSZES tcs
|
|
INNER JOIN T_TANULOCSOPORT_OSSZES csop
|
|
ON tcs.C_TANULOID = csop.C_TANULOID
|
|
AND csop.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
|
|
AND csop.C_BELEPESDATUM <= @pEndDate
|
|
AND (csop.C_KILEPESDATUM > @pStartDate OR csop.C_KILEPESDATUM IS NULL)
|
|
AND csop.TOROLT = 'F'
|
|
INNER JOIN T_CSOPORT_OSSZES cs
|
|
ON cs.ID = tcs.C_OSZTALYCSOPORTID
|
|
AND (cs.C_OSZTALYBONTASID IS NULL OR cs.C_OSZTALYBONTASID = @osztalyId)
|
|
INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = cs.ID AND ocs.TOROLT='F' AND ocs.C_FELADATKATEGORIAID = @kategoriaId
|
|
WHERE tcs.C_OSZTALYCSOPORTID <> @pOsztalyCsoportId
|
|
AND tcs.C_TANEVID = @pTanevId
|
|
AND tcs.C_INTEZMENYID = @pIntezmenyId
|
|
AND tcs.C_BELEPESDATUM <= @pEndDate
|
|
AND (tcs.C_KILEPESDATUM > @pStartDate OR tcs.C_KILEPESDATUM IS NULL)
|
|
AND tcs.TOROLT = 'F' AND csop.TOROLT = 'F'
|
|
GROUP BY tcs.C_OSZTALYCSOPORTID
|
|
END
|
|
|
|
IF EXISTS (SELECT 1 FROM T_CSOPORT_OSSZES WHERE ID = @pOsztalyCsoportId AND C_OSZTALYBONTASID IS NULL AND TOROLT = 'F') BEGIN
|
|
|
|
INSERT INTO @Result (Id, Kezdete, Vege) /* Az csoport tanulóinak más csoportjai */
|
|
SELECT
|
|
tcs.C_OSZTALYCSOPORTID AS Id
|
|
,CASE
|
|
WHEN MIN(tcs.C_BELEPESDATUM) > MIN(csop.C_BELEPESDATUM) AND MIN(tcs.C_BELEPESDATUM) > @pStartDate THEN MIN(tcs.C_BELEPESDATUM)
|
|
WHEN MIN(csop.C_BELEPESDATUM) > MIN(tcs.C_BELEPESDATUM) AND MIN(csop.C_BELEPESDATUM) > @pStartDate THEN MIN(csop.C_BELEPESDATUM)
|
|
ELSE @pStartDate
|
|
END AS Kezdete -- A három közül a legnagyobb
|
|
,CASE
|
|
WHEN MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) < MAX(ISNULL(csop.C_KILEPESDATUM, @pEndDate)) AND MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) < @pEndDate THEN MIN(ISNULL(tcs.C_KILEPESDATUM, @pEndDate))
|
|
WHEN MAX(ISNULL(csop.C_KILEPESDATUM, @pEndDate)) < MAX(ISNULL(tcs.C_KILEPESDATUM, @pEndDate)) AND MAX(ISNULL(csop.C_KILEPESDATUM, @pEndDate)) < @pEndDate THEN MIN(ISNULL(csop.C_KILEPESDATUM, @pEndDate))
|
|
ELSE @pEndDate
|
|
END AS Vege -- A három közül a legkisebb
|
|
FROM T_TANULOCSOPORT_OSSZES tcs
|
|
INNER JOIN T_TANULOCSOPORT_OSSZES csop
|
|
ON tcs.C_TANULOID = csop.C_TANULOID
|
|
AND csop.C_OSZTALYCSOPORTID = @pOsztalyCsoportId
|
|
AND csop.C_BELEPESDATUM <= @pEndDate
|
|
AND (csop.C_KILEPESDATUM > @pStartDate OR csop.C_KILEPESDATUM IS NULL)
|
|
AND csop.TOROLT = 'F'
|
|
AND csop.C_BELEPESDATUM <= ISNULL(tcs.C_KILEPESDATUM, @pEndDate) AND ISNULL(csop.C_KILEPESDATUM, @pEndDate) > tcs.C_BELEPESDATUM
|
|
INNER JOIN T_OSZTALYCSOPORT_OSSZES ocs ON ocs.ID = tcs.C_OSZTALYCSOPORTID AND ocs.TOROLT='F' AND ocs.C_FELADATKATEGORIAID = @kategoriaId
|
|
WHERE tcs.C_TANEVID = @pTanevId
|
|
AND tcs.C_INTEZMENYID = @pIntezmenyId
|
|
AND tcs.C_BELEPESDATUM <= @pEndDate
|
|
AND (tcs.C_KILEPESDATUM > @pStartDate OR tcs.C_KILEPESDATUM IS NULL)
|
|
AND tcs.TOROLT = 'F' AND csop.TOROLT = 'F'
|
|
GROUP BY tcs.C_OSZTALYCSOPORTID
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM @Result WHERE ID = @pOsztalyCsoportId) BEGIN
|
|
INSERT INTO @Result (Id, Kezdete, Vege)
|
|
SELECT
|
|
@pOsztalyCsoportId AS Id
|
|
,t.C_KEZDONAP as Kezdete
|
|
,t.C_UTOLSONAP as Vege
|
|
FROM T_TANEV t
|
|
WHERE t.ID = @pTanevId
|
|
END
|
|
END
|
|
|
|
RETURN
|
|
END
|
|
GO |