LANGUAGE SQL
BEGIN

			-- declare temp tables
	                   DECLARE GLOBAL TEMPORARY TABLE session.jcl
		               (
					    JobName VARCHAR(50) ,
						DDName VARCHAR(50) ,
						DDPath VARCHAR(250) ,
						DDStartRow INTEGER ,
						CalledPgmID INTEGER ,
						DataSetID INTEGER ,
						MemberName VARCHAR(50)
		                ) WITH REPLACE 
                          ON COMMIT PRESERVE ROWS
						  NOT LOGGED;
					
					
						DECLARE GLOBAL TEMPORARY TABLE session.core
						(
						StatementStartRow INTEGER ,
						StatementStartColumn INTEGER ,
						StatementEndRow INTEGER ,
						StatementEndColumn INTEGER ,
						StmtPathStr VARCHAR(250) ,
						Description VARCHAR(50) ,
						ProgramID INTEGER ,
						ProgramName VARCHAR(256) ,
						ProgramTypeID INTEGER ,
						ProgramPath VARCHAR(250) ,
						ProgStartRow INTEGER ,
						ProgStartCol INTEGER ,
						ProgEndRow INTEGER ,
						ProgEndCol INTEGER ,
						Ancestor VARCHAR(256) ,
						AncestorID INTEGER ,
						AncestorTypeID INTEGER ,
						FileName VARCHAR(255) ,
						FileLogicalName VARCHAR(255) ,
						FileTypeCode INTEGER
						) WITH REPLACE 
                          ON COMMIT PRESERVE ROWS
						  NOT LOGGED;


					--get needed data in one step (join only one time the big tables)
					-- step 1
						INSERT INTO session.jcl					
						SELECT
							       jj.JobName,
							       jd.DDName,
								   NULLIF(DDPosition.ResourceFilePath, '0')  AS DDPath,
						           DDPosition.StartRow AS DDStartRow,
							       js.CalledPgmID,
								   jr.DataSetID,
							       jr.MemberName
							FROM  JCLJob jj
						           INNER JOIN JCLStep js ON jj.JobID = js.JobID
								   INNER JOIN JCLDD jd ON js.StepID = jd.StepID
								   INNER JOIN JCLPosition AS DDPosition ON DDPosition.PositionID = jd.PositionID
								   INNER JOIN JCLDDRef jr ON jd.DDID = jr.DDID
							WHERE jd.StepID IS NOT NULL
							      AND jr.DDID IS NOT NULL	
								  AND js.JobID IS NOT NULL
								  AND jd.PositionID IS NOT NULL ;
		
					

			
                            -- step 2
							INSERT INTO session.core
							SELECT
							        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
							FROM StatementReference sr
							     INNER JOIN Files f ON f.FileID = sr.ResourceID
							     INNER JOIN OccurrencesStmt os ON os.OccurID = sr.OccurID
								 INNER JOIN Statements st ON sr.StatementType = st.StatementType
								 INNER JOIN ProgramAliases pga1 ON pga1.ProgramID = os.ProgID AND pga1.AliasType = 0
								 INNER JOIN Programs pg1 ON pg1.ProgramID = os.ProgID
								 LEFT OUTER JOIN (
								                   SELECT DISTINCT pga2.ProgramID, pga2.AliasName, tpg2.ProgramTypeID
								                   FROM ProgramAliases pga2
												          INNER JOIN Programs tpg2 ON pga2.ProgramID = tpg2.ProgramID AND  tpg2.ProgramTypeID = 8
												    ) pg2 ON  pg2.AliasName = pg1.Ancestor
							     INNER JOIN Occurrences occ ON occ.OccurID = pg1.OccurID
							     INNER JOIN Paths pth1 ON os.PathID = pth1.PathID
							     INNER JOIN Paths pth2 ON occ.PathID = pth2.PathID
							WHERE sr.ResourceType = 9;


                            BEGIN
						      COMMIT;
							  TRUNCATE TABLE cacheEZViewer_Usage_DSInPrg IMMEDIATE ;
				              --DELETE FROM cacheEZViewer_Usage_DSInPrg ;
				            END;



							INSERT INTO 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
							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, cr.FileName) AS DDName,
										    cr.FileLogicalName AS LogicalName,
										    jcl.DDPath,
										    jcl.DDStartRow,
										    cr.ProgramID,
										    cr.ProgramName,
										    cr.ProgramTypeID,
										    cr.ProgramPath,
										    cr.ProgStartRow,
										    cr.ProgStartCol,
										    cr.ProgEndRow,
										    cr.ProgEndCol,
										    cr.Ancestor,
										    cr.AncestorID,
										    cr.AncestorTypeID,
										    cr.Description,
										    cr.StatementStartRow,
										    cr.StatementStartColumn,
										    cr.StatementEndRow,
										    cr.StatementEndColumn,
										    cr.StmtPathStr,
										    jcl.MemberName AS DataSetMemberName
									  FROM session.core cr
										  LEFT OUTER JOIN ProgramsUsedInPgm pu ON cr.ProgramID = pu.ProgramID
										  LEFT OUTER JOIN session.jcl jcl ON pu.JclPgmID = jcl.CalledPgmID
										  LEFT OUTER JOIN JCLPhysicalDataSet jpds ON jcl.DataSetID = jpds.DataSetID
									  WHERE   (
									             jcl.DDName IS NULL
									  	         OR ( cr.FileName = jcl.DDName
									  	              OR
									  	               cr.FileName LIKE '%-'||  jcl.DDName
									  	               
									  	            )
									  	       )
											AND (jpds.IsInstream  != 1 OR jpds.IsInstream IS NULL)
											AND cr.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,
										    CAST(NULL AS INTEGER) AS ProgramID,
										    jp.PgmName AS ProgramName,
										    jp.PgmType AS ProgramTypeID,
										    CAST(NULL AS VARCHAR(250)) AS ProgramPath,
										    CAST(NULL AS INTEGER) AS ProgStartRow,
										    CAST(NULL AS INTEGER) AS ProgStartCol,
										    CAST(NULL AS INTEGER) AS ProgEndRow,
										    CAST(NULL AS INTEGER) AS ProgEndCol,
										    '' AS Ancestor,
										    CAST(NULL AS INTEGER) AS AncestorID,
										    CAST(NULL AS INTEGER) AS AncestorTypeID,
										    'N/A' AS Description,
										    CAST(NULL AS INTEGER) AS StatementStartRow,
										    CAST(NULL AS INTEGER) AS StatementStartColumn,
										    CAST(NULL AS INTEGER) AS StatementEndRow,
										    CAST(NULL AS INTEGER) AS StatementEndColumn,
										    CAST(NULL AS VARCHAR(250)) AS StmtPathStr,
										    jcl.MemberName AS DataSetMemberName
									  FROM session.jcl jcl
										  INNER JOIN JCLPhysicalDataSet jpds ON jpds.IsInstream != 1 AND jcl.DataSetID = jpds.DataSetID
										  INNER JOIN JCLPgm jp ON jcl.CalledPgmID = jp.PgmID
										  LEFT OUTER JOIN 																		
										                 (
																			 SELECT DISTINCT
																			        p.ProgramID,
																			        --p.Ancestor,
																		            --p.ProgramTypeID,
																		            p.OccurID,
																			        pa.AliasName AS ProgramName
																			 FROM Programs p
																				   INNER JOIN ProgramAliases pa ON p.ProgramID = pa.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,
										    CAST(NULL AS INTEGER) AS GenerationNumber,
										    CAST(NULL AS INTEGER) AS DataSetID,
										    CAST(NULL AS INTEGER) AS IsTemp,
										    CAST(NULL AS VARCHAR(50)) AS JobName,
										    'N/A' AS DDName,
										    cr.FileLogicalName AS LogicalName,
										    CAST(NULL AS VARCHAR(250)) AS DDPath,
										    CAST(NULL AS INTEGER) AS DDStartRow,
										    cr.ProgramID,
										    cr.ProgramName,
										    cr.ProgramTypeID,
										    cr.ProgramPath,
										    cr.ProgStartRow,
										    cr.ProgStartCol,
										    cr.ProgEndRow,
										    cr.ProgEndCol,
										    cr.Ancestor,
										    cr.AncestorID,
										    cr.AncestorTypeID,
										    cr.Description,
										    cr.StatementStartRow,
										    cr.StatementStartColumn,
										    cr.StatementEndRow,
										    cr.StatementEndColumn,
										    cr.StmtPathStr,
										    CAST(NULL AS VARCHAR(50)) AS DataSetMemberName
									  FROM session.core cr
										  LEFT OUTER JOIN MFCICSFile mf ON cr.FileName = mf.DDName
									  WHERE  cr.FileTypeCode IS NULL
										    AND cr.Description LIKE 'CICS%'
							    )s;		




								
END 
