Datenübernahme von Xbase zu Windev

Alle Themen rund um die Erstellung von Programmen
Antworten
Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Datenübernahme von Xbase zu Windev

Beitrag von Herbert »

Beim Umwandeln von Xbase .dbf-Tabellen erden ab einem bestimmten Moment die logischen Felder nicht mehr korrekt umgewandelt.

Nach mehreren Versuchen und Kontakt mit der technischen Abteilung von PC-Soft ergibt sich folgender Lösungsweg:
- es muss der Foxpro OLE DB Treiber versendet werden.
Download ab hier: http://www.microsoft.com/en-us/download ... x?id=14839

Nur - das ist der Treiber aus FoxPro-Zeiten. Daher ist dieser Treiber nur bis und mit Windows XP einsetzbar.
PC-Soft ist darüber informiert. mal sehen, was die machen.

Workaround:
Mit dem internen Treiber von Windev umstellen (so kommen auch die memos mit). Anschliessend nachbearbeiten der logischen Felder.
Ich exportiere die .DBF in eine sdf-Datei mittels DbExport in Xbase. Eine Rutine scannt diese Datei durch und ersetzt so die logischen Werte an richtiger Stelle.

Benutzeravatar
BRANDELH
Site Admin
Beiträge: 199
Registriert: 30. Juni 2010, 14:31
Wohnort: Germersheim
Kontaktdaten:

Re: Datenübernahme von Xbase zu Windev

Beitrag von BRANDELH »

Ich habe in anderen Export Fällen immer mit set alternate to, einer FOR NEXT Schleife und "?" genau den Datensatzaufbau erzeugt, den ich benötigt habe (SDF, SQL etc.)
DBEXPORT mag etwas schneller sein als die FOR NEXT, aber so ist man flexibler beim Format: 0/1 oder Ja/Nein bei logik Feld, Datum, Memo etc.

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Datenübernahme von Xbase zu Windev

Beitrag von Herbert »

Das Problem hat nun eine Bearbeitungsnummer und wird irgendwann mal als Fix integriert. Grund ist übrigens nicht ein Fehler von Windev, sondern von Xbase-Seite her, da offensiochtlich nicht immer ein Wert in ein logisches Feld geschrieben wird. Heisst, dass der Inhalt NIL ist und nicht 0 (=false). Wieso dies nur sporadisch vorkommt, ist nicht klar, da das Erstellen der Datensätze mit APPEND BLANK entsteht.

Diese Tatsache hat mich zu einer Alternative gezwungen. Allerdings mit dem schönen Nebeneffekt, flexibel die Daten anpassen zu können.
Die Umwandlung von XBase zu WIndev verläuft nun 3-Stufig
1. Export aus Xbase

Code: Alles auswählen

	DbeLoad( "SDFDBE" )            // Ergebnis: .T.
	SET ORDER TO 0
	SET FILTER TO
	SELECT(1)
    	DbExport( cSDF,,,,,,, "SDFDBE" , ;   // cSDF ist der Name der zu erstellenden Textdatei
      	            { {SDFDBE_LOGICAL_TOKEN, "10"} } )
eventuelles Umwandeln zu Oem zu Ansi
Ergebnis: 2 Dateien, eine mit der Struktur (Erweiterung SDF) und die Andere mit dem Inhalt (Erweiterung TXT)
2. Umwandlungsprogramm geschrieben in Windev
Die Analyse beinhaltet dieselben Datenfelder aber mit den für Windev passenden Feldtypen. Hier sind bekanntlich wesentlich mehr Typen möglich.

Code: Alles auswählen

	IF NOT HDBOpen("ZLMAND","MA",CompleteDir(EDT_Pfadalt)+"ZLMAND.DBF") THEN
		Error("hdbopen zlmand nicht ok")
		RESULT False
	END
	HChangeDir(Mandanten,EDT_Pfadneu)
	HCreation(Mandanten,"","","",hChangeCharset)
//	HDeleteAll(Mandanten)
	HReadFirst("ZLMAND")
	i=0
	WHILE NOT HOut
		IF HCopyRecord(Mandanten,"ZLMAND") THEN
			HAdd(Mandanten)
			i++
		END
		HReadNext("ZLMAND")
	END
	ModifyFromSDF("ZLMAND",EDT_Pfadalt,EDT_Pfadneu,False)		// ersetzen logische Felder
Das ModifyFromSDF ersetzt die logischen Felder korrekt. Liest das DSF durch und bei einem logischen Feld wird der Wert im TXT gelesen und bei 1 auf true gesetzt sonst auf false.
3. Das eigentliche Programm erstellt nun die passenden Dateien beim ersten Aufruf
Die Dateien aus dem Transfeer werden ausserhalb der Analyse geladen. In der Analyse stehen die Dateien in der gewünschten Form (mehr Felder und auch fehlende Felder der Transferdateien).

Code: Alles auswählen

	IF NOT HDeclareExternal(CompleteDir(EDT_Pfadalt)+"Trans_MAND.fic","TRMAND") THEN
		Error("hdbopen zlmand nicht ok")
		RESULT False
	END
	HChangeDir(Mandanten,EDT_Pfadneu)
	HCreation(Mandanten,"","","",hChangeCharset)
	HReadFirst("TRMAND")
	i=0
	WHILE NOT HOut
		IF HCopyRecord(Mandanten,"TRMAND") THEN
			HAdd(Mandanten)
			i++
		END
		HReadNext("TRMAND")
	END
	HClose("TRMAND")
	HCancelDeclaration("TRMAND")
Zusätzlich kann beim Einlesen auf ungültige oder nicht mehr benötigte Datensätze kontrolliert, welche nicht verarbeitet werden.
Dies kann nach HcopyRecord eingebaut werden und je nach Ergebnis lässt man den Hadd einfach weg!

Benutzeravatar
BRANDELH
Site Admin
Beiträge: 199
Registriert: 30. Juni 2010, 14:31
Wohnort: Germersheim
Kontaktdaten:

Re: Datenübernahme von Xbase zu Windev

Beitrag von BRANDELH »

Ist das nur nach Append blank (ab und zu) vorgekommen oder auch nach replace ... with .f. ?

Benutzeravatar
BRANDELH
Site Admin
Beiträge: 199
Registriert: 30. Juni 2010, 14:31
Wohnort: Germersheim
Kontaktdaten:

Re: Datenübernahme von Xbase zu Windev

Beitrag von BRANDELH »

Ich habe es eben mal mit DBU durchgespielt und die DBF im Hexeditor geöffnet.
Append Blank hat ausschließlich Blanks an die Datei angehängt. Erst ein copy to ... oder ein Replace with .f. haben dann die Werte gesetzt.
Beim DBU dann auch 0.0 für die Zahlen. T und F stehen übrigens in der Datei, nicht 0 !

Benutzeravatar
BRANDELH
Site Admin
Beiträge: 199
Registriert: 30. Juni 2010, 14:31
Wohnort: Germersheim
Kontaktdaten:

Re: Datenübernahme von Xbase zu Windev

Beitrag von BRANDELH »

Liegt es an Alaska ?
Weiterer Test mit Cli**er 5.2 DBU und gleiches Verhalten ...

Ein COPY TO oder (vermutlich) APPEND FROM beseitigen den Fehler (nur copy to probiert).
Damit kann man auch einfach die Anzahl der Datensätze einschränken bzw. bei APPEND FROM auch die Struktur ändern.

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Datenübernahme von Xbase zu Windev

Beitrag von Herbert »

Hubert, ich kanns dir nicht sagen. Die Fehler ereignen sich direkt aus dem in Xbase erstellten Code (APPEND-Befehl). Aber eben nicht immer... Von da her gesehen vermute ich deine Annahme, dass Xbase da nicht immer korrekt arbeitet.

Benutzeravatar
BRANDELH
Site Admin
Beiträge: 199
Registriert: 30. Juni 2010, 14:31
Wohnort: Germersheim
Kontaktdaten:

Re: Datenübernahme von Xbase zu Windev

Beitrag von BRANDELH »

Hallo Herbert,

ich hatte mich falsch ausgedrückt, Xbase++ verhält sich wie Cli**er !

Append Blank erzeugt nur einen Satz mit Blanks, erst ein REPLACE auf das Feld speichert die Formatierung die nötig ist.
Ein COPY TO repariert aber eine DBF auf jeden Fall.

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Datenübernahme von Xbase zu Windev

Beitrag von Herbert »

Bist du sicher? Ein COPY TO... SDF macht dies jedenfalls nicht.

Benutzeravatar
BRANDELH
Site Admin
Beiträge: 199
Registriert: 30. Juni 2010, 14:31
Wohnort: Germersheim
Kontaktdaten:

Re: Datenübernahme von Xbase zu Windev

Beitrag von BRANDELH »

ein copy to SDF habe ich nicht ausprobiert, ich sprach von DBF Dateien und dem internen Aufbau.
Nach meinen Tests (Testprogramm habe ich im Xbase Forum veröffentlicht) hat ein COPY TO (ohne SDF) eine DBF erzeugt die intern alle Felder richtig darstellt.

... wobei ich probiere es mal:

Code: Alles auswählen

1234567890F  0.00
          T  0.00
          F  0.00
          F# 0.00
          F  1.00
          F  0.00
so stellt sich die SDF Datei dar, statt der Blanks sind hier 0.00 bei den Zahlen und T/F bei logischen Feldern, was will man mehr ?

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Datenübernahme von Xbase zu Windev

Beitrag von Herbert »

Hm. Was heist bei dir "Blanks"? Der Wert NIL?

Benutzeravatar
BRANDELH
Site Admin
Beiträge: 199
Registriert: 30. Juni 2010, 14:31
Wohnort: Germersheim
Kontaktdaten:

Re: Datenübernahme von Xbase zu Windev

Beitrag von BRANDELH »

Hallo Herbert,

den Wert NIL gibt es DBF / Text Dateien gar nicht. Ein Blank ist ein chr(32) bzw. chr(0x20), auch als Leerzeichen oder SPACE(1) bekannt.
Wenn eine Variable in Xbase++ NIL ist, dann ist sie vom Typ unbestimmt, für API Aufrufe wird das zu einem Null-Pointer ( 0 statt einer gültigen Speicheradresse).

Falls du die alte Funktion BLANK() aus den XbToolsIII meinst, die erzeugt eine Variable des übergebenen Typs, aber mit LEEREM Wert:

N => 0
D => leeres Datum etc.
C => ""

Ich wollte nur erwähnen, dass man mit COPY TO eine Exportdatei erzeugen kann, die Feder mit definiertem Inhalt erhält.

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Datenübernahme von Xbase zu Windev

Beitrag von Herbert »

Alles klar. Nein, Tools habe ich nie verwendet.

Antworten