AS
BEGIN
SET NOCOUNT ON


--get needed data in one step (join only one time the big tables)
-- step 1
IF OBJECT_ID('tempdb.dbo.#jcl') IS NOT NULL DROP TABLE #jcl
     SELECT --DISTINCT
	       JCLJob.JobName,
	       JCLDD.DDName,
		  NULLIF(DDPosition.ResourceFilePath, '0')  AS DDPath,
            DDPosition.StartRow AS DDStartRow,
	       JCLStep.CalledPgmID,
		  JCLDDRef.DataSetID,
	       JCLDDRef.MemberName
     INTO #jcl
	FROM  JCLJob
             INNER JOIN dbo.JCLStep ON JCLJob.JobID = JCLStep.JobID
		   INNER JOIN dbo.JCLDD ON JCLStep.StepID = JCLDD.StepID
		   INNER JOIN dbo.JCLPosition AS DDPosition ON DDPosition.PositionID = JCLDD.PositionID
		   INNER JOIN dbo.JCLDDRef ON JCLDD.DDID = JCLDDRef.DDID

		
-- step 2
IF OBJECT_ID('tempdb.dbo.#core') IS NOT NULL DROP TABLE #core
SELECT --DISTINCT
        os.StartRow AS StatementStartRow,
        os.StartCol AS StatementStartColumn,
        os.EndRow AS StatementEndRow,
        os.EndCol AS StatementEndColumn,
	   pth1.PathStr AS StmtPathStr,
	   st.Description,
	   pg1.ProgramID,
        pga1.AliasName as ProgramName,
        pg1.ProgramTypeID,
	   pth2.PathStr AS ProgramPath,
	   occ.StartRow AS ProgStartRow,
        occ.StartCol AS ProgStartCol,
	   occ.EndRow AS ProgEndRow,
	   occ.EndCol AS ProgEndCol,
	   pg1.Ancestor,
	   pg2.ProgramID AS AncestorID,
        pg2.ProgramTypeID AS AncestorTypeID,
	   f.Name AS FileName,
        f.LogicalName AS FileLogicalName,
	   f.TypeCode AS FileTypeCode,
	   COALESCE(NULLIF((REVERSE(SUBSTRING(REVERSE(f.Name ),0, CHARINDEX('-',REVERSE(f.Name ))))),''),f.Name ) AS FileNameflt
INTO #core
FROM dbo.StatementReference sr
     INNER JOIN dbo.Files f ON f.FileID = sr.ResourceID
     INNER JOIN dbo.OccurrencesStmt os ON os.OccurID = sr.OccurID
	INNER JOIN dbo.Statements st ON sr.StatementType = st.StatementType
	INNER JOIN dbo.ProgramAliases pga1 ON pga1.ProgramID = os.ProgID  and pga1.AliasType = 0
        INNER JOIN dbo.Programs pg1 ON pg1.ProgramID = os.ProgID
	LEFT OUTER JOIN ( select DISTINCT AliasName, pga2.ProgramID, tpg2.ProgramTypeID from dbo.ProgramAliases pga2 INNER JOIN
                        dbo.Programs tpg2 ON tpg2.ProgramID = pga2.ProgramId AND tpg2.ProgramTypeID = 8 ) pg2 ON  pg2.AliasName = pg1.Ancestor
     INNER JOIN dbo.Occurrences occ ON occ.OccurID = pg1.OccurID
     INNER JOIN dbo.Paths pth1 ON os.PathID = pth1.PathID
     INNER JOIN dbo.Paths pth2 ON occ.PathID = pth2.PathID
WHERE sr.ResourceType=9


IF OBJECT_ID('dbo.cacheEZViewer_Usage_DSInPrg') IS NOT NULL  DROP TABLE dbo.cacheEZViewer_Usage_DSInPrg

SELECT DataSetName, GenerationNumber, DataSetID, IsTemp, JobName, DDName, LogicalName, DDPath, DDStartRow,
	  ProgramID, ProgramName, ProgramTypeID, ProgramPath, ProgStartRow, ProgStartCol, ProgEndRow, ProgEndCol,
       Ancestor, AncestorID, AncestorTypeID, Description,
	  StatementStartRow, StatementStartColumn, StatementEndRow, StatementEndColumn, StmtPathStr,
       DataSetMemberName
INTO dbo.cacheEZViewer_Usage_DSInPrg
FROM
 (		  SELECT COALESCE(jpds.DataSetName, 'UNKNOWN')AS DataSetName,
			    CASE
				   WHEN jpds.IsGeneration = '1' THEN jpds.GenerationNumber
				   ELSE NULL
			    END AS GenerationNumber,
			    jpds.DataSetID,
			    jpds.IsTemp,
			    jcl.JobName,
			    COALESCE(jcl.DDName, core.FileName) AS DDName,
			    core.FileLogicalName AS LogicalName,
			    jcl.DDPath,
			    jcl.DDStartRow,
			    core.ProgramID,
			    core.ProgramName,
			    core.ProgramTypeID,
			    core.ProgramPath,
			    core.ProgStartRow,
			    core.ProgStartCol,
			    core.ProgEndRow,
			    core.ProgEndCol,
			    core.Ancestor,
			    core.AncestorID,
			    core.AncestorTypeID,
			    core.Description,
			    core.StatementStartRow,
			    core.StatementStartColumn,
			    core.StatementEndRow,
			    core.StatementEndColumn,
			    core.StmtPathStr,
			    jcl.MemberName AS DataSetMemberName
		  FROM #core core
			  LEFT OUTER JOIN dbo.ProgramsUsedInPgm pu ON core.ProgramID = pu.ProgramID
			  LEFT OUTER JOIN #jcl jcl ON pu.JclPgmID = jcl.CalledPgmID
			  LEFT OUTER JOIN JCLPhysicalDataSet jpds ON jcl.DataSetID = jpds.DataSetID
		  WHERE   ( jcl.DDName IS NULL OR core.FileNameflt = jcl.DDName)
				AND (jpds.IsInstream  != 1 OR jpds.IsInstream IS NULL)
				AND core.Description NOT LIKE 'CICS%'

		  UNION
		  SELECT
			    jpds.DataSetName,
			    CASE
				   WHEN jpds.IsGeneration = '1' THEN jpds.GenerationNumber
				   ELSE NULL
			    END AS GenerationNumber,
			    jpds.DataSetID,
			    jpds.IsTemp,
			    jcl.JobName,
			    jcl.DDName,
			    'N/A' AS LogicalName,
			    jcl.DDPath,
			    jcl.DDStartRow,
			    NULL AS ProgramID,
			    jp.PgmName AS ProgramName,
			    jp.PgmType AS ProgramTypeID,
			    NULL AS ProgramPath,
			    NULL AS ProgStartRow,
			    NULL AS ProgStartCol,
			    NULL AS ProgEndRow,
			    NULL AS ProgEndCol,
			    '' AS Ancestor,
			    NULL AS AncestorID,
			    NULL AS AncestorTypeID,
			    'N/A' AS Description,
			    NULL AS StatementStartRow,
			    NULL AS StatementStartColumn,
			    NULL AS StatementEndRow,
			    NULL AS StatementEndColumn,
			    NULL AS StmtPathStr,
			    jcl.MemberName AS DataSetMemberName
		  FROM #jcl jcl
			  INNER JOIN dbo.JCLPhysicalDataSet jpds ON jpds.IsInstream != 1 AND jcl.DataSetID = jpds.DataSetID
			  INNER JOIN dbo.JCLPgm jp ON jcl.CalledPgmID = jp.PgmID
			  LEFT OUTER JOIN (select DISTINCT tpg.OccurID, pa.AliasName as ProgramName, pa.ProgramID from dbo.Programs tpg
                                        INNER JOIN ProgramAliases pa ON pa.ProgramId = tpg.ProgramId) pg ON pg.OccurID != 0 AND jp.PgmName = pg.ProgramName
		  WHERE pg.ProgramID IS NULL

		  UNION
		  SELECT 				
		  		CASE WHEN  mf.DSName IS NULL THEN 'UNKNOWN' 
					 WHEN  mf.DSName='' THEN 'UNKNOWN' 
					 ELSE mf.DSName END  AS DataSetName,
			    NULL AS GenerationNumber,
			    NULL AS [DataSetID],
			    NULL AS IsTemp,
			    NULL AS JobName,
			    'N/A' AS [DDName],
			    core.FileLogicalName AS LogicalName,
			    NULL AS DDPath,
			    NULL AS DDStartRow,
			    core.ProgramID,
			    core.ProgramName,
			    core.ProgramTypeID,
			    core.ProgramPath,
			    core.ProgStartRow,
			    core.ProgStartCol,
			    core.ProgEndRow,
			    core.ProgEndCol,
			    core.Ancestor,
			    core.AncestorID,
			    core.AncestorTypeID,
			    core.Description,
			    core.StatementStartRow,
			    core.StatementStartColumn,
			    core.StatementEndRow,
			    core.StatementEndColumn,
			    core.StmtPathStr,
			    NULL AS DataSetMemberName
		  FROM #core core
			  LEFT OUTER JOIN dbo.MFCICSFile mf ON core.FileName = mf.DDName
		  WHERE  core.FileTypeCode IS NULL
			    AND core.Description LIKE 'CICS%'
    )s

	
END