Faktura¶
Die Faktura ist über Events, Enums und Interfaces erweiterbar.
Beispiel: Erweiterung um die zusätzliche Kalkulationsart "Arbeitsauftrag"¶
Szenario: Wir wollen eine zusätzliche Gruppierung im Beleglayout nach Arbeitsaufträgen in der Rechnungsdarstellung ermöglichen.
Über den Enum BSSSP Invoice Scheme Calculation Type wird gesteuert welche Gruppierungen / Ausgaben bzw. Rechnungserstellungen möglich sind. Dieser Enum implementiert wiederum das Interface BSSSP Invoice Scheme Calculation.
Auszug aus dem Enum:
enum 5250101 "BSSSP Invoice Scheme Calculation Type" implements "BSSSP Invoice Scheme Calculation"
{
Extensible = true;
value(0; None)
{
Caption = 'Keine Auswahl';
Implementation = "BSSSP Invoice Scheme Calculation" = "BSSSP InvCalcNone";
}
value(5; Customer)
{
Caption = 'Rechnungsempfänger';
Implementation = "BSSSP Invoice Scheme Calculation" = "BSSSP InvCalcCustomer";
}
...
}
Zunächst muss der Enum erweitert werden:
enumextension 50001 MyInvoiceSchemeExt extends "BSSSP Invoice Scheme Calculation Type"
{
value(50000; "Work Order")
{
Caption = 'Arbeitsauftrag';
}
}
Jetzt fehlt noch die Implementierung des Interfaces, hierfür wird eine Codeunit benötigt, die das Interface implementiert.
Beispielimplementierung:
codeunit 50000 "MyInvCalcWorkOrder" implements "BSSSP Invoice Scheme Calculation"
{
var
WorkOrder: Record "BSSSP Work Order";
procedure FillValueBuffer(var InvoiceSchemeLineBuffer: Record "BSSSP Invoice Scheme Line" temporary; var InvoiceEntryBuffer: Record "BSSSP Invoice Entry" temporary; var ValueBuffer: List of [Guid])
begin
if not WorkOrder.get(InvoiceEntryBuffer."Work Order No.") then
Clear(WorkOrder);
if not ValueBuffer.Contains(WorkOrder.SystemId) then begin
ValueBuffer.Add(WorkOrder.SystemId);
end;
end;
procedure SortValueBuffer(var InvoiceSchemeLineBuffer: Record "BSSSP Invoice Scheme Line" temporary; var ValueBuffer: List of [Guid]; var SortedValueBuffer: Dictionary of [Integer, Guid])
var
InvoiceSchemeCalculation: Codeunit "BSSSP InvoiceSchemeCalculation";
begin
InvoiceSchemeCalculation.SortValueBufferDefault(WorkOrder, InvoiceSchemeLineBuffer, ValueBuffer, SortedValueBuffer);
end;
procedure SetRangeByValue(var InvoiceSchemeLineBuffer: Record "BSSSP Invoice Scheme Line" temporary; var InvoiceEntryBuffer: Record "BSSSP Invoice Entry" temporary; SystemId: Guid)
begin
if WorkOrder.GetBySystemId(SystemId) then begin
InvoiceEntryBuffer.SetRange("Work Order No.", WorkOrder."No.");
end;
end;
procedure GetDocumentText(var InvoiceSchemeLineBuffer: Record "BSSSP Invoice Scheme Line" temporary; SystemId: Guid): Text;
var
StandardLbl: Label 'Arbeitsauftrag ';
RecordVariant: Variant;
begin
GetRecordFromSystemId(SystemId, RecordVariant);
WorkOrder := RecordVariant;
if InvoiceSchemeLineBuffer."Document Text" = '' then begin
exit(StandardLbl + WorkOrder."No.");
end else begin
exit(StrSubstNo(InvoiceSchemeLineBuffer."Document Text", WorkOrder."No.", WorkOrder."Search Description", WorkOrder."Document Date"));
end;
end;
procedure GetRecordFromSystemId(SystemId: Guid; var RecordVariant: Variant)
begin
if WorkOrder.GetBySystemId(SystemId) then
RecordVariant := WorkOrder;
end;
procedure GetAvailableDocumentPlaceholders(var DocumentTextDictionary: Dictionary of [Integer, Text])
begin
DocumentTextDictionary.Add(1, WorkOrder.FieldCaption("No."));
DocumentTextDictionary.Add(2, WorkOrder.FieldCaption("Search Description"));
DocumentTextDictionary.Add(3, WorkOrder.FieldCaption("Document Date"));
end;
procedure GetSortingFields(var SortingFieldsDictionary: Dictionary of [Integer, Text])
begin
SortingFieldsDictionary.Add(WorkOrder.FieldNo("No."), WorkOrder.FieldCaption("No."));
SortingFieldsDictionary.Add(WorkOrder.FieldNo("Search Description"), WorkOrder.FieldCaption("Search Description"));
end;
}
Über die Funktion FillValueBuffer wird ein Puffer mit Werten erzeugt, um über die Arbeitsaufträge gruppieren zu können. In diesen Puffer wird die SystemId des Arbeitsauftrages geschrieben, der im Fakturaposten gefunden wurde.
Die Funktion SortValueBuffer sortiert diesen Puffer abhängig davon welche Sortierung im Beleglayout ausgewählt wurde. Über die Funktion GetSortingFields kann definiert werden welche Felder des Arbeitsauftrages für die Sortierung zur Verfügung stehen, wir haben hier die Nummer und den Suchbegriff gewählt. In der Funktion SortValueBuffer nutzen wir die Codeunit InvoiceSchemeCalculation, welche eine Standardsortierfunktion beinhaltet die mit allen Records (Variant) umgehen kann, vorstellbar wäre aber auch eine komplett freie Routine. Wichtig ist hier, dass die Variable SortedValueBuffer einen sortierten Puffer zurückliefert.
Die Funktion SetRangeByValue wird in der Rechnungserstellung verwendet, um die Fakturaposten entsprechend zu filtern, hier nach dem Arbeitsauftrag.
Die Funktion GetRecordFromSystemId liefert den Record als Variant zurück, der verwendet werden soll.
Abschliessend müssen wir uns mit den Dokumenttexten befassen, hierfür liefert die Funktion GetDocumentText für eine SystemId (Arbeitsauftrag) einen Textstring zurück. Über die Funktion GetAvailableDocumentPlaceholders geben wir dem Benutzer die möglichen Felder an, wir haben uns hier für Nummer, Suchbegriff und Belegdatum entschieden.
Als letzen Schritt unserer Erweiterung müssen wir die Implementation in unserer Enum-Erweiterung eintragen:
enumextension 50001 MyInvoiceSchemeExt extends "BSSSP Invoice Scheme Calculation Type"
{
value(50000; "Work Order")
{
Caption = 'Arbeitsauftrag';
Implementation = "BSSSP Invoice Scheme Calculation" = "MyInvCalcWorkOrder";
}
}
Danach kann Rechnungserstellung nach Arbeitsauftrag, Gruppierung nach Arbeitsauftrag und Ausgabe nach Arbeitsauftrag für das Beleglayout verwendet werden.