[gelöst] MSAccess Umlaute

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
VB_Lazarus
Beiträge: 85
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10 32/64bit, L 2.0.4 32bit, FPC 3.0.4 32bit
CPU-Target: 32Bit

[gelöst] MSAccess Umlaute

Beitrag von VB_Lazarus »

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 Mi 15. Feb 2017, 19:58, insgesamt 1-mal geändert.

Michl
Beiträge: 2349
Registriert: Di 19. Jun 2012, 12:54

Re: MSAccess Umlaute

Beitrag von Michl »

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; 

VB_Lazarus
Beiträge: 85
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10 32/64bit, L 2.0.4 32bit, FPC 3.0.4 32bit
CPU-Target: 32Bit

Re: MSAccess Umlaute

Beitrag von VB_Lazarus »

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ß

Michl
Beiträge: 2349
Registriert: Di 19. Jun 2012, 12:54

Re: MSAccess Umlaute

Beitrag von Michl »

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; 

VB_Lazarus
Beiträge: 85
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10 32/64bit, L 2.0.4 32bit, FPC 3.0.4 32bit
CPU-Target: 32Bit

Re: MSAccess Umlaute

Beitrag von VB_Lazarus »

Falls Interesse besteht, ich habe mein Projekt stark reduziert, damit ich nur das Problem wie vorher beschrieben darstelle.
Dateianhänge
MSAccess.zip
Umlaute darstellen
(179.7 KiB) 39-mal heruntergeladen

wp_xyz
Beiträge: 3440
Registriert: Fr 8. Apr 2011, 09:01

Re: MSAccess Umlaute

Beitrag von wp_xyz »

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.

VB_Lazarus
Beiträge: 85
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10 32/64bit, L 2.0.4 32bit, FPC 3.0.4 32bit
CPU-Target: 32Bit

Re: MSAccess Umlaute

Beitrag von VB_Lazarus »

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ß
Dateianhänge
MSAccess2.zip
(179.67 KiB) 34-mal heruntergeladen

wp_xyz
Beiträge: 3440
Registriert: Fr 8. Apr 2011, 09:01

Re: MSAccess Umlaute

Beitrag von wp_xyz »

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.

VB_Lazarus
Beiträge: 85
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10 32/64bit, L 2.0.4 32bit, FPC 3.0.4 32bit
CPU-Target: 32Bit

Re: MSAccess Umlaute

Beitrag von VB_Lazarus »

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ß

wp_xyz
Beiträge: 3440
Registriert: Fr 8. Apr 2011, 09:01

Re: [gelöst] MSAccess Umlaute

Beitrag von wp_xyz »

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.

VB_Lazarus
Beiträge: 85
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10 32/64bit, L 2.0.4 32bit, FPC 3.0.4 32bit
CPU-Target: 32Bit

Re: [gelöst] MSAccess Umlaute

Beitrag von VB_Lazarus »

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ß

wp_xyz
Beiträge: 3440
Registriert: Fr 8. Apr 2011, 09:01

Re: [gelöst] MSAccess Umlaute

Beitrag von wp_xyz »

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.

VB_Lazarus
Beiträge: 85
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10 32/64bit, L 2.0.4 32bit, FPC 3.0.4 32bit
CPU-Target: 32Bit

Re: [gelöst] MSAccess Umlaute

Beitrag von VB_Lazarus »

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?

wp_xyz
Beiträge: 3440
Registriert: Fr 8. Apr 2011, 09:01

Re: [gelöst] MSAccess Umlaute

Beitrag von wp_xyz »

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?

VB_Lazarus
Beiträge: 85
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10 32/64bit, L 2.0.4 32bit, FPC 3.0.4 32bit
CPU-Target: 32Bit

Re: [gelöst] MSAccess Umlaute

Beitrag von VB_Lazarus »

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 üüü.

Antworten