---
title: "Table 9650 Custom Report Layout"
author: "Jonas Paprotka"
url: https://jonas-paprotka.de/ref/table/9650-custom-report-layout/
type: table
id: 9650
name: "Custom Report Layout"
app: "Base Application"
namespace: Microsoft.Foundation.Reporting
versions: "17-28"
build: 28.5.54151.54365
source: "https://jonas-paprotka.de/ref/table/9650-custom-report-layout/source/29/"
checked: 2026-09-20
subject: "Microsoft Dynamics 365 Business Central"
license: "Content © 2026 Jonas Paprotka. Quote freely with attribution and a link."
---

# Table 9650 Custom Report Layout

Jonas Paprotka, https://jonas-paprotka.de/ref/table/9650-custom-report-layout/

| | |
| --- | --- |
| App | Base Application |
| Namespace | Microsoft.Foundation.Reporting |
| Versions | 17-28 |
| Source file | Foundation/Reporting/CustomReportLayout.Table.al |

## Fields

| Id | Name | Type | Versions | Obsolete | Reason |
| --- | --- | --- | --- | --- | --- |
| 1 | Code | Code[20] | 17-28 | - | - |
| 2 | Report ID | Integer | 17-28 | - | - |
| 3 | Report Name | Text[250] | 17-28 | - | - |
| 4 | Company Name | Text[30] | 17-28 | - | - |
| 6 | Type | Enum Custom Report Layout Type | 17-28 | - | - |
| 7 | Layout | Blob | 17-28 | - | - |
| 8 | Last Modified | DateTime | 17-28 | - | - |
| 9 | Last Modified by User | Code[50] | 17-28 | - | - |
| 10 | File Extension | Text[30] | 17-28 | - | - |
| 11 | Description | Text[250] | 17-28 | - | - |
| 12 | Custom XML Part | Blob | 17-28 | - | - |
| 13 | App ID | Guid | 17-28 | - | - |
| 14 | Built-In | Boolean | 17-28 | - | - |
| 15 | Layout Last Updated | DateTime | 17-28 | - | - |

## Keys

| Name | Fields | Versions |
| --- | --- | --- |
| Key1, clustered | Code | 17-28 |
| Key2 | Report ID, Company Name, Type | 17-28 |

## Procedures

| Name | Parameters | Returns | Access | Versions | Obsolete | Reason |
| --- | --- | --- | --- | --- | --- | --- |
| InitBuiltInLayout | (Integer, Option) | Code[20] | public | 17-28 | - | - |
| CopyBuiltInLayout | () | - | public | 17-19 | Pending 17.0 | Replaced by CopyBuildInReportLayout() |
| CopyBuiltInReportLayout | () | - | public | 17-28 | - | - |
| GetCustomRdlc | (Integer) | Text | public | 17-22 | Pending 20.0 | This procedure is replaced by the report event FetchReportLayoutByCode. Subscribe to it to retrieve a selected custom layout. |
| CopyRecord | () | Code[20] | public | 17-19 | Pending 17.0 | Replaced by CopyReportLayout() |
| CopyReportLayout | () | Code[20] | public | 17-28 | - | - |
| ImportLayout | (Text) | - | public | 17-19 | Pending 17.0 | Replaced by ImportReportLayout() |
| ImportReportLayout | (Text) | - | public | 17-28 | - | - |
| ImportLayoutBlob | (var Codeunit Temp Blob, Text[30]) | - | public | 17-28 | - | - |
| ExportLayout | (Text, Boolean) | Text | public | 17-19 | Pending 17.0 | Replaced by ExportReportLayout() |
| ExportReportLayout | (Text, Boolean) | Text | public | 17-28 | - | - |
| ValidateLayout | (Boolean, Boolean) | Boolean | public | 17-28 | - | - |
| UpdateLayout | (Boolean, Boolean) | Boolean | public | 17-19 | Pending 17.0 | Replaced by UpdateReportLayout() |
| UpdateReportLayout | (Boolean, Boolean) | Boolean | public | 17-28 | - | - |
| TryUpdateLayout | (Boolean) | Text | public | 17-28 | - | - |
| ExportSchema | (Text, Boolean) | Text | public | 17-28 | - | - |
| EditLayout | () | - | public | 17-19 | Pending 17.0 | Replaced by EditReportLayout() |
| EditReportLayout | () | - | public | 17-19 | Pending 17.3 | The codeunits run in this procedure are being removed as they use .NET which do not work on the web client. The procedure will be removed. |
| GetWordXmlPart | (Integer) | Text | public | 17-28 | - | - |
| RunCustomReport | () | - | public | 17-28 | - | - |
| ApplyUpgrade | (var DotNet ReportUpgradeSet, var DotNet IReportChangeLogCollection, Boolean) | - | public | 17-28 | - | - |
| LookupLayoutOK | (Integer) | Boolean | public | 17-28 | Pending 28.0 | This procedure is obsolete because the lookup page 9650 Custom Report Layouts is obsoleted. |
| GetDefaultCode | (Integer) | Code[20] | public | 17-28 | - | - |
| CanBeModified | () | Boolean | public | 17-28 | - | - |
| NewExtensionLayout | (Guid, DotNet DataTable) | - | public | 17-28 | - | - |
| HasLayout | () | Boolean | public | 17-28 | - | - |
| HasCustomXmlPart | () | Boolean | public | 17-28 | - | - |
| GetLayout | () | Text | public | 17-28 | - | - |
| GetCustomXmlPart | () | Text | public | 17-28 | - | - |
| GetLayoutBlob | (var Codeunit Temp Blob) | - | public | 17-28 | - | - |
| ClearLayout | () | - | public | 17-28 | - | - |
| ClearCustomXmlPart | () | - | public | 17-28 | - | - |
| TestLayout | () | - | public | 17-28 | - | - |
| TestCustomXmlPart | () | - | public | 17-28 | - | - |
| SetLayout | (Text) | - | public | 17-28 | - | - |
| SetCustomXmlPart | (Text) | - | public | 17-28 | - | - |
| SetDefaultCustomXmlPart | () | - | public | 17-28 | - | - |
| SetLayoutBlob | (var Codeunit Temp Blob) | - | public | 17-28 | - | - |
| SetLayoutLastUpdated | () | - | internal | 17-28 | - | - |
| CanModify | () | Boolean | public | 20-28 | - | - |
| GetFileExtension | () | Text[4] | public | 22-28 | - | - |

## Events

| Kind | Name | Parameters | Versions | Obsolete | Reason |
| --- | --- | --- | --- | --- | --- |
| Integration event | OnAfterReportGetCustomRdlc | (Integer, var Text) | 17-22 | Pending 20.0 | This event is replaced by the report event FetchReportLayoutByCode. Subscribe to it to retrieve a selected custom layout. |
| Integration event | OnBeforeUpdateLayout | (var Boolean, var Boolean) | 17-28 | - | - |
| Integration event | OnCopyRecordOnBeforeInsertLayout | (var Record Custom Report Layout, Record Custom Report Layout) | 17-28 | - | - |
| Integration event | OnGetNonBuiltInLayout | (Record Custom Report Layout, var InStream) | 17-28 | - | - |
| Integration event | OnGetFileExtension | (Record Custom Report Layout, var Text[4]) | 17-28 | - | - |
| Integration event | OnImportLayoutBlob | (Record Custom Report Layout, var Codeunit Temp Blob, Text[30], Text, OutStream) | 17-28 | - | - |
| Integration event | OnImportLayoutSetFileFilter | (Record Custom Report Layout, var Text) | 17-28 | - | - |
| Integration event | OnInitBuiltInLayout | (var Record Custom Report Layout, Integer, Option) | 17-28 | - | - |
| Integration event | OnLookupLayoutOKOnBeforePageRun | (var Record Custom Report Layout) | 17-28 | Pending 28.0 | This procedure is obsolete because the procedure LookupLayoutOK is obsoleted. |
| Integration event | OnGetCustomRdlcOnAfterSelectCustomLayoutCode | (Integer, var Code[20]) | 17-22 | Pending 20.0 | This event is replaced by the report event SelectReportLayoutCode. Subscribe to it to select a custom layout. |
| Integration event | OnBeforeExportReportLayout | (Record Custom Report Layout, var Text, Boolean) | 19-28 | - | - |
| Integration event | OnBeforeExportSchema | (Record Custom Report Layout, var Text, Boolean, var Boolean) | 19-28 | - | - |
| Integration event | OnBeforeCanBeModified | (var Record Custom Report Layout, var Boolean) | 21-28 | - | - |

## Source

Symbols: Microsoft.BaseApplication.symbols.437dbf0e-84ff-417a-965d-ed2bb9650972, https://dynamicssmb2.pkgs.visualstudio.com/DynamicsBCPublicFeeds/_packaging/MSSymbols/nuget/v3/index.json, highest build per major on 2026-09-20.
AL source 29: https://github.com/microsoft/BCApps, MIT, releases/29.x at a66254c3b8b5bb1cea290dc8f9d097aec4381153.

Jonas Paprotka, 2026-09-20.
