Entwickler-Ecke
Datenbanken - Charset von dbase-Datenbanken ändern
kiwicht - Mi 18.12.02 13:03
Titel: Charset von dbase-Datenbanken ändern
Hi,
weiß einer wie ich zur Laufzeit den Charset von DB´s ändern kann?
Das Problem ist, das ich in allen möglichen Kontroll-Feldern, die auf die DB zugreifen, die Umlaute angezeigt bekomme. die die DB enthält. Aber intern werden die Umlaute immer noch nicht erkannt, und als z.B. ,"´ Gänsefüßchen dargestellt. Das macht sich dann bemerkbar, wenn ich mittels SQL in den Feldern nach "Ö" suche, und ich kein Feld angezeigt bekomme, obwohl es definitv Felder geben müsste.
Bei den z.B. Edit-Feldern setzt ich ja einfach unter "Fonts" die "charset"-eigenschaft auf "OEM", aber was mache ich bei der DB-Quelle? Muss ich das vielleicht irgendwo in der SQL-Anweisung festlegen?
danke im Voraus für hoffentlich eine Lösung, bin echt am verzweifeln hier...
kiwicht
LCS - Mi 18.12.02 13:22
Hi
ne Funktion um den Zeichensatz zur Laufzeit zu ändern gibts IMHO nicht. Ich hatte vor längerer Zeit ein ähnliches Problem und die enizige Lösung die was gebracht hat, war die Tabelle in eine neue, mit dem richtigen Zeichensatz zu schreiben.
Als Alternative könntest du noch versuchen den SQL-String vor dem Absenden zu konvertieren. Entweder mit der API-funktion CharToOEM oder noch besser mit der BDE-Funktion dbiAnsiToNative.
Gruss Lothar
kiwicht - Mi 18.12.02 15:00
also in eine neue db schreiben fällt leider aus, da von der db noch zig andere programme abhängen, und die will ich nicht alle portieren.
aber das mit den funktion werd ich ma probieren,
danke
kiwicht
kiwicht - Do 19.12.02 09:50
... ich habs jetzt mal mit dem AnsiToNative versucht, aber ich bin einfach zu lame die Funktion richtig einzusetzen:
Laut Delphi-Hilfe:
AnsiToNative(Locale: TLocale; const AnsiStr: string; NativeStr: PChar; MaxLen: Integer): PChar;
1. Wofür bitte steht Locale?
2. AnsiStr -> der String aus meinem EditFeld zur Konvertierung !?
3. NativeStr -> PChar, der konvertierte AnsiStr, aber kann ich mit PChar
auch SQL-Abfragen durchführen !?
4. MaxLen -> Wie lange darf der String max sein
und meine Ausführunge, die btw nichts funzt...
conveingabe := AnsiToNative(eingabe;25);
gut, das das NICHT funzen kann, is mir irgendwo schon klar, aber warum?
könnt ihr einem absoluten delphi-nub bitte weiterhelfen? thx im voraus, im gegenzug könnt ihr mir auch n paar flash-fragen stellen..... ;)
kiwicht
LCS - Do 19.12.02 10:14
Hi
das ist das betreffende Beispiel aus der BDE-Reference: Kapselt den Aufruf in einer Funktion.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function fDbiAnsiToNative(Table: TTable; AnsiStr: String): String; var pDesc: pLDDesc; Len: Word; Done: Boolean; begin Len := Length(AnsiStr); SetLength(Result, Len); Check(DbiGetLDObj(Table.Handle, pointer(pDesc))); Check(DbiAnsiToNative(pointer(pDesc), PChar(Result), PChar(AnsiStr), Len, Done)); end; |
Gruss Lothar
hansa - Do 19.12.02 14:19
Hi,
vielleicht gehts besser mit meiner Holzhammer-Methode :
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| function IBMAsciiToAnsi(s: string): string; var result : string; i: integer; begin Result := ''; for i := 1 to Length(s) do begin case s[i] of #142: Result := Result + #196; {ä} #153: Result := Result + #214; {ö} #154: Result := Result + #220; {ü} #132: Result := Result + #228; {Ä;} #148: Result := Result + #246; {Ö} #129: Result := Result + #252; {Ü} #225: Result := Result + #223; {ß} else Result := Result + s[i]; end; end; IBMAsciiToAnsi := result; end; |
ausländische Umlaute sind aber NICHT berücksichtigt !
Gruß
Hansa
kiwicht - Do 19.12.02 15:48
Cool, die von Hansa, die versteh sogar ich... seih mir nit böse LCS, aber bei deiner seh ich überhaupt nit durch... delphi-newby eben.. ;)
danke trotzdem, das hilft mir schon mal sehr viel weiter!
mfg
kiwicht
kiwicht - Mi 15.01.03 15:22
NAAAAAACHTRAG ...... ;)
Leider half die Holzhammer-Methode von Hansa auch nicht viel weiter... und ich hab mich nochmal eingehend mit dem Problem beschäftigt.
Die Lösung:
Der Text aus dem Edit-Feld DARF NICHT mit UpperCase in GroßBuchstaben umgewandelt werden, da diese Funktion nur die 7-bittigen Zeichen, also alles von a-z., berücksichtigt. Darunter fallen aber keine Umlaute.
Benutzt man AnsiUpperCase, werden aber auch diese Umgewandelt, und die Suche nach Umlauten wie Ö´s und Ü´s funktioniert einwandfrei!
Wollt ich nur mal gesacht haben, damit sich nachfolgende Generationen nicht auch an diesem Problem die Zähne ausbeissen... :P ... und damit der nächste per Suchfunktion eine vernünftige Lösung findet...
Danke nochaml für eure Hilfe und die wertvollen Tips...
mfg
kiwicht
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!