166 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Transact-SQL
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Transact-SQL
		
	
	
	
	
	
DROP FUNCTION IF EXISTS dbo.fnGetDokumentumKapcsolodoOsztalyCsoportokByDateRange
 | 
						|
GO
 | 
						|
 | 
						|
CREATE FUNCTION dbo.fnGetDokumentumKapcsolodoOsztalyCsoportokByDateRange (
 | 
						|
   @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 MAX(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 MAX(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 MAX(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 MAX(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 MAX(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 MAX(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
 | 
						|
  END
 | 
						|
 | 
						|
  RETURN
 | 
						|
END
 | 
						|
GO |