[gelöst]BC23: Berichtslayout von AL bestimmen

7. Februar 2024 14:47

Hi allerseits,

ich möchte das Berichtslayout für Angebote und Aufträge in Abhängigkeit von bestimmten Feldern im Angebot steuern. Dazu habe ich diesen interessanten Artikel https://yzhums.com/40025/ gefunden. Ich habe alles so wie beschrieben umgesetzt. Leider funktioniert es nicht. Es wird nach wie vor das Standard-Layout vorgeschlagen.

Hat jemand von Euch Erfahrung damit?
Zuletzt geändert von elf am 8. Februar 2024 00:28, insgesamt 1-mal geändert.

Re: BC23: Berichtslayout von AL bestimmen

8. Februar 2024 00:27

Mit der im obigen Link beschriebenen Vorgehensweise habe ich es nicht hingekriegt...
Habe es dann wie folgt gelöst:

Im Sales Header gibt es das neue Feld "elf_Report Layout Name" (wie im obigen Link beschrieben).

Ich habe mir das Codeunit 229 "Document-Print" mal genauer angesehen. Habe dann auch die Stelle gefunden, wo ich das Layout setzen kann. In der Table 77 "Report Selections" wird der Report zur Ausführung aufgerufen bzw. das PDF für die E-Mail erzeugt.

Glücklicherweise gibt es einen EventSubscriber: OnBeforePrintDocument
Code:
OnBeforePrintDocument(TempReportSelections, IsGUI, RecVarToPrint, IsHandled);
if not IsHandled then
      REPORT.RunModal(TempReportSelections."Report ID", IsGUI, false, RecVarToPrint);


ebenso für den Aufruf, wenn als E-Mail versendet werden soll: OnSendEmailDirectlyOnBeforeSaveReportAsPDFInTempBlob
Code:
OnSendEmailDirectlyOnBeforeSaveReportAsPDFInTempBlob(TempAttachReportSelections, DocumentRecord, ReportUsage, TempBlob, IsHandled);
if not IsHandled then
     SaveReportAsPDFInTempBlob(TempBlob, "Report ID", DocumentRecord, "Custom Report Layout Code", ReportUsage);


diese Events habe ich versogt und das Layout aus dem Feld "elf_Report Layout Name" versorgt:
Code:
[EventSubscriber(ObjectType::Table, database::"Report Selections", 'OnBeforePrintDocument', '', true, true)]
    local procedure OnBeforePrintDocument(TempReportSelections: Record "Report Selections" temporary; IsGUI: Boolean; var RecVarToPrint: Variant; var IsHandled: Boolean)
    begin
        setSelectedLayout(RecVarToPrint);
    end;

    [EventSubscriber(ObjectType::Table, database::"Report Selections", 'OnSendEmailDirectlyOnBeforeSaveReportAsPDFInTempBlob', '', true, true)]
    local procedure OnSendEmailDirectlyOnBeforeSaveReportAsPDFInTempBlob(ReportSelection: Record "Report Selections"; RecordVariant: Variant; ReportUsage: Enum "Report Selection Usage"; var TempBlob: Codeunit "Temp Blob"; var IsHandled: Boolean)
    begin
        setSelectedLayout(RecordVariant);
    end;

    local procedure setSelectedLayout(RecordVariant: Variant)
    var
        DesigntimeReportSelection: Codeunit "Design-time Report Selection";
        DataTypeManagement: Codeunit "Data Type Management";
        RecordRef: RecordRef;
        FieldRef: FieldRef;
        LayoutName: Text[250];
    begin
        RecordRef.GetTable(RecordVariant);
        case RecordRef.Number of
            database::"Sales Header":
                begin
                    if DataTypeManagement.FindFieldByName(RecordRef, FieldRef, 'elf_Report Layout Name') then begin
                        LayoutName := FieldRef.Value;
                        if LayoutName <> '' then begin
                            DesigntimeReportSelection.ClearLayoutSelection();
                            DesigntimeReportSelection.SetSelectedLayout(LayoutName);
                        end;
                    end;
                end;
        end;
    end;


Et voila, schon funktioniert's. Beim Aufruf zum Drucken des Angebots wird das Layout aus dem Feld "'elf_Report Layout Name" aus dem "Sales Header" vorbelegt, beim Versenden per Mail wird dieses Layout benutzt. Geht allerdings nur mit eigenen "User Defined" Layouts.
Hat mich 'n paar Stunden gekostet...