DBE-Einstellung

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

DBE-Einstellung

Beitrag von Jan »

Kuze Frage für eine kurze Antwort:

Wie stelle ich DBFDBE_ANSI korrekt auf .T. ein? Egal was ich mache, ich bekomme einen Laufzeitfehler wegen falschem Parameter.

Alle anderen Einstellungen zur DBE werden aber korrekt übernommen.

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Jan,

also laut dem blauen Text im 1.90 Handbuch, könnte man denken dass man es während der Laufzeit umstellen kann. Aber das macht keinen Sinn.
(mal sehen ob ich wieder einen Rüffel von Steffen bekomme :) )

Bisher und bei DBINFO ist es ein reiner read only Infowert und war so definiert:

DBFNTX immer in OEM
FOXCDX (DBFCDX ?) immer in der SET CHARSET Einstellung bei der Erstellung der DBF.

Und nur das macht Sinn, solange ein Umschalten dieses Schalters nicht automatisch die DBF von ANSI nach OEM umsetzt. Somit müsste man eine neue wie gewünscht erstellen und von der Alten umkopieren. Beim Lesen und schreiben müsste dann alles automatisch umgesetzt werden...
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hubert,

die Doku zu DBFDBE sagt, daß DBFDBE_ANSI Assignable ist. Also muß man das über DbeInfo() ändern können.

Der Punkt bei mir ist: Ich habe dbf, die ich aus Access heraus exportiert habe. Und Access schreibt offensichtlich ANSI in dbf. Um das nun in meiner Xbase++-Anwendung korrekt verarbeiten zu können muß ich also DBFDBE_ANSI = .T. setzen. Oder verstehe ich da was falsch?

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Jan hat geschrieben:die Doku zu DBFDBE sagt, daß DBFDBE_ANSI Assignable ist. Also muß man das über DbeInfo() ändern können.
Ich gebe dir da grundsätzlich recht, aber vieles was gehen müsste geht doch nicht ;)

Immerhin hast du einen sinnvollen Einsatzzweck gefunden ;)
Ich hatte wenig Erfolg mit dem Export aus Access und habe deshalb SQLExpress genutzt um per SQL-ODBC auf die MDB zuzugreifen und die Daten zu extrahieren. Eines meiner Probleme war aber auch eine verschiedene Accessversion, die bei ODBC Zugriff keine Rolle spielte.

Versuche doch mal folgendes:

1. Charset auf OEM, öffnen mit DBFNTX ->
Xbase denkt es ist OEM und konvertiert nicht, es ist aber ANSI
nun wandle alle Inhalte manuell:
ConvToOemCP( cFeldInAnsi )

2. Charset auf OEM, öffnen mit DBFCDX / FOXCDX ... testen.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo Hubert,

ja, vielleicht sollte ich mal an den Support mailen. Morgen.

Das mit dem Feldweise konvertieren mag funktionieren. Ich muß aber gestehen daß mir das nicht wirklich gefällt, da es ca. 50 Tabellen mit teilweise mehreren Dutzend Feldern und mehreren hunterttausend Sätzen gibt. Selbst wenn ich eine Routine schreibe die alle Tabellen automatisch durchgeht und alle Felder, dann ist das sicher immer noch ein enormer zeitlicher Aufwand. Den ich in der Entwicklungsphase mehrfach durchlaufen lassen müsste.

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Jan hat geschrieben:Ich muß aber gestehen daß mir das nicht wirklich gefällt, da es ca. 50 Tabellen mit teilweise mehreren Dutzend Feldern und mehreren hunterttausend Sätzen gibt ... Den ich in der Entwicklungsphase mehrfach durchlaufen lassen müsste.
Wenn der Support nicht helfen kann, schau dir SQLexpress an.
Für einmalige Konvertierungen reicht die DEMO, die DEMO Meldung kannst du wegklicken. Der Zugriff über ODBC auf die MDB ist einfacher als jede Tabelle nach DBF zu exportieren.
Gruß
Hubert
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Jan,

ich habe auch Probleme mit DBEInfo() gehabt, was ich in DBESYS() versucht habe.

Dann habe ich folgendes rausgefunden:
die Header-Datei laden,
die DBE als Standard-DBE festlegen,
erst dann DbeInfo() absetzen,
Dann kannst du deine normale Standard-DBE festlegen, wenn nötig.


Beispiel:

Code: Alles auswählen

#include "cdxdbe.ch"

PROCEDURE DBESYS()

.....

DbeSetDefault( "DBFNTX" )
DBEINFO(...)

DbeSetDefault( "FOXCDX" )

RETURN
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Moin Andreas,

ja, genau so mache ich das auch. DbeInfo() funktioniert ja auch anstandslos (ich benenne die Endungen der dbf und ntx um, das mache ich bei allen größeren Projekten so, funktioniert auch imemr einwandfrei). Nur eben die ANSI-Einstellung wird verweigert wegen falschem Parameter-Typ.

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Jan,

Code: Alles auswählen

#include "DbfDbe.ch"

PROCEDURE DbeSys()
  DbeLoad("FOXDBE")
  DbeSetDefault("FOXDBE")
RETURN

procedure main

use test alias t
? "Name: "+t->name
msgbox("Name: "+t->name)
? DbeSetDefault()
? "ANSI:",DbeInfo( COMPONENT_DATA,DBFDBE_ANSI)
? "Setzen"
DbeInfo( COMPONENT_DATA,DBFDBE_ANSI,.t.)
? "ANSI:",DbeInfo( COMPONENT_DATA,DBFDBE_ANSI)
? "Name: "+t->name
msgbox("Name: "+t->name)
inkey(0)
return
dieses kleine Testprogramm auf eine DBF ohne Memofelder losgelassen (erzeugt mit DBU im DBF Format)
öffnet die DBF mit dem FOX Treiber (der DBF Treiber kann immer nur OEM), akzeptiert bei mir
auch das setzen von ANSI = .T. ohne Fehlermeldung.

Allerdings werden die Daten sowohl im CRT als auch in der MSGBOX jeweils gleich angezeigt (und zwar richtig). Das könnte nun an der internen Konvertierung liegen, aber ich fürchte, dass die DBF immer so behandelt wird, wie sie erstellt wurde.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hubert,

manchmal sollte man genauer hinsehen :? Ich habe einen Eintrag in dem DbeInfo-Aufruf vergessen, das musste ja einen Fehler geben. :cry:

Aber: Ich habe das jetzt mal von Dir übernommen, inkl. der Abfrage welche Einstellung denn besteht. 2 Probleme:
1) Gibt mir die Abfrage nach der Einstellung 2 zurück, nicht .T. oder .F.
2) Ändert sich nichts an der Anzeige. Scheint immer noch OEM zu sein.

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Jan,

ich habe eben mit Access 2003 eine MDB und eine Tabelle mit Textfeldern erstellt und ÄÖÜ ß etc. eingegeben. Dann habe ich auf der Tabelle rechte Maustaste -> exportieren gestartet. Dort habe ich einmal mit DBase5 und nochmals mit DBase3 Format exportiert.

Mit DBU und DBEditor kann ich die DBF öffnen und die Umlaute stimmen !
Die DBF liegt also in OEM vor.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hubert,

lustig. Bei mir stimmt es eben nicht. Z. B. das "ü" aus Osnabrück wird als ³ angezeigt. Egal ob mit ANSI = .T. oder nicht. Und das war auch so, bevor ich die Endungen umbenannt habe (also wenn das was damit zu tun hätte :-)), also sozusagen mit einer Standard-DBE gearbeitet habe.

Merkwürdig das ganze.

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Jan,

mach die DBF mal mit DBU auf uns sieh nach wie die Daten aussehen.

Nutzt du GUI (msgbox) oder XbpCrt() modus ?

wenn ich

OEM-DBF
set charset to ansi
? name

teste, sehe ich auch ³ statt ü.
Mit msgbox(name) kommt trotzdem ein ü.

wenn ich

OEM-DBF
set charset to OEM
? name
oder msgbox(name)

teste, kommt immer ein ü.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo Hubert,

ja, da kommen wir der Sache schon näher.

Ich arbeite grundsätzlich mit ANSI-Quellcode. Habe also auch die entsprechende Einstellung in VX gesetzt.

Aber dabei ist es egal, was ich jetzt mit CHARSET und DBFDBE_ANSI eintrage, im Browse wird immer das ³ angezeigt.

Meine Projekte sind übrigens immer GUI pur. Ich war schlichtweg zu faul, da über irgendwelche Zwischenschritte zu gehen.

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

in der GUI stimmt es bei mir dennoch, nur im Textmodus nicht.

Hast du den DBU von Clipper zur Verfügung ?
Wenn nicht, mach doch mal in einer CMD Box:

copy xyz.dbf con

eventuell mit | more

copy xyz.dbf con | more

dann ist nämlich die interne Konvertierung weg.
Was man eventuell machen könnte wäre entweder die Daten lowlevel auf OEM setzen, oder aber im Header der DBF das ANSI Flag setzen.
Hierzu müsste man wissen welches Byte im Header genutzt wird. Im anderen Fall müsste man zuerst die Byte des Header einlesen und unverändert lassen, dann die Bytes der Daten und die durch ConvToOEMCP() jagen. Danach alles wieder zusammenfügen und abspeichern. Wobei memoread() zum lesen brauchbar ist, aber memowrit() ein chr(26) anhängt, das stören könnte. Nein es stört nicht, ich habe es gerade probiert.

Also entweder (aus dem Kopf)

Code: Alles auswählen

cDBF := memoread(cFileName)
cDBF[nAnsiByte] := ?? -> Ansi ist on, öffnen mit FoxDBE !
memowrit(cFileName, cDBF )
oder

Code: Alles auswählen

use (cFileName)
nHeader := Header()
close 
cDBF := memoread(cFileName)
cHeader := left(cDBF,nHeader)
cDaten   := ConvToOemCP(substr(cDBF,nHeader+1))
memowrit(cFileName, cHeader+cDaten )
Im 1. Fall muss man mit FoxCDX öffnen, sonst geht es nicht.

Ich habe das jetzt nicht getestet und man sollte es an einer Sicherungskopie probieren, aber es müsste funktionieren.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hubert,

Deine Erfahrungen haben mich nun doch stutzig gemacht. Warum geht das bei Dir, aber nicht bei mir?

Ich habe also jetzt die ganzen Tabellen nochmal neu von Access nach dbf exportiert. Du wirst es nicht glauben: Es funktioniert! Keine Ahnung, was mit den Dateien passiert ist. Ich hatte die auch beim letzten Mal nach dBase III exportiert, genau wie jetzt auch. Aber dieses Mal lief es korrekt.

Aber vielen Dank für Deine Geduld und die vielen Selbsttests.

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

schön dass es so geht. Bei der Methode mit dem Flag setzen bin ich mir jetzt doch etwas unsicher geworden, dann der Header einer FOX-DBF sieht ganz anders aus als der einer DBF-DBF. Das Datenumkopieren hatte aber funktionieren können.
Gruß
Hubert
Antworten