Seite 1 von 1
Betriebssystemfehler bei use
Verfasst: Mi, 05. Jun 2019 13:56
von Martin_L
Hallo Zusammen,
ich habe ein Problem, bei dem ich nicht weiter komme.
Das Programm soll eine csv in eine dbf einlesen. Es funktioniert auch so.
Nur, wenn ich danach eine 2. csv mit dem gleichen Programmcode in eine 2. dbf einlesen will, kommt ein Betriebssystemfehler beim use ... .
Also einmal Input1.txt -> File1.dbf danach Input2.txt -> File2.dbf.
Hat jemand eine Idee?
LG Martin
Code: Alles auswählen
aStructure := { {"F1", "C", 4, 0}, {"F2", "C", 4, 0}, {"F3", "C", 4, 0}, {"F4", "C", 1, 0} }
select 1
DbCreate("File1", aStructure, "DBFDBE")
use File1
select 2
DbeSetDefault("DELDBE")
DbeInfo(COMPONENT_DATA, DELDBE_FIELD_TOKEN, ";")
DbeInfo(COMPONENT_DATA, DELDBE_FIELD_TYPES, "CCCC")
use ("Input1.txt") ALIAS inp VIA ("DELDBE") // Zeile mit dem Fehler beim 2. Aufruf
go top
do while .not. inp->(eof())
select 1
append blank
select 2
replace File1->F1 with field->field1
replace File1->F2 with field->field2
replace File1->F3 with field->field3
replace File1->F4 with field->field4
SKIP
enddo
use
DbCloseArea()
use
DbCloseArea()
close all
Re: Betriebssystemfehler bei use
Verfasst: Mi, 05. Jun 2019 14:06
von brandelh
Die DELDBE ist etwas sperrig in der Anwendung, falls die Satzlänge variiert oder Sonderzeichen vorkommen hat man nichts als Probleme.
Möglich, dass dies in der 2.00 mittlerweile besser wurde, aber ich habe diese nach kurzen Versuchen nicht mehr verwendet.
In der Wissensdatenbank findest du eine Klasse, mit der man Textdateien jeder Art einlesen kann, so mache ich das.
Außerdem würde ich keine Befehle nutzen, sondern Funktionen mit dem Alias / Select Bezeichner direkt: replace ZIEL->Feld with (nQuelle)->Feld ... so ist klarer welche wie gemeint ist.
HBTxtReader() - egal ob UNIX oder Windows Dateiformat (Zeilenschaltung), egal ob fixe Satzlänge oder variabel, sehr schnell.
viewtopic.php?f=16&t=7961
Re: Betriebssystemfehler bei use
Verfasst: Mi, 05. Jun 2019 14:11
von Martin_L
Danke für die Antwort.
Es liegt nicht an der csv-Datei. Es funktioniert ja mit einer Datei einzeln und dabei ist es auch egal ob Datei1 oder Datei2.
Nur wenn ich beide nacheinander einlese kommt der Fehler und auch hier ist die Reihenfolge egal.
Re: Betriebssystemfehler bei use
Verfasst: Mi, 05. Jun 2019 14:19
von brandelh
Genau, weil Xbase intern die Dateien mit möglichen Beschreibungsdateien nicht sauber schließt oder sonstige Fehler macht ...
du kannst den Fehler melden und warten ob Alaska eine Lösung bietet, oder es einfach anders machen
PS: an deinem Code fällt mir kein Fehler auf. Meine Anmerkungen bezüglich der Namen sind rein dokumentarischer Natur.
Re: Betriebssystemfehler bei use
Verfasst: Mi, 05. Jun 2019 14:40
von Martin Altmann
Na Hubert,
dann hast Du aber nicht aufmerksam genug geschaut - da sind schon ein paar "Fehler" drin. Allerdings weiß ich nicht, was davon in seinem Originalcode drin ist und was davon durch das Anpassen für seinen Beitrag hier dazu kam.
Martin,
Deine Zeilen am Ende machen so nicht viel Sinn:
Du schließt zweimal die selbe Workarea() und danach noch einmal alle offenen Dateien.
Viele Grüße,
Martin
Re: Betriebssystemfehler bei use
Verfasst: Mi, 05. Jun 2019 14:42
von Martin_L
Hallo Martin,
ich habe ja schon eine Weile rumprobiert und erst nur "close all" drin gehabt.
Die anderen Sachen habe ich nach und nach eingebaut, aber an der Stelle kommt auch kein Fehler hoch.
Sei es drum, ich habe es jetzt mit MEMOREAD und TOKEN gelöst.
Re: Betriebssystemfehler bei use
Verfasst: Mi, 05. Jun 2019 14:47
von Tom
Ich nehme an, dass eine Workarea nicht ordentlich geschlossen wird. An den vielen USE - CLOSE - CLOSE ALL am Ende des Codes sieht man ja, dass Du damit schon herumgespielt hast.
Ich würde auf die numerische Auswahl von Workareas (SELECT 1 .. SELECT 2 ... SELECT 3) völlig verzichten und alle USEs um NEW und einen Alias ergänzen:
USE ... NEW ALIAS file1
Damit ist immer die nächste freie Workarea gewählt und die Tabelle kann mit "SELECT file1" oder file1-> angesprochen werden. In etwa so also:
Code: Alles auswählen
aStructure := { {"F1", "C", 4, 0}, {"F2", "C", 4, 0}, {"F3", "C", 4, 0}, {"F4", "C", 1, 0} }
DbCreate("File1", aStructure, "DBFDBE")
use File1 alias file1 NEW
DbeSetDefault("DELDBE")
DbeInfo(COMPONENT_DATA, DELDBE_FIELD_TOKEN, ";")
DbeInfo(COMPONENT_DATA, DELDBE_FIELD_TYPES, "CCCC")
use ("Input1.txt") ALIAS inp VIA ("DELDBE") NEW // Zeile mit dem Fehler beim 2. Aufruf
go top
do while .not. inp->(eof())
select file1
append blank
replace F1 with inp->field1
replace F2 with inp->field2
replace F3 with inp->field3
replace F4 with inp->field4
select inp
SKIP
enddo
select inp
close
select file1
close
Das ist auch noch nicht superelegant, sollte aber auch bei wiederholten Aufrufen funktionieren. Ach so, und ganz wichtig. Das hier ist die Fehlerquelle:
Das muss am Ende der Funktion natürlich wieder aufgehoben werden:
Re: Betriebssystemfehler bei use
Verfasst: Mi, 05. Jun 2019 14:47
von Tom
Wie eben gezeigt. Du setzt die Default-DBE auf DELDBE, aber Du setzt das nicht wieder zurück. Das ist der Fehler.
Edit: Das Setzen der DELDBE als Default-DBE kannst Du auch völlig rausnehmen (und das Gegenteil auch), weil Du ja ein VIA beim entsprechenden USE hast.
Re: Betriebssystemfehler bei use
Verfasst: Mi, 05. Jun 2019 14:53
von Martin_L
Hallo Tom,
ohne
hat es auch nicht funktioniert.
Wie gesagt, ich habe es jetzt anders gelöst.
Re: Betriebssystemfehler bei use
Verfasst: Mi, 05. Jun 2019 15:52
von brandelh
Für Memoread() darf die Datei nicht zu groß werden ...
Mehrfache USE hintereinander mögen nicht elegant sein (sinnlos), aber wenn es ein Fehler wäre, dann würde ein Laufzeitfehler auftreten