Betriebssystemfehler bei use

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten
Martin_L
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 23
Registriert: Di, 02. Apr 2019 9:09
Danksagung erhalten: 6 Mal

Betriebssystemfehler bei use

Beitrag 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
Zuletzt geändert von Martin_L am Mi, 05. Jun 2019 14:16, insgesamt 2-mal geändert.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Betriebssystemfehler bei use

Beitrag 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
Gruß
Hubert
Martin_L
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 23
Registriert: Di, 02. Apr 2019 9:09
Danksagung erhalten: 6 Mal

Re: Betriebssystemfehler bei use

Beitrag 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.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Betriebssystemfehler bei use

Beitrag 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.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Betriebssystemfehler bei use

Beitrag 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
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Martin_L
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 23
Registriert: Di, 02. Apr 2019 9:09
Danksagung erhalten: 6 Mal

Re: Betriebssystemfehler bei use

Beitrag 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.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Betriebssystemfehler bei use

Beitrag 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")
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Betriebssystemfehler bei use

Beitrag 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.
Herzlich,
Tom
Martin_L
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 23
Registriert: Di, 02. Apr 2019 9:09
Danksagung erhalten: 6 Mal

Re: Betriebssystemfehler bei use

Beitrag 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.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Betriebssystemfehler bei use

Beitrag 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 ;-)
Gruß
Hubert
Antworten