3. Juni 2009 09:52
Hallo zusammen,
ich habe folgendes Problem. Ich sollte eine "sehr datenintensive" Auswertung in Excel exportieren. Hier nutze ich natürlich den
Excel-Buffer von Navision. Die Variable für den Excelbuffer binde ich temporär ein. Wenn ich nun die Auswertung
starte, so kommt nach einer Weile die Betriebssystemfehlermeldung 131 "An attempt was made to move the file pointer before the
beginning of the file". In diesem Fall hat er noch nicht angefangen den Excelbuffer in Excel zu übernehmen, sondern war immer
noch dabei den Excelbuffer zu füllen. Eine Vermutung von mir war, dass ein temporärer Record nur eine begrenzte Anzahl
Datensätze aufnehmen kann. Ich habe also den Excelbuffer nicht temporär gestaltet und siehe da, das Ganze hat plötzlich
funktioniert.
Ich würde den Excelbuffer gerne nur temporär nutzen und wäre daher dankbar, wenn mir jemand von euch einen Tip hat, bzw.
generell weiß, wieviel Datensätze ein temporärer Record aufnehmen kann.
Vielen Dank...
3. Juni 2009 10:37
Hallo Tobias,
das Problem hierbei ist, dass temporäre Records im Arbeitsspeicher des Clients verwaltet werden.
Meine Erfahrungen in verschiedenen Projekten deuten darauf hin, dass diese Tabellen maximal 2GB groß werden dürfen.
Wächst die Tabelle darüber hinaus an, so kann NAV dies nicht mehr adressieren.
Scheinbar verwendet NAV für die Adressierung einen 4-Byte-Integer, welcher bekanntlich bei mehr als 2GB sein Vorzeichen wechselt.
Dies erklärt auch, warum der Pointer vor den Anfang der Datei (also die Tabelle im Arbeitsspeicher) gesetzt werden soll.
3. Juni 2009 10:45
Hallo Timo,
danke für Deine schnelle Antwort. In diesem Fall bleibt mir wohl nur die Möglichkeit die Tabelle für den Excelbuffer speziell für diesen
Fall zu kopieren um nicht mit anderen Programmierungen, die evtl. auch nicht temporär darauf zugreifen (man weiß ja nie...) zu kollidieren.
Oder gibt es eine elegantere Lösung?
Viele liebe Grüße,
Tobi
3. Juni 2009 10:49
Deine Lösung ist zwar nicht schön (und gefällt dir scheinbar auch selber nicht), aber leider scheint es wohl keine elegantere Lösung zu geben, wenn man mehrere Gigabytes nach Excel transferieren möchte.
Falls also jemand eine bessere/elegantere Lösung hat: Immer her damit, ich lerne auch gerne dazu
3. Juni 2009 11:35
Da temporäre Tabellen NICHT mit variablen Feldinhalt arbeiten, besteht auch noch die Möglichkeit auf einer Kopie des Excel Buffers die nicht benötigten Felder (z.B. Comment, Formula, usw.) entsprechend zu kürzen. Die volle Größe des Datensatzes beträgt nach meinen Berechungen 1600 Byte, nach dem Kürzen aller Textdfelder (abgesehen von "Cell Value as Text") von Text 250 auf Text 1 beträgt die Datensatzlänge nur noch 350 Byte. Es können also vermutlich 5 mal soviele Daten in den Excel Buffer eingetragen werden. Wenn du die benötigte Länge für das Feld "Cell Value as Text" abschätzen kannst, kann auch das noch gekürzt werden.
14. August 2009 21:51
Ich weiß zwar nicht ob es noch aktuell ist, aber evtl. hilft es einem von Euch.
Ein ähnliches Problem hatten wir auch mal, es wurden über 1 Millionen Felder exportiert.
Lösung: Weglassen aller 0 (Nuller) Werte.
Die Tabelle sah zwar nicht mehr so schön aus, aber es funktionierte.
Unklar ist allerdings geblieben, lag es an der anzahl Felder oder war die Datenmenge zu groß?!
16. August 2009 19:18
mikka hat geschrieben:Unklar ist allerdings geblieben, lag es an der anzahl Felder oder war die Datenmenge zu groß?!
Hallo Mikka,
aus meinen bisherigen Erfahrungen muss es an der Datenmenge liegen, denn ich bin mir ziemlich sicher, dass diese 2GB-Grenze die unüberwindbare Hürde für temporäre Tabellen darstellt.
17. August 2009 08:58
Timo Lässer hat geschrieben:aus meinen bisherigen Erfahrungen muss es an der Datenmenge liegen, denn ich bin mir ziemlich sicher, dass diese 2GB-Grenze die unüberwindbare Hürde für temporäre Tabellen darstellt.
nicht nur für temporäre Tabellen, sondern für jede 32bit Anwendung ;)
3. März 2010 14:52
Hallo zusammen,
nachdem ich schon öfter über dieses Problem gestolpert bin und sich der Kunde dieses Mal nicht mit "dann exportieren Sie halt häppchenweise" abspeisen lassen wollte,bin ich durch Verbinden verschiedener Foren-Einträge zum Thema Excelbuffer (danke jeweils :)) auf eine Lösung gekommen, die es mir erlaubt hat im aktuellen Fall 64GB nach Excel zu exportieren.
Grundgedanke: Datei zwischenspeichern, bevor die temporäre Datei zu groß (> 2 GB) wird, Buffer leeren und solange fortfahren, bis alles exportiert ist. Offen ist noch, was aus Performance-Gründen der optimale Zeitpunkt zum Zwischenspeichern ist. (In meinem Fall ergab Speichern alle 5.000 Datensätze eine temporäre Datei von 0,5 GB; und lief 7 Stunden, ...)
1. Zwei neue Funktionen in Tabelle 370 (Hier entwickelt auf 3.70; Excel 2007 zwingend vorausgesetzt)
SaveBook()
---------------------
XlWorkBook.Save; // in bestehende Datei speichern
XlWorkBook.Close; // Schliessen
XlApplication.Quit; // Excel beenden
CLEAR(XlApplication);
SaveBookAs(FileName : Text[250])
------------------
XlWorkBook.SaveAs(FileName); // Datei speichern
XlWorkBook.Close; // Schliessen
XlApplication.Quit; // Excel beenden
CLEAR(XlApplication);
2. Filename, Sheetname sowie Anzahl Datensätze, nach denen zwischengespeichert werden soll, in der RequestForm abfragen.
(Wer möchte kann die Datei im OnPreReport noch löschen, wenn schon vorhanden; sonst kommt Nachfrage während des 1. Speicherns)
IF FILE.EXISTS(Filename)THEN BEGIN
IF NOT CONFIRM('Datei existiert bereits - überschreiben?') THEN
ERROR('Datei existiert bereits!');
FILE.ERASE(Filename);
3. Im OnAfterGetRecord die Funktion SaveExcelFile aufrufen (Und im OnPostDataItem natürlich auch nochmal für die restlichen Datensätze)
IF RowNo MOD gvSpeichereNachXDatensätzen = 0 THEN BEGIN
SaveExcelFile();
END;
SaveExcelFile()
--------
IF NOT gvFirstCall THEN BEGIN
TempExcelBuffer.OpenBook(Filename,Sheetname);
TempExcelBuffer.CreateSheet(Sheetname,'',COMPANYNAME,USERID);
TempExcelBuffer.comSaveBook();
END ELSE BEGIN
TempExcelBuffer.CreateBook;
TempExcelBuffer.CreateSheet(Sheetname,'',COMPANYNAME,USERID);
TempExcelBuffer.comSaveBookAs(Filename);
gvFirstCall := FALSE;
END;
TempExcelBuffer.DELETEALL;
CLEAR(TempExcelBuffer);
Ergänzungen zur Optimierung werden gerne entgegengenommen,)
Grüße, Maren.
3. März 2010 15:43
das Schreiben ist die eine Sache, aber hat es auch jemand geschafft dieses 64GB Excel Monster dann zu öffnen oder Auswertungen damit zu machen?
27. April 2010 10:28
Ara hat geschrieben:das Schreiben ist die eine Sache, aber hat es auch jemand geschafft dieses 64GB Excel Monster dann zu öffnen oder Auswertungen damit zu machen?
Und was interessant wäre, ist die Frage, warum man 64 GB in Excel auswertet und nicht die SQL-Server AS, RS oder IS hernimmt? Es würde mit Excel doch Wochen dauern, bis 64 GB verarbeitet sind. Da wäre es doch besser, wenn man das ganze in eine Access Datenbank reinpackt, bevor man es auswertet, wenn für SQL-Server kein Geld mehr da ist.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.