| Docs Hilfe
  AppSource  
Docs  /  Excel Report Builder  /  Informationen für Entwickler

 Temporäre Daten-Codeunits


2025/03/26 • 8 Min. Lesedauer
Mithilfe von temporären Daten-Codeunits können Auswertungen um Funktionen erweitert werden, die bestimmte Daten der Auswertung während der Ausführung temporär berechnen. Damit lassen sich z.B. Daten auswerten, die normalerweise nicht oder nicht in dieser Form zur Verfügung stehen. Temporäre Daten-Codeunits können über eine Individualprogrammierung bereitgestellt bzw. hinzugefügt werden. Über die Aktion Hinzufügen, Weitere Optionen... können diese Codeunits dann einem Datenblatt hinzugefügt werden. Auswertungen bearbeiten, Datenblätter, Datenblatt

Aufbau

Temporären Daten-Codeunits bestehen aus der Codeunit für die Berechnung und einer Tabelle vom TableType = Temporary für das Ergebnis.

Hinweis

Selbst wenn eine Tabelle nicht als temporär definiert ist, wird die Tabelle beim Aufruf der Codeunit als temporäre Tabelle übergeben. Man könnte also durchaus auch bereits vorhandene Tabellen für temporäre Berechnungen verwenden. Empfohlen wird aber die Anlage einer eigenen Tabelle.
Damit der Excel Report Builder die Codeunit als temporären Daten-Codeunit erkennt, muss diese über einen EventSubscriber eingebunden werden. Über den EventSubscriber können zusätzlich auch Hilfetexte angegeben werden, welche später bei der Auswahl der Codeunit in einer Auswertung angezeigt werden.

Beispiel 1

Es soll eine Summe für alle Länder innerhalb des Filters berechnet werden. Als Filter soll der Länder-/Regionscode angegeben werden können. Als Ergebnis soll die Summe von Verkauf (MW) und die Anzahl gebuchter Rechnungen als Datensatz zurückgeliefert werden.

Implementierung

Die Tabelle für das Ergebnis ist wie folgt aufgebaut:
table 50000 "NVX Country Statistics"
{
    DataClassification = SystemMetadata;
    Caption = 'NVX Country Statistics';
    TableType = Temporary;

    fields
    {
        field(1; "Country/Region Filter"; Code[10])
        {
            DataClassification = SystemMetadata;
            Caption = 'Country/Region Filter';
            TableRelation = "Country/Region".Code;
        }
        field(10; "Sales (LCY)"; Decimal)
        {
            DataClassification = SystemMetadata;
            Caption = 'Sales (LCY)';
        }
        field(11; "No. of Pstd. Invoices"; Integer)
        {
            DataClassification = SystemMetadata;
            Caption = 'No. of Pstd. Invoices';
        }
    }

    keys
    {
        key(Key1; "Country/Region Filter")
        {
        }
    }
}
Die Codeunit für die Berechnung ist folgendermaßen aufgebaut:
codeunit 50000 "NVX Country Statistics"
{
    TableNo = "NVX Country Statistics";

    trigger OnRun()
    var
        NVXCountryStatistics: Record "NVX Country Statistics";
        Customer: Record Customer;
    begin
        if not Rec.IsTemporary() then
            exit;

        //Die Summe wird in diesem Beispiel über die Debitoren ermittelt.
        //Eventuell gesetzte Länder-/Regionsfilter müssen also von der temporären Tabelle auf die Debitoren übertragen werden.
        //Der Filter auf der temporären Tabelle wird in diesem Beispiel danach entfernt, da das Feld nur für die Filterung der Debitoren verwendet wird.
        Customer.SetCurrentKey("Country/Region Code");
        Rec.FilterGroup(0);
        Customer.FilterGroup(0);
        Rec.CopyFilter("Country/Region Filter", Customer."Country/Region Code");
        Rec.SetRange("Country/Region Filter");
        Rec.FilterGroup(2);
        Customer.FilterGroup(2);
        Rec.CopyFilter("Country/Region Filter", Customer."Country/Region Code");
        Rec.SetRange("Country/Region Filter");
        //set relation filter
        //Der Excel Report Builder übergibt Filter aus Verknüpfungen über Filtergruppe 11
        Rec.FilterGroup(11);
        Customer.FilterGroup(11);
        Rec.CopyFilter("Country/Region Filter", Customer."Country/Region Code");
        Rec.SetRange("Country/Region Filter");
        Rec.FilterGroup(0);
        Customer.FilterGroup(0);

        NVXCountryStatistics.Copy(Rec);
        
        Clear(Rec);
        Rec."Country/Region Filter" := '';
        Rec.Insert();
        if Customer.FindSet() then
            repeat
                Customer.CalcFields("Sales (LCY)", "No. of Pstd. Invoices");
                Rec."Sales (LCY)" += Customer."Sales (LCY)";
                Rec."No. of Pstd. Invoices" += Customer."No. of Pstd. Invoices";
                Rec.Modify();
            until Customer.Next() = 0;

        Rec.Copy(NVXCountryStatistics);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"NCE Temp. Data Codeunit Mgt.", 'OnAddAllowedTempDataCodeunits', '', false, false)]
    local procedure NCETempDataCodeunitMgt_OnAddAllowedTempDataCodeunits(var TempNCETempDataCodeunit: Record "NCE Temp. Data Codeunit" temporary)
    var
        NVXCountryStatistics: Record "NVX Country Statistics";
        CountryRegion: Record "Country/Region";
        RecField: Record Field;
        CodeunitID: Integer;
        TableID: Integer;
        TableSettingsName: Text;
        HelpTxt: Label 'This Codeunit calculates the total for all countries within the filter.';
        FiltersAndRelationsHelpTxt: Label '\\Filters and Relations:\The filter in the ''%1'' field determines which Countries/Regions should be included in the evaluation.';
        ResultsHelpTxt: Label '\\Results:\''%1'', ''%2''';
    begin
        CodeunitID := Codeunit::"NVX Country Statistics";
        TableID := Database::"NVX Country Statistics";
        TableSettingsName := NVXCountryStatistics.TableCaption();

        TempNCETempDataCodeunit.Add(CodeunitID, TableID, TableSettingsName,
            HelpTxt +
            StrSubstNo(FiltersAndRelationsHelpTxt, NVXCountryStatistics.FieldCaption("Country/Region Filter")) +
            StrSubstNo(ResultsHelpTxt, NVXCountryStatistics.FieldCaption("Sales (LCY)"), NVXCountryStatistics.FieldCaption("No. of Pstd. Invoices")));

        TempNCETempDataCodeunit.AddTableFilter(CodeunitID, NVXCountryStatistics.FieldNo("Country/Region Filter"));
        TempNCETempDataCodeunit.AddTableFilter(CodeunitID, Database::"Country/Region", NVXCountryStatistics.FieldNo("Country/Region Filter"), '', CountryRegion.FieldNo(Code));

        Clear(RecField);
        RecField.SetRange(TableNo, TableID);
        RecField.SetFilter("No.", '<%1', 2000000000);
        RecField.SetRange(Enabled, true);
        if RecField.FindSet() then
            repeat
                if (RecField."No." <> NVXCountryStatistics.FieldNo("Country/Region Filter")) then
                    TempNCETempDataCodeunit.AddDataSheetField(CodeunitID, RecField."No.");
            until RecField.Next() = 0;
    end;
}
  • Über TempNCETempDataCodeunit.Add wird die Codeunit in den Excel Report Builder eingebunden. Hier werden auch weitere Informationen über den Zweck und die Verwendung der aktuellen Codeunit angegeben.
  • Über TempNCETempDataCodeunit.AddTableFilter werden die Filter und mögliche Verknüpfungen angegeben, welche später beim Hinzufügen im Datenblatt vorgeschlagen werden sollen.
  • Über TempNCETempDataCodeunit.AddDataSheetField werden die Felder angegeben, welche später beim Hinzufügen im Datenblatt vorgeschlagen werden sollen.

Zum Datenblatt hinzufügen

Über die Aktion Hinzufügen, Weitere Optionen... kann die Codeunit nach deren Veröffentlichung in einem Datenblatt hinzugefügt werden. Dabei werden automatisch Felder und Verknüpfungen, welche über AddDataSheetField und AddTableFilter vorgegeben wurden, vorgeschlagen: Folgendes Ergebnis wird nach dem Erstellen der Auswertung in Excel angezeigt: Die temporäre Daten-Codeunit kann auch einer anderen Tabelle untergeordnet werden: Folgendes Ergebnis wird nach dem Erstellen der Auswertung in Excel angezeigt:

Ergebnisse und Verhalten von temporären Daten-Codeunits

Je nachdem, wie die Codeunit programmiert ist, hängen die Ergebnisse auch davon ab, wie und wo sie später in ein Datenblatt hinzugefügt wird. Beispiel 1 ermittelt immer nur die Summe von Verkauf (MW) bestimmter Länder und liefert einen Datensatz zurück.
  • Wird die Codeunit ohne Filter aufgerufen, ermittelt sie die Gesamtsumme von Verkauf (MW).
  • Wird die Codeunit mit Filter aufgerufen, ermittelt sie die Gesamtsumme von Verkauf (MW) aller Länder innerhalb des Filters.
  • Wird die Codeunit der Tabelle Land/Region untergeordnet, ermittelt sie für das Land den Wert von Verkauf (MW).
Möglich wäre aber auch ein anderes Verhalten welches Beispiel 2 zeigt. Hier wird bei einem Aufruf ohne/mit Filter für jedes einzelne Land innerhalb des Filters der Wert von Verkauf (MW) ermittelt und dementsprechend mehrere Datensätze zurückliefert.

Beispiel 2

Es soll eine Summe für jedes Land innerhalb des Filters berechnet werden. Als Filter soll der Länder-/Regionscode angegeben werden können. Als Ergebnis soll pro Länder-/Regionscode die Summe von Verkauf (MW) und die Anzahl gebuchter Rechnungen als Datensatz zurückgeliefert werden.

Implementierung

Die Tabelle für das Ergebnis ist wie in Beispiel 1 aufgebaut. Die Codeunit für die Berechnung ist ähnlich wie in Beispiel 1 aufgebaut. Alle Änderungen zu Beispiel 1 sind farblich hervorgehoben:
codeunit 50001 "NVX Country Statistics 2"
{
    TableNo = "NVX Country Statistics";

    trigger OnRun()
    var
        NVXCountryStatistics: Record "NVX Country Statistics";
        Customer: Record Customer;
    begin
        if not Rec.IsTemporary() then
            exit;

        //Die Summe wird in diesem Beispiel über die Debitoren ermittelt.
        //Eventuell gesetzte Länder-/Regionsfilter müssen also von der temporären Tabelle auf die Debitoren übertragen werden.
        //Der Filter auf der temporären Tabelle wird in diesem Beispiel danach entfernt, da das Feld nur für die Filterung der Debitoren verwendet wird.
        Customer.SetCurrentKey("Country/Region Code");
        Rec.FilterGroup(0);
        Customer.FilterGroup(0);
        Rec.CopyFilter("Country/Region Filter", Customer."Country/Region Code");
        Rec.SetRange("Country/Region Filter");
        Rec.FilterGroup(2);
        Customer.FilterGroup(2);
        Rec.CopyFilter("Country/Region Filter", Customer."Country/Region Code");
        Rec.SetRange("Country/Region Filter");
        //set relation filter
        //Der Excel Report Builder übergibt Filter aus Verknüpfungen über Filtergruppe 11
        Rec.FilterGroup(11);
        Customer.FilterGroup(11);
        Rec.CopyFilter("Country/Region Filter", Customer."Country/Region Code");
        Rec.SetRange("Country/Region Filter");
        Rec.FilterGroup(0);
        Customer.FilterGroup(0);

        NVXCountryStatistics.Copy(Rec);

        Clear(Rec);
        if Customer.FindSet() then
            repeat
                if not Rec.Get(Customer."Country/Region Code") then begin
                    Clear(Rec);
                    Rec."Country/Region Filter" := Customer."Country/Region Code";
                    Rec.Insert();
                end;
                Customer.CalcFields("Sales (LCY)", "No. of Pstd. Invoices");
                Rec."Sales (LCY)" += Customer."Sales (LCY)";
                Rec."No. of Pstd. Invoices" += Customer."No. of Pstd. Invoices";
                Rec.Modify();
            until Customer.Next() = 0;

        Rec.Copy(NVXCountryStatistics);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"NCE Temp. Data Codeunit Mgt.", 'OnAddAllowedTempDataCodeunits', '', false, false)]
    local procedure NCETempDataCodeunitMgt_OnAddAllowedTempDataCodeunits(var TempNCETempDataCodeunit: Record "NCE Temp. Data Codeunit" temporary)
    var
        NVXCountryStatistics: Record "NVX Country Statistics";
        CountryRegion: Record "Country/Region";
        RecField: Record Field;
        CodeunitID: Integer;
        TableID: Integer;
        TableSettingsName: Text;
        HelpTxt: Label 'This Codeunit calculates the total for each country within the filter.';
        FiltersAndRelationsHelpTxt: Label '\\Filters and Relations:\The filter in the ''%1'' field determines which Countries/Regions should be included in the evaluation.';
        ResultsHelpTxt: Label '\\Results:\''%1'', ''%2'', ''%3''';
    begin
        CodeunitID := Codeunit::"NVX Country Statistics 2";
        TableID := Database::"NVX Country Statistics";
        TableSettingsName := NVXCountryStatistics.TableCaption();

        TempNCETempDataCodeunit.Add(CodeunitID, TableID, TableSettingsName,
            HelpTxt +
            StrSubstNo(FiltersAndRelationsHelpTxt, NVXCountryStatistics.FieldCaption("Country/Region Filter")) +
            StrSubstNo(ResultsHelpTxt, NVXCountryStatistics.FieldCaption("Country/Region Filter"), NVXCountryStatistics.FieldCaption("Sales (LCY)"), NVXCountryStatistics.FieldCaption("No. of Pstd. Invoices")));

        TempNCETempDataCodeunit.AddTableFilter(CodeunitID, NVXCountryStatistics.FieldNo("Country/Region Filter"));
        TempNCETempDataCodeunit.AddTableFilter(CodeunitID, Database::"Country/Region", NVXCountryStatistics.FieldNo("Country/Region Filter"), '', CountryRegion.FieldNo(Code));

        Clear(RecField);
        RecField.SetRange(TableNo, TableID);
        RecField.SetFilter("No.", '<%1', 2000000000);
        RecField.SetRange(Enabled, true);
        if RecField.FindSet() then
            repeat
                TempNCETempDataCodeunit.AddDataSheetField(CodeunitID, RecField."No.");
            until RecField.Next() = 0;
    end;
}
Wird die Codeunit nach deren Veröffentlichung in einem Datenblatt hinzugefügt, werden wie in Beispiel 1 automatisch Felder und Verknüpfungen vorgeschlagen: Folgendes Ergebnis wird nach dem Erstellen der Auswertung in Excel angezeigt:

Weitere Informationen




Feedback senden für
DE|EN Impressum