Einleitung

In diesem Tutorial werden wir zur Demonstration eine Exceldatei erzeugen, die alle Debitoren auflistet. Wie schon oben erwähnt werden wir dafür die Tabelle „Excel Buffer” (ID: 370) benutzen. Diese Standard-Tabelle stellt neben den eigentlichen Tabellenfeldern auch vielen Funktionen zur Verfügung, die benötigt werden.

Anleitung

Erstelle als erstes einen neuen Report mit dem DataItem „Customer”. Die Report-Eigenschaft „ProcessingOnly” muss auf „Ja” gesetzt werden. Das Setzen dieser Eigenschaft bewirkt, dass Navision beim Ausführen des Reports nichts druckt. Außerdem wird der Button „Seitenansicht” auf der RequestForm erst gar nicht dargstellt und auch der Button „Drucken” wird durch den Button „OK” ausgetauscht. Du willst ja schließlich nichts drucken, sondern „missbrauchst” den Report um eine Exceldatei zu erzeugen.

Jetzt musst du über „Ansicht” - „C/AL Globals” zwei Variablen, eine Textkonstante und eine Funktion erstellen. Die erste Variable nennt sich „ExcelBuffer”, ist vom DataType „Record” und vom Subtype „Excel Buffer”. Die zweite Variable nennt sich „RowNo” und ist vom DataType „Integer”.

Die neue Textkonstante nennt sich „SUMME” und enthält „=SUMME(C2:C%1)”.

Die Funktion nennt sich „EnterCell” und bekommt die sieben Parameter „RowNo” und „ColumnNo” vom DataType „Integer”, „CellValue” und „CellFormula” vom DataType „Text” (Length: 250), „Bold”, „Italic” und „UnderLine” vom DataType „Boolean”.

Lokale Variablen RowNo, ColumnNo, CellValue, CellFormula, Bold, Italic, UnderLine der neuen Funktion EnterCell

Gehe nun über „Ansicht” - „C/AL Code” in die neue Funktion und füge die folgenden Programmzeilen ein:

ExcelBuffer.INIT;
ExcelBuffer.VALIDATE("Row No.",RowNo);
ExcelBuffer.VALIDATE("Column No.",ColumnNo);
ExcelBuffer."Cell Value as Text" := CellValue;
ExcelBuffer.Formula := CellFormula;
ExcelBuffer.Bold := Bold;
ExcelBuffer.Italic := Italic;
ExcelBuffer.Underline := UnderLine;
ExcelBuffer.INSERT;

Da sich diese Programmzeilen innerhalb der Funktion „EnterCell” befinden, werden sie bei jedem Aufruf der Funktion durchlaufen. Sie sorgen dafür, dass pro Tabellenzelle in Excel ein Datensatz in der Tabelle „Excel Buffer” hinzugefügt wird.

In den „Customer - OnPreDateItem”-Trigger müssen als nächstes die folgenden Programmzeilen hinzugefügt werden:

ExcelBuffer.DELETEALL;
EnterCell(1, 1, FIELDCAPTION("No."), '', TRUE, FALSE, FALSE);
EnterCell(1, 2, FIELDCAPTION(Name), '', TRUE, FALSE, FALSE);
EnterCell(1, 3, FIELDCAPTION("Sales (LCY)"), '', TRUE, FALSE, FALSE);
RowNo := 1;

Die erste Programmzeile leert die Tabelle „Excel Buffer”. In der zweiten, dritten und vierten Programmzeile werden die Spaltenüberschriften erzeugt. Die fünfte Zeile setzt die Variable „RowNo” auf den Wert „1”.

Und nun müssen in den „Customer - OnAfterGetRecord”-Trigger die folgenden Programmzeilen hinzugefügt werden:

CALCFIELDS("Sales (LCY)");
RowNo += 1;
EnterCell(RowNo, 1, "No.", '', FALSE, FALSE, FALSE);
EnterCell(RowNo, 2, Name, '', FALSE, FALSE, FALSE);
EnterCell(RowNo, 3, FORMAT("Sales (LCY)"), '', FALSE, FALSE, FALSE);

Der „OnAfterGetRecord”-Trigger wird für jeden Datensatz des DateItems durchlaufen. In unserem Fall also pro Debitor. In der ersten Programmzeile wird das FlowField „Sales (LCY)” berechnet. Die zweite Programmzeile zählt die Variable „RowNo” um eins nach oben. Die letzten drei Programmzeilen schreiben die Debitordaten über unsere neue Funktion in die Tabelle „Excel Buffer”.

Und zum Schluss muss noch in den „Customer - OnPostDataItem”-Trigger die folgenden Programmzeilen hinzugefügt werden:

RowNo += 1;
EnterCell(RowNo, 2, 'Total', '', TRUE, FALSE, FALSE);
EnterCell(RowNo, 3, '', STRSUBSTNO(SUMME, RowNo-1), TRUE, FALSE, FALSE);
ExcelBuffer.CreateBook;
ExcelBuffer.CreateSheet(TABLECAPTION, TABLECAPTION, COMPANYNAME, USERID);
ExcelBuffer.GiveUserControl();

In der zweiten und dritten Zeile erzeugen wir noch eine Total-Zeile in Excel. Über die Record-Variable „ExcelBuffer” rufen wir anschließend drei Funktionen auf. Die erste Funktion erstellt ein neues Excelbuch. Die zweite Programmzeile und somit die Funktion „CreateSheet” erzeugt innerhalb des Excelbuches eine neue Mappe. Hier werden vier Parameter erwartet. Die letzte Zeile holt zum Schluss die Excel-Anwendung in den Vordergrund.

Ausgabe in Microsoft Excel