AS
BEGIN
SET NOCOUNT ON



--get data in one step (join only one time same big tables)
    IF OBJECT_ID('tempdb..#p') IS NOT NULL DROP TABLE #p
	SELECT
		 p.ProgramID,
		 p.ProgramName,
		 p.Ancestor,
		 p.ProgramTypeID,
		 pt.ProgramType AS ProgramTypeName,
		 occ.StartRow AS ProgStartRow,
		 occ.StartCol AS ProgStartCol,
		 occ.EndRow AS ProgEndRow,
		 occ.EndCol AS ProgEndCol,
		 occ.PathID--pth.PathStr
	INTO #p
	FROM (SELECT p1.ProgramID, AliasName as ProgramName, Ancestor, ProgramTypeID, OccurID FROM dbo.Programs p1 INNER JOIN dbo.ProgramAliases p2 ON p1.ProgramID = p2.ProgramID and p2.AliasType = 0) p
	    INNER JOIN dbo.ProgramTypes pt ON pt.ProgramTypeID = p.ProgramTypeID
	    INNER JOIN dbo.Occurrences occ ON p.OccurID = occ.OccurID
	    --INNER JOIN dbo.Paths pth ON occ.PathID = pth.PathID


  CREATE NONCLUSTERED INDEX ncidx_p
		  ON #p([ProgramID], [ProgramTypeID])
		  INCLUDE (ProgramName, Ancestor, ProgramTypeName, ProgStartRow, ProgStartCol, ProgEndRow, ProgEndCol, PathID /*PathStr*/)

	

IF OBJECT_ID('dbo.cacheEZViewer_Usage_TPMSX') IS NOT NULL  DROP TABLE dbo.cacheEZViewer_Usage_TPMSX
SELECT TPMSXScreenID, TPMSXScreenName,
	  StatementTypeID, StatementTypeName, StatementStartRow, StatementStartColumn, StatementEndRow, StatementEndColumn, pth1.PathStr AS StmtPathStr,
	  ID, ParentName, Ancestor, TypeID, TypeDescription, pth2.PathStr AS Path, ProgStartRow, ProgStartCol, ProgEndRow, ProgEndCol,
	  pth3.PathStr AS ScreenPath, ScreenStartRow, ScreenStartCol, ScreenEndRow, ScreenEndCol
INTO dbo.cacheEZViewer_Usage_TPMSX
FROM (
		  SELECT
			  Resources.ResourceID AS TPMSXScreenID,
			  resources.Name AS TPMSXScreenName,
			  statements.StatementType AS StatementTypeID,
			  Statements.Description AS StatementTypeName,
			  OccurrencesStmt.StartRow AS StatementStartRow,
			  OccurrencesStmt.StartCol AS StatementStartColumn,
			  OccurrencesStmt.EndRow AS StatementEndRow,
			  OccurrencesStmt.EndCol AS StatementEndColumn,
			  OccurrencesStmt.PathID AS StmtPathID,
			  p.ProgramID AS ID,
			  p.ProgramName AS ParentName,
			  p.Ancestor AS Ancestor,
			  p.ProgramTypeID AS TypeID,
			  p.ProgramTypeName as TypeDescription,
			  p.PathID AS PathID,
			  p.ProgStartRow,
			  p.ProgStartCol,
			  p.ProgEndRow,
			  p.ProgEndCol,
			  p2.PathID AS ScreenPathID,
			  ElementSourceInfo.StartRow AS ScreenStartRow,
			  ElementSourceInfo.StartCol AS ScreenStartCol,
			  ElementSourceInfo.EndRow AS ScreenEndRow,
			  ElementSourceInfo.EndCol AS ScreenEndCol
		  FROM #p p
			  INNER JOIN OccurrencesStmt ON p.ProgramID = OccurrencesStmt.ProgID
			  INNER JOIN StatementReference ON StatementReference.OccurID = OccurrencesStmt.OccurID
			  --INNER JOIN Paths AS PathsStmt ON OccurrencesStmt.PathID = PathsStmt.PathID
			  INNER JOIN Statements ON StatementReference.StatementType = Statements.StatementType
			  INNER JOIN Resources ON StatementReference.ResourceID = Resources.ResourceID
			  LEFT JOIN DDCLElement on (DDCLElement.Name = resources.Name AND DDCLElement.DDsTypeId = 14)--screen
			  LEFT JOIN DDCLSourceInfo AS ElementSourceInfo ON DDCLElement.SourceInfo=ElementSourceInfo.Id
			  LEFT OUTER JOIN #p p2 ON ElementSourceInfo.ProgramId=p2.ProgramID 	
		  WHERE StatementReference.ResourceType = 101
			  AND p.ProgramTypeID = 1
			  AND OccurrencesStmt.StatementType IN (1838, 1839)
			  AND p.PathID IS NOT NULL AND OccurrencesStmt.PathID IS NOT NULL

		  UNION
		  SELECT
			  -1 AS TPMSXScreenID,
			  'NA' AS TPMSXScreenName,
			  statements.StatementType AS StatementTypeID,
			  Statements.Description AS StatementTypeName,
			  OccurrencesStmt.StartRow AS StatementStartRow,
			  OccurrencesStmt.StartCol AS StatementStartColumn,
			  OccurrencesStmt.EndRow AS StatementEndRow,
			  OccurrencesStmt.EndCol AS StatementEndColumn,
			  OccurrencesStmt.PathID AS StmtPathID,
			  p.ProgramID AS ID,
			  p.ProgramName AS ParentName,
			  p.Ancestor AS Ancestor,
			  p.ProgramTypeID AS TypeID,
			  p.ProgramTypeName as TypeDescription,
			  p.PathID AS PathID,
			  p.ProgStartRow,
			  p.ProgStartCol,
			  p.ProgEndRow,
			  p.ProgEndCol,
			  null AS ScreenPathID,
			  null AS ScreenStartRow,
			  null AS ScreenStartCol,
			  null AS ScreenEndRow,
			  null AS ScreenEndCol
		  FROM #p p
			  INNER JOIN OccurrencesStmt ON OccurrencesStmt.ProgID = p.ProgramID
			  --INNER JOIN Paths AS PathsStmt ON OccurrencesStmt.PathID = PathsStmt.PathID
			  INNER JOIN Statements ON OccurrencesStmt.StatementType = Statements.StatementType
		  WHERE (p.ProgramTypeID = 1)
		  AND (OccurrencesStmt.StatementType IN (1838, 1839))
            AND
			  (
				  OccurrencesStmt.OccurID NOT IN
				  (
     			   SELECT
     				   OccurID
     			   FROM StatementReference
     			   WHERE (ResourceType = 101)
				  )
			  )
            AND p.PathID IS NOT NULL AND OccurrencesStmt.PathID IS NOT NULL

		  --add ddcl components DIALOGUE and EXCHANGE that relate to the screen
		  UNION
		  SELECT
			  DDCLElement.Id AS TPMSXScreenID,
			  DDCLValue.ReferenceName AS TPMSXScreenName,
			  null AS StatementTypeID,
			  'DISPLAY-STRUCTURE' AS StatementTypeName,
			  CallSourceInfo.StartRow AS StatementStartRow,
			  CallSourceInfo.StartCol AS StatementStartColumn,
			  CallSourceInfo.EndRow AS StatementEndRow,
			  CallSourceInfo.EndCol AS StatementEndColumn,
			  p3.PathID AS StmtPathID,
			  DDCLValue.ElementId AS ID,
			  DDCLElementParent.Name AS ParentName,
			  null AS Ancestor,
			  DDCLElementParent.DdsTypeId AS TypeID,
			  DDCLDdsType.Description as TypeDescription,
			  p2.PathID AS PathID,
			  ParentSourceInfo.StartRow AS ProgStartRow,
			  ParentSourceInfo.StartCol AS ProgStartCol,
			  ParentSourceInfo.EndRow AS ProgEndRow,
			  ParentSourceInfo.EndCol AS ProgEndCol,
			  p1.PathID AS ScreenPathID,
			  ElementSourceInfo.StartRow AS ScreenStartRow,
			  ElementSourceInfo.StartCol AS ScreenStartCol,
			  ElementSourceInfo.EndRow AS ScreenEndRow,
			  ElementSourceInfo.EndCol AS ScreenEndCol
		  FROM DDCLElement
			  RIGHT JOIN DDCLValue ON DDCLElement.Name=DDCLValue.ReferenceName AND DDCLElement.DdsTypeId=DDCLValue.ReferenceDdsTypeId
			  INNER JOIN DDCLProperty ON DDCLValue.PropertyId=DDCLProperty.Id
			  INNER JOIN DDCLElement AS DDCLElementParent ON DDCLValue.ElementId=DDCLElementParent.Id
			  INNER JOIN DDCLDdsType ON DDCLElementParent.DdsTypeId = DDCLDdsType.id
			  LEFT JOIN DDCLSourceInfo AS ElementSourceInfo ON DDCLElement.SourceInfo=ElementSourceInfo.Id
			  LEFT OUTER JOIN #p p1 ON ElementSourceInfo.ProgramId=p1.ProgramID
			  LEFT JOIN DDCLSourceInfo AS ParentSourceInfo ON DDCLElementParent.SourceInfo= ParentSourceInfo.Id
			  LEFT OUTER JOIN #p p2 ON ParentSourceInfo.ProgramId = p2.ProgramID
			  INNER JOIN DDCLSourceInfo AS CallSourceInfo ON DDCLValue.SourceInfo=CallSourceInfo.Id
			  INNER JOIN #p p3 ON CallSourceInfo.ProgramId = p3.ProgramID
		  WHERE (DDCLValue.ReferenceDdsTypeId=14)
			  AND (DDCLProperty.Name='DISPLAY-STRUCTURE')
			  AND (DDCLElementParent.DdsTypeId=26--dialogue
					  OR DDCLElementParent.DdsTypeId=16)--exchange
			  AND p3.PathID IS NOT NULL
		
		  UNION
		  SELECT
			  DDCLElement_SCREEN.Id AS TPMSXScreenID,
			  DDCLElement_SCREEN.Name AS TPMSXScreenName,
			  null AS StatementTypeID,
			  'DISPLAY-STRUCTURE' AS StatementTypeName,
			  CallSourceInfo.StartRow AS StatementStartRow,
			  CallSourceInfo.StartCol AS StatementStartColumn,
			  CallSourceInfo.EndRow AS StatementEndRow,
			  CallSourceInfo.EndCol AS StatementEndColumn,
			  p3.PathID AS StmtPathID,
			  DDCLElementParent.Id AS ID,
			  DDCLElementParent.Name AS ParentName,
			  null AS Ancestor,
			  DDCLElementParent.DdsTypeId AS TypeID,
			  DDCLDdsType.Description as TypeDescription,
			  p2.PathID AS PathID,
			  ParentSourceInfo.StartRow AS ProgStartRow,
			  ParentSourceInfo.StartCol AS ProgStartCol,
			  ParentSourceInfo.EndRow AS ProgEndRow,
			  ParentSourceInfo.EndCol AS ProgEndCol,
			  p1.PathID AS ScreenPathID,
			  ElementSourceInfo.StartRow AS ScreenStartRow,
			  ElementSourceInfo.StartCol AS ScreenStartCol,
			  ElementSourceInfo.EndRow AS ScreenEndRow,
			  ElementSourceInfo.EndCol AS ScreenEndCol
		  FROM DDCLElement AS DDCLElement_SCREEN
			  INNER JOIN DDCLValue AS DDCLValue_1 ON DDCLElement_SCREEN.Id = DDCLValue_1.ElementId
			  INNER JOIN DDCLProperty AS DDCLProperty_1 ON DDCLValue_1.PropertyId=DDCLProperty_1.Id
			  INNER JOIN DDCLValue AS DDCLValue_2 ON DDCLValue_1.ReferenceName=DDCLValue_2.ReferenceName
			                                         AND  DDCLValue_1.ReferenceDdsTypeId=DDCLValue_2.ReferenceDdsTypeId
			  INNER JOIN DDCLProperty AS DDCLProperty_2 ON DDCLValue_2.PropertyId=DDCLProperty_2.Id
			  INNER JOIN DDCLElement AS DDCLElementParent ON DDCLValue_2.ElementId=DDCLElementParent.Id
			  INNER JOIN DDCLDdsType ON DDCLElementParent.DdsTypeId = DDCLDdsType.id
			  INNER JOIN DDCLSourceInfo AS ElementSourceInfo ON DDCLElement_SCREEN.SourceInfo=ElementSourceInfo.Id
			  INNER JOIN #p p1 ON ElementSourceInfo.ProgramId=p1.ProgramID
			  LEFT JOIN DDCLSourceInfo AS ParentSourceInfo ON DDCLElementParent.SourceInfo= ParentSourceInfo.Id
			  LEFT OUTER JOIN #p p2 ON ParentSourceInfo.ProgramId=p2.ProgramID
			  INNER JOIN DDCLSourceInfo AS CallSourceInfo ON DDCLValue_1.SourceInfo=CallSourceInfo.Id
			  INNER JOIN #p p3 ON CallSourceInfo.ProgramId=p3.ProgramID
		  WHERE (DDCLElement_SCREEN.DdsTypeId=14)
			  AND (DDCLValue_1.ReferenceDdsTypeId=15)
			  AND (DDCLProperty_1.Name='DISPLAY-STRUCTURE')
			  AND (DDCLValue_2.ReferenceDdsTypeId=15)
			  AND (DDCLProperty_2.Name='DISPLAY-STRUCTURE')
			  AND (DDCLElementParent.DdsTypeId=16--exchange
					  OR DDCLElementParent.DdsTypeId=26)--dialogue
                 AND p1.PathID IS NOT NULL
			  AND p3.PathID IS NOT NULL
	)s
	LEFT OUTER JOIN dbo.Paths pth1 ON s.StmtPathID = pth1.PathID
	LEFT OUTER JOIN dbo.Paths pth2 ON s.PathID = pth2.PathID
	LEFT OUTER JOIN dbo.Paths pth3 ON s.ScreenPathID = pth3.PathID

 	
END