Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi datensätze ind DBDrid doppelt angezeigt (https://www.delphipraxis.net/150318-datensaetze-ind-dbdrid-doppelt-angezeigt.html)

veetschal 13. Apr 2010 17:31

Datenbank: Paradox • Version: 7 • Zugriff über: DBE

datensätze ind DBDrid doppelt angezeigt
 
hey!

ich probiere mich erstmals mit delphi datenbanken und SQL verzeiht mir also bitte wenn manche dinge vielleicht nicht allzu perfektioniert gelöst sind.
Ich habe folgendes problem:

ich lese mittels SQL abfragen aus verschiedenen tabellen verschiedene werte per button klick in ein DBGrid ein.
dies geschieht mittels implizite Join abfragen.

im prinzip funktioniert auch alles so wie es soll es werden genau die daten aufgewählt die ich haben möchte das problem ist nur, dass sie mir gleich 2x angezeigt werden obwohl die datensätze in den tabellen nicht doppelt sind.

hier nochmal der quellcode.

Delphi-Quellcode:
frame61.Queryuebersicht2.Active:=false;
 frame61.Queryuebersicht2.SQL.Clear;
 
variable:=
'SELECT lehrveranstaltung.Titel //*1
FROM tabellen\stRichtung2, tabellen\lehrveranstaltung, tabellen\LVtyp2, tabellen\semester2, tabellen\datum
WHERE (stRichtung2.studienname = "' + frame61.DBLookupComboBox1.Text + '") AND (stRichtung2.Studienrichtung_ID = lehrveranstaltung.ID_StRichtung) //*2
AND (semester2.Semester_ID = datum.ID_Semester) AND (semester2.Semester = "' + frame61.DBLookupComboBox3.Text + '")
AND ( LVtyp2.LVType_ID = lehrveranstaltung.ID_Type) AND (LVtyp2.Typ = "' + frame61.DBLookupComboBox2.Text + '")'; //*3

 frame61.Queryuebersicht2.SQL.Add(variable);
 frame61.Queryuebersicht2.Active:=true;
end;
*1 alle einträge aus der spalte titel aus der tabelle lehrveranstaltung sollen angezeigt werden und zwar zu den unten angeführten bedingungen
*2 erste bedingung ist, dass die ausgewählte spalte einer dblookupcombobox mit dem studienname, der per fremdschlüsselfeld mit lehrveranstaltung verbunden ist übereinstimmt.
*3 die lehrveranstaltung ist wiederum an LVtyp2 geknüpft. über eine zweite DBlookupcombobox wird sichergestellt, dass nur die titel ausgegeben werden, deren LVtyp in der dblookupbomobox2 ausgewählt wurde

anmerkung: der obige quelltext wurde von mir zur leichteren veranschaulichung zerlegt und kommentare an den stellen //* eingefügt


hoffe das hier ist annähernd verständlich erklärt vielleicht hatte ja schonmal wer ein ähnliches problem und kann mir helfen meins zu lösen :)

rapante 13. Apr 2010 18:08

Re: datensätze ind DBDrid doppelt angezeigt
 
Hallo veetschal,

Sieht so aus als wenn da eine Verknüpfung zwischen den Tabellen fehlt?!
-> semester2 und datum stehen irgendwie in keiner verbindung zu deinen anderen Tabellen

veetschal 14. Apr 2010 17:50

Re: datensätze ind DBDrid doppelt angezeigt
 
danke für den tipp nur leider hats nicht geholfen

hab jetzt die tabellen etwas umgestaltet damit semester direkt mit lehrveranstaltung verbunden ist mein aktueller quellcode sieht jetzt so aus:

Delphi-Quellcode:
frame61.Queryuebersicht2.Active:=false;
 frame61.Queryuebersicht2.SQL.Clear;
 variable:= 'SELECT lehrveranstaltung.Titel FROM tabellen\stRichtung2, tabellen\lehrveranstaltung, tabellen\LVtyp2, tabellen\semester2, tabellen\datum WHERE (stRichtung2.studienname = "' + frame61.DBLookupComboBox1.Text + '") AND (stRichtung2.Studienrichtung_ID = lehrveranstaltung.ID_StRichtung) AND (semester2.Semester_ID = lehrveranstaltung.ID_Semester) AND (semester2.Semester = "' + frame61.DBLookupComboBox3.Text + '") AND ( LVtyp2.LVType_ID = lehrveranstaltung.ID_Type) AND (LVtyp2.Typ = "' + frame61.DBLookupComboBox2.Text + '")';
 frame61.Queryuebersicht2.SQL.Add(variable);
 frame61.Queryuebersicht2.Active:=true;
datensätze werden immer noch doppelt angezeigt. falls er 2 verschiedene datensätze findet gibt er es folgender maßen aus:
1. datensatz_1
2. datensatz_2
3. datensatz_1
4. datensatz_2

also so als ob er eine schleife durchlaufen würde!

DeddyH 14. Apr 2010 18:16

Re: datensätze ind DBDrid doppelt angezeigt
 
Und wenn Du vorerst die Tabelle "datum" aus der Abfrage rauslässt?

rapante 14. Apr 2010 19:51

Re: datensätze ind DBDrid doppelt angezeigt
 
Du benutzt die Tabelle datum in deiner Abfrage überhaupt nich - also weg damit.

Außerdem wäre es schön wenn du deine SQL-Statements ein wenig übersichtlicher/leserlicher formatieren würdest...

mkinzler 14. Apr 2010 19:53

Re: datensätze ind DBDrid doppelt angezeigt
 
Und der Einsatz von Parametern macht das ganze flexibler, lesbarer und bei Mehrfacher Verwendung auch schneller

veetschal 14. Apr 2010 20:14

Re: datensätze ind DBDrid doppelt angezeigt
 
wow danke leute offenbar hat das delphi tatsächlich verwirrt war auch keine absicht dass tabelle\datum noch dabei stand ist noch ein überbleibsel von variante 1 gewesen was ich schlicht weg übersehen hatte...

momentan zeigts mirs wieder richtig an ich hoff das war jetzt auch wirklich der fehler weils mir zwischendurch plötzlich den datensatz nicht mehr doppelt sondern gleich vierfach angezeit hat obwohl ich nichts verändert hatte

warum nicht mit parameter? weil ich das noch weniger kann als ohne hab mich zwar schon etwas eingelesen aber muss ein programm für die schule machen und so viel zeit bleibt mir dann nicht mehr um das auch noch zu lernen und nochmals umzuändern
vil. ändere ich das im nachhinein noch aber vorerst muss mal so reichen

vielen dank nochmal für eure hilfe =)

rapante 15. Apr 2010 08:22

Re: datensätze ind DBDrid doppelt angezeigt
 
Zitat:

Zitat von veetschal
wow danke leute offenbar hat das delphi tatsächlich verwirrt...

Das hat nichts mit Delphi zutun, sondern allein mit deinem SQL-Statement.
Bsp.:
SQL-Code:
SELECT table1.field1
FROM table1,table2;
Das ist jetzt vereinfacht - das was du gemacht hast. imho wird dabei jeder Datensatz aus table1 mit jedem Datensatz aus table2
kombiniert, da du keine Beziehung zwischen den Tabellen angegeben hast.

Deutlich wird das, wenn du mal alle Felder der beiden Tabellen selektierst:
SQL-Code:
SELECT table1.*,table2.*
FROM table1,table2;
Das mit den Parametern ist keine große Sache, kann dir aber eine Menge Ärger ersparen.
Delphi-Quellcode:
Query.SQL.Add('SELECT * FROM table1 WHERE table1.field1 = :value1');
Query.ParamByName('value1').asString := Edit1.Text;


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