AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL/DBase: Datenformat Character mit String vergleichen
Thema durchsuchen
Ansicht
Themen-Optionen

SQL/DBase: Datenformat Character mit String vergleichen

Ein Thema von X-Dragon · begonnen am 23. Jan 2003 · letzter Beitrag vom 24. Jan 2003
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von X-Dragon
X-Dragon

Registriert seit: 14. Jan 2003
Ort: Schortens
289 Beiträge
 
Delphi 6 Enterprise
 
#1

SQL/DBase: Datenformat Character mit String vergleichen

  Alt 23. Jan 2003, 11:33
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 ...
  Mit Zitat antworten Zitat
Benutzerbild von harrybo
harrybo

Registriert seit: 26. Nov 2002
Ort: Aachen
87 Beiträge
 
Delphi 6 Enterprise
 
#2
  Alt 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 &):
'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
Harry Boldt
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#3
  Alt 23. Jan 2003, 12:25
Hi,


Zitat von harrybo:
QuotedStr setzt Hochkommata vor und hinter den Suchstring und ist zwingend erforderlich!
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
  Mit Zitat antworten Zitat
Benutzerbild von X-Dragon
X-Dragon

Registriert seit: 14. Jan 2003
Ort: Schortens
289 Beiträge
 
Delphi 6 Enterprise
 
#4
  Alt 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.
  Mit Zitat antworten Zitat
Benutzerbild von X-Dragon
X-Dragon

Registriert seit: 14. Jan 2003
Ort: Schortens
289 Beiträge
 
Delphi 6 Enterprise
 
#5
  Alt 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 ...
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6
  Alt 23. Jan 2003, 12:46
Halt, Kommando halb zurück.

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. 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.

Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#7
  Alt 23. Jan 2003, 12:48
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]
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von harrybo
harrybo

Registriert seit: 26. Nov 2002
Ort: Aachen
87 Beiträge
 
Delphi 6 Enterprise
 
#8
  Alt 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.
Harry Boldt
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#9
  Alt 23. Jan 2003, 12:57
Hi,

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
  Mit Zitat antworten Zitat
Benutzerbild von X-Dragon
X-Dragon

Registriert seit: 14. Jan 2003
Ort: Schortens
289 Beiträge
 
Delphi 6 Enterprise
 
#10
  Alt 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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:13 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