Reporting > Native reporting system > How to use subreports > Example 5: Using subreports at multiple levels
  
Example 5: Using subreports at multiple levels
This example multi-level report explores Activity-ActivityPerformedByPerformer-Performer:
REPORT "Multi-level, no subreports - Activity-APBP-Performer"
ID 60474
{
SETTING { DECIMALSEPARATOR "." }
SETTING { LISTSEPARATOR "," }
SETTING { MEASUREMENT METRIC }
SETTING { PAGESIZE -1", 0.00 }
SETTING { HEADER 1 "t" }
SETTING { REPORTFORMAT 20 }
SETTING { EXTRACTFILE "test" }
SETTING { STYLESHEETFILE "Reports\StyleSht\default.xsl" }
TABULAR 1
{
SELECT "Name" LEGEND "Activity", "Type"
WHERE Class = Definition
WHERE "Type Number" = 1326
ORDERBY "Name"
JOIN
WHERE REFERENCEDBY = "Activity"
JOIN
SELECT "Name" LEGEND "APBP"
WHERE Class = Definition
WHERE "Type Number" = 1380
ORDERBY "Name"
JOIN
WHERE REFERENCES = "Performer"
JOIN
SELECT "Name" LEGEND "Performer", "Type"
WHERE Class = Definition
WHERE "Type Number" = 1367
ORDERBY "Name"
}
}
This graphic is described in the surrounding text.
Using subreports this is, minimally:
REPORT "main: Multi-level, 1-level each: Activity Report"
{
FONT "Font4" { NAME "Courier" HEIGHT 12 }
SETTING { DECIMALSEPARATOR "." }
SETTING { LISTSEPARATOR "," }
SETTING { MEASUREMENT ENGLISH }
SETTING { PAGESIZE -1", 0.00 }
SETTING { HEADER 1 "OV-03 Need Line" }

TABULAR 1
{
SELECT "Name" LEGEND "Activity"
WHERE Class = Definition
WHERE "Type Number" = 1326 REM "Activity"
ORDERBY "Name"
SUBREPORT "Subreport: Activity-APBP Report" { }
}
}
REPORT "Subreport: Activity-APBP Report"
{
FONT "Font4" { NAME "Courier" HEIGHT 12 }
SETTING { DECIMALSEPARATOR "." }
SETTING { LISTSEPARATOR "," }
SETTING { MEASUREMENT ENGLISH }
SETTING { PAGESIZE -1", 0.00 }
SETTING { HEADER 1 "OV-03 Need Line" }

TABULAR 1
{
ORDERBY "Name"

JOIN
WHERE REFERENCEDBY = "Activity"
JOIN

SELECT "Name" LEGEND "APBP"
WHERE Class = Definition
WHERE "Type Number" = 1380 REM "APBP"
ORDERBY "Name"
SUBREPORT "Subreport: APBP-Perf Report" { }
}
}
REPORT "Subreport: APBP-Perf Report"
{
FONT "Font4" { NAME "Courier" HEIGHT 12 }
SETTING { DECIMALSEPARATOR "." }
SETTING { LISTSEPARATOR "," }
SETTING { MEASUREMENT ENGLISH }
SETTING { PAGESIZE -1", 0.00 }
SETTING { HEADER 1 "OV-03 Need Line" }

TABULAR 1
{
ORDERBY "Name"

WHERE Class = Definition
WHERE "Type Number" = 1380 REM "APBP"

JOIN
WHERE REFERENCES = "Performer"
JOIN

SELECT "Name" LEGEND "Performer"
ORDERBY "Name"
}
}
This lists all Activities regardless of whether they are linked with an ActivityPerformedByPerformer.
This graphic is described in the surrounding text.
...
This graphic is described in the surrounding text.
This modification shows how you can add constraints that affect the results. It is rather wasted in this case, but it shows what happens:
REPORT "main: Multi-level, 1-level each: Activity Report - constrained"
{
FONT "Font4" { NAME "Courier" HEIGHT 12 }
SETTING { DECIMALSEPARATOR "." }
SETTING { LISTSEPARATOR "," }
SETTING { MEASUREMENT ENGLISH }
SETTING { PAGESIZE -1", 0.00 }
SETTING { HEADER 1 "OV-03 Need Line" }

TABULAR 1
{
SELECT "Name" LEGEND "Activity"
WHERE Class = Definition
WHERE "Type Number" = 1326 REM "Activity"
ORDERBY "Name"
SUBREPORT "Subreport: Activity-APBP Report" { }

JOIN
WHERE REFERENCEDBY = "Activity"
JOIN

WHERE Class = Definition
WHERE "Type Number" = 1380

JOIN
WHERE REFERENCES = "Performer"
JOIN

WHERE Class = Definition
WHERE "Type Number" = 1367
}
}
This graphic is described in the surrounding text.
This shows what happens if selections are made from the main report at the lower levels:
REPORT "main: Multi-level, 1-level each: Activity Report - constrained with selections"
{
FONT "Font4" { NAME "Courier" HEIGHT 12 }
SETTING { DECIMALSEPARATOR "." }
SETTING { LISTSEPARATOR "," }
SETTING { MEASUREMENT ENGLISH }
SETTING { PAGESIZE -1", 0.00 }
SETTING { HEADER 1 "OV-03 Need Line" }

TABULAR 1
{
SELECT "Name" LEGEND "Activity"
WHERE Class = Definition
WHERE "Type Number" = 1326 REM "Activity"
ORDERBY "Name"
SUBREPORT "Subreport: Activity-APBP Report" { }

JOIN
WHERE REFERENCEDBY = "Activity"
JOIN

SELECT "Name" LEGEND "APBP"
WHERE Class = Definition
WHERE "Type Number" = 1380
ORDERBY "Name"

JOIN
WHERE REFERENCES = "Performer"
JOIN

SELECT "Name" LEGEND "Performer", "Type"
WHERE Class = Definition
WHERE "Type Number" = 1367
ORDERBY "Name"
}
}
The APBP, Performer and Type columns are sourced from the levels of the main report.
The APBP and Performer columns following those are sourced from the subreports:
This graphic is described in the surrounding text.
Related topics
Report specification requirements
Example 1: 1-level main with 1-level subreport
Example 2: Multi-level main with 1-Level subreport
Example 3: 1-level main with multi-level subreport
Example 4: Multi-level main with multi-level subreport
Example 6: Pass DDID by parameter
Example 7: Subreport by property and class, type restriction
Report output differences
Sample subreport files
Parent topic
How to use subreports