Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Verknüpfung von Tabellen (https://www.delphipraxis.net/41684-verknuepfung-von-tabellen.html)

Pindel 7. Mär 2005 09:51

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

Verknüpfung von Tabellen
 
Hallo...

Ich habe ein Problem und hoffe ihr könnt mir helfen...
Ich habe zwei Tabellen zum Beispiel Videos und Kunden...
Diese Tabellen möchte ich jetzt m:n Verknüpfen, wie machen ich das...
Die Tabellen sind vom Typ TTable. Und wenn die dann Verknüpft sind möchte ich
die durchsuchen...
Wie mache ich das???

Danke schonmal im vorraus....

Union 7. Mär 2005 10:01

Re: Verknüpfung von Tabellen
 
Zitat:

Zitat von Pindel
Hallo...

Ich habe ein Problem und hoffe ihr könnt mir helfen...
Ich habe zwei Tabellen zum Beispiel Videos und Kunden...
Diese Tabellen möchte ich jetzt m:n Verknüpfen, wie machen ich das...
Die Tabellen sind vom Typ TTable. Und wenn die dann Verknüpft sind möchte ich
die durchsuchen...
Wie mache ich das???

Danke schonmal im vorraus....

Wenn Du TQuery verwendest, setzt Du SQL ein um eine verknüpfte Ansicht der Tabelleninhalte zu erhalten. Beispiel:
SQL-Code:
SELECT Kunden.Name,
       Kunden.Nummer,
       Video.Titel
FROM Kunden
LEFT OUTER JOIN Video ON Video.Kundennummer = Kunden.Nummer
Besser wäre aber in diesem Fall noch eine dritte Tabelle, in der steht, welcher Kunde welches Video wann ausgeliehen hat. Sonst hast Du bei einer m:n Verknüpfung ja sowohl die Videodaten als auch die Kundendaten doppelt!

Pindel 8. Mär 2005 17:23

Re: Verknüpfung von Tabellen
 
Habe das noch nicht ganz verstanden....
Ich habe in einer Tabelle die Kunden und möchte in einer
Anderen die Videos haben...
nun möchte ich wenn ein Kunde mehrere Videos ausleiht... das ich das sehen kann welche er ausleiht...
und wenn von einem film mehrere weg sind das ich sehen kann wer die hat...
außerdem komme ich nicht so ganz mit der suche klar...
ich möchte gerne nach alles suchen können und auch nach mehreren kriterien...

danke schonmal

ibp 8. Mär 2005 17:33

Re: Verknüpfung von Tabellen
 
wie wäre es erstmal mit einem db tutorial?

Pindel 8. Mär 2005 17:43

Re: Verknüpfung von Tabellen
 
Ich denke das habe ich nicht nötig...
mir ist schon klar was er meint, aber ich weiss nicht genau wie ich das vernünftig hinbekomme
wenn ich mich an die normalformen halten muss...
ich kann zum beispiel eine dritte tabelle machn in der ich die ID der videos-tabelle und die
id der kunden-tabelle mit einander verknüpfe, aber ich weiss nicht wie ich das dann vernünftig anzeigen
soll...
wenn ich zum beipiel auf einen kunden klicke, das ich dann sehe welche filme der ausgeliehen hat...
probleme habe ich außerdem mit der suche...

Union 8. Mär 2005 18:02

Re: Verknüpfung von Tabellen
 
Zitat:

Zitat von Pindel
Ich denke das habe ich nicht nötig...
mir ist schon klar was er meint, aber ich weiss nicht genau wie ich das vernünftig hinbekomme
wenn ich mich an die normalformen halten muss...
ich kann zum beispiel eine dritte tabelle machn in der ich die ID der videos-tabelle und die
id der kunden-tabelle mit einander verknüpfe, aber ich weiss nicht wie ich das dann vernünftig anzeigen
soll...
wenn ich zum beipiel auf einen kunden klicke, das ich dann sehe welche filme der ausgeliehen hat...
probleme habe ich außerdem mit der suche...

Du könntest z.B. einen Kundendialog machen, wo Name Adresse usw. drinstehen. Und dort fügst Du ein DbGrid ein, in dem die von diesem Kunden ausgeliehenen Filme mit Ausleihdatum stehen. Dazu musst Du von der untergeordneten TQuery die Eigenschaft DataSource setzen und kannst dann auf die Felder als automatische Parameter zugreifen.

Beipiel qryKunden:

SQL-Code:
SELECT * 
FROM Kunden
WHERE id = :id
Delphi-Quellcode:
qryKunden.ParambyName.('Id').AsInteger := fKundenId
qryKunden.Open;
Beispiel für 2 Stufige Subquery der ausgeliehenen Filme:

SQL-Code:
SELECT Filme.Titel,
       Ausleih.Datum
FROM Ausleih
LEFT OUTER JOIN Filme on Filme.Id = Ausleih.FilmId
WHERE Ausleih.KundenId = :Id
Und zum Verbinden
Delphi-Quellcode:
qryAusleih.DataSource := dsKunden;
Jedesmal wenn Du den Tabellenzeiger in qryKunden (dsKunden) bewegst (Next, Prior etc.) prüft dann qryAusleih über eine Notification die DataSource und aktualisiert sich selbst (d.h. macht Close, füllt den Parameter :id mit dem GLEICHNAMIGEN Wert aus qryKunden und wieder Open).

Analog kannst Du das auch umgekehrt bei den Filmen machen, also wer hat welchen Film ausgeliehen. In den jweiligen Grids könntest Du auch gleich Bearbeitungsoptionen mit reinnehmen, Neu, Löschen usw. dann kannst Du von den Kunden gleich zum Verleih springen oder vom Film einen Kunden entfernen.

shmia 8. Mär 2005 18:07

Re: Verknüpfung von Tabellen
 
Zitat:

Zitat von Pindel
Ich denke das habe ich nicht nötig...

Hey, man kann immer noch was dazu lernen...

Also bei einer Videothek gibt es ja möglicherweise mehrere Exemplare vom gleichen Film.
Wenn man schlau ist, hat jedes Medium einen eindeutigen Barcode.
Also gibt es nun 3 Tabellen:
Kunden, Videos und Medien.
Die Tabelle Medien hat folgende Felder:
Code:
IdMedia - der eindeutige Schlüssel (=der Barcode)
IdVideo - Verweis auf die Filmdaten
Quality - 1=Neuwertig 6=kaputt
UseCount - Anzahl der Ausleihvorgänge
IdKunde - Der Kunde, der den Film hat oder (NULL)
Mediatype- 0=VHS, 1=DVD, 2=SuperDVD, 3= AudioCD, ....
Ob ein Kunde ein Medium ausgeliehen hat oder nicht, wird in der Tabelle Medien vermerkt.
Denn ein physikalischer Gegenstand kann entweder bei einem Kunden sein oder im Laden.

Zusätzlich sollte man eine Historytabelle führen, mit der man sämtliche Ausleih- und Rückgabevorgänge nachvollziehen kann.
In der Historytabelle steht IdKunde, IdMedia, Vorgang (1=Ausleih, 2=Rück), DatumUhrzeit, Verkaeufer, ...

Das sollte dir doch mal genügend Anregungen für das DB Design geben.

Pindel 8. Mär 2005 18:08

Re: Verknüpfung von Tabellen
 
sauber, danke...genau sowas habe ich gesucht...
und wie funktioniert das mit der suche??
die aufgabe ist das ich nach allem suchen kann und auch nach mehreren kriterien auf einmal...
danke

Union 8. Mär 2005 18:13

Re: Verknüpfung von Tabellen
 
Zitat:

Zitat von Pindel
sauber, danke...genau sowas habe ich gesucht...
und wie funktioniert das mit der suche??
die aufgabe ist das ich nach allem suchen kann und auch nach mehreren kriterien auf einmal...
danke

Suchen kannst Du entweder über Locate, Findkey oder mit SELECT. Locate stellt sich den passenden Index selber ein, Findkey erwartet dass der richtige bereits eingestellt ist (aber dafür auch 20 x schneller) und mit SELECT (evtl. verknüpft mit LIKE) bist Du am flexibelsten.

Pindel 9. Mär 2005 09:00

Re: Verknüpfung von Tabellen
 
Wenn ich mit einem Query und select nach sachen
gesucht habe, wie kann ich die ergebnisse dann nochmal nach
anderen sachen durchsuchen???

Jelly 9. Mär 2005 09:13

Re: Verknüpfung von Tabellen
 
indem du in der Where-Clause deiner Query eine Zusatzbedingung hinzufügst.

SQL-Code:
select k.name, v.Filmtitel
from kunden k inner join ausleihe a on a.Kunde=k.ID,
videos vinner join ausleihe a on a.Video=v.ID
where k.Name = 'Muller'
in etwa so... musst deine Joins allerdings an deine Struktur anpassen.

Oder du setzt, nach öffnen der Query in Delphi, einen Filter. Davon würd ich aber prinzipiell abraten, da so erst mal alle Daten zum Client wandern, und dann erst gefiltert werden. Durch das direkte Einbetten in die Query entsteht weniger Datenverkehr, und wird auch weniger Speicher verbraucht.

Union 9. Mär 2005 09:13

Re: Verknüpfung von Tabellen
 
Zitat:

Zitat von Pindel
Wenn ich mit einem Query und select nach sachen
gesucht habe, wie kann ich die ergebnisse dann nochmal nach
anderen sachen durchsuchen???

Mit Locate.

Pindel 9. Mär 2005 09:31

Re: Verknüpfung von Tabellen
 
wie ich nach zwei sachen gleichzeitig suche ist mir weiß
ich schon, aber ich möchte das ich nach einer sache suche...
die ergebnisse dann im grid ausgegeben werden und wenn ich
dann zu viele einträge habe das ich die ergebnisse dann nochmal
durchsuchen kann...

Jelly 9. Mär 2005 14:34

Re: Verknüpfung von Tabellen
 
Also erstmal definierst du, was viel ist und was nicht viel ist. Und dann musst du halt ne neue Query schicken. Nach was du dann da filterst, ist dir überlassen. Ich weiss nicht so recht, ob ich dich richtig verstanden hab.

Luckie 9. Mär 2005 14:47

Re: Verknüpfung von Tabellen
 
Das ist aber doch eine 1:n Beziehung oder? Wenn ich die Kassetet bei mir zu Hause haben, dann kann sie sich auch kein anderer ausleihen. Den Titel wohl schon, aber jede Kassette wird doch eine eindeutige ID haben, sonst kann ich ja nicht zu ordner wo welche Kassette ist.

Zitat:

Zitat von Pindel
wie ich nach zwei sachen gleichzeitig suche ist mir weiß
ich schon, aber ich möchte das ich nach einer sache suche...
die ergebnisse dann im grid ausgegeben werden und wenn ich
dann zu viele einträge habe das ich die ergebnisse dann nochmal
durchsuchen kann...

Deine Umschalttaste ist kaputt.
Deine Kommataste ist funktioniert wohl nur zufällig.
Deine Punkttaste ist kaputt.
Deine Grammatikprüfung ist kaputt.

Eigentlich eine Unverschämtheit so ein Posting. Du setzt uns hier so ein hingerotztes Posting vor und erwartest von, dass wir die Mühe machen es in vernünftiges deutsch zu übersetzten, damit wir es überhaupt erst verstehen können, um dir dann zu helfen. Dir ist deine Zeit zu schade, es vernünftig zu schreiben, aber wir sollen unsere Zeit dafür opfer. Das ist eine Unverschämtheit und ich empfinde es als sehr unhöflich jemanden ein soleche Posting zu zumuten.

Albi 9. Mär 2005 16:17

Re: Verknüpfung von Tabellen
 
Hallo Pindel,

ich verstehe zwar was du willst aber ich habe das Gefühl, dass Du deine DB anfängst von hinten zu erstellen. Solltest Du dir nicht ersteinmal eine klare DB-Struktur schaffen und dann erst mit den Spielerein wie einer Suche anfangen?

Man baut doch die DB nicht danach auf was man suchen will sondern welchen Zweck sie erfüllen soll.

Ich würde dir 3 Tabellen empfehlen, wie "shmia" das schon beschrieben hat und dann kannst Du dir doch einfach über eine SQL-Abfrage alles selber zusammen basteln.

Zitat:

Zitat von ibp
wie wäre es erstmal mit einem db tutorial?

Zitat:

Zitat von Pindel
Ich denke das habe ich nicht nötig...


Wenn das so ist, dann sollte es doch eigentlich für dich kein Problem sein, mit den hier vorgegebenen Möglichkeiten, eine entsprechende SQL-Abfrage zu erstellen, oder? :gruebel:

Zitat:

Zitat von pindel
aber ich möchte das ich nach einer sache suche...
die ergebnisse dann im grid ausgegeben werden und wenn ich
dann zu viele einträge habe das ich die ergebnisse dann nochmal
durchsuchen kann...

Wenn Du viele Einträge hast, dann kannst Du die Abfrage neu starten und den Suchbegriff genauer beschreiben, dass wäre die einfachste Variante. Oder Du bastelst Dir mit Hilfe von SQL.ADD eine Abfrage, in der dann alle deine Kriterien untergebracht werden.

Pindel 9. Mär 2005 17:18

Re: Verknüpfung von Tabellen
 
1. Also, ich denke nun ist es doch an der Zeit mich für mein teilweise
doch sehr schroffes Verhalten zu entschuldigen.
Alle Einträge die ich gemacht habe mussten schnell von statten gehen, da ich sie in der Schule
getätigt habe und ich bitte deshalb darum meine vielen Rechtschreibfehler zu entschuldigen.

2. Natürlich habe ich mir auch viele Tutorials angesehen, aber so wirklich das Richtige habe ich nicht gefunden. Wenn jemand eines kennt wäre ich natürlich dankbar. Das war auch nicht so gemeint
das ich das nicht nötig hätte, ich war einfach sauer weil das alles nicht so funktioniert hat wie
ich wollte.

3. Ich schreibe nächste Woche ABI über dieses Thema und unser Lehrer hat leider überhaupt keine
Ahnung und gibt einfach Aufgaben, die er selber nie lösen könnte. Das grobe Programm steht jetzt schon
(dank eurer Hilfe). Ich habe drei Tabellen und kann auch sehen wer welche Filme ausgeliehen hat und
welcher Film von wem ausgeliehen wurde. Nun habe ich halt nur Probleme mit der Suche. Wir sollen eine
verknüpfte Suche realisieren, bei der wir nach alles suchen können und auch nach mehreren Kriterien
gleichzeitig.
Da habe ich mir gedacht wenn ich mit einem Query und SELECT suche und die Ergebnisse dann wieder durchsuchen kann, dann kann ich ja im Prinzip nach allem suchen und nach mehreren Sachen.

shmia 9. Mär 2005 17:34

Re: Verknüpfung von Tabellen
 
Zitat:

Zitat von Pindel
3. Ich schreibe nächste Woche ABI über dieses Thema und unser Lehrer hat leider überhaupt keine
Ahnung und gibt einfach Aufgaben, die er selber nie lösen könnte. Das grobe Programm steht jetzt schon
(dank eurer Hilfe). Ich habe drei Tabellen und kann auch sehen wer welche Filme ausgeliehen hat und
welcher Film von wem ausgeliehen wurde. Nun habe ich halt nur Probleme mit der Suche. Wir sollen eine
verknüpfte Suche realisieren, bei der wir nach alles suchen können und auch nach mehreren Kriterien
gleichzeitig.
Da habe ich mir gedacht wenn ich mit einem Query und SELECT suche und die Ergebnisse dann wieder durchsuchen kann, dann kann ich ja im Prinzip nach allem suchen und nach mehreren Sachen.

In der Praxis sind solche allgemeinen Suchmöglichkeiten schwer zu programmieren und für den Benutzer fast unverständlich.
Deshalb ist es ratsam sich auf bestimmte (Ab-)Fragen festzulegen.
Als da wären:
- Zeige *alle* ausgeliehenen Medien mit Kundendaten
- Zeige alle ausgeliehenen Medien für einen best. Kunden
Startpunkt ist ein ausgewählter Datensatz im Kundenstamm
- Zeige alle nicht ausgeliehenen Medien für ein bestimmtes Video
(Kunde interessiert sich z.B. für Ocean's Twelve; man möchte nun wissen, ob noch ein Medium im Lager ist)
Startpunkt ist ein ausgewählter Datensatz in Tabelle Video

Und immer schön die Begriffe Suchen und Filtern unterscheiden.
Gefiltert wird mit einer WHERE Bedingung in der SELECT - Anweisung.
Gesucht wird mit [TDataset.]Locate.

Pindel 9. Mär 2005 18:01

Re: Verknüpfung von Tabellen
 
Das das schwer zu realisieren ist, ist ja genau mein Problem, aber so ist
ja leider die Aufgabenstellung.

Union 9. Mär 2005 18:05

Re: Verknüpfung von Tabellen
 
Zitat:

Zitat von Pindel
Das das schwer zu realisieren ist, ist ja genau mein Problem, aber so ist
ja leider die Aufgabenstellung.

Mach das doch über einen Dialog in dem alle relevanten Felder stehen. Dort kann der Benutzer die Selektion ausfüllen. Je nachdem, was ausgefüllt ist, baust Du Dir dann den entsprechenden Select-String zusammen.

Albi 9. Mär 2005 18:31

Re: Verknüpfung von Tabellen
 
Hallo Pindel,

Du kannst eine ComboBox nehmen, wo der Benutzer sich die relevanten Felder aussuchen kann. Dann hast Du noch ein Cbox wo eben nur größer, gleich, kleiner usw. gewählt werden können und zum Schluß nimmst Du noch ein Edit-Feld wo dann Benutzerspezifische Suchbegriffe eingegeben werden können. Dann noch ein Button übernehmen, über diesen werden die Suchabfragen in ein StringGrid oder so geschrieben. Der Benutzer kann somit in einer Suchabfrage mehrere Suchbegriffe abfragen.

Zu guter letzt, nur noch einen Button mit Suchen und dann kannste Du dir das Ergebnis in einem DBGrid anzeigen lassen.

Du kannst dann das StringGrid durchlaufen und die kriterien in dein Abfrage übernehmen. Ich habe das zwar so noch nie gemacht aber es könnte so gehen.

SQL-Code:
SQL.clear;
SQL.Add('Select * From Table WHERE')
/*erste Zeile aus dem Grid o.ä.*/
SQL.Add('Name Like '+Edit1.text+'')
/*zweite Zeile*/
SQL.ADD('ausgeliehen > '+Edit1.text+'')
/*alle Zeilen abgearbeitet*/
SQL.Open;
Wie gesagt ich habe das auch noch nie so realisiert aber es könnte so gehen, glaub ich.

Pindel 9. Mär 2005 18:50

Re: Verknüpfung von Tabellen
 
So geht das auch, habe das bisher auch so gemacht, ich dachte nur das es vieleicht einfacher
wäre, wenn ich die Ergebnisse nochmal durchsuchen könnte.
Das muss doch auch irgendwie gehen.
Trotzdem schonmal DANKE.

Albi 9. Mär 2005 18:57

Re: Verknüpfung von Tabellen
 
Hallo,

das geht sicherlich, nur must dann ja alle Ergebnisse merken und in der neuen Abfrage mit einbauen.

Wenn Du das so machen willst, dann must du im ersten Arbeitsschritt das Suchergebniss durchsuchen und dir die ID's merken, da diese aber aus verschieden Tabellen kommen, dürfte das ein zu großer Aufwand werden.

Wenn Du die Abfrage neu startest wird eh die Ergebnismenge der alten Abfrage verworfen und alle Daten neu geholt, daher hast Du - denke ich - eigentlich keinen Vorteil davon. Nur noch mehr schreibarbeit. :wink:

Oder lautet die Aufgabenstellung so, dass Du das bereits bestehende Ergebnis nochmals durchsuchen sollst?

Pindel 9. Mär 2005 19:19

Re: Verknüpfung von Tabellen
 
Nein, das nicht, ich soll nur nach mehreren Sachen gleiczeitig suchen können.
Die Anzahl der Suchkriterien soll allerdings auch frei wählbar sein.
Also mal halt nur nach einer Sache und mal nach allen.

Jelly 11. Mär 2005 15:32

Re: Verknüpfung von Tabellen
 
Zitat:

Zitat von Luckie
Das ist aber doch eine 1:n Beziehung oder? Wenn ich die Kassetet bei mir zu Hause haben, dann kann sie sich auch kein anderer ausleihen. Den Titel wohl schon, aber jede Kassette wird doch eine eindeutige ID haben, sonst kann ich ja nicht zu ordner wo welche Kassette ist.

Ja, aber nachdem du die Kassette zurückgebracht hast, kann sie wieder ausgeliehen werden. Wenn du eine History erstellen willst, darfst du dein Ausleihverfahren nicht überschreiben durch eine neue Ausleihe der Kassette. d.h. eine Kassette kann, solange sie im Sortiment geführt wird, von mehreren Leuten ausgeliehen werden (nacheinander versteht sich). Und jeder Käufer kann mehrere Kassetten ausleihen. Also: eine n:n Beziehung par excellence.


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