![]() |
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 ... |
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:
QuotedStr setzt Hochkommata vor und hinter den Suchstring und ist zwingend erforderlich!
with Query1 do begin
if Open then Close; SQL.Clear; SQL.Add('SELECT * FROM Adressen WHERE ORT LIKE ' + QuotedStr('Dortmund'); Open; end; 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:
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 ...'
'SELECT * FROM Adressen WHERE ORT LIKE ' + QuotedStr('Dor%')
Falls Du Code für OnFilterRecord brauchst, sach bescheid. gruß, harrybo |
Hi,
Zitat:
Gruß hansa |
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. |
Ä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 ... |
Halt, Kommando halb zurück. :mrgreen:
Code:
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:
SelectSQL.Text := 'SELECT * FROM LIEF8 WHERE UPPER (NAME) LIKE UPPER (''%' + Form3.Edit1.Text + '%'') ORDER BY NR'
Code:
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:
SELECT * FROM LIEF8 WHERE UPPER (NAME) LIKE UPPER ('%suchbegriff%') ORDER BY NR;
Gruß Hansa |
Zitat:
Code:
[/code]
Query1.Close;
Query1.SQL.Text := 'SELECT * FROM tabelle WHERE feldname = ' + QuotedStr (stringvariable); Query1.Open; |
@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. |
Hi,
Zitat:
@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 |
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 09:25 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