Excel Datei nach dem Erzeugen automatisch speichern?

27. April 2010 10:12

Hallo allerseits,

Ich habe dieses Bsp. hier nachgemacht und damit gelernt, wie der Excel Buffer funzt:

http://www.navision24.de/tutorials/echte-excel-tabellen-erzeugen.html

Frage: wie sag ich von NAV aus, Excel => mach ein save Strg+S und schließe dich Alt+F4?

Mein Code ist wie folgt, das Schließen von Excel hab ich also herausbekommen:

Customer - OnPostDataItem()

Code:
RowNoVar := RowNoVar + 1;
EnterCell(RowNoVar, 2, 'Total','',TRUE,FALSE,FALSE);
EnterCell(RowNoVar, 3, '', STRSUBSTNO(SUMME, RowNoVar - 1), TRUE, FALSE, FALSE);

ExcelBuffer.CreateBook;
ExcelBuffer.CreateSheet(TABLECAPTION, TABLECAPTION, COMPANYNAME, USERID);

//ExcelWrkBk.SaveAs('C:\text.xls'); geht nicht, daher auskommentiert!!!
//ExcelWrkBk.Close(); geht nicht, daher auskommentiert!!!

IF CONFIRM (TXT50000) THEN ExcelBuffer.GiveUserControl() ELSE ExcelApp.Quit();


Habe hier ein paar Links gefunden, aber ich komme nicht darauf

http://www.msdynamics.de/viewtopic.php?f=36&t=9884&p=49450&hilit=Excel#p49450
http://www.msdynamics.de/viewtopic.php?f=7&t=9948&p=49445&hilit=Excel#p49445

edit: übrigens, wenn ich Nein bei CONFIRM klicke, erscheint eine Fehlermeldung:
Diese Meldung ist für C/AL Programmierer: für Automation Variable wurde keine Instanz erstellt. Sie können ihr eine Instanz zuordnen, indem Sie entweder erstellen oder zuordnen
=> warum erscheint die Meldung, wo ich doch deklariert hab unter Globals: ExcelApp Automation 'Microsoft Excel 12.0 Object Library'.Application

Re: Excel Datei nach dem Erzeugen automatisch speichern?

27. April 2010 11:01

Hallo

Völlig klar dass sies nicht funktioniert.
ExcelApp ist bei Dir eine andere Instanz und hat nichts der Instanz von Excel zu tun, die in ExcelBuffer verwendet wird.

Du müsstest die Tabelle Excelbuffer anpassen.
Es braucht eine neue Funktion z.B. GetExcelApp
Dieser Funktion übergibst Du eine Variable des Typs Automation Excel Application
Code:
GetExcelApp(VAR XlApp2 : Automation "Unknown Automation Server.Application")
XlApp2 := XlApp;


Dein Code müsste dann so aussehen:

Code:
ExcelBuffer.GetExcelApp(ExcelApp);
IF CONFIRM (TXT50000) THEN ExcelBuffer.GiveUserControl() ELSE ExcelApp.Quit;


Gruss

Re: Excel Datei nach dem Erzeugen automatisch speichern?

27. April 2010 11:37

martinst hat geschrieben:Hallo

Völlig klar dass sies nicht funktioniert.
ExcelApp ist bei Dir eine andere Instanz und hat nichts der Instanz von Excel zu tun, die in ExcelBuffer verwendet wird.

Du müsstest die Tabelle Excelbuffer anpassen.
Es braucht eine neue Funktion z.B. GetExcelApp
Dieser Funktion übergibst Du eine Variable des Typs Automation Excel Application
Code:
GetExcelApp(VAR XlApp2 : Automation "Unknown Automation Server.Application")
XlApp2 := XlApp;


Dein Code müsste dann so aussehen:

Code:
ExcelBuffer.GetExcelApp(ExcelApp);
IF CONFIRM (TXT50000) THEN ExcelBuffer.GiveUserControl() ELSE ExcelApp.Quit;


Gruss



Vielen Dank, aber das was ich wollte, ließ sich etwas anders realisieren:
In Tab 370 hab ich implementiert GetExcelApp():
Code:
XlWrkBk.SaveAs('C:\Testdatei-1234.xls');
XlWrkBk.Close();
XlApp.Quit;


In meinem Report rufe ich entsprechend auf im Customer - OnPostDataItem():
Code:
RowNoVar := RowNoVar + 1;
EnterCell(RowNoVar, 2, 'Total','',TRUE,FALSE,FALSE);
EnterCell(RowNoVar, 3, '', STRSUBSTNO(SUMME, RowNoVar - 1), TRUE, FALSE, FALSE);
ExcelBuffer.CreateBook;
ExcelBuffer.CreateSheet(TABLECAPTION, TABLECAPTION, COMPANYNAME, USERID);
IF CONFIRM (TXT50000) THEN ExcelBuffer.GetExcelApp;


Fazit: in der Tabelle 370 hat einfach die Funktion GetExcel App gefehlt und ich wußte nicht, daß dort XlWrkBk vordefiniert ist als eine Abbildung vom Automation Server für Excel 2007.

Übrigens, was für einen Sinn hat Ihr Bsp.:

Code:
GetExcelApp(VAR XlApp2 : Automation "Unknown Automation Server.Application")
XlApp2 := XlApp;


Müßte es nicht eher XlApp := XlApp2; heißen?

Aber nochmals danke für den Denkanstoß, weil von allein wär ich nicht drauf gekommen, daß ich noch GetExcelApp implementieren muß! THX! :-)

Re: Excel Datei nach dem Erzeugen automatisch speichern?

27. April 2010 13:07

Hallo

Müßte es nicht eher XlApp := XlApp2; heißen?

Nein, da XlApp2 by Reference übergeben wird ist das so schon korrekt.

Gruss