Zitat von
Klaus D.:
unabhängig der Schreibweise soll der Datensatz gefunden werden.
aber mit Umlauten hat mein Code Probleme ? wieso weshalb warum ??
Damit dies funktioniert, müsste die Datenbank wissen, welchen Zeichensatz du
verwendest und ob Gross-/Kleinschreibung als gleich oder ungleich
betrachtet werden soll.
Der MS
SQL Server 2000 verwendet hierfür sogenannte Collations.
(siehe Online-Help zum
SQL Server Stichwort COLLATE)
Wenn man sich unabhängig von der Datenbank machen möchte, muss
man Schattenfelder in den Tabellen speichern.
Hier ein Beispiel:
Delphi-Quellcode:
Table1['Fabrikat'] := 'Ferrari';
// auf das Schattenfeld schreiben.
// alle Schattenfeld tragen den Postfix "_MC" für "MatchCode"
Table1['Fabrikat_MC'] := AnsiUpperCase(KonvertSonderzeichen(Table1['Fabrikat']));
Hier die Funktion
KonvertSonderzeichen:
Delphi-Quellcode:
function KonvertSonderzeichen(const s: string): string;
var
i,slen: integer;
src,dst: PChar;
begin
slen := Length(s);
SetLength(Result, slen * 2); // Ergebnis kann u.U. doppelt so groß
if slen = 0 then
Exit;
src := PChar(@s[1]);
dst := PChar(@Result[1]);
for i := 1 to slen do
begin
case src^ of
'ä': begin dst[0] := 'a'; dst[1] := 'e'; Inc(dst); end;
'ö': begin dst[0] := 'o'; dst[1] := 'e'; Inc(dst); end;
'ü': begin dst[0] := 'u'; dst[1] := 'e'; Inc(dst); end;
'Ä': begin dst[0] := 'A'; dst[1] := 'E'; Inc(dst); end;
'Ö': begin dst[0] := 'O'; dst[1] := 'E'; Inc(dst); end;
'Ü': begin dst[0] := 'U'; dst[1] := 'E'; Inc(dst); end;
'ß': begin dst[0] := 's'; dst[1] := 's'; Inc(dst); end;
'à','á','â','ã','å': begin dst^ := 'a'; end;
'À','Á','Â','Ã','Å': begin dst^ := 'A'; end;
'è','é','ê','ë': begin dst^ := 'e'; end;
'È','É','Ê','Ë': begin dst^ := 'E'; end;
'ì','í','î','ï': begin dst^ := 'i'; end;
'Ì','Í','Î','Ï': begin dst^ := 'I'; end;
'ò','ó','ô','õ': begin dst^ := 'o'; end;
'Ò','Ó','Ô','Õ': begin dst^ := 'O'; end;
'ù','ú','û': begin dst^ := 'u'; end;
'Ù','Ú','Û': begin dst^ := 'U'; end;
'ñ': begin dst^ := 'n'; end;
'Ñ': begin dst^ := 'N'; end;
'ý','ÿ': begin dst^ := 'y'; end;
'Ý': begin dst^ := 'Y'; end;
'ç': begin dst^ := 'c'; end;
'Ç': begin dst^ := 'C'; end;
'°': begin dst^ := 'o'; end; // Bernc#18.12.03
else
dst^ := src^;
end;
Inc(dst);
Inc(src);
end;
SetLength(Result, dst-PChar(@Result[1]));
end;
Falls deine Datenbank UDFs (User Defined Functions) unterstützt, dann kann
evtl. auf die Schattenfelder verzichtet werden.
Statt
WHERE (Fabrikat_MC like :param1)
schreibt man dann:
WHERE (UDF_KonvertSonderzeichen(Fabrikat_MC) like :param1)