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.

:arrow: 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:

Code: Alles auswählen

use
DbCloseArea()
use
DbCloseArea()
close all
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:

Code: Alles auswählen

DbeSetDefault("DELDBE")
Das muss am Ende der Funktion natürlich wieder aufgehoben werden:

Code: Alles auswählen

DbeSetDefault("DBFNTX")

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

Code: Alles auswählen

DbeSetDefault("DELDBE")
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 ;-)