[gelöst] MSAccess Umlaute

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.

[gelöst] MSAccess Umlaute

Beitragvon VB_Lazarus » 13. Feb 2017, 19:00 [gelöst] MSAccess Umlaute

Hallo,

ich habe folgendes Problem:
Ich habe eine MSAccess Datenbank. In dieser Datenbank sind Wörter mit Umlaute.
Wenn ich die Datenbank auslese, verwende ich bei den TSQLQuery in dem Ereignis AfterOpen die Funktionen:

Code: Alles auswählen
DataSet.Fields[i].OnGetText:=@Text_von_DB_umwandeln;
DataSet.Fields[i].OnSetText:=@Text_nach_DB_umwandeln;
 

In diesen Funktionen wird der Text mit den Funktionen WinCPToUTF8 / UTF8ToWinCP umgewandelt.
Der Text (Umlaute) wird richtig in einem TDBGrid dargestellt.
Sobald ich aber den von dem TSQLQuery in ein TEdit lade

Code: Alles auswählen
frmPosition.TechnPlatz_Edit.Text:=unitDM.DM.SQLQueryPosition.FieldByName('TechnischerPlatz').AsString;
 

werden die Umlaute mit einem ? dargestellt. D.h. ich kann die Daten nicht ändern.
Was mache ich falsch, bzw. kennt jemand dieses Problem?
Danke.
Gruß
Zuletzt geändert von VB_Lazarus am 15. Feb 2017, 19:58, insgesamt 1-mal geändert.
VB_Lazarus
 
Beiträge: 65
Registriert: 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10 64bit / Windows 7 32bit, L 1.6.4 32bit, FPC 3.0.2 32bit | 
CPU-Target: 32Bit
Nach oben

Beitragvon Michl » 13. Feb 2017, 20:45 Re: MSAccess Umlaute

Geht denn dort die Umwandlung nicht?:
Code: Alles auswählen
frmPosition.TechnPlatz_Edit.Text:=WinCPToUTF8(unitDM.DM.SQLQueryPosition.FieldByName('TechnischerPlatz').AsString);
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2169
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon VB_Lazarus » 13. Feb 2017, 21:18 Re: MSAccess Umlaute

Hallo,

danke, für die schnelle Antwort.

Ich habe schon folgende Möglichkeiten versucht:
UTF8Encode, AnsiToUTF8,WinCPToUTF8,SysToUTF8
UTF8Decode, UTF8ToAnsi, UTF8ToWinCP, UTF8ToSys
Keine der Funktionen hat zum Erfolg geführt.
Ich werde mal ein Beispiel zusammenschrauben, vielleicht habe ich ja nur ein Denkfehler.

Gruß
VB_Lazarus
 
Beiträge: 65
Registriert: 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10 64bit / Windows 7 32bit, L 1.6.4 32bit, FPC 3.0.2 32bit | 
CPU-Target: 32Bit
Nach oben

Beitragvon Michl » 13. Feb 2017, 21:24 Re: MSAccess Umlaute

Welchen CodePoint hat denn ein ä, wenn du es noch nicht umgewandelt hast?

PS: Ich selbst könnte ein Minimalbsp. nicht testen, da ich kein MSAccess hier habe.
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2169
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon VB_Lazarus » 14. Feb 2017, 18:15 Re: MSAccess Umlaute

Falls Interesse besteht, ich habe mein Projekt stark reduziert, damit ich nur das Problem wie vorher beschrieben darstelle.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
VB_Lazarus
 
Beiträge: 65
Registriert: 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10 64bit / Windows 7 32bit, L 1.6.4 32bit, FPC 3.0.2 32bit | 
CPU-Target: 32Bit
Nach oben

Beitragvon wp_xyz » 15. Feb 2017, 00:23 Re: MSAccess Umlaute

Tut mir leid, ich seh keinen Fehler. In welchem Edit sollen denn die Umlaute nicht funktionieren? Wie erzeuge ich den Fehler? Ein bisschen mehr Hilfestellung würde ich mir schon erwarten, zumal das hier gar kein Minimal-Beispiel ist: 6 Units, Anforderungen für LazReport, powerpdf. Erwartest du denn allen Ernstes, dass sich jemand, der dir helfen will, seine Maschine mit Nicht-Standard-Komponenten vollkleistert, die er selbst nicht braucht? Und soll er sich mit dem Debugger durch die 6 Units wühlen, bis er das fehlerhafte Edit findet?

Entschuldige die harten Worte, aber manche Leute hier meinen, wenn man ihnen Hilfe angeboten hat, können sie ihr Hirn ausschalten und den Helfern die schlechtesten Voraussetzungen bieten. Bitte bereite das Demo-Projekt so auf, dass es nur das enthält, was nötig ist, und dass es den Fehler sofort zeigt, bzw. füge eine Schritt-für-Schritt-Beschreibung bei, wie man ihn erzeugen kann.
wp_xyz
 
Beiträge: 2249
Registriert: 8. Apr 2011, 08:01

Beitragvon VB_Lazarus » 15. Feb 2017, 05:48 Re: MSAccess Umlaute

Sorry,

In der Hauptform DBGrid (Spalte Position) siehst du die Umlaute.
Wenn du die in der Hautpform auf den Stift gehst, dann wird der aktuelle Datensatz editiert.
Es wird dann die Form frmPosition aufgerufen und die Daten werden von der SQLQuery in die TEdit geladen.
Bei diesen Laden, wird aus dem ü ein ?.
Beim Laden der SQLQuery wird die Anweisung AfterOpen aufgerufen, wo die Function OnGetText und OnSetText aufgerufen werden.
Da ich ein wenig mit den Stringumwandlungen rumexperimentiert habe, habe ich dort mehrer Optionen eingefügt.
Diese kann man in der Einstellungsdatei 'Einstellungen.ini' entsprechend einstellen ([DATABASE], TEXT_UMWANDELN_OPTION=3).
Nur bei der Option 3 (WincpToUtf8) werden die Umlaute richtig im DBGrid dargestellt.
Leider ist diese Beispiel etwas größer, da ich mein Projekt genommen habe, um zu sehen, ob ich eine verkehrte Einstellung habe.
Ich sehe halt vor lauter Bäume den Wald nicht mehr.
Ich habe die Abhängigkeiten rausgenommen.
Falls notwendig, kann ich auch noch die Exe in die Zip reinkopieren.
Gruß
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
VB_Lazarus
 
Beiträge: 65
Registriert: 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10 64bit / Windows 7 32bit, L 1.6.4 32bit, FPC 3.0.2 32bit | 
CPU-Target: 32Bit
Nach oben

Beitragvon wp_xyz » 15. Feb 2017, 10:49 Re: MSAccess Umlaute

Schön, das ist jetzt besser.

Also: als erstes solltest du dein Projekt mit Debug-Einstellungen kompilieren, dann kannst du mit dem Debugger Breakpoints setzen und den aktuellen Wert von Variablen abfragen. Ohne dieses Tool, auch wenn viele über GDB schimpfen, bist du blind!

Dann zu deinem Problem:
Wenn ich zu Beginn von "TDM.Text_von_DB_umwandeln" Dummy-Variablen len := Length(Sender.AsString) und wlen := Length(Sender.AsWideString) definiere, einen Breakpoint auf der folgenden Zeile setze, das Programm starte und, wenn es am Breakpoint angehalten hat, mit der Maus über len und über wlen fahre, erscheint in dem Popup jedesmal der Wert 32. Da die Umlaute in UTF8 mit zwei Byte codiert sind, müssten die beiden Angaben voneinander abweichen, falls die aus der DB erhaltenenen Strings UTF8-kodiert wären. Daher sind die Strings entweder in der System-Codepage codiert, oder WideStrings. Da aber m.E. das alte Access per Default noch nicht mit WideStrings gearbeitet hat, tippe ich auf CodePage 1252 - d.h. du musst den per Sender.AsString ausgelesenen String mit CP1252ToUTF8 oder allgemeiner WinCPtoUTF8 nach UTF8 umwandeln.

An der Stelle mit dem Edit hast du
Code: Alles auswählen
frmPosition.Position_Edit.Text := unitDM.DM.SQLQueryPosition.FieldByName('Position').AsString

Offenbar wird hier beim einfachen Aufruf von Field.AsString nicht das Ereignis OnGetText erzeugt, so dass die String-Umwandlung fehlt. Entweder nimm hier von FieldByName('Position') den DisplayText, oder füge wieder eine explizite Umwandlung der CodePage um:
Code: Alles auswählen
  frmPosition.Position_Edit.Text := unitDM.DM.SQLQueryPosition.FieldByName('Position').DisplayText;
  //oder:
  frmPosition.Position_Edit.Text := WinCPtoUTF8(unitDM.DM.SQLQueryPosition.FieldByName('Position').AsString);

Entsprechend musst du natürlich beim Zurückschreiben in das Feld die Rückumwandlung ausführen:
Code: Alles auswählen
  unitDM.DM.SQLQueryPosition.FieldByName('Bezeichnung').Value := UTF8ToWinCP(frmPosition.Bezeichnung_Edit.Text);

In den Parametern, die du verwendest, um die ODBCConnection zu öffnen, verwendest du "ODBCConnection.Params.Add('CHARSET=UTF8')". Das ist offenbar wirkungslos, zumindest sehe ich keinen Unterschied, wenn man das entfernt, oder ändert. Daher würde ich das entfernen - es führt nur zur Verwirrung, falls du später den Code wieder siehst und alle Details vergessen hast.
wp_xyz
 
Beiträge: 2249
Registriert: 8. Apr 2011, 08:01

Beitragvon VB_Lazarus » 15. Feb 2017, 19:57 Re: MSAccess Umlaute

Hallo,

mit dem UTF8 hast du recht. Hat keine Auswirkung.

Ich habe jetzt herausgefunden, warum ich das Problem habe.

Ich habe folgende Zeile:
Code: Alles auswählen
unitDM.DM.ODBCConnection.Params.Add('Locale Identifier=1031');

Als ich diese Zeile deaktiviert habe, hat es mit der Umwandlung WinCPtoUTF8 auch geklappt.

Danke, für deine Denkanstoß.

Gruß
VB_Lazarus
 
Beiträge: 65
Registriert: 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10 64bit / Windows 7 32bit, L 1.6.4 32bit, FPC 3.0.2 32bit | 
CPU-Target: 32Bit
Nach oben

Beitragvon wp_xyz » 15. Feb 2017, 20:31 Re: [gelöst] MSAccess Umlaute

Ich glaube nicht, dass das dein Problem war. Denn ich habe Locale Identifier überhaupt nicht verändert, und dein Demo funktionierte trotzdem mit den Änderungen, die ich oben beschrieben habe.
wp_xyz
 
Beiträge: 2249
Registriert: 8. Apr 2011, 08:01

Beitragvon VB_Lazarus » 15. Feb 2017, 20:41 Re: [gelöst] MSAccess Umlaute

Seltsam.
Ich habe deine Änderungen vorher schon gemacht bevor ich in diesem Forum das Problem geschildert habe und nichts hat sich geändert.
Ich habe diese ? immer in dem TEdit gesehen.
Jetzt wo ich diesen Local Identifier rausgenommen habe, hat es zumindestens bei meinem Laptop mit Win10 64bit funktioniert.
Ich werde dies morgen bei meinem Firmen PC (win7 32bit Prof) ausprobieren.

Gruß
VB_Lazarus
 
Beiträge: 65
Registriert: 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10 64bit / Windows 7 32bit, L 1.6.4 32bit, FPC 3.0.2 32bit | 
CPU-Target: 32Bit
Nach oben

Beitragvon wp_xyz » 15. Feb 2017, 21:05 Re: [gelöst] MSAccess Umlaute

Leider kenne ich mich mit ODBC nicht gut aus. Ich habe das Gefühl, dass "Locale Identifier" genauso wenig unterstützt wird wie "Charset", zumindest finde ich diese Angaben in den üblichen ConnectionStrings nicht. Und bezüglich der Parameter ist ODBCConnection sehr tolerant und schluckt auch unsinnige Parameter ohne zu murren.
wp_xyz
 
Beiträge: 2249
Registriert: 8. Apr 2011, 08:01

Beitragvon VB_Lazarus » 16. Feb 2017, 13:58 Re: [gelöst] MSAccess Umlaute

Also, ich habe es noch mal mit dem Firmenrechner (WIN7, 64bit) geprüft.

Sobald ich die Zeile "Locale Identifier" weglasse, funktioniert es mit den Umwandlung der Umlaute.

Charset wird nicht genutzt, beachtet von dem ODBC Treiber bei zumindestens MSAccess.

Ich habe es schon oft gesehen, das mit dem ConnectionString.

Auch auf Gocher seine Webseite ist ein solches Beispiel vorhanden.

Mit welchem Betriebsystem hat es bei dir funktioniert?
VB_Lazarus
 
Beiträge: 65
Registriert: 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10 64bit / Windows 7 32bit, L 1.6.4 32bit, FPC 3.0.2 32bit | 
CPU-Target: 32Bit
Nach oben

Beitragvon wp_xyz » 16. Feb 2017, 14:51 Re: [gelöst] MSAccess Umlaute

Win 10/64 bit (Laz/fpc sind 32 bit). Und du meinst die Umwandlung an beiden Stellen, im OnGetText-Handler (Text_von_DB_umwandeln) und in TfrmHauptFormular.PositionAendern? Wiegesagt, das geht bei mir mit oder ohne den Locale Identifier, sowohl mit Laz trunk als auch 1.6.2 (beides fpc 3.0) und mit Laz 1.4.4 / fpc 2.6.4.

Hast du evtl. einmal die Datenbank gespeichert, ohne dass die Speicherroutine die Rückkonvertierung vorgenommen hat?
wp_xyz
 
Beiträge: 2249
Registriert: 8. Apr 2011, 08:01

Beitragvon VB_Lazarus » 16. Feb 2017, 18:39 Re: [gelöst] MSAccess Umlaute

Ja, du hast recht.
Wenn du nur die Lazarus Seite siehst.
D.h. wenn du die Daten ohne Konvertierung eingibst und wieder einliest, dann siehst du immer die Umlaute.
Wenn du aber die Datenbank öffnest, dann siehst
üüü
Das sind üüü.
VB_Lazarus
 
Beiträge: 65
Registriert: 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10 64bit / Windows 7 32bit, L 1.6.4 32bit, FPC 3.0.2 32bit | 
CPU-Target: 32Bit
Nach oben

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Datenbanken



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried