---
id: object/codeunit/9660
type: object
title: Codeunit 9660 "Report Layouts Impl."
summary: Codeunit 9660 "Report Layouts Impl." in Base Application (Microsoft.Shared.Report). 24 public procedures, 1 events, 2 event subscribers. Introduced in BC25, still in BC30, changed in BC26, BC28-29.
tier: official
language: en
tags:
  - codeunit
  - base application
versions:
  introduced: "25"
  last_changed: "29"
  deprecated: null
review:
  state: derived
  by: null
  at: null
  flags: []
generated:
  at: "2026-10-11T00:31:51.816Z"
  pipeline: 0.2.0
  prompts: {}
  input_hash: d3796f9ba2d358f6f68d6c0d20a16ed6c583b4d33b24788f18a50214188c6c13
evidence:
  - kind: code
    url: https://github.com/microsoft/BCApps/blob/ea08af5ef2d6a9b5c5af4a029288abbe2c883220/src/Layers/W1/BaseApp/Foundation/Reporting/ReportLayoutsImpl.codeunit.al
    title: src/Layers/W1/BaseApp/Foundation/Reporting/ReportLayoutsImpl.codeunit.al (releases/29.x)
    date: null
    commit: ea08af5ef2d6a9b5c5af4a029288abbe2c883220
    t: null
    quote: null
links:
  learn: []
  objects: []
  features: []
  topics: []
  localizations: []
  videos: []
  posts: []
  guidelines: []
  changes:
    - change/bcapps/11211
    - change/bcapps/9428
    - change/bcapps/9949
object_type: codeunit
object_id: 9660
name: Report Layouts Impl.
namespace: Microsoft.Shared.Report
app: Base Application
extends: null
first_version: "25"
last_version: "30"
present_in:
  - "25"
  - "26"
  - "27"
  - "28"
  - "29"
  - "30"
changed_in:
  - "26"
  - "28"
  - "29"
source_major: "29"
obsolete: null
countries: []
ms_search_form_ids: []
counts:
  fields: 0
  procedures: 53
  events: 1
  subscribers: 2
relations:
  out: 0
  referenced_by: 0
  pages: 0
  extended_by: 0
  event_subscribers: 0
  calls: 7
  called_by: 3
  implements: 0
---

# Codeunit 9660 "Report Layouts Impl."

> Codeunit 9660 "Report Layouts Impl." in Base Application (Microsoft.Shared.Report). 24 public procedures, 1 events, 2 event subscribers. Introduced in BC25, still in BC30, changed in BC26, BC28-29.

Base Application · Microsoft.Shared.Report · BC25-30 · [source at ea08af5e](https://github.com/microsoft/BCApps/blob/ea08af5ef2d6a9b5c5af4a029288abbe2c883220/src/Layers/W1/BaseApp/Foundation/Reporting/ReportLayoutsImpl.codeunit.al) · facts from BC29

## Properties

| Property | Value |
|---|---|
| Access | Internal |
| Permissions | tabledata "Tenant Report Layout" = rimd, tabledata "Tenant Report Layout Selection" = rimd, tabledata "Tenant Report Layout Override" = rimd, tabledata Company = r |

## Events published

- `OnBeforeUpload(var AlreadyUploaded: Boolean; var UploadFileName: Text; var FileInStream: InStream)` (internal)

## Event subscriptions

- SelectReportLayout subscribes to Page "Report Layout Selection" OnSelectReportLayout
- SelectReportLayoutUI subscribes to Codeunit "ReportManagement" OnSelectReportLayout

## Procedures

- `SetSelectedCompany(NewCompanyName: Text)` (internal)
- `SetLayoutStatus(ReportLayoutList: Record "Report Layout List"; NewStatus: Enum "Report Layout Status"): Boolean` (internal): Sets the status for a layout. Extension-installed layouts live in the read-only App database, so their status is written as an override record rather than by copying the layout.
- `SetLayoutStatusBatch(var ReportLayoutList: Record "Report Layout List"; NewStatus: Enum "Report Layout Status"): Integer` (internal): Sets the status for multiple selected layouts. Use this from page actions when user selects multiple layouts.
- `RunCustomReport(SelectedReportLayoutList: Record "Report Layout List")` (internal)
- `CreateNewReportLayout(SelectedReportLayoutList: Record "Report Layout List"; var ReturnReportID: Integer; var ReturnLayoutName: Text)` (internal)
- `CreateNewReportLayout(SelectedReportLayoutList: Record "Report Layout List"; ImpliedSubtype: Enum "Report Layout Subtype"; var ReturnReportID: Integer; var ReturnLayoutName: Text)` (internal)
- `SetDefaultReportLayoutSelection(SelectedReportLayoutList: Record "Report Layout List"; ShowMessage: Boolean)` (internal)
- `GetDefaultReportLayoutSelection(ReportId: Integer; var DefaultReportLayoutList: Record "Report Layout List"): Boolean` (internal)
- `UpdateDefaultLayoutSelectionName(SelectedReportLayoutList: Record "Report Layout List"; NewLayoutName: Text[250]): Boolean` (internal)
- `ConfirmDeleteDefaultLayoutSelection(SelectedReportLayoutList: Record "Report Layout List"; TenantReportLayoutSelectionParm: Record "Tenant Report Layout Selection"): Boolean` (internal)
- `InsertNewLayout(ReportID: Integer; LayoutName: Text[250]; LayoutDescription: Text[250]; LayoutFormat: Option; LayoutIsGlobal: Boolean; CreateEmptyLayout: Boolean; ExcelSheetConfiguration: Enum "Excel Sheet Configuration"; var ReturnReportID: Integer; var ReturnLayoutName: Text)` (internal)
- `InsertNewLayout(ReportID: Integer; LayoutName: Text[250]; LayoutDescription: Text[250]; LayoutFormat: Option; LayoutIsGlobal: Boolean; CreateEmptyLayout: Boolean; ExcelSheetConfiguration: Enum "Excel Sheet Configuration"; LayoutSubtype: Enum "Report Layout Subtype"; var ReturnReportID: Integer; var ReturnLayoutName: Text)` (internal)
- `InsertNewLayout(ReportID: Integer; LayoutName: Text[250]; LayoutDescription: Text[250]; LayoutFormat: Option; LayoutIsGlobal: Boolean; CreateEmptyLayout: Boolean; ExcelSheetConfiguration: Enum "Excel Sheet Configuration"; LayoutSubtype: Enum "Report Layout Subtype"; ReplaceExisting: Boolean; var ReturnReportID: Integer; var ReturnLayoutName: Text)` (internal)
- `DeleteReportLayout(TenantReportLayout: Record "Tenant Report Layout")` (internal)
- `UpdateReportLayoutDescription(ReportID: Integer; LayoutName: Text[250]; NewDescription: Text[250])` (internal)
- `ReplaceLayout(ReportID: Integer; LayoutName: Text[250]; LayoutDescription: Text[250]; LayoutFormat: Option; var ReturnReportID: Integer; var ReturnLayoutName: Text)` (internal)
- `ValidateLayout(SelectedReportLayoutList: Record "Report Layout List")` (internal)
- `EditReportLayout(SelectedReportLayoutList: Record "Report Layout List"; var NewEditedLayoutName: Text)` (internal)
- `ExportReportLayout(SelectedReportLayoutList: Record "Report Layout List"; UpdateOnOnexport: Boolean): Text` (internal)
- `ShowInfoDialog(SelectedReportLayoutList: Record "Report Layout List")` (internal)
- `OpenInOneDrive(SelectedReportLayoutList: Record "Report Layout List")` (internal)
- `ShareWithOneDrive(SelectedReportLayoutList: Record "Report Layout List")` (internal)
- `EditInOneDrive(SelectedReportLayoutList: Record "Report Layout List")` (internal)
- `ExportReportSchema(SelectedReportLayoutList: Record "Report Layout List"; DefaultFileName: Text; ShowFileDialog: Boolean): Text`

Plus 26 local procedures.

## Calls

From the extracted call graph of BC29 (graphify-al on the snapshot checkout): calls whose target is known from a declared type or an `Object::"Name"` argument. Interface dispatch and calls through events are not counted, so the list is not complete.

- [Codeunit 4100 "Temp Blob"](../codeunit/4100.md) (12 calls: `EditInOneDrive → CreateInStream`, `EditInOneDrive → CreateOutStream`, `EditReportLayout → CreateInStream`, …)
- [Codeunit 419 "File Management"](../codeunit/419.md) (4 calls: `CreateLayoutMime → GetExtension`, `ExportReportLayout → BLOBExport`, `ExportReportLayout → BLOBExportWithEncoding`, …)
- [Codeunit 9510 "Document Service Management"](../codeunit/9510.md) (3 calls: `EditInOneDrive → EditInOneDrive`, `OpenInOneDrive → OpenInOneDrive`, `ShareWithOneDrive → ShareWithOneDrive`)
- [Codeunit 9654 "Design-time Report Selection"](../codeunit/9654.md) (2 calls: `RunCustomReport → ClearLayoutSelection`, `RunCustomReport → SetSelectedLayout`)
- [Codeunit 9665 "Composite Layout Lookup Helper"](../codeunit/9665.md) (2 calls: `ValidatePartReference → DecodeAppId`, `ValidatePartReference → DecodeLayoutName`)
- [Page 9660 "Report Layouts"](../page/9660.md) (2 calls: `SelectReportLayout → (object)`, `SelectReportLayoutUI → (object)`)
- [Codeunit 8714 "Audit Log"](../codeunit/8714.md) (1 call: `Log → LogAuditMessage`)

## Called by

- [Page 9660 "Report Layouts"](../page/9660.md) (5 calls: `OnAfterGetRecord → GetDefaultReportLayoutSelection`, `OnDeleteRecord → ConfirmDeleteDefaultLayoutSelection`, `OnDeleteRecord → DeleteReportLayout`, …)
- [Page 9666 "Report Theme and Header/Footer"](../page/9666.md) (5 calls: `CreateArtifact → InsertNewLayout`, `DeleteSelectedArtifact → DeleteReportLayout`, `EditPartDescription → UpdateReportLayoutDescription`, …)
- [Page 9652 "Report Layout Selection"](../page/9652.md) (2 calls: `ShowResolvedLayoutParts → GetDefaultReportLayoutSelection`, `ShowResolvedLayoutParts → SetSelectedCompany`)

## Recent changes

- 2026-09-10 [#11211 [Bug 649379] Composite layout stress-test fixes, part resolution source and status action captions](../../changes/bcapps/11211.md) (main, BC30, fix)
- 2026-08-17 [#9428 637301 Report layout override lifecycle](../../changes/bcapps/9428.md) (main, BC30, feature)
- 2026-08-10 [#9949 [Bug 645022] UI improvements for report themes and header/footers (composite layout)](../../changes/bcapps/9949.md) (main, BC30, feature)

## Across versions

- Present in: BC25-30
- Changed (declaration) in: BC26, BC28-29

Source: AL metadata extracted from the code (names, ids, signatures, properties); no code bodies (D10).

## Ask your agent

Procedure bodies are not stored here (D10). The call sections above are our own, per object, from the BC29 call graph. For a procedure body or the calls of one procedure, ask bc-code-atlas (external, by Stefan Maron, MIT; default corpus w1-28), which the bc-observatory plugin connects: `bcatlas_resolve_node(object_type: "codeunit", object_name: "Report Layouts Impl.")`, then `bcatlas_get_procedure_body` or `bcatlas_get_neighbors` on the returned id.
