Delphi-PRAXiS
Seite 1 von 8  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi bin am verzweifeln... select abfragen miteinander kombinieren??? (https://www.delphipraxis.net/161073-bin-am-verzweifeln-select-abfragen-miteinander-kombinieren.html)

Serienchiller 15. Jun 2011 10:51

Datenbank: firerbird • Version: 2.1 • Zugriff über: ??

bin am verzweifeln... select abfragen miteinander kombinieren???
 
hallo, ich bin neu hier. habe aber schon viel durch euer forum gelernt. ich bin seit 8 wochen praktikant in einer firma, die ausschließlich mit delphi arbeitet und habe vorher nur java gemacht. so musste ich mir das meiste was delphi und auch sql angeht selbst beibringen. meine aufgabe in der firma ist es, eine bilderdatenbank zu erstellen mit benutzeroberfläche, in der die firma ihre icons dann zentral verwalten kann. sie besteht aus den tabellen bilder, tags und programme. jedes bild kann also verschiedenen tags und verschiedenen programmen zugeordnet werden, was ich durch zwei zusätzliche zwischentabellen gelöst habe. soweit so gut...

nun habe ich heute mein programm vorgestellt und es wurde angemahnt, dass man die db entweder nach bildern, programmen oder tags durchsuchen kann, was ich mit radiobuttons implementiert hatte. folgendermaßen sah meine anzeigen prozedur dann aus:

Delphi-Quellcode:
procedure anzeigen(parameter, befehl: String);
begin
  dm.dsetbilder.Close;
  dm.dsetbilder.SelectSQL.Clear;
 
  if befehl = 'alleanzeigen' then
  begin
    dm.dsetbilder.SelectSQL.Add('select * from bilder b order '+
      'by upper(b.name)');
  end
  else
  begin
   
// nach bild suchen

    if parameter = 'n' then    
      dm.dsetbilder.SelectSQL.Add('select * from bilder b where upper(b.name)'+
        ' containing upper(:WERT) order by upper(b.name)');
   
// nach programm suchen

    if parameter = 'p' then    
      dm.dsetbilder.SelectSQL.Add('select * from bilder b where b.bid in '+
        '(select b1.bid from BILDER b1 ' +
        'join zwbilderprogramme z on z.bildid = b1.bid join programme t '+
        'on t.pid = z.programmid ' +
        'where Upper(t.namep) containing UPPER(:WERT)) order by upper(b.name)');
   
// nach tag suchen

    if parameter = 't' then
      dm.dsetbilder.SelectSQL.Add('select * from bilder b where b.bid in '+
        '(select b1.bid from BILDER b1 ' +
        'join zwbildertags z on z.bildid = b1.bid join tags t on t.tid = z.tagid '+
        'where Upper(t.namet) containing UPPER(:WERT)) order by upper(b.name)');

    dm.dsetbilder.ParamByName('WERT').AsString := befehl;
  end;
  dm.dsetbilder.Open;
  dm.dsetbilder.Locate('bid',bid2,[]);
  if dm.dsetbilder.IsEmpty then showmessage('Keine Icons gefunden');
end;


das hat auch alles wunderbar funktioniert, bis mir mein chef heute sagte, ich solle die suche über checkboxen implementieren, so dass man z. b. gleichzeitig nach bild und tag suchen kann und nun bin ich mit meinem latein am ende... :(

weiß jemand wie man dieses problem lösen kann? wäre dankbar für jeden denkanstoß.

mkinzler 15. Jun 2011 10:56

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Du musst den Inhalt der where-clause dynamisch zusammenbasteln

DeddyH 15. Jun 2011 10:56

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Wie wäre es mit einem Basis-Statement, das je nach Zustand der Checkboxen dynamisch erweitert werden kann?
Delphi-Quellcode:
Dings.SQL.Text := 'SELECT * FROM Bilder WHERE 1 = 1';
if cbBla.Checked then
  begin
    Dings.SQL.Add('AND Bla = :blubb');
    Dings.ParamByName('blubb').Value := edtWuppdi.Text;
  end;
So in der Art zumindest.

p80286 15. Jun 2011 11:12

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Zitat:

Zitat von Serienchiller (Beitrag 1106505)
bis mir mein chef heute sagte, ich solle die suche über checkboxen implementieren, so dass man z. b. gleichzeitig nach bild und tag suchen kann und nun bin ich mit meinem latein am ende... :(

weiß jemand wie man dieses problem lösen kann? wäre dankbar für jeden denkanstoß.

und was heißt das?
Soll "KILLEFIT" in Programmen und in Tags und in Bildern gesucht werden ?
Oder ist Bild="KILLEFIT" und Programm="SELBSTZERSTÖRER"
oder ist Bild="KILLEFIT" und Programm="Selbszerstörer" oder Tags="Selbstzerstörer"
oder.....

Was soll denn da möglich sein?

Gruß
K-H

CCRDude 15. Jun 2011 11:30

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Ideal wäre, wenn Du die Tabellen ordentlich aufgebaut hast, also der Index und das zu durchsuchende Textfeld überall gleich heißen.

Dein Freund dürfte, zumindest in MySQL, UNION heißen.

Serienchiller 15. Jun 2011 11:36

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
möglich sein soll, dass man mit einem suchbegriff sowohl in den bildern an sich als auch die bilder, die mit dem jeweiligen tag oder programm, dass diesen suchbegriff trägt, in verbindung stehen, angezeigt bekommt.

DeddyH 15. Jun 2011 12:00

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Also Du gibst einen Suchbegriff ein und daraufhin soll ggf. in mehreren Feldern gesucht werden? In dem Fall kannst Du das auch so machen wie weiter oben beschrieben, nur dass statt dem AND dann ein OR verwendet werden muss.

[edit] Allerdings muss das ganze dynamische SQL dann in Klammern, da Du sonst immer alle DS gelistet bekommst. [/edit]

[edit2] Kurz nachgedacht (ungetestet, geht ja nur ums Prinzip):
Delphi-Quellcode:
const
  ClauseBegins: array[Boolean] of string = ('WHERE', 'OR');
var
  HasWhere: Boolean;
begin
  HasWhere := false;
  Query.SQL.Text := 'SELECT * FROM Bilder';
  if cbBla.Checked then
    begin
      Query.SQL.Add(Format('%s Dings = :Dings', [ClauseBegins[HasWhere]]));
      Query.ParamByName(':Dings').Value := EditHallo.Text;
      HasWhere := true;
    end;
  if cbBlubb.Checked then
    begin
      Query.SQL.Add(Format('%s Bums = :Bums', [ClauseBegins[HasWhere]]));
      Query.ParamByName(':Bums').Value := EditHallo.Text;
      HasWhere := true;
    end;
[/edit2]

Serienchiller 15. Jun 2011 12:53

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
so vielen dank erstmal an alle. wollte jetzt das von deddyh ausprobieren doch spätestens wenn ich das zweite kästchen anclicke bekomme ich die fehlermeldung:

dynamic sql error code = -104
as approximate floating-point values in sql dialect1, but as 64-bit.

weiß jemand was das bedeutet?

hab ich das jetzt richtig eingebaut?
Delphi-Quellcode:
[CODE]
procedure anzeigen(n,p,t: boolean; befehl: String);
var
  bid2: String;
  haswhere: boolean;
  const ClauseBegins: array[Boolean] of string = ('WHERE', 'OR');
begin
  bid2:= bid;
  dm.dsetbilder.Close;
  dm.dsetbilder.SelectSQL.Clear;
  if befehl = 'alleanzeigen' then
  begin
    dm.dsetbilder.SelectSQL.Add('select * from bilder b order '+
      'by upper(b.name)');
  end
  else
  begin
    haswhere:= false;
    dm.dsetbilder.SelectSQL.Text:= 'SELECT * FROM Bilder b ';
    if n then
    begin
      dm.dsetbilder.SelectSQL.Add(Format('%s name containing upper(:WERT)',
        [ClauseBegins[HasWhere]]));
      HasWhere := true;
    end;
    if p then
      dm.dsetbilder.SelectSQL.Add(Format(' %s (select * from bilder c where c.bid in '+
        '(select c1.bid from BILDER c1 ' +
        'join zwbilderprogramme z on z.bildid = c1.bid join programme t '+
        'on t.pid = z.programmid ' +
        'where Upper(t.namep) containing UPPER(:WERT)))',
        [ClauseBegins[HasWhere]]));
        HasWhere := true;
    if t then
      dm.dsetbilder.SelectSQL.Add(Format(' %s (select * from bilder b where b.bid in '+
        '(select b1.bid from BILDER b1 ' +
        'join zwbildertags z on z.bildid = b1.bid join tags t on t.tid = z.tagid '+
        'where Upper(t.namet) containing UPPER(:WERT)))',
        [ClauseBegins[HasWhere]]));

    dm.dsetbilder.ParamByName('WERT').AsString := befehl;
  end;
  dm.dsetbilder.Open;
  dm.dsetbilder.Locate('bid',bid2,[]);
  showmessage(dm.dsetbilder.SelectSQL.Text);
  if dm.dsetbilder.IsEmpty then showmessage('Keine Icons gefunden');
end;

DeddyH 15. Jun 2011 12:54

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Schon beim Anklicken? Zeig doch mal Deinen Code.

DeddyH 15. Jun 2011 13:02

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Benutz doch bitte die Delphi-Tags. Was mir auffällt: sobald der Subselect ins Spiel kommt, dürfte das ganze Statement nicht mehr stimmen. Lass Dir doch zur Kontrolle einmal den gesamten m.dsetbilder.SelectSQL.Text ausgeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:01 Uhr.
Seite 1 von 8  1 23     Letzte »    

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