Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Umlaute anzeigen egal ob Ü oder UE usw. (https://www.delphipraxis.net/54236-umlaute-anzeigen-egal-ob-ue-oder-ue-usw.html)

SKolberg 30. Sep 2005 10:24


Umlaute anzeigen egal ob Ü oder UE usw.
 
Hi,

Ich habe ein TEdit als Suchfeld in welches der Teil,-Artikelname eingegeben wird und dann die gefundenen Datensätze in einem DBGrid anzeigt. In der DB sind Daten mal mit UE oder mal mit Ü geschrieben, wie kann ich es erreichen das er wenn ich z.B. nach Ä suche er auch AE anzeigt?


Mfg, Steve

Hansa 30. Sep 2005 10:28

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Es gibt das Wort OR für IF - Abfragen. Und dann noch die Funktion POS -> Hilfe. Damit ist das eine Kleinigkeit. 8)

Jelly 30. Sep 2005 10:31

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Standardgegenfrage: Welche Datenbank?

in MSSQL könntest du dir ne Funktion schreiben die dir alle ü in ue umwandelt. Die Abfrage könnte dann so lauten:
SQL-Code:
select * from Kontakte where dbo.umlaute(Nachnname) = 'Mueller'
Dafür musst du natürlich auch von Delphi heraus sicherstellen, dass du die ü in ue umwandelts, und dann auch tatsächlich nach Mueller suchts... Mixen kannst du beides nicht

Jelly 30. Sep 2005 10:39

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Zitat:

Zitat von Hansa
Es gibt das Wort OR für IF - Abfragen. Und dann noch die Funktion POS -> Hilfe. Damit ist das eine Kleinigkeit. 8)

Das musst du mir mal näher erklären, was du da meinst. Er will doch Abfragen in der Datenbank machen. Was nützt denn da If, Or und Pos?

SKolberg 30. Sep 2005 10:40

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
HI,

ich arbeite mit MySQL. Die Ü und UE umwandeln ist schlecht da es vorgeschriebene Bezeichnungen sind und nicht einfach so geändert werden sollen/dürfen. Was mich nervt ist einfach nur das ich nach "ÜBUNG" suche er mir die auch zurück gibt aber eben nicht "UEBUNG" umgekehrt soll es natürlich auch gehen.

Suche -> Üb = Ueb, Üb
Suche -> Ueb = Ueb, Üb
Suche -> Öl = Oel, Öl

usw....


Mfg, Steve

Jelly 30. Sep 2005 10:44

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Kann man in MySQL Funktionen erstellen :gruebel:

Wenn nicht, hast du ein Problem. Zum Suchen/Vergleichen hast du nur 2 Möglichkeiten... ü mit ü oder ue mit ue, soll heissen, entweder du wandelst bei der Suchabfrage alle ü in ue um, oder umgekehrt.

Ich glaub aber du hast mich falsch verstanden. Ich meinte nicht, dass du in der DB die Einträge änderst, sondern dass du nur bei der Suche die ü in ue umwandelst.

Wenn du in Delphi schreibst,
Delphi-Quellcode:
if uppercase(Dummy)='MUELLER' then begin
   ...
end ;
hast du den Inhalt von Dummy ja auch nicht verändert, sondern nur die Grossschreibung für den Vergleich herangezogen.

EDIT: OK, hab grad mal kurz nachgeschaut, MySQL scheint auch Funktionen zu unterstützen, also sollte sowas machbar sein...

Jelly 30. Sep 2005 10:51

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
MySQL scheint sowas sogar oder eigene Benutzerfunktion zu unterstützen:

Hier hätte ich was für dich. Um die regular expression zu erstellen fragst aber lieben jemand anderen :wiejetzt:

SKolberg 30. Sep 2005 10:51

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Hi,
gut danke dann werde ich mal bei MySQL schauen, da wird sich bestimmt was finden.


Mfg, Steve

himitsu 30. Sep 2005 10:53

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
zu dem OR ...

mach doch einfach 2 Suchstrings.

einmal wo die Ä's, Ö's, Ü's... drin sind
und dann noch 'nen Zweiten, wo du dann die Namen aus dem ersten String hernimmst und mit StringReplace alles in AE, OE... umwandelst.

Und dann läßt du einfach nach beiden Strings in der DB suchen (natürlich OR-verknüpft).

Hansa 30. Sep 2005 10:55

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Was treibt ihr denn da ? :shock:

Normalfall :

Delphi-Quellcode:
DS.SelectSQL.Text := 'SELECT * FROM TABLE1 WHERE UPPER (NAME) LIKE UPPER (''%' + edSuch.Text + '%'') ORDER BY NR';
;

Groß/Kleinschreibung gleich miterschlagen. 8) Beliebige Position im Suchstring möglich.

für ä/ae abgewandeltes SelectSQL :

Delphi-Quellcode:
if pos ('ae',edSuch.Text) <> 0 then begin
  HilfStr := StringReplace (edSuch.Text ... ä durch ae ersetzen !
  DS.SelectSQL.Text := 'SELECT * FROM TABLE1 WHERE UPPER (NAME) LIKE UPPER (''%' + edSuch.Text + '%'') OR UPPER (NAME) LIKE UPPER (''%' + HilfStr + '%'') ORDER BY NR';
;

Reicht das ? :mrgreen:

Unplugged 30. Sep 2005 10:57

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
ich kenne zwar jetzt nicht den Inhalt / die Größe deiner Tabellen, aber die einzige funktionierende Lösung aus Delphi-Sicht wäre, erstmal alles zu Selecten und dann in Delphi selbst die WHERE-Selektierung zu machen.

@himitsu, Hansa

was ist aber, wenn der String in der DB beides enthält. Dann geht die Lösung schon nicht mehr

Edit:
Wenn keine "alte" DB existiert/übernommen wird, könnte man auch selbst dafür Sorgen, dass beispielsweise keine Umlaute in der DB landen

SKolberg 30. Sep 2005 11:02

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
:gruebel: :gruebel:

Also würde er mir wenn ich z.B. nach übungs suche NICHT Uebungszünder anzeigen??? Oder wie? *Verwirrt*


Mfg, Steve

himitsu 30. Sep 2005 11:04

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Also, ob nun Ä, AE, oder Ä und AE in der DB steht ... da es ja mit OR verknüpft wird, wird auch alles gefunden.


[add]
übungs <> Uebungszünder
sowas mußt du a in der QL-Anfrage entscheiden ... also obe nur nach ganzen wörtern gesucht werden soll, oder nicht.

Flocke 30. Sep 2005 11:06

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
@himitsu: nicht wenn ae und ä im selben String vorkommen hast du selbst schon geschrieben

MySQL kennt neben LIKE auch REGEXP, ersetze also einfach alle Ö durch (Ö|OE) usw. (die speziellen REGEXP-Zeichen "(|)^$.*" (usw., siehe MySQL-Hilfe) solltest du dann mit einem Backslash quoten).

SKolberg 30. Sep 2005 11:07

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Joa werd mich da heute Abend oder am WE mal ranmachen.

Danke nochmal, Steve



//EDIT:
So sieht er jetzt aus...
Delphi-Quellcode:
begin
  if MATKlasse.Text = '<Alle>' then
  MATStr:= ''
else
  MATStr:= MATKlasse.Text;
begin

  ZQuery1.ParamByName('MAT').AsString := MATStr + '%';
  ZQuery1.ParamByName('Modell').AsString := '%' + Modell.Text + '%';
  ZQuery1.ParamByName('Artikel').AsString := '%' + Artikel.Text + '%';
  ZQuery1.ParamByName('Verwendung').AsString := '%' + Verwendung.Text + '%';
  ZQuery1.ParamByName('Versorgung').AsString := '%' + Versorgung.Text + '%';
  ZQuery1.Refresh;
  Label3.Caption:= 'Anzahl Datensätze ' + IntToStr(ZQuery1.RecordCount);
end;
end;

Jelly 30. Sep 2005 11:09

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Was ist wenn in der DB
Übungszuender steht, und du in Delphi nach Übungszünder suchst... Da kommt nix, auch nicht mit Hansas OR Verknüpfung.

Unplugged 30. Sep 2005 11:11

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
genau dieses Beispiel hab ich mit meinem letzten Posting gemeint.

Diese Variante müsste man auch berücksichtigen

Hansa 30. Sep 2005 11:13

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Zitat:

Zitat von Flocke
..ersetze also einfach alle Ö durch (Ö|OE) usw.

Was soll er wo ersetzen ? Und wozu überhaupt ? :shock: Mein Code findet bei ä/ae :

Räsenmaeher
Rasenmaeher
Rasenmäher
Ärger
Mensch äergere dich nicht,
ist das aetzend

8)

Und wegen des ORDER BY noch nach Nummern sortiert.

SKolberg 30. Sep 2005 11:14

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Hi,

genau das denke ich ja auch weil er ja nur nach Übungszünder und Uebungszuender sucht.
Sonst müsste er ja bei diesem Bsp. 4 Möglichkeiten haben...

@Hansa Ich werde es wie gesagt mal ausprobieren und ann schauen...

Mfg, Steve

Delphi-Quellcode:
begin
  if MATKlasse.Text = '<Alle>' then
  MATStr:= ''
else
  MATStr:= MATKlasse.Text;
begin

  ZQuery1.ParamByName('MAT').AsString := MATStr + '%';
  ZQuery1.ParamByName('Modell').AsString := '%' + Modell.Text + '%';
  ZQuery1.ParamByName('Artikel').AsString := '%' + Artikel.Text + '%';
  ZQuery1.ParamByName('Verwendung').AsString := '%' + Verwendung.Text + '%';
  ZQuery1.ParamByName('Versorgung').AsString := '%' + Versorgung.Text + '%';
  ZQuery1.Refresh;
  Label3.Caption:= 'Anzahl Datensätze ' + IntToStr(ZQuery1.RecordCount);
end;
end;

Unplugged 30. Sep 2005 11:16

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
nicht aber, wenn in der DB

Räsenmaeher

steht, und ich nach Raesenmäher suche
Da sollte der Code logisch gesehen versagen

Hansa 30. Sep 2005 11:27

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Ihr versteht meinen Code nicht. :shock:

Inhalt in DB "Übungszünder" (Suchbegriff "ü") :

1. Übungszünder : upper (ü) = Ü ist enthalten -> gefunden.

2. uEbungszünderübung : dto.

3. Uebungszuenderuebung : kein ü, aber das ue wird in Ü umgewandelt -> gefunden

Lediglich das erste Vorkommen von ue muß ersetzt werden !!

Unplugged 30. Sep 2005 11:30

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
du verstehts meinen gedanken nicht:

bei deiner Erläuterung wird nach ü oder ue gesucht.
Wenn ich als Suchbegriff aber ein ganzes Wort vorgebe, dann gibts Probleme.

Und wenn in der DB Raesenmäher steht und ich Suche in dem Edit-Feld nach Räsenmaeher dann dürfte er das mit deiner Suche nicht finden.

Oder bin ich nun ganz blöd geworden? ^^ , obwohl, ist ja schon Freitag :D

Hansa 30. Sep 2005 11:40

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Also gut : Räsenmäher steht in DB und als Suchbegriff wird Raesenmaeher eingegeben. Und ? Stringreplace mit rfReplaceAll für den Suchbegriff eingeben. Dann die DB durchwandern und jeden DS genauso behandeln (ä in ae umwandeln) und dann vergleichen. Und bevor jetzt noch behauptet wird, das sei langsam : so ist es. Aber was ist nicht relativ bei 3 GHz ? Durch LIKE und % hindert man die DB so oder so daran einen Index zu benutzen.

jensw_2000 30. Sep 2005 12:12

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Nimm doch einfach Jellys Vorschlag und erstelle dir in deiner MySQL DB eine UDF (Userdefined Function).

Der (my)SQL Server erledigt die Zeichenersetzung flink während des Selects mit. Einfacher gehts doch garnicht. Zudem erschlägt man alle Sonderfälle auf einmal (Groß-Kleinschreibung, Umlaute,'ß'-'ss') und braucht nicht hunterdt IF's und POS(bla) im Delphi-Code verbauen.

Hier ein Beispiel in MSSQL Syntax.
Den Code kannst du mit einem kurzen Blick ins MySQL-Handbuch innerhalb weniger Minuten für MySQL anpassen.

SQL-Code:
CREATE Function ReplaceSpecialChars
  @InputParam VARCHAR(4000)         -- ein Eingabeparameter an den du deinen Suchbegriff übergibst
  RETURNS VarChar(4000)             -- Die Funktion liefert Varchar zurück
AS
BEGIN
  DECLARE @TMP VARCHAR(4000)                 -- eine Temporäre Variable deklarieren
  SET @TMP = LOWER(@InputParam)              -- Suchbegriff als LowerCase in @TMP einlesen
  SET @TMP = REPLACE(@TMP,'ß','ss')          -- gewünschte Zeichen ersetzen
  SET @TMP = REPLACE(@TMP,'ä','ae')
  SET @TMP = REPLACE(@TMP,'ö','oe')
  SET @TMP = REPLACE(@TMP,'ü','ue')

  RETURN @TMP                                -- die fertige Zeichenkette aus Result zurückgeben
END

Verwendung :

SQL-Code:
 
SELECT Vorname,Nachname FROM Personal WHERE dbo.ReplaceSpecialChars(Nachname) = LOWER(@Suchbegriff)

Falls du die Funktion sehr häufig für ein und die selben Feler bestimmter Tabellen benutzt, kannst du in der Tabelle auch flink für jedes (häufig zum suchen verwendete) Feld ein berechnetes Feld hinzufügen. Als Formel für das berechnete Feld nimmst du in diesem Fall auch "dbo.ReplaceSpecialChars(<Feldname>)".


Schöne Grüße,
Jens
:hi:

Jelly 30. Sep 2005 12:16

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Zitat:

Zitat von Hansa
Also gut : Räsenmäher steht in DB und als Suchbegriff wird Raesenmaeher eingegeben.

Nee, DB Eintrag ist Raesenmäher und Suchbegriff ist Räsenmaeher.

Zitat:

Zitat von Hansa
Dann die DB durchwandern und jeden DS genauso behandeln (ä in ae umwandeln) und dann vergleichen.

Das kanns doch auch nicht sein. Man will doch über eine Select Abfrage einen kompletten Recordset direkt anzeigen lassen, und nicht noch jeden einzelnen Datensatz auf Delphiebene nochmals durchlaufen, und dann nur die relevanten anzeigen. Da kannst du dein DBGrid gleich vergessen und musst die ganze Anzeige auch noch per Hand vornehmen...

Wie mein Link bereits oben zeigt geht das relativ einfach über Regular Expression, REGEXP...

Zum Suchen: entweder man vergleicht Äpfel mit Äpfel (also Räsenmäher mit Suchstring mäher), Birnen mit Birnen (Raesenmaeher mit maeher), aber nicht Äpfel mit Birnen (Räsenmäher mit maeher). Es führt also kein Weg dran vorbei, in der DB alle Einträge in ue umzuwandeln, und genauso auf Delphiebene im Suchstring.

Jelly 30. Sep 2005 12:23

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Zitat:

Zitat von jensw_2000
Verwendung :

SQL-Code:
 
SELECT Vorname,Nachname FROM Personal WHERE dbo.ReplaceSpecialChars(Nachname) = LOWER(@Suchbegriff)

Der Mann hat mich verstanden :zwinker:
Noch ne Ergänzung:
um sich die Tipparbeit auf Delphiebene zu sparen, da ja der Suchstring auch umgewandelt werden muss damit die Where Bedingung pass, kann man das auch einfach so formulieren:
SQL-Code:
SELECT Vorname,Nachname FROM Personal WHERE dbo.ReplaceSpecialChars(Nachname) = dbo.ReplaceSpecialChars(@Suchbegriff)
edit: Tags vergessen

Sharky 30. Sep 2005 14:26

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Hai Jelly,

ab welcher Version unterstützt mySQL denn UDFs?

Hansa 30. Sep 2005 16:24

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Zitat:

Zitat von Jelly
...Es führt also kein Weg dran vorbei, in der DB alle Einträge in ue umzuwandeln, und genauso auf Delphiebene im Suchstring.

Du schlägst aber nicht vor, die umgewandelten DB-Felder auch abzuspeichern, oder doch ?

Flocke 30. Sep 2005 16:25

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von Flocke
..ersetze also einfach alle Ö durch (Ö|OE) usw.

Was soll er wo ersetzen ? Und wozu überhaupt ? :shock:

Na du sollst halt nicht nach
SQL-Code:
WHERE Feld LIKE 'räsenmäher' OR Feld LIKE 'raesenmaeher'
suchen sondern nach
SQL-Code:
WHERE Feld REGEXP 'r(ä|ae)senm(ä|ae)her'
Zitat:

Zitat von Hansa
Also gut : Räsenmäher steht in DB und als Suchbegriff wird Raesenmaeher eingegeben. Und ? Stringreplace mit rfReplaceAll für den Suchbegriff eingeben. Dann die DB durchwandern und jeden DS genauso behandeln (ä in ae umwandeln) und dann vergleichen. Und bevor jetzt noch behauptet wird, das sei langsam : so ist es. Aber was ist nicht relativ bei 3 GHz ? Durch LIKE und % hindert man die DB so oder so daran einen Index zu benutzen.

Welchen Sinn macht da ein DB-Server? Erzähl das mal jemandem, der über eine ISDN-Standleitung angebunden ist - für drei Fundstellen werden alle Datensätze über's Netz übertragen. Der Sinn dabei liegt ja gerade darin, den Server die Arbeit tun zu lassen!

Sharky 30. Sep 2005 16:29

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Nicht schön aber selten ;-)
SQL-Code:
SELECT *  FROM tabelle
WHERE REPLACE( REPLACE( REPLACE( REPLACE(Lower( feldname ), 'ä', 'ae'), 'ö', 'oe'), 'ü','ue'), 'ß', 'ss') = Lower(:param)

Jelly 30. Sep 2005 16:41

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Zitat:

Zitat von Sharky
ab welcher Version unterstützt mySQL denn UDFs?

Also wenn ich mir diesen Link durchschau, schon mindestens ab 3.23. Die Funktion selbst scheint aber extern wohl in einer DLL zu liegen.

juergen 12. Okt 2005 11:27

Re: Umlaute anzeigen egal ob Ü oder UE usw.
 
Hallo,
die Nutzung genormter oder selbst erstellter UDF Vorgaben für die DB hat noch weitere Vorteile.
(Sortierreihenfolge im Grid, Zusammenarbeit mit z.B. Crystal Report usw.)
Man selbst bestimmt, wie die DB die Datensätze sortiert. Je nach Struktur kann auch ein Tempogewinn erzielt werden. (glaube ich zumindest)

Das Configfile muss dann natürlich auch Serverseitig gespeichert sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz