@Project_UUID_IN VARCHAR(255),
@VarName_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;
			  DECLARE @Project_UUID VARCHAR(255);
			  DECLARE @VarName VARCHAR(250);
			  DECLARE @ResourceTypeID_Prog INTEGER = (SELECT TOP 1 ResourceID FROM ResourceTypes WHERE Name = 'PROGRAM') ;

	

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

			 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. DETERMINE Variable based on filters
		   IF OBJECT_ID('tempdb..#varf5') IS NOT NULL DROP TABLE #varf5;
		   CREATE TABLE #varf5 (VarID INTEGER NOT NULL PRIMARY KEY) ;
	
		   INSERT INTO #varf5(VarID)
		   SELECT v.VarID
		   FROM BRD_Variables v 
		   WHERE v.VarName  = @VarName
		         AND EXISTS (SELECT 1 FROM #BRDVariableHashInput hi WHERE v.VariableHash = hi.VarHash)
	   



				
	      --4. DETERMINE STATEMENTS for VARIABLES
		  IF OBJECT_ID('tempdb..#varres5') IS NOT NULL DROP TABLE #varres5;
		  SELECT  rd.ResourceName AS ProgramName, src1.ProgID, src1.PathID, src1.StatementTypeID, src1.StatementCategory, src1.StartRow, src1.EndRow, src1.StartCol, src1.EndCol, src1.OccurID 
		          ,COALESCE(bc.CategoryShortAlias, '') AS StatementMark
				,src1.VarID ,src1.OrigVarID
		          ,ROW_NUMBER() OVER(ORDER BY rd.ResourceName, src1.ProgID, src1.PathID, src1.StatementTypeID, src1.StatementCategory, src1.StartRow, src1.EndRow, src1.StartCol, src1.EndCol, src1.StatementMark, src1.OccurID, src1.VarID ,src1.OrigVarID) AS RN
		  INTO #varres5 
		  FROM (
						  SELECT 'D' AS StatementCategory
								,ds.VarID
								,ds.VarID AS OrigVarID
								,ds.StatementTypeID
								,ds.ProgID
								,ds.PathID
								,ds.StartRow
								,ds.EndRow
								,ds.StartCol
								,ds.EndCol
								,ds.OccurID
								,CASE
								     WHEN ds.IsCalculation = 1 THEN 1
									WHEN ds.IsCondition = 1 THEN 2	
									WHEN ds.IsDBIO  = 1 THEN 3	
									WHEN ds.IsFileIO = 1 THEN 4
									WHEN ds.IsMQ = 1 THEN 5	
									WHEN ds.IsScreen = 1 THEN 6
									WHEN ds.IsAssignment = 1 THEN 7
									ELSE NULL
								 END AS StatementMark
						  FROM BRD_DirectStatements ds
							 WHERE EXISTS (SELECT 1 FROM #varf5 v WHERE ds.VarID = v.VarID)

						  UNION 

						  SELECT 'I' AS StatementCategory
								,vh.ChildVarID AS VarID
								,ds.VarID AS OrigVarID
								,ds.StatementTypeID
								,ds.ProgID
								,ds.PathID
								,ds.StartRow
								,ds.EndRow
								,ds.StartCol
								,ds.EndCol
								,ds.OccurID
								,CASE
									WHEN ds.IsFileIO = 1 THEN 4
									WHEN ds.IsMQ = 1 THEN 5	
									WHEN ds.IsScreen = 1 THEN 6
									WHEN ds.Is88VarLvlCondition = 1 THEN 2
									ELSE NULL
								  END AS StatementMark
						  FROM BRD_DirectStatements ds
							 INNER JOIN BRD_VariableHierarchy vh ON ds.VarID = vh.VarID 
			                 WHERE EXISTS (SELECT 1 FROM #varf5 v WHERE vh.ChildVarID = v.VarID)
								AND (ds.IsFileIO + ds.IsMQ + ds.IsScreen + ds.Is88VarLvlCondition > 0) 
			    )src1
				 INNER JOIN BRD_ResourceDetails rd ON rd.ResourceID = src1.ProgID  AND rd.ResourceTypeID = @ResourceTypeID_Prog
				 LEFT OUTER JOIN BRD_Category bc ON bc.CategoryID = src1.StatementMark AND bc.IsActive = 1 ;
		    
		        SET @RC = @@ROWCOUNT;  	  



                   -- 5.OUTPUT
				   SELECT
				        /*@Project_UUID AS Project_UUID,*/
					   src.ProgramName
					   ,src.ProgID AS ProgramID
				       ,pth.PathStr
					   ,src.OccurID
					   ,st.Description
					   ,src.StatementCategory
					   ,src.StartRow   
					   ,src.EndRow
					   ,src.StartCol  
					   ,src.EndCol
					   ,v.VarName AS VarName
					   ,v.VariableHash AS Variable_UUID
					   --,CASE WHEN v.RootVarID > 0 THEN 'TRUE' ELSE 'FALSE' END AS IsRecord
					   --,src.VarID
					   --,src.OrigVarID
					   ,src.StatementMark
					   ,src.RN
					   ,@RC AS NR
				    FROM (
						  SELECT ProgramName, ProgID, PathID, StatementTypeID,  StatementCategory,  StartRow, EndRow, StartCol, EndCol, StatementMark, OccurID, /*VarID,*/ OrigVarID, RN			
						  FROM  #varres5
						  WHERE RN BETWEEN  @StartPosition  AND (@StartPosition + @NumberOfRows - 1) 
								 
						)src
						     INNER JOIN BRD_Variables v ON v.VarID = src.OrigVarID -- src.VarID
							 INNER JOIN Statements st ON st.StatementType = src.StatementTypeID
							 INNER JOIN BRD_Paths pth ON pth.PathID = src.PathID
 						 ORDER BY src.RN
						 OPTION(FAST 500);
					  


               --6.CLEANUP
				IF OBJECT_ID('tempdb..#varf5') IS NOT NULL DROP TABLE #varf5;
				IF OBJECT_ID('tempdb..#varres5') IS NOT NULL DROP TABLE #varres5;
	  

END;
