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

Code: Alles auswählen

      aValues := oWorkBook:workSheets(1):usedRange:value
nimmt, hat man alle Werte in einem Array.
hm ... :-k
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