Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL und Umlaute (https://www.delphipraxis.net/17781-sql-und-umlaute.html)

Klaus D. 9. Mär 2004 18:23


SQL und Umlaute
 
Moin

ich komm nicht weiter....erst einmal den Code
Edit1.OnChange_:
Code:
frmDataMod.SQL_Typenschild.Params[0].AsString :=(UPPERCASE('%'+frmMain.V_Fabrikat+'%'));
SQL_:
Code:
SELECT MA.Motorart
     , MA.id_Motorart
     , TS.id_Typenschild
     , TS.sid_Motorart
     , TS.sid_Fabrikat
     , TS.Typ
     , TS.Drehzahl
     , TS.Motornummer
     , TS.Leistung_KW
     , FA.Fabrikat
     , SPF.Spannung AS Feldspannung
     , SPL.Spannung AS Lauferspannung

FROM            tbl_Typenschild TS

INNER JOIN      tbl_Motorart MA
ON             (MA.id_Motorart=TS.sid_Motorart)

LEFT OUTER JOIN tbl_Spannung SPF
ON             (SPF.id_Spannung=TS.sid_Spannung_Feld)

LEFT OUTER JOIN tbl_Spannung SPL
ON             (SPL.id_Spannung=TS.sid_Spannung_Anker)

LEFT OUTER JOIN tbl_Fabrikat FA
ON             (TS.sid_Fabrikat=FA.id_Fabrikat)

LEFT OUTER JOIN tbl_Spannung SP
ON             (TS.sid_Spannung_Feld=SP.ID_Spannung)

WHERE
      ((UPPER(Typ)         like :p1) OR
       (UPPER(Fabrikat)    like :p1) OR
       (UPPER(Drehzahl)    like :p1) OR
       (UPPER(Motornummer) like :p1) OR
       (UPPER(Leistung_KW) like :p1) OR
       (UPPER(SPF.Spannung) like :p1))
unabhängig der Schreibweise soll der Datensatz gefunden werden.
:gruebel: aber mit Umlauten hat mein Code Probleme ? wieso weshalb warum ??
wo ist mein Fehler ???

Danke schon mal--> Klaus

APP 9. Mär 2004 18:28

Re: SQL und Umlaute
 
Hallo Klaus,
falls Deine DB Umlaute unterstützt, dann fällt mir so auf die Schnelle nur folgendes ein:
Code:
frmDataMod.SQL_Typenschild.Params[0].AsString :=([color=red][b]AnsiUpperCase[/b][/color]('%'+frmMain.V_Fabrikat+'%'));
Uppercase ist nur für 7-Bit ASCII geeignet.

Sharky 10. Mär 2004 07:16

Re: SQL und Umlaute
 
Hai Klaus D.

was für einen DB-Server hast Du denn? Zumindes mein MS-SQL 7 und 2000 sowie mein MySQL 4.x unterscheiden bei einem Vergeleich mit LIKE keine Groß- / Kleinschreibung.

Robert_G 10. Mär 2004 07:32

Re: SQL und Umlaute
 
Oracle schon...

shmia 10. Mär 2004 09:56

Re: SQL und Umlaute
 
Zitat:

Zitat von Klaus D.
unabhängig der Schreibweise soll der Datensatz gefunden werden.
:gruebel: 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
SQL-Code:
WHERE (Fabrikat_MC like :param1)
schreibt man dann:
SQL-Code:
WHERE (UDF_KonvertSonderzeichen(Fabrikat_MC) like :param1)


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:22 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