Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Per SQL ein Memo-Feld durchsuchen (https://www.delphipraxis.net/4521-per-sql-ein-memo-feld-durchsuchen.html)

Werwurm 2. Mai 2003 22:49


Per SQL ein Memo-Feld durchsuchen
 
Nabend Allerseits,

da hat man schon allerhand Bücher über Delphi und kommt trotzdem nicht weiter.
Folgendes Problem:
Ich habe eine Paradox7 Tabelle die formatierte Memofelder enthält. Genau in diesen Feldern möchte ich nach einem String S suchen, wobei auch die Groß/Kleinschreibung keine Rolle spielt. :shock:
Bisher sieht es so aus:
SQL-Code:
  Form1.Query1.SQL.Clear;
  Form1.Query1.SQL.Add('SELECT * FROM ".\Daten\Alben.db"');
  Form1.Query1.SQL.Add('WHERE UPPER (Titel) LIKE UPPER ("%'+S+'%")');
  Form1.Query1.SQL.Add('ORDER BY (Interpret, Jahr, Album);
  Form1.Query1.ExecSQL;
  Form1.Query1.Open;
Starte ich so das Programm bekomme ich den Fehler: Keine Übereinstimmung der Typen im Ausdruck. :evil:
Wo liegt mein Fehler??? :(
Vielleicht kann mir ja jemand helfen. :?:

Hansa 3. Mai 2003 00:01

probier mal statt Execute SQL "open"

Werwurm 3. Mai 2003 00:05

Hallo Hansa,

Ich bin was Delphi betrifft, noch recht unerfahren.
Aber benutze doch den Open Befehl. Der kommt direkt nach ExecuteSQL.
Oder meinst Du was anderes???

Hansa 3. Mai 2003 00:11

kommentier das executesql aus

Hansa 3. Mai 2003 00:12

was ist mit dem S?

Werwurm 3. Mai 2003 00:18

Habe das ExecSQL auskommentiert.
Jetzt bringt der Open Befehl den gleichen Fehler...

Das S ist mein Suchstring, welchen ich mit einem Edit Feld abfrage.

Hansa 3. Mai 2003 00:21

dann mach ein Close vorne dran.

Werwurm 3. Mai 2003 00:26

Habe ich probiert, ebenfalls ohne Erfolg.
Mein Prog sieht jetzt so aus:
SQL-Code:
  Form1.Query1.Close;
  Form1.Query1.SQL.Clear;
  Form1.Query1.SQL.Add('SELECT * FROM ".\Daten\Alben.db"');
  Form1.Query1.SQL.Add('WHERE UPPER (Titel) LIKE UPPER ("%'+S+'%")');
  Form1.Query1.SQL.Add('ORDER BY (Interpret, Jahr, Album);
  {Form1.Query1.ExecSQL; }
  Form1.Query1.Open;

Hansa 3. Mai 2003 00:34

und danach ordne sie SQL-Anweisung. Das werden wir doch noch hinkriegen?

Werwurm 3. Mai 2003 00:41

Zitat:

Zitat von Hansa
mach das clear wieder weg

Auch das habe ich gemacht. Jetzt rufe ich aber den SELECT Befehl 2x mal auf, und bekomme den Fehler: ungültiges Schlüsselwort SELECT

Hansa 3. Mai 2003 01:00

na gut, mit folgendem steht alles in deinem Dataset:

Code:
with LiefModul.LiefDS do begin
  Close;
  SelectSQL.Text := 'SELECT NR, NAME ORDER BY NR';
  Open;
end;
LiefModul ist ein Datamdule, DataSet ein dataset. Probier einfach weiter.

MrSpock 3. Mai 2003 14:08

Hallo Werwurm,

vielleicht ist es ja nur ein Übertragungsfehler, aber deine Zeile:

Delphi-Quellcode:
Form1.Query1.SQL.Add('ORDER BY (Interpret, Jahr, Album);
enthält einen nicht abgeschlossenen String. Hinter das Album) muss noch ein '.

Und wie oben schon erwähnt, eine Abfrage, die eine Datenmenge zurückliefert muss immer mit Open ausgeführt werden. Nur Abfragen, die keine Datenmenge zurückliefern (z.B. DELETE) werden mit ExecSQL ausgeführt.

Ich empfehle außerdem, keine relativen Pfadnamen bei der Tabelle zu benutzen.

Catbytes 3. Mai 2003 14:32

Re: Per SQL ein Memo-Feld durchsuchen
 
Zitat:

Zitat von Werwurm
Nabend Allerseits,

da hat man schon allerhand Bücher über Delphi und kommt trotzdem nicht weiter.
Folgendes Problem:
Ich habe eine Paradox7 Tabelle die formatierte Memofelder enthält. Genau in diesen Feldern möchte ich nach einem String S suchen, wobei auch die Groß/Kleinschreibung keine Rolle spielt.

Hallo,

das geht mit Paradox IMHO gar nicht.

Du kannst aber den Text des Memos irgendwo zwischenspeichern und dann den Text mit POS prüfen.

Sollte es sich um eine große Datenbank mit umfangreichen Memo-Inhalten handeln, wird das ganze sehr langsam von statten gehen - dann würde ich Dir sowieso ein anderes DBMS empfehlen...

Werwurm 3. Mai 2003 15:24

Re: Per SQL ein Memo-Feld durchsuchen
 
Zitat:

Zitat von Catbytes
Zitat:

Zitat von Werwurm
Nabend Allerseits,

da hat man schon allerhand Bücher über Delphi und kommt trotzdem nicht weiter.
Folgendes Problem:
Ich habe eine Paradox7 Tabelle die formatierte Memofelder enthält. Genau in diesen Feldern möchte ich nach einem String S suchen, wobei auch die Groß/Kleinschreibung keine Rolle spielt.

Hallo,

das geht mit Paradox IMHO gar nicht.

Du kannst aber den Text des Memos irgendwo zwischenspeichern und dann den Text mit POS prüfen.

Sollte es sich um eine große Datenbank mit umfangreichen Memo-Inhalten handeln, wird das ganze sehr langsam von statten gehen - dann würde ich Dir sowieso ein anderes DBMS empfehlen...


Hallo Catbytes,

welchen Datenbanktyp sollte ich den wählen?
Ich versuche meine LP's inkl. der Titel zu verwalten, von daher brauche ich ein String-Feld mit mehr als 255 Zeichen. Und in diesem Feld möchte ich eben auch nach den einzelnen Titeln suchen.
Vielleicht habe ich ja auch schon den falschen Ansatz???

Übrigens hatte Mr. Spock recht was meinen nicht abgeschlossenen String betrifft, im meinem Programm stehts richtig...

Catbytes 3. Mai 2003 19:33

Re: Per SQL ein Memo-Feld durchsuchen
 
Zitat:

Zitat von Werwurm
Hallo Catbytes,

welchen Datenbanktyp sollte ich den wählen?
Ich versuche meine LP's inkl. der Titel zu verwalten, von daher brauche ich ein String-Feld mit mehr als 255 Zeichen. Und in diesem Feld möchte ich eben auch nach den einzelnen Titeln suchen.
Vielleicht habe ich ja auch schon den falschen Ansatz???

Übrigens hatte Mr. Spock recht was meinen nicht abgeschlossenen String betrifft, im meinem Programm stehts richtig...

Hallo Werwurm,

Du hast vermutlich kein Datenbankmodell erstellt.

Du könntest z.B. eine Tabelle erstellen, in denen Du die Grunddaten der Alben speicherst, die (normalerweise - Ausnahmen bestätigen die Regel) einzigartig sind, wie Albumname, Erscheinungsjahr, Anzahl der Titel, Gesamtzahl der Titel, Genre etc.

Du mußt dann nur eine einzigartige ID pro LP vergeben (leicht z.b. über einen Autozähler).

Dann legst Du eine neue Tabelle an - z.B. Titel. Dort hast Du dann ein ID-Feld als LongInt, daß auf die ID der Albumtabelle verweisst. So kannst Du dann theoretisch unbegrennzt Titel pro Album verwalten. Ich würde dann auch noch andere Tabellen erzeugen (z.B. Genre.db, Land.db, Plattenlabel.db, Künstler.db etc.) - eben alles, was i.d.R. nicht einzigartig ist.

Du kannst dann alles über die ID verbinden. Wenn Du keine Zahlen möchtest, kannst Du das auch über einen einzigartigen Matchcode machen. Dort könntest Du aber auf Probleme stoßen, falls mal zwei verschiedene LPs den gleichen Namen haben.

Such Dir im Internet per Google mal die Grundfunktionen und Aufbauten einer Datenbank an (1:n und 1:1-Beziehungen, Analyse, Sicherung etc). Danach kannst Du Dich mit Spezialthemen wie "Entity-Relationship-Modellierung" auseinandersetzen - und danach die verschiedenen DBMS-Systeme in Angriff nehmen (XML, fixed-length/variable-length-Datenfelder).

Werwurm 3. Mai 2003 20:02

Re: Per SQL ein Memo-Feld durchsuchen
 
Zitat:

Zitat von Catbytes
Zitat:

Zitat von Werwurm
Hallo Catbytes,

welchen Datenbanktyp sollte ich den wählen?
Ich versuche meine LP's inkl. der Titel zu verwalten, von daher brauche ich ein String-Feld mit mehr als 255 Zeichen. Und in diesem Feld möchte ich eben auch nach den einzelnen Titeln suchen.
Vielleicht habe ich ja auch schon den falschen Ansatz???

Übrigens hatte Mr. Spock recht was meinen nicht abgeschlossenen String betrifft, im meinem Programm stehts richtig...

Hallo Werwurm,

Du hast vermutlich kein Datenbankmodell erstellt.

Du könntest z.B. eine Tabelle erstellen, in denen Du die Grunddaten der Alben speicherst, die (normalerweise - Ausnahmen bestätigen die Regel) einzigartig sind, wie Albumname, Erscheinungsjahr, Anzahl der Titel, Gesamtzahl der Titel, Genre etc.

Du mußt dann nur eine einzigartige ID pro LP vergeben (leicht z.b. über einen Autozähler).

Dann legst Du eine neue Tabelle an - z.B. Titel. Dort hast Du dann ein ID-Feld als LongInt, daß auf die ID der Albumtabelle verweisst. So kannst Du dann theoretisch unbegrennzt Titel pro Album verwalten. Ich würde dann auch noch andere Tabellen erzeugen (z.B. Genre.db, Land.db, Plattenlabel.db, Künstler.db etc.) - eben alles, was i.d.R. nicht einzigartig ist.

Du kannst dann alles über die ID verbinden. Wenn Du keine Zahlen möchtest, kannst Du das auch über einen einzigartigen Matchcode machen. Dort könntest Du aber auf Probleme stoßen, falls mal zwei verschiedene LPs den gleichen Namen haben.

Such Dir im Internet per Google mal die Grundfunktionen und Aufbauten einer Datenbank an (1:n und 1:1-Beziehungen, Analyse, Sicherung etc). Danach kannst Du Dich mit Spezialthemen wie "Entity-Relationship-Modellierung" auseinandersetzen - und danach die verschiedenen DBMS-Systeme in Angriff nehmen (XML, fixed-length/variable-length-Datenfelder).

Danke,

genau damit habe ich gerade angefangen. Nun habe ich drei Tabellen in denen ich meine Daten verwalte (alben, Titel Seite A und Titel Seite B).
Der Nachteil ist, das ich mein Programm, welches bis auf die Suchfunktion fertig war, jetzt nochmal neu schreibe. Eine Überarbeitung wäre mir zu kompliziert und zu Fehleranfällig.
Ich hab mir das wohl zu einfach vorgestellt.
Aber großen Dank für Deine Hilfe!!!

Yngvi 4. Mai 2003 12:11

Wie schon ein andere User festestellt hat, kann man ein Memofeld nicht nach Strings durch suchen.

Hilfreich währe, wenn Du Deine Tabellenstrucktur Postest.

Vorweg ein Tipp:

Lege doch ein Suchfeld in Deiner Tabelle an z.B.Titel o. ä.
meinetwegen setze einen Sekundäindex auf das Feld erhöht die Suchgeschwindigkeit
dann kannst Du mit Query1.FindNearest([Edit2.Text]);//mit einem TEdit
oder mit einer Combox
Query1.Locate('BUCHTEXT',cbSuch.Text,[loPartialKey]);
natürich muss Du bei einer Combobox die Daten im FormCrate Event erts in die Comox einlesen.
Mit FindNearst, muss das Feld indiziert sein!!!

Hier ein kleiner Auszug von mir

procedure TfrmBelege.FormCreate(Sender: TObject);
begin
DateTimePicker1.Enabled := False;
DateTimePicker1.Date := Date;
cbSuch.Clear;
BudgetData.tblBelege.First;
while not BudgetData.tblBelege.Eof do
begin
cbSuch.Items.Add(BudgetData.tblBelegeBUCHTEXT.Valu e);
BudgetData.tblBelege.Next;
end;
BudgetData.tblBelege.First;
cbSuch.Text := BudgetData.tblBelegeBUCHTEXT.Value;


inipfad := ExtractFilePath(ParamStr(0))+ '\budget.ini';
appini := TIniFile.Create(inipfad);

BudgetData.tblBelegeEINNAHMEN.DisplayFormat :=
AppIni.ReadString('Geld','Einheit','###,###,###.00 DEM');
BudgetData.tblBelegeAUSGABEN.DisplayFormat :=
AppIni.ReadString('Geld','Einheit','###,###,###.00 DEM');
AppIni.Free;

DBinfo;

end;

Catbytes 4. Mai 2003 17:06

Zitat:

Zitat von Yngvi
Wie schon ein andere User festestellt hat, kann man ein Memofeld nicht nach Strings durch suchen.

Hi,

meine Beschränkung lag auf Paradox.

IMHO kann man bei anderen DBMS sehr wohl Memos nach Strings durchsuchen.

Ich glaube, korrigiert mich, wenn es nicht stimmt, das geht sogar bei DBase...


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