Delphi-PRAXiS
Seite 3 von 4     123 4      

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)

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)


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:10 Uhr.
Seite 3 von 4     123 4      

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