AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken knifflige KriterienAbfrage einer Datenbank!
Thema durchsuchen
Ansicht
Themen-Optionen

knifflige KriterienAbfrage einer Datenbank!

Ein Thema von daNiii · begonnen am 15. Apr 2009 · letzter Beitrag vom 15. Apr 2009
Antwort Antwort
daNiii

Registriert seit: 10. Nov 2008
98 Beiträge
 
Turbo Delphi für Win32
 
#1

knifflige KriterienAbfrage einer Datenbank!

  Alt 15. Apr 2009, 11:17
Datenbank: Access • Version: 2007 • Zugriff über: SQL... siehe unten
HI!!!
hier mal eine sehr knifflige aufgabenstellung!
ich weis auch gar nicht ob es für mein Problem überhaupt eine Lösung gibt.
Hierbei handelt es sich um ein Programm, welches einen zeigt für welche Seminare man angemeldet ist und welche Seminare man nicht besucht.
Die Struktur der DAtenbank findest du im Anhang.

Ausgangssituation: ich habe bereits ein Listview erstellt, in dem alle Seminare angezeigt werden bei denen Der User angemeldet wird.

Problem: ich habe ein zweites Listview, in dem sollte alle übrigen Seminare (bei denen der User nicht angemeldet ist)angezeigt werden.

Hier mein Programmieransatz:

Delphi-Quellcode:
 
//erstes Listview: funktioniert problemlos
       adoquery1.close;
      adoquery1.SQL.Clear;
      adoquery1.SQL.Add('SELECT Anmeldungen.SID, Seminare.Seminartitel, Seminare.Datum, Anmeldungen.AID, Anmeldungen.MID FROM Seminare INNER JOIN Anmeldungen ON Seminare.[SID] = Anmeldungen.[SID] WHERE (((Anmeldungen.MID)=' +inttostr(Mitarbeiter)+')) ORDER BY Seminare.SID');
      adoquery1.open;
      while not adoquery1.eof do begin
        LI := Listview1.items.Add;
        LI.Caption := inttostr(adoquery1.FieldValues['SID']);
        LI.subitems.add(adoquery1.FieldValues['Seminartitel']);
        LI.subitems.add(datetostr(adoquery1.FieldValues['Datum']));
        LI.subitems.add(inttostr(adoquery1.FieldValues['AID']));
        SIDcounter:= SIDcounter +1;
       adoquery1.next;
       end;
       adoquery1.close;

//zweites Listview:
//Der SIDcounter zählt die zeilen im ersten Listview und somit die Anzahl der angemeldeten Seminare
//SID_angemeldet (array Variable) speichert welche Seminare im Listview1 eingetragen sind.
 for I := 1 to SIDcounter do begin
                  SID_angemeldet[I] := strtoint(LI.caption[I]);
                   end;
//SQLCODE(array VAriable): Teile des späteren SQLcodes.
          SQLCODE[1]:= 'and (Seminare.SID <> '+inttostr(SID_angemeldet[1])+') ';
          SQLCODE[2]:= 'and (Seminare.SID <> '+inttostr(SID_angemeldet[2])+') ';
          SQLCODE[3]:= 'and (Seminare.SID <> '+inttostr(SID_angemeldet[3])+') ';
          SQLCODE[4]:= 'and (Seminare.SID <> '+inttostr(SID_angemeldet[4])+') ';
          SQLCODE[5]:= 'and (Seminare.SID <> '+inttostr(SID_angemeldet[5])+') ';
          SQLCODE[6]:= 'and (Seminare.SID <> '+inttostr(SID_angemeldet[6])+') ';
          SQLCODE[7]:= 'and (Seminare.SID <> '+inttostr(SID_angemeldet[7])+') ';
          SQLCODE[8]:= 'and (Seminare.SID <> '+inttostr(SID_angemeldet[8])+') ';
          SQLCODE[9]:= 'and (Seminare.SID <> '+inttostr(SID_angemeldet[9])+') ';
          SQLCODE[10]:= 'and (Seminare.SID <> '+inttostr(SID_angemeldet[10])+') ';



         if SIDcounter = 1 then SQL_code:= SQLCODE[1] else
         if SIDcounter = 2 then SQL_code:= SQLCODE[1] + SQLCODE[2] else
         if SIDcounter = 3 then SQL_code:= SQLCODE[1] + SQLCODE[2] + SQLCODE[3] else
         if SIDcounter = 4 then SQL_code:= SQLCODE[1] + SQLCODE[2] + SQLCODE[3] + SQLCODE[4] else
         if SIDcounter = 5 then SQL_code:= SQLCODE[1] + SQLCODE[2] + SQLCODE[3] + SQLCODE[4] + SQLCODE[5]else
         if SIDcounter = 6 then SQL_code:= SQLCODE[1] + SQLCODE[2] + SQLCODE[3] + SQLCODE[4] + SQLCODE[5] + SQLCODE[6] else
         if SIDcounter = 7 then SQL_code:= SQLCODE[1] + SQLCODE[2] + SQLCODE[3] + SQLCODE[4] + SQLCODE[5] + SQLCODE[6] + SQLCODE[7] else
         if SIDcounter = 8 then SQL_code:= SQLCODE[1] + SQLCODE[2] + SQLCODE[3] + SQLCODE[4] + SQLCODE[5] + SQLCODE[6] + SQLCODE[7] + SQLCODE[8]else
         if SIDcounter = 9 then SQL_code:= SQLCODE[1] + SQLCODE[2] + SQLCODE[3] + SQLCODE[4] + SQLCODE[5] + SQLCODE[6] + SQLCODE[7] + SQLCODE[8] + SQLCODE[9]else
         if SIDcounter = 10 then SQL_code:= SQLCODE[1] + SQLCODE[2] + SQLCODE[3] + SQLCODE[4] + SQLCODE[5] + SQLCODE[6] + SQLCODE[7] + SQLCODE[8] + SQLCODE[9] + SQLCODE[10] ;


//hier der kniffelige Teil...funktioniert nicht.
          adoquery1.Close;
        adoquery1.close;
      adoquery1.SQL.Clear;
      adoquery1.SQL.Add('SELECT distinct Seminare.SID, Seminare.Seminartitel, Seminare.Datum FROM Seminare INNER JOIN (Mitarbeiter INNER JOIN Anmeldungen ON Mitarbeiter.MID = Anmeldungen.MID) ON Seminare.SID = Anmeldungen.SID WHERE ((Mitarbeiter.MID)<>' +inttostr(Mitarbeiter)+')'+SQL_Code+' ORDER BY Seminare.SID)');
      adoquery1.open;
      while not adoquery1.eof do begin
        LI := Listview2.items.Add;
        LI.Caption := inttostr(adoquery1.FieldValues['SID']);
        LI.subitems.add(adoquery1.FieldValues['Seminartitel']);
        LI.subitems.add(datetostr(adoquery1.FieldValues['Datum']));

       adoquery1.next;
       end;
       adoquery1.close;
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: knifflige KriterienAbfrage einer Datenbank!

  Alt 15. Apr 2009, 11:29
Hallo,

puh, machst du es dir schwer ...


Benutze einen Left Join und prüfe per Is Null .


Alternative wäre ein SubSelect etwa so

SQL-Code:
Select Seminare.* From Seminare
Where Seminare.SID not in
  (Select Anmeldungen.SID From Anmeldungen Where Anmeldungen.MID=:MId)
ParamByName('MId').AsInteger:= Mitarbeiter;

Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#3

Re: knifflige KriterienAbfrage einer Datenbank!

  Alt 15. Apr 2009, 11:35
Richtig. Etwas ausführlicher (wir suchen alle Datensätze aus Tabelle1, die keine Entsprechung in Tabelle2 aufweisen):
SQL-Code:
SELECT A.*
FROM Tabelle1 A
LEFT JOIN Tabelle2 B ON A.Pk = B.Fk
WHERE B.Fk IS NULL
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: knifflige KriterienAbfrage einer Datenbank!

  Alt 15. Apr 2009, 12:32
Der Vollständigkeit halber könnte man erwähnen, dass es alternativ auch per Subselect möglich ist.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#5

Re: knifflige KriterienAbfrage einer Datenbank!

  Alt 15. Apr 2009, 12:33
Das hat Heiko doch getan
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: knifflige KriterienAbfrage einer Datenbank!

  Alt 15. Apr 2009, 12:42
Upps, ich scheine heute blind zu sein.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:42 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