RDL Editor - Troubleshooting
Field-tested debugging recipes for BC RDLC layouts. The golden rule: for document reports, the PDF is the truth — the designer and even BC's HTML preview are softer than the hard-page renderer.
Blank pages
Almost always a width problem: body, a table, a rectangle, a line, or a hidden item extends past page width − margins.
- Deselect → check the width budget readout (chapter 6). Fix the report width if it's over.
- Look for bands with the red boundary line / warning chip — the overflow detector includes hidden items.
- Recently added a table column? Narrow others until the table warning clears.
- Check page breaks: a break at the end of the last group/table instance = trailing blank page. Prefer Between or Start.
- Check Keep Together — it can push a whole section to the next page, leaving a blank gap.
- Consume Container Whitespace (Report properties) can absorb container slack — but it never fixes a layout that is simply too wide.
- Diagnostic trick: give suspect sections temporary background tints, Test Print, see which color owns the blank page. Undo afterwards.
A field doesn't show — the decision tree
- Is the field in the dataset? Check the Bind-to-field dropdown. Not there → fix the AL report / report extension; no layout edit can conjure it.
- Is it populated? Run the report with data-only output (Excel/XML) from BC. Empty there → AL logic/filters/permissions, not the layout.
- Expression right? Exact field name (use the dropdown — don't type from memory), correct scope.
- Visible? Check, in order: textbox visibility → row visibility → column visibility → group member visibility → parent rectangle visibility. Use Highlight hidden items.
- Scope? A document-level value inside a grouped area may need
=First(Fields!X.Value, "DataSet_Result")(snippet available). Don't blanket-wrap everything inFirst()— if a per-line value needs it, the grouping is wrong. - In a page header/footer? Dataset fields don't work there — the lint will have told you. Use the
ReportItems!pattern (chapter 4), and make sure the referenced body textbox appears on every page that needs it. - Clipped or invisible? Too-small textbox, white-on-white color, CanGrow off with long text.
Header/footer value is blank or #Error
- The
ReportItems!name doesn't match any textbox → the lint flags it; check the Structure tab. - The referenced body textbox isn't on the current rendered page → move the hidden helper into a repeating table row.
- More than one
ReportItems!reference in a single expression → split into two textboxes.
Address blocks broke
Address areas rely on hidden helper textboxes and First() scoping more than anything else in a BC layout. Before editing one: select pieces and read Referenced by; hide rather than delete; test with a blank Address 2, long names, and international addresses. Empty lines that should collapse need row visibility (=IsNothing(...) Or ...=""), not textbox visibility — a hidden textbox still leaves an empty row.
Totals are wrong
The same =Sum(Fields!Amount.Value) means group total, table total, or dataset total depending on where the textbox sits. Check which row/group hosts it; add an explicit scope (=Sum(Fields!X.Value, "DataSet_Result")) when in doubt; make sure you're not summing a formatted-text field; compare against data-only output.
Long text pushes everything around
- Enable Can Grow only where long text is expected (descriptions, comments). On tightly controlled documents it shoves totals to the next page.
- Test with the real ugly data: the longest description, the blank optional fields, multiple VAT rates.
Looks right in the editor, wrong in BC
Fonts (use standard ones for cloud), images (keep them small; FitProportional for logos), the dataset (the editor shows expressions, not data), and renderer differences (Excel export proves nothing about print). When output differs between renderers, remember the classes: PDF/print are hard-page, Word/Excel are soft-page, CSV/XML are data-only.
After a BC upgrade or extension update
Custom layouts break when the underlying dataset changes shape. Keep layouts in source control, re-test after app updates, and compare against a freshly exported standard layout when a field stops arriving.