![]() |
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 |
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)
|
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:
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
select * from Kontakte where dbo.umlaute(Nachnname) = 'Mueller'
|
Re: Umlaute anzeigen egal ob Ü oder UE usw.
Zitat:
|
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 |
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:
hast du den Inhalt von Dummy ja auch nicht verändert, sondern nur die Grossschreibung für den Vergleich herangezogen.
if uppercase(Dummy)='MUELLER' then begin
... end ; EDIT: OK, hab grad mal kurz nachgeschaut, MySQL scheint auch Funktionen zu unterstützen, also sollte sowas machbar sein... |
Re: Umlaute anzeigen egal ob Ü oder UE usw.
MySQL scheint sowas sogar oder eigene Benutzerfunktion zu unterstützen:
![]() |
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 |
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). |
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: |
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 |
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 |
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. |
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). |
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; |
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. |
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 |
Re: Umlaute anzeigen egal ob Ü oder UE usw.
Zitat:
Räsenmaeher Rasenmaeher Rasenmäher Ärger Mensch äergere dich nicht, ist das aetzend 8) Und wegen des ORDER BY noch nach Nummern sortiert. |
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; |
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 |
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 !! |
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 |
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.
|
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: |
Re: Umlaute anzeigen egal ob Ü oder UE usw.
Zitat:
Zitat:
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. |
Re: Umlaute anzeigen egal ob Ü oder UE usw.
Zitat:
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:
edit: Tags vergessen
SELECT Vorname,Nachname FROM Personal WHERE dbo.ReplaceSpecialChars(Nachname) = dbo.ReplaceSpecialChars(@Suchbegriff)
|
Re: Umlaute anzeigen egal ob Ü oder UE usw.
Hai Jelly,
ab welcher Version unterstützt mySQL denn UDFs? |
Re: Umlaute anzeigen egal ob Ü oder UE usw.
Zitat:
|
Re: Umlaute anzeigen egal ob Ü oder UE usw.
Zitat:
SQL-Code:
suchen sondern nach
WHERE Feld LIKE 'räsenmäher' OR Feld LIKE 'raesenmaeher'
SQL-Code:
WHERE Feld REGEXP 'r(ä|ae)senm(ä|ae)her'
Zitat:
|
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) |
Re: Umlaute anzeigen egal ob Ü oder UE usw.
Zitat:
![]() |
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 21:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz