@Project_UUID_IN VARCHAR(255),
@VarName_IN VARCHAR(250), 
@RecordName_IN VARCHAR(250),  
@ProgName_IN VARCHAR(250),
@CopyName_IN VARCHAR(250),
@StartPosition_IN INTEGER, 
@NumberOfRows_IN  INTEGER	
AS 
BEGIN
SET XACT_ABORT ON
SET NOCOUNT ON
  

	--1. DECLARATION AREA
	   DECLARE @StartPosition INTEGER, @NumberOfRows INTEGER;
	   DECLARE @RC INTEGER = 0, @RC1 INTEGER = 0, @RC2 INTEGER = 0,  @totalvarnumber INTEGER = 0;
	   DECLARE @Sql1 NVARCHAR(MAX) = '',  @Sql2 NVARCHAR(MAX) = '', @Sql3 NVARCHAR(MAX) = '', @Sql4 NVARCHAR(MAX) = '';
       DECLARE @Sql5 NVARCHAR(MAX) = '',  @Sql6 NVARCHAR(MAX) = '', @Sql7 NVARCHAR(MAX) = '';
	   DECLARE @Project_UUID VARCHAR(255);
	   DECLARE @OnlyCopyFlag SMALLINT = 0;
	   DECLARE @VarName VARCHAR(250), @RecordName VARCHAR(250),  @ProgName VARCHAR(250), @CopyName VARCHAR(250);
	   DECLARE @Cat1 FLOAT(6) = 0, @Cat2 FLOAT(6) = 0, @Cat3 FLOAT(6) = 0, @Cat4 FLOAT(6) = 0;
	   DECLARE @Cat5 FLOAT(6) = 0, @Cat6 FLOAT(6) = 0, @Cat7 FLOAT(6) = 0, @Cat8 FLOAT(6) = 0;
	


	--2. SET FINAL VALUES FOR WORK VARIABLES
		SET @StartPosition = COALESCE(NULLIF(@StartPosition_IN, -1), 1) ;
		SET @NumberOfRows  = COALESCE(NULLIF(@NumberOfRows_IN, -1), 3000) ; 
	    SET @Project_UUID_IN = COALESCE(LTRIM(RTRIM(@Project_UUID_IN)), '!');

	    SET @VarName    = COALESCE(NULLIF(LTRIM(RTRIM(@VarName_IN)),'')   , '%');
	    SET @RecordName = COALESCE(NULLIF(LTRIM(RTRIM(@RecordName_IN)),''), '%');
	    SET @ProgName   = COALESCE(NULLIF(LTRIM(RTRIM(@ProgName_IN)),''),   '%'); 
	    SET @CopyName   = COALESCE(NULLIF(LTRIM(RTRIM(@CopyName_IN)), ''),  '%');                  
	    -- Be aware about !!!!!  if @CopyName_IN = '*' then we have to return all variables DefinedInCopy    (API will transform '*' -> %)
	    SET @OnlyCopyFlag   =  CASE WHEN  LTRIM(RTRIM(@CopyName_IN)) LIKE '\%' ESCAPE'\' THEN 1
	                                ELSE 0
                                END;
	   

        --SELECT @VarName AS VarName, @RecordName AS REcordName, @ProgName AS ProgName,  @CopyName AS CopyName, @OnlyCopyFlag  AS OnlyCopyFlag 

 


        SELECT @Project_UUID = ProjectGUID
	    FROM  BRD_Status  
	    WHERE BRDID = (SELECT MAX(BRDID) FROM BRD_Status WHERE BRDProcessStatusTypeID = 2); -- last BRD succssfull
													 		
	    SET @Project_UUID = COALESCE(LTRIM(RTRIM(@Project_UUID)), '?');


	     IF ( @Project_UUID != @Project_UUID_IN) 
			BEGIN 
					   RAISERROR ('BRD - wrong project.', -- Message text.  
								16, -- Severity.  
								1 -- State.  
								); 
					   RETURN;

			 END;



	--3.CATEGORY WEIGHTS 
	   -- 3.1 Final weights for BRD Categories
	   IF OBJECT_ID('tempdb..#categvalues4') IS NOT NULL DROP TABLE #categvalues4;
	   SELECT f.Flag
	        ,COALESCE([1], 1) AS [1]
			,COALESCE([2], 1) AS [2]
			,COALESCE([3], 1) AS [3]
			,COALESCE([4], 1) AS [4]
			,COALESCE([5], 1) AS [5]
			,COALESCE([6], 1) AS [6]
			,COALESCE([7], 1) AS [7]
			,COALESCE([8], 1) AS [8]
	   INTO #categvalues4
	   FROM (
	         SELECT 1  -- to be sure we will have 1 row
		    )f(Flag)
		    LEFT OUTER JOIN
		                   (
					       SELECT Flag, [1], [2], [3], [4], [5], [6], [7], [8]
						  FROM
							 (   --!!!!!! be aware at categories + weigths -> we have to receive it
								SELECT 1 AS Flag, bc.CategoryID, --bc.CategoryAlias, 
								      COALESCE(bcinput.CategoryWeight, bc.CategoryInitValue ) AS CategoryWeight 
								FROM BRD_Category bc
								     LEFT OUTER JOIN #BRDCategoryInput bcinput ON LTRIM(RTRIM(bc.CategoryLongAlias)) =  LTRIM(RTRIM(bcinput.CategoryAlias)) 
								WHERE bc.IsActive = 1
							 ) src
								PIVOT (
								    MAX(CategoryWeight)
								    FOR CategoryID IN ([1],[2],[3],[4],[5],[6],[7],[8])
								    ) AS PivotTable
					    ) cat ON f.Flag = cat.Flag

          SET @RC = @@ROWCOUNT;


          IF(@RC != 1)   
	     BEGIN 
				RAISERROR ('Weight values issues.',  16,  1); 
				RETURN;

	      END;


		 SELECT @Cat1 = [1], @Cat2 = [2], @Cat3 = [3],  @Cat4 = [4], 
		        @Cat5 = [5], @Cat6 = [6], @Cat7 = [7],  @Cat8 = [8]
		 FROM #categvalues4
		 WHERE Flag = 1 ;
         --SELECT @Cat1, @Cat2, @Cat3, @Cat4, @Cat5, @Cat6, @Cat7, @Cat8


        --4. CREATE SCRIPT SLICES 
	       -- 4.1  create script for - get info-1 related to variables according to filters

		  	  SET    @Sql2 = '';
			  SELECT @Sql2 = N' BRD_Variables WHERE 1 = 1 '
			               + CASE  WHEN @VarName   NOT LIKE '\%' ESCAPE'\'   THEN ' AND VarName LIKE ''' +  @VarName + ''''  
							       ELSE ' '
						     END	
						   + CASE @OnlyCopyFlag
							       WHEN 1 THEN  ' AND CopyName IS NOT NULL '
							       ELSE  ' ' 
						     END
					       + CASE  WHEN  @CopyName  NOT LIKE '\%' ESCAPE'\'   THEN ' AND CopyName LIKE '''  +  @CopyName + ''''  
                                   ELSE ' '
						      END  
						   + CASE  WHEN @ProgName   NOT LIKE '\%' ESCAPE'\'   THEN ' AND ProgName LIKE '''  +  @ProgName + ''''  
						           ELSE ' '
						   END 
						    + CASE  WHEN @RecordName NOT LIKE '\%' ESCAPE'\'   THEN ' AND RecordName LIKE ''' +  @RecordName + ''''  
							   ELSE ' '
						   END ; 		  
			 -- SELECT @Sql2;




			    --4.3. create script for VARIABLE USAGE STATISTICS
			   SET    @Sql3 = '';
			   SELECT @Sql3 = N' SELECT v.VarName ,vus.IsFromCopy ,vus.DNrStmtCalc AS NrStmtCalc ,vus.DNrStmtDB AS NrStmtDB
			                       ,(vus.DNrStmtCond   + vus.INrStmtCond)   AS NrStmtCond
								   ,(vus.DNrStmtFile   + vus.INrStmtFile)   AS NrStmtFile 
								   ,(vus.DNrStmtMQ     + vus.INrStmtMQ)     AS NrStmtMQ
								   ,(vus.DNrStmtScreen + vus.INrStmtScreen) AS NrStmtScreen
			                    FROM BRD_Variables v
						          INNER JOIN BRD_VariableUsageStatistics vus ON v.VarID = vus.VarID '
						       + CASE  WHEN @VarName     NOT LIKE '\%' ESCAPE'\'   THEN ' AND v.VarName LIKE ''' +  @VarName + ''''  
									   ELSE ' '
								 END	
							    + CASE @OnlyCopyFlag
							           WHEN 1 THEN  ' AND v.CopyName IS NOT NULL '
							           ELSE  ' ' 
						          END	 
								+ CASE  WHEN  @CopyName  NOT LIKE '\%' ESCAPE'\'   THEN ' AND v.CopyName LIKE '''  +  @CopyName + ''''  
									    ELSE ' '
								   END  
								 + CASE  WHEN @ProgName   NOT LIKE '\%' ESCAPE'\'   THEN ' AND v.ProgName LIKE '''  +  @ProgName + ''''  
										 ELSE ' '
								   END 
								 + CASE  WHEN @RecordName NOT LIKE '\%' ESCAPE'\'   THEN ' AND v.RecordName LIKE ''' +  @RecordName + ''''  
									     ELSE ' '
								   END   ; 
                   -- SELECT @Sql3;



               --4.4. create script to cumulate VARIABLE USAGE STATISTICS
		    SET @Sql4 = '';
		    SET @Sql4 = N' INSERT INTO #varres4 
					    SELECT VarName, NrCalc, NrCond, NrDB, NrFile, NrMQ, NrScreen,  
						    /*ROUND((NrCalc + NrCond + NrDB + NrFile + NrMQ + NrScreen), 0) AS Total,
						    ROUND((NrCalc_W + NrCond_W + NrDB_W + NrFile_W + NrMQ_W + NrScreen_W), 0) AS Total_W,*/
						    ROW_NUMBER() OVER(ORDER BY NrCalc_W + NrCond_W + NrDB_W + NrFile_W + NrMQ_W + NrScreen_W DESC, VarName) AS RN
						FROM( SELECT  s.VarName AS VarName
						      	,COALESCE(SUM( s.NrStmtCalc ), 0 ) AS  NrCalc
								,COALESCE(SUM( s.NrStmtCond ), 0 ) AS  NrCond
								,COALESCE(SUM( s.NrStmtDB   ), 0 ) AS  NrDB
								,COALESCE(SUM( s.NrStmtFile ), 0 ) AS  NrFile
								,COALESCE(SUM( s.NrStmtMQ   ), 0 ) AS  NrMQ
								,COALESCE(SUM( s.NrStmtScreen), 0 ) AS  NrScreen
								,COALESCE(SUM( ( CASE s.IsFromCopy WHEN 1 THEN ' + CAST(@Cat8 AS VARCHAR(20)) + '  ELSE 1 END )  *  ' + CAST(@Cat1 AS VARCHAR(20)) + ' * s.NrStmtCalc ), 0 ) AS  NrCalc_W
								,COALESCE(SUM( ( CASE s.IsFromCopy WHEN 1 THEN ' + CAST(@Cat8 AS VARCHAR(20)) + '  ELSE 1 END )  *  ' + CAST(@Cat2 AS VARCHAR(20)) + ' * s.NrStmtCond ), 0 ) AS  NrCond_W
								,COALESCE(SUM( ( CASE s.IsFromCopy WHEN 1 THEN ' + CAST(@Cat8 AS VARCHAR(20)) + '  ELSE 1 END )  *  ' + CAST(@Cat3 AS VARCHAR(20)) + ' * s.NrStmtDB   ), 0 ) AS  NrDB_W
								,COALESCE(SUM( ( CASE s.IsFromCopy WHEN 1 THEN ' + CAST(@Cat8 AS VARCHAR(20)) + '  ELSE 1 END )  *  ' + CAST(@Cat4 AS VARCHAR(20)) + ' * (s.NrStmtFile )), 0 ) AS  NrFile_W
								,COALESCE(SUM( ( CASE s.IsFromCopy WHEN 1 THEN ' + CAST(@Cat8 AS VARCHAR(20)) + '  ELSE 1 END )  *  ' + CAST(@Cat5 AS VARCHAR(20)) + ' * (s.NrStmtMQ )), 0 )  AS  NrMQ_W
								,COALESCE(SUM( ( CASE s.IsFromCopy WHEN 1 THEN ' + CAST(@Cat8 AS VARCHAR(20)) + '  ELSE 1 END )  *  ' + CAST(@Cat6 AS VARCHAR(20)) + ' * (s.NrStmtScreen)), 0 ) AS  NrScreen_W
						    FROM    (
								    ' + @Sql3 + '
								   ) s	   							
							 GROUP BY s.VarName
						)src1 ';
                   --SELECT @Sql4;


			

		    --4.5. create script for VARIABLE COUNT + Prog
		    SET @Sql5 = '';
		    SET @Sql5 = N' INSERT INTO #varprog4(VarName, NrVar, NrProg)
			              SELECT v.VarName, COUNT(DISTINCT v.VarID) AS NrVar, SUM(v.DirectIndirectDistProgNr) AS NrProg              
					      FROM ( SELECT VarID, VarName, DirectIndirectDistProgNr FROM ' + @Sql2 + ' )  v 
					            INNER JOIN #varres4 vr ON v.VarName = vr.VarName
											AND vr.RN BETWEEN ' + CAST(COALESCE(@StartPosition, 0) AS VARCHAR(20)) +  ' AND ' + CAST(COALESCE((@StartPosition + @NumberOfRows - 1), 0) AS VARCHAR(20)) + ' 
						GROUP BY v.VarName	' ; 
              -- SELECT @Sql5;




               --4.6. create script for VARIABLE HASH OUTPUT
		    SET @Sql6 = '';
		    SET @Sql6 = N' INSERT INTO #BRDVariableHashOutput(VarName, VarHash)
			               SELECT v.VarName, v.VariableHash
				           FROM ( SELECT VarName, VariableHash FROM ' + @Sql2 + ' )  v 
					            INNER JOIN #varres4 vr ON v.VarName = vr.VarName
											AND vr.RN BETWEEN ' + CAST(COALESCE(@StartPosition, 0) AS VARCHAR(20)) +  ' AND ' + CAST(COALESCE((@StartPosition + @NumberOfRows - 1), 0) AS VARCHAR(20)) + ' ' ;

             --SELECT @Sql6;




		      --5. GET USAGE STATISTICS FOR VARIABLES 
			 IF OBJECT_ID('tempdb..#varres4') IS NOT NULL DROP TABLE #varres4;
		      CREATE TABLE #varres4(VarName VARCHAR(250) 
		                  ,NrCalc INTEGER, NrCond INTEGER, NrDB INTEGER, NrFile INTEGER, NrMQ INTEGER, NrScreen INTEGER 
					   --,Total INTEGER, Total_W INTEGER 
					   ,RN INTEGER); 
			 --CREATE NONCLUSTERED INDEX ncidx_varres4_VarName ON #varres4 (VarName);
                --CREATE NONCLUSTERED INDEX ncidx_varres4_RN ON #varres4 (RN) INCLUDE (VarName);
                EXECUTE SP_EXECUTESQL @Sql4;
                SET @RC1 = COALESCE(@@ROWCOUNT, 0);
                --PRINT @RC1 
				--PRINT (@StartPosition + @NumberOfRows - 1)

			 --6. GET ADDITIONAL VARNAME IF NECESSARY 
			 IF ( 
			      (@StartPosition + @NumberOfRows - 1) > 0
			       AND
			       @RC1 < (@StartPosition + @NumberOfRows - 1)
				 )
                BEGIN
			       	    SET @Sql7 = '';
			 			SELECT @Sql7 = N' INSERT INTO #varres4
									   SELECT VarName,  0 AS NrCalc, 0 AS NrCond, 0 AS NrDB, 0 AS NrFile, 0 AS NrMQ, 0 AS NrScreen, /*0 AS Total, 0 AS Total_W,*/ ' 
									          + CAST(@RC1 AS VARCHAR(20)) + ' + ROW_NUMBER() OVER(ORDER BY VarName) AS RN
									   FROM (
											 SELECT  DISTINCT TOP ' + CAST(ABS(COALESCE(NULLIF(((@StartPosition + @NumberOfRows - 1) - @RC1), 0), 1)) AS VARCHAR(20)) + ' VarName 
											 FROM ' + @Sql2 +  '
											 AND VarName NOT IN ( SELECT VarName FROM #varres4) 
											 ORDER BY VarName '  
										+ ' ) src1 ' ;
						  --SELECT @Sql7 ;
			 
			              EXECUTE SP_EXECUTESQL @Sql7;
                          SET @RC2 = COALESCE(@@ROWCOUNT, 0);

			    END; 




			 --8. Get NrVar and NrProg
			   IF OBJECT_ID('tempdb..#varprog4') IS NOT NULL DROP TABLE #varprog4;
		       CREATE TABLE #varprog4 (VarName VARCHAR(250), NrVar INTEGER, NrProg INTEGER); 
               EXECUTE SP_EXECUTESQL @Sql5;
			   --PRINT @Sql5;

	           --9. GET VarName and VarHash for variables directed on output  
                TRUNCATE TABLE #BRDVariableHashOutput;
		        EXECUTE SP_EXECUTESQL @Sql6;
	            --PRINT @Sql6;

	            --10. Get Total Number of distinct variables
			   SET @Sql1 = '';
			   SET @Sql1 = 'SELECT @tvn =  COUNT(DISTINCT VarName) FROM ' + @Sql2 ;
			   EXECUTE SP_EXECUTESQL @Sql1 , N'@tvn INTEGER OUT',@totalvarnumber  OUT;
			   SET @totalvarnumber = COALESCE(@totalvarnumber, 0);
			  --PRINT @totalvarnumber;


			 --11.OUTPUT 
			 SELECT /*@Project_UUID AS Project_UUID, */
				    s1.VarName, s1.NrCalc, s1.NrCond, s1.NrDB, s1.NrFile, s1.NrMQ, s1.NrScreen, s2.NrProg, s2.NrVar 
				    --,s1.Total, s1.Total_W
				    ,s1.RN 
				    ,@totalvarnumber /*@RC1 + @RC2*/ AS NR 
			 FROM (			 
				    SELECT VarName, NrCalc, NrCond, NrDB, NrFile, NrMQ, NrScreen, --Total, Total_W,
				    RN 
				    FROM #varres4 
				    WHERE RN BETWEEN  @StartPosition  AND (@StartPosition + @NumberOfRows - 1) 
				 )s1
				   INNER JOIN #varprog4 s2 ON s1.VarName = s2.VarName				 
			  ORDER BY s1.RN
			  OPTION(FAST 500) ;	


	
	  --5.CLEANUP
	 IF OBJECT_ID('tempdb..#categvalues4') IS NOT NULL DROP TABLE #categvalues4;
	 IF OBJECT_ID('tempdb..#varres4')      IS NOT NULL DROP TABLE #varres4;
	 IF OBJECT_ID('tempdb..#varprog4')     IS NOT NULL DROP TABLE #varprog4;
END;
