Seite 1 von 1
Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm
Verfasst: Mo, 26. Feb 2018 20:10
von georg
Hallo,
ich habe da einen sehr seltsamen Effekt:
Code: Alles auswählen
nCurRow := 2
lDoShift := .F.
xValue := oSheet:Cells(nCurRow, 1):Value
WHILE xValue <> NIL .AND. nCurRow <= nMaxRows
oProgressDia:NewLine("Zeile " + LTrim(Str(nCurRow)) + " von " + LTrim(Str(nMaxRows)))
WriteLineIntegra(oSheet, nCurRow, lDoShift)
nCurRow ++
xValue := oSheet:Cells(nCurRow, 1):value
END
oProgressDia ist eine Klasse, mit der ich Fortschrittsinformationen in einer XbpListbox() ausgeben kann.
Lasse ich das Programm im Debugger laufen, wird die Datei komplett gelesen und verarbeitet.
Lasse ich das Programm ohne Debugger laufen, hängt das Programm bei der 28. Zeilen und reagiert nicht mehr.
Die Excel-Datei wird durch einen Export aus einem DWH erzeugt und lässt sich in MS Office 2010 ohne Probleme oder Fehlerhinweise laden.
Nun brauche ich eine gute Idee ...
Re: Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm
Verfasst: Mo, 26. Feb 2018 20:52
von AUGE_OHR
ich hatte auch mal die Situation das es nur mit Debugger lief
https://xbaseforum.de/viewtopic.php?f=32&t=8612&p=97058
Frage : Xbase++ v1.9x oder v2.x ?
liest du die Excel Datei via ActiveX ?
p.s. eine XbpListbox() würde ich auf o:hide() schalten wenn ich mehr o:AddItem() habe als ich anzeigen kann (ohne Scrollbar).
Re: Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm
Verfasst: Mo, 26. Feb 2018 21:05
von georg
Hallo, Jimmy -
also, Xbase++ 2.0 (Version 886). Die Excel-Datei wird via Office-Automation geöffnet, also CreateObject("Excel.Application").
Im Gegensatz zu Deinem damaligen Problem lässt sich das Programm starten und bedienen. Nur beim Einlesen der Daten aus der Excel-Datei hängt es sich ohne Debugger auf.
Re: Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm
Verfasst: Mo, 26. Feb 2018 22:01
von Werner_Bayern
Hört sich nach einem notwendigen sleep(1) an, wenns nicht ursächlich an dieser Excel-Datei liegt?
Re: Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm
Verfasst: Mo, 26. Feb 2018 22:19
von AUGE_OHR
was ist wenn du den Progressbar weg lässt
überhaupt was für ein Progressbar ist es
wenn es der "grüne" Progressbar von Alaska oder DXE_Progressbar sein sollten : die laufen in einen eigenen GUI Thread
---
Frage : warum nimmt du eine Schleife um das Excel Sheet zu "lesen"
wenn du den Berech (Range) markierst (SELECT) kannst du doch alles in ein Array schaufeln mit
Code: Alles auswählen
aExcel := oSheet:range( "A1:"+cEnde+LTRIM(STR(numRows)) ):value
Re: Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm
Verfasst: Di, 27. Feb 2018 7:58
von georg
Guten Morgen -
die Reaktionen auf solche Fragen sind immer wieder interessant. So habe ich geschrieben, dass die Fortschrittsanzeige eine XbpListBox() ist (also kein XbpprogressBar()). Die im Code gezeigte Information habe ich eingefügt, um festzustellen, an welcher Stelle es hakt, die war vorher dort nicht drin, aber der Hänger kam trotzdem.
Die Funktion WriteLineIntegra() übernimmt die Daten aus einer Zeile, ändert aber auch (abhängig von bestimmten Faktoren) Werte in der Excel-Datei. Dabei scheint es - sporadisch und an verschiedenen Stellen - zu dem Hänger zu kommen. (Hintergrund: ich habe einen Daten-Import aus einer Text-Datei auf Excel umgestellt).
Hier erscheint mir Jimmy's Vorschlag hilfreich, es mit einer Range zu versuchen und dann mit dem Array zu arbeiten (das Ändern in der Excel-Datei ist eigentlich nicht erforderlich, es müssen nur die importierten Daten angepasst werden).
Also danke erst einmal für das Feedback und die Hinweise. Ich werde weiter berichten.
Re: Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm
Verfasst: Di, 27. Feb 2018 8:01
von Martin Altmann
Nun,
im Allgemeinen kann man (wie von Werner angemerkt) davon ausgehen, dass der Garbage Collector etwas Zeit braucht - sofern etwas mit aktivem Debugger funktioniert, ohne aber nicht.
In diesem speziellen Fall wirst Du mit Jimmys Vorschlag sicherlich besser dran sein, weil schneller (kein Bremsen des Ablaufs).
Viele Grüße,
Martin
Re: Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm
Verfasst: Di, 27. Feb 2018 8:12
von Wolfgang Ciriack
wenn du den Berech (Range) markierst (SELECT) kannst du doch alles in ein Array schaufeln mit
Markieren ist doch gar nicht notwendig, wenn man
Code: Alles auswählen
oWorkBook := oExcel:workbooks:open(meineexecdatei)
aValues := oWorkBook:workSheets(1):usedRange:value
oWorkBook:close(.F.)
nimmt, hat man alle Werte in einem Array.
Re: Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm
Verfasst: Di, 27. Feb 2018 8:33
von AUGE_OHR
Wolfgang Ciriack hat geschrieben: ↑Di, 27. Feb 2018 8:12
Markieren ist doch gar nicht notwendig, wenn man
nimmt, hat man alle Werte in einem Array.
hm ...
aus irgend einem Grund lege ich das Array vorher in den Dimensionen an. dabei funktionierte
Code: Alles auswählen
// nmber Row / Col
numRows := oWorkBook:workSheets(1):usedRange:Rows:Count
numColumns := oWorkBook:workSheets(1):usedRange:Columns:Count
nicht wenn ich nicht vorher ein
Code: Alles auswählen
// SELECT hole Range
oWorkBook:workSheets(1):usedRange:Select
stehen hatte.
ich werde die paar Zeilen einfach mal auskommentieren und sehen ob es mit meiner (alten) Excel Version ohne die Zeilen läuft.
Danke für den Tip