Domain 5 β€” Module 2 of 4 50%
18 of 28 overall
Domain 5: Implement Reporting Free ⏱ ~15 min read

SSRS Reports: Precision Design

Build, design, and deploy SQL Server Reporting Services reports in F&O β€” RDP classes, precision vs auto design, report projects in Visual Studio, and extending standard reports.

Why SSRS is still the backbone of F&O reporting

Simple explanation

Think of a printing press.

Power BI is great for exploring data on screen, but when you need to print something β€” an invoice, a packing slip, a cheque β€” you need a tool that controls exactly where every line, logo, and number appears on the page. That’s SSRS.

SSRS is the printing press of F&O. You design the exact layout in Visual Studio, feed it data from an X++ class, and it produces pixel-perfect PDF, Word, or Excel documents every time.

Precision design vs auto design

Every SSRS report in F&O uses one of two design approaches:

Auto design = quick internal lists. Precision design = polished external documents.
AspectAuto DesignPrecision Design
Layout creationGenerated automatically from dataset fieldsManually designed in RDLC designer (Visual Studio)
Control over placementMinimal β€” columns render in orderComplete β€” every textbox, image, line is placed precisely
Use caseSimple tabular lists, internal reportsInvoices, cheques, packing slips, any externally-facing document
Grouping / subtotalsBasic grouping supportedFull control: nested groups, conditional visibility, sub-reports
Effort to buildLow β€” drag dataset, doneHigher β€” manual layout, expressions, formatting
Modification approachChange dataset or queryEdit .rdl XML or use VS designer
Exam tip: When to pick which design

The exam tests this distinction. Rule of thumb:

  • β€œThe report must match an existing printed form layout exactly” β†’ Precision design
  • β€œThe report shows a simple list of records for internal review” β†’ Auto design
  • β€œThe customer invoice must include a company logo at specific coordinates” β†’ Precision design
  • β€œA developer needs a quick data dump to verify business logic” β†’ Auto design

Building an SSRS report: the full pipeline

Here’s the end-to-end flow for creating a custom SSRS report:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 1. Contract  │───▢│ 2. RDP      │───▢│ 3. Report    │───▢│ 4. Menu Item β”‚
β”‚    Class     β”‚    β”‚    Class    β”‚    β”‚    Design    β”‚    β”‚   + Privilege β”‚
β”‚ (parameters) β”‚    β”‚ (data logic)β”‚    β”‚  (VS .rdl)   β”‚    β”‚  (security)  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                              β”‚
                                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                    β”‚ 5. Deploy to       β”‚
                                    β”‚    Report Server   β”‚
                                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Step 1: Contract class (parameters)

The contract class defines what the user enters before running the report.

[DataContractAttribute]
class PFProductionReportContract
{
    TransDate   fromDate;
    TransDate   toDate;
    ProdPoolId  prodPool;

    [DataMemberAttribute('FromDate'),
     SysOperationLabelAttribute(literalStr("From date"))]
    public TransDate parmFromDate(TransDate _fromDate = fromDate)
    {
        fromDate = _fromDate;
        return fromDate;
    }

    [DataMemberAttribute('ToDate'),
     SysOperationLabelAttribute(literalStr("To date"))]
    public TransDate parmToDate(TransDate _toDate = toDate)
    {
        toDate = _toDate;
        return toDate;
    }

    [DataMemberAttribute('ProdPool'),
     SysOperationLabelAttribute(literalStr("Production pool"))]
    public ProdPoolId parmProdPool(ProdPoolId _prodPool = prodPool)
    {
        prodPool = _prodPool;
        return prodPool;
    }
}
Key decorators explained
DecoratorPurpose
[DataContractAttribute]Marks the class as a serialisable data contract
[DataMemberAttribute('Name')]Exposes the property as a parameter with a serialisation name
[SysOperationLabelAttribute]Sets the label shown to users in the parameter dialog
[SysOperationGroupAttribute]Groups parameters visually in the dialog
[SysOperationDisplayOrderAttribute]Controls the order parameters appear

Step 2: RDP class

The RDP class runs the actual data retrieval and business logic.

[SRSReportParameterAttribute(classStr(PFProductionReportContract))]
class PFProductionReportDP extends SRSReportDataProviderBase
{
    PFProductionReportTmp tmpTable;

    [SRSReportDataSetAttribute(tableStr(PFProductionReportTmp))]
    public PFProductionReportTmp getTmpTable()
    {
        select tmpTable;
        return tmpTable;
    }

    public void processReport()
    {
        PFProductionReportContract contract = this.parmDataContract()
            as PFProductionReportContract;

        TransDate fromDate = contract.parmFromDate();
        TransDate toDate   = contract.parmToDate();

        ProdTable prodTable;

        while select prodTable
            where prodTable.SchedDate >= fromDate
               && prodTable.SchedDate <= toDate
        {
            tmpTable.ProdId    = prodTable.ProdId;
            tmpTable.ItemId    = prodTable.ItemId;
            tmpTable.QtyGood   = prodTable.QtyGood;
            tmpTable.SchedDate = prodTable.SchedDate;
            tmpTable.insert();
        }
    }
}
Sophie asks: Why a temp table and not a direct query?

Sophie Chen asks Elena: β€œWhy can’t the report just read from ProdTable directly?”

Elena explains:

  • Business logic β€” you often need calculated fields, joined data from multiple tables, or conditional logic that a simple query can’t express
  • Performance β€” the temp table is populated once, then the report reads from it. The live table isn’t locked during rendering
  • Isolation β€” the report’s data snapshot is frozen at execution time. No dirty reads mid-render
  • Reusability β€” the same RDP class can feed multiple report designs

β€œFor simple reports with no logic, use an AOT query instead,” Elena adds. β€œBut most real-world reports need the RDP class.”

Step 3: Report design in Visual Studio

TaskHow
Add report to projectRight-click project β†’ Add β†’ New Item β†’ Report
Add datasetIn report, add dataset β†’ select RDP class or query
Auto designRight-click Designs β†’ Add Auto Design β†’ fields render automatically
Precision designRight-click Designs β†’ Add Precision Design β†’ opens RDLC designer
ExpressionsUse =Fields!FieldName.Value for data, =Parameters!Param.Value for parameters
GroupingIn precision design, add row groups for subtotals and page breaks

Step 4: Menu item and security

Every report needs a menu item output to be accessible:

ElementPurpose
Menu item outputThe entry point β€” Object = ReportName, ObjectType = SSRSReport
PrivilegeGrants access to the menu item
DutyContains the privilege
RoleContains the duty β€” users with this role can run the report

Step 5: Deploying reports

MethodWhen
Build + Deploy from VSDevelopment environment β€” right-click report β†’ Deploy
Incremental syncAfter code deployment β€” new or changed reports deploy automatically
PowerShellForce-refresh on report server for stubborn deployments
Admin pageSystem Administration β†’ Setup β†’ Deploy reports
Exam tip: Report deployment troubleshooting

If a report doesn’t appear after deployment:

  1. Check the deploy log in Visual Studio output window for errors
  2. Verify the report’s menu item exists and is correctly linked
  3. Confirm the user’s security role includes the privilege
  4. Run Deploy reports from System Administration if incremental sync missed it
  5. Clear browser cache β€” sometimes old report parameter dialogs are cached

Extending standard reports

You should never modify a standard report directly (that’s overlayering). Instead, use extensions.

Extension approaches β€” from lightest touch to full replacement
Extension approachWhat it doesWhen to use
Delegate handlerSubscribe to report events to modify data or parametersAdd calculated fields, filter data, change default parameters
Custom RDP extending standardCreate a new RDP class that extends the standard oneNeed to add new data sources or heavy custom logic
Report format customisationDuplicate the .rdl design, modify layout, register as customChange visual layout (logo placement, column order, totals)
Print management overrideConfigure Print Management to use your custom report instead of standardReplace the standard invoice/packing slip with your version
Scenario: Elena extends the sales invoice

PacificForge needs the standard sales invoice to include a β€œProduction Batch Number” column. Elena’s approach:

  1. Creates a new report design β€” duplicates the standard SalesInvoice precision design
  2. Extends the RDP class β€” adds a delegate handler to the standard SalesInvoiceDP that populates the batch number field
  3. Registers the custom design β€” creates a new report with the modified layout
  4. Configures Print Management β€” sets the custom report as the default for sales invoices

β€œWe never touch the standard report,” Elena tells compliance officer Kenji. β€œIf Microsoft updates it, our extension still works because we’re subscribing to events, not modifying source.”

Print Management decides which report design to use when printing documents like invoices, purchase orders, and packing slips.

ConceptDetail
Report formatMaps a document type to a specific report design
ConditionsPrint different designs based on customer, vendor, or other criteria
DestinationsScreen, printer, email, file β€” configurable per document type
Override hierarchyModule defaults β†’ Account-level β†’ Transaction-level

Question

What is the difference between precision design and auto design in SSRS?

Click or press Enter to reveal answer

Answer

Auto design generates the layout automatically from dataset fields β€” good for quick tabular lists. Precision design gives you full manual control over every element's position β€” required for pixel-perfect documents like invoices and cheques. Precision design uses the RDLC designer in Visual Studio.

Click to flip back

Question

What are the three main components of an RDP-based SSRS report?

Click or press Enter to reveal answer

Answer

1) Contract class β€” defines user parameters (decorated with [DataContractAttribute]). 2) RDP class β€” runs processReport() to populate a temp table with data. 3) Temp table β€” the bridge between X++ logic and the SSRS report design. The report's dataset binds to this table.

Click to flip back

Question

How do you make a custom SSRS report accessible to users?

Click or press Enter to reveal answer

Answer

Create a menu item output (Object = report name, ObjectType = SSRSReport). Create a privilege that grants access to the menu item. Add the privilege to a duty, and the duty to a role. Users with that role can then see and run the report.

Click to flip back

Question

How should you modify a standard SSRS report in F&O?

Click or press Enter to reveal answer

Answer

Never modify directly (no overlayering). Use extensions: subscribe to report delegate events for data changes, extend the RDP class for new logic, duplicate and customise the report design for layout changes, then configure Print Management to use your custom version.

Click to flip back


Knowledge Check

Elena needs to create a production report that calculates weighted average costs across multiple warehouses with conditional discount logic. Which data source approach should she use?

Knowledge Check

PacificForge's customer invoices must include a company logo at exact coordinates and match a government-mandated layout. Which report design type should Elena use?

Knowledge Check

Vik needs to add a custom field to the standard purchase order report without overlayering. What is the correct approach?

Next up: Power BI & Analytical Workspaces β€” embedding interactive dashboards and KPI tiles directly in F&O.