Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL/DBase: Datenformat Character mit String vergleichen (https://www.delphipraxis.net/2434-sql-dbase-datenformat-character-mit-string-vergleichen.html)

X-Dragon 23. Jan 2003 11:33


SQL/DBase: Datenformat Character mit String vergleichen
 
Eigentlich dürfte das ja kein Problem sein, aber ich hab jetzt zig Varianten ausprobiert aber keine funkioniert bisher.

Mit der Forum-Suchfuntkion(und Google) finde ich irgendwie fast nur Beispiele um Zahlen zu vergleichen oder das Datum oder direkt einen Text, aber fast nie eine String-Variable. Also ich hab die String-Variable schon (nach Beispielen die ich gefunden habe) mit 0 - 6 Anführungszeichen versehen und mit keinen bis zu 4 Klammern umrahmt und mit einem oder 2 "+" (jew. rechts und links) und ...

harrybo 23. Jan 2003 12:09

Hallo X-Dragon,
keine Panik, das ist verhältnismäßig einfach, allerdings abhängig von der Datenbank, die Du verwendest. Zudem gibt es zwei Möglichkeiten, die angezeigten Datenstätze auf das Gesuchte zu reduzieren, nämlich über SQL (dann werden nur die gesuchten Records in die Datenmenge geschoben), oder per Filter über die geöffnete Datenmenge (OnFilterRecord). Ein Beispiel wär auch gut gewesen, aber gut, mach ich eins, zunächst mal die SQL Variante. Angenommen, Du suchst in einer Adresstabelle alle Dortmunder Adressen:
Delphi-Quellcode:
with Query1 do begin
  if Open then Close;
  SQL.Clear;
  SQL.Add('SELECT * FROM Adressen WHERE ORT LIKE ' + QuotedStr('Dortmund');
  Open;
end;
QuotedStr setzt Hochkommata vor und hinter den Suchstring und ist zwingend erforderlich!
Sollen alle Datensätze gefiltert werden, deren Ort mit 'Dor' beginnt, also z.B. auch Dormagen, kann die SELECT Anweisung mit Wildcard abgeschickt werden, das Zeichen ist datenbankabhängig (% oder &):
Delphi-Quellcode:
'SELECT * FROM Adressen WHERE ORT LIKE ' + QuotedStr('Dor%')
Das Wildcard Zeichen wird in der Regel an die Usereingabe per Code angehängt und/oder vorangestellt, je nach Fragestellung. Alternativ kannst Du den SQL String auch mit Format(... %s, ...) aufbauen. Datenbanken wie z.B. Interbase/Firebird besitzen eine erweiterte SQL Syntax und kennen WHERE Klauseln wie 'WHERE Ort STARTING WITH ...'

Falls Du Code für OnFilterRecord brauchst, sach bescheid.

gruß, harrybo

Hansa 23. Jan 2003 12:25

Hi,


Zitat:

Zitat von harrybo
QuotedStr setzt Hochkommata vor und hinter den Suchstring und ist zwingend erforderlich!

:spin: Ich habe fast dieselbe Suchfunktion mit dem Unterschied, daß ich % am Anfang und Ende stehen habe, um nach einem beliebigen Namensbestandteil zu suchen, aber "" bzw. QuotedStr habe ich nirgendwo im Programm gebraucht. Darüber hatte ich mal einen ellenlangen Thread aufgemacht und hatte am Schluß immer noch nur Vermutungen. Ich habe mir zwischenzeitlich angewöhnt, alles groß zu schreiben. Seitdem brauche ich keine "" mehr. DB abhängig könnte es aber trotzdem sein. Als Konsolenprogramm benutze ich zudem IBexpert. Da kann man einstellen "Always capitalize Database Object names" Zumindest bei IB/Firebird bin ich mir inzwischen zu 90% sicher, daß dieses Verhalten daran liegt.

Gruß
hansa

X-Dragon 23. Jan 2003 12:38

AHHHHHHHHHHHHHHHHHHHHHHHHHHHHH NEEEEEIIIIINNNNNNNNNNNNNNNNNN

Ich will doch nur einen String ganz genau vergleichen, und nicht mit 'Text' sondern mit einer String-Variablen und ohne LIKE, geht das?

DB-Format ist DBase.

X-Dragon 23. Jan 2003 12:46

Ähm, wäre es möglich das man das Character-Format von DBase nicht direkt mit einer String-Variable vergleichen kann?

Also mit LIKE funktioniert es zumindest ...

Hansa 23. Jan 2003 12:46

Halt, Kommando halb zurück. :mrgreen:

Code:
SelectSQL.Text := 'SELECT * FROM LIEF8 WHERE UPPER (NAME) LIKE UPPER (''%' + Form3.Edit1.Text + '%'') ORDER BY NR'
So siehts bei mir aus. Was ist das jetzt ? Brauche ich etwa einfache ' oder was ? Die blöden doppelten '', für eins zu kriegen. Im SQL-Klartext wäre das doch '%suchbegriff%'. Da kommt gerade eine email, das ist bestimmt harrybo. :mrgreen: Deshalb habe ich in der Konsole noch nachgeschaut. folgendes Statement wird richtig ausgeführt:
Code:
SELECT * FROM LIEF8 WHERE UPPER (NAME) LIKE UPPER ('%suchbegriff%') ORDER BY NR;
Au Backe, noch ne email. Hoffentlich krieg ich den Text hier noch fertig, wenn die emails von delphi-praxis sind ist seltsamerweise der Text immer weg wenn ich da rein gehe. Deshalb schau ich erst, wenn der hier weg ist. Also : die ' werden gebraucht, die Klammern () sind für das UPPER. Alles ohne Delphi getestet. LIKE scheint also ein Sonderfall zu sein. Falls harrybo das gemeint hat, dann hab ich das falsch verstanden. So, jetzt habe ich noch um einen Kasten Bier wetten, da glaubt mir jemand nicht, daß eine der emails mit dem thema hier zu tun haben, das ging ihm zu schnell. :mrgreen:

Gruß
Hansa

Sharky 23. Jan 2003 12:48

Zitat:

Zitat von X-Dragon
AHHHHHHHHHHHHHHHHHHHHHHHHHHHHH NEEEEEIIIIINNNNNNNNNNNNNNNNNN

Ich will doch nur einen String ganz genau vergleichen, und nicht mit 'Text' sondern mit einer String-Variablen und ohne LIKE, geht das?

DB-Format ist DBase.

Dann mache doch einfach:

Code:
Query1.Close;
Query1.SQL.Text := 'SELECT * FROM tabelle WHERE feldname = '
                  + QuotedStr (stringvariable);
Query1.Open;
[/code]

harrybo 23. Jan 2003 12:52

@X-Dragon
Erstens: Deine Antwort ist unhöflich denen gegenüber, die sich die Mühe machen, Dir zu helfen und mögliche Folgefragen gleich mit erwähnen. Zweitens: dass es Dir um einen genauen String Vergleich geht, hast Du nicht geschrieben. Drittens: ersetze in meinem SQL Beispiel 'Dortmund' durch Deine Variable (sorry, das hatte ich Dir zugetraut). Viertens: lass das LIKE trotzdem drin.

Hansa 23. Jan 2003 12:57

Hi,

Zitat:

Zitat von X-Dragon
AHHHHHHHHHHHHHHHHHHH NEEEEEIIIIINNNNNNNNNNNNNNNNNN
Ich will doch nur einen String ganz genau vergleichen

OT : Uff ! Hätte beinahe auf harrybo gesetzt, hehe

@X-Dragon : Da habe ich Dir im Blindflug doch die Lösung für alle Varianten gegeben. Mit SQL, mit LIKE, ohne LIKE, ohne SQL, dann brauchst Du nur die UPPER Variante deiner DB zu nehmen. Also wandelst Du den DB Eintrag und deinen String in Großbuchstaben um und vergleichst sie mit =, oder Du vergleichst sie direkt, dann gibt es eben bei = bei einem unterschiedlichen b statt B als Ergebnis false zurück. Also ehrlich gesagt, mir fällt nichts mehr ein, was man da noch sonst gebrauchen könnte. Die % bei LIKE sind auch erwähnt. Was willst Du denn noch ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ???????????????????????????????????????

Gruß
Hansa

X-Dragon 23. Jan 2003 13:19

Ja ich bitte vielmals um Entschuldigung. Ich hab selber etwas der Überblick verloren, da ich an dem Problem schon den halben Tag dransitze.

Auf jeden Fall erstmal Danke für eure Hilfe.

So wie ihr es geschrieben habt, sollte es normal auch funtkionieren, allerdings hab ich jetzt die Fehlermeldung "Type Mismatch ...".

Ich vermute das der Character-Datentyp bei DBase nicht ganz kompatibel zum String-Format ist, allerdings weiss ich nicht wie ich das umwandeln soll. Der Eintrag in der DB ist also vom Typ Character und auf 6 Zeichen begrenzt. Mit einem auf 6-Zeichen begrenzten String funktioniert es leider nicht.

[edit]
Hab den Thread-Titel mal an mein Problem angepaßt


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:52 Uhr.
Seite 1 von 3  1 23      

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