Report Extension Example

The following article illustrates how an existing table and report is extended by using extension objects. The code snippets shown in this example don't provide a full end-to-end scenario that can be deployed; they're intended to illustrate the way to extend existing functionality by using the Table Extension Object and Report Extension Object.

The base table - BaseFoodTable

The report extension will be based on the following base table, which holds information about food and specific details that applies to that. The Color field in this table is an enum, which is defined with the FoodColor enum next.

table 50100 BaseFoodTable
{
    DataClassification = ToBeClassified;
    DataPerCompany = false;

    fields
    {
        field(1; Name; Text[256]) { }
        field(2; Color; Enum FoodColor) { }
        field(3; Flavour; Text[256]) { }
        field(4; "Vegan Friendly"; Boolean) { }
        field(5; "Vegetarian Friendly"; Boolean) { }
        field(7; Price; Decimal)
        {
            DecimalPlaces = 2;
        }

        field(8; Restaurant; Integer) { }
    }

    keys
    {
        key(PK; Name)
        {
            Clustered = true;
        }
    }
}

Defining an enum - FoodColor

The FoodColor enum enables selecting a descriptive color of an item in the BaseFoodTable.

enum 50100 FoodColor
{
    Extensible = true;

    value(0; White) { }
    value(1; Red) { }
    value(2; Black) { }
    value(3; Brown) { }
    value(4; Orange) { }
    value(5; Green) { }
    value(6; Blue) { }
}

The base report - FoodReport

The following FoodReport object defines a report based on BaseFoodTable as a data source. There's a DataItemLink to a second table that displays restaurant information. The report is defined with an RDL layout. For more information, see Creating an RDL Layout Report.

report 50100 FoodReport
{
    UsageCategory = Administration;
    ApplicationArea = All;
    DefaultLayout = RDLC;
    RDLCLayout = 'FoodReport.rdl';
    AllowScheduling = true;

    dataset
    {
        dataitem(FoodTable; BaseFoodTable)
        {
            column(Name; Name) { }
            column(Color; Color) { }
            column(Flavour; Flavour) { }
            column(Vegan_Friendly; "Vegan Friendly") { }
            column(Vegetarian_Friendly; "Vegetarian Friendly") { }
            column(Price; Price) { }
            dataitem(Restaurant; Restaurant)
            {
                DataItemLink = ID = field(Restaurant);
                column(RestaurantName; Name) { }
            }

        }
    }
}

The table extension - GMOFood

In the next code snippet, the table extension GMOFood is defined. This table extension extends the BaseFoodTable with extra fields to register more details about food. GMOFood adds a relation to the Producer table through the ProducerID key.

tableextension 50200 GMOFood extends BaseFoodTable
{
    fields
    {
        field(100; "GMO Free"; Boolean) { }
        field(101; Organic; Boolean) { }

        field(103; Calories; Decimal)
        {
            DecimalPlaces = 3;
        }
        field(102; ProducerID; Integer) { }
    }
}


table 50202 Producer
{
    DataPerCompany = false;
    fields
    {
        field(1; ID; Integer) { }
        field(2; Name; Text[256]) { }
    }
}

The report extension - FoodExtension

As we've seen in the previous sections, the base table BaseFoodTable was extended with the GMOFood extension. To reflect that change, it makes sense to extend the FoodReport to enable displaying the extra set of fields that were added; both to the existing FoodTable and to the new table Producer. To do that, we need to use a report extension object. For more information, see Report Extension Object. In the dataset element, three new columns are added to the FoodTable dataitem, and a new dataitem element is introduced that adds columns corresponding to the reports source table.

reportextension 50200 FoodExtension extends FoodReport
{
    RDLCLayout = 'ExtendedFoodReport.rdl';

    dataset
    {
        add(FoodTable)
        {
            column(GMO_Free; "GMO Free") { }
            column(Organic; Organic) { }
            column(Calories; Calories) { }
        }

        addfirst(Restaurant)
        {
            dataitem(Producer; Producer)
            {
                DataItemLink = ID = field(ProducerID);
                DataItemLinkReference = FoodTable;
                column(ProducerName; Name) { }
            }
        }
    }
}

The example code above illustrates how additive changes to tables that are used on reports can use report extension objects to reflect these changes.

See Also

Reports Overview
Report Object
Report Extension Object
Using request pages with reports

Report extension triggers
OnPostReport (Report Extension) Trigger
OnPreReport (Report Extension) Trigger
OnAfterAfterGetRecord (Report Extension Data Set Modify) Trigger
OnAfterPostDataItem (Report Extension Data Set Modify) Trigger
OnAfterPreDataItem (Report Extension Data Set Modify) Trigger
OnBeforeAfterGetRecord (Report Extension Data Set Modify) Trigger
OnBeforePostDataItem (Report Extension Data Set Modify) Trigger
OnBeforePreDataItem (Report Extension Data Set Modify) Trigger