Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Master / detail haut nicht hin! (https://www.delphipraxis.net/84215-master-detail-haut-nicht-hin.html)

cugar 13. Jan 2007 09:32

Datenbank: InterBase • Version: 7,5 • Zugriff über: Delphi

Master / detail haut nicht hin!
 
Hi,
komme jetzt nicht weiter....
Habe zwei IBDataSets, die Daten werden in zwei DBGrids angezeigt.
Die erste Tabelle Rechnungen ist die Mastertabelle, die zweite RechDetail soll die Details anzeigen.
Über die Eigenschaft "DataSource" bei RechDetail wird das Verhältnis festgelegt? ...oder nicht?

Beide DBGrid zeigen die Daten an, mein Problem ist aber:
die Detailtabelle zeigt alles an was sie enthält, und nicht nur die Daten, die zu der jeweiligen Rechnung gehören.
Was mache ich da falsch?

Gruß
cugar

dataspider 13. Jan 2007 09:52

Re: Master / detail haut nicht hin!
 
Hi,

sieht so aus, als ob die Where Bedingung im Detail - SQL fehlt.

Also:
SQL-Code:
select * from detail where master_id = :id
In diesem Beispiel muss in der Mastertabelle ein Feld Id existieren, welches mit der Detailtabelle über das Feld master_id verknüpft ist.

Cu, Frank

cugar 13. Jan 2007 09:55

Re: Master / detail haut nicht hin!
 
CREATE TABLE "RECHNUNG"
(
"Re_Nr" INTEGER NOT NULL,
"Datum" DATE NOT NULL,
"MWST" SMALLINT NOT NULL,
"KD_ID" INTEGER NOT NULL,
"Anmerkung" "STR(100)",
PRIMARY KEY ("Re_Nr")
);
CREATE TABLE "RECH_DETAIL"
(
"ID" INTEGER NOT NULL,
"Re_ID" INTEGER NOT NULL,
"Art_ID" INTEGER NOT NULL,
"MENGE" INTEGER DEFAULT 1 NOT NULL,
"Preis_NETTO" DOUBLE PRECISION,
"Anmerkung" "TSTR(50)",
PRIMARY KEY ("ID")
);

Mastertabelle:
select "RECHNUNG"."Anmerkung","Re_Nr","Datum","MWST","KD_ ID","Firma",ANREDE."Anrede" ||
' '|| "Kontakt_Vorname"||' '||"Kontakt_Name" AS "Kontakt_Person",
"TelefonNr",
"PLZ"||' '||"ORT"||' '||"STRASSE"||"HausNr" AS "Anschrift"
FROM RECHNUNG,KUNDE,ANREDE
WHERE "KD_ID"="KUNDE"."ID" AND "KUNDE"."ANREDE"="ANREDE"."ID"



Detailtabelle:
SELECT
RECH_DETAIL."ID", "Art_ID", "Re_ID", "MENGE", "Preis_NETTO", "ArtNr", "Bezeichnung","Anmerkung"
FROM RECH_DETAIL, PALETTE, RECHNUNG
WHERE "Art_ID"=PALETTE."ID" AND "Re_Nr"="Re_ID"

marabu 13. Jan 2007 11:44

Re: Master / detail haut nicht hin!
 
Hallo cugar,

das SQL-Statement der Detail-Tabelle erhält den selektierenden master-key über einen Parameter:

SQL-Code:
SELECT r.re_nr, d.id, d.art_id, d.menge, d.preis_netto,
   p.artnr, p.bezeichnung, d.anmerkung
FROM rech_detail d, palette p, rechnung r
WHERE d.art_id = p.id AND d.re_id = r.re_nr AND d.re_id = :re_nr
Der Name des Parameters muss mit dem Namen desjenigen Feldes in der mit DataSource verknüpften Tabelle übereinstimmen, dessen Wert für die Selektion benutzt werden soll.

Noch ein Rat: Wenn RE_NR vom Benutzer eingegeben wird, dann nimm nicht RE_NR als primary key für die Tabelle Rechnung, sondern führe einen künstlichen Schlüssel ID ein, der automatisch (Generator) vergeben wird. Da dieser Schlüssel später als Fremdschlüssel Verwendung findet, ist ein surrogate key besser, da bei Änderungen der Schlüsselwert nicht auf abhängige Tabellen propagiert werden muss.

Noch etwas zur Namenskonvention: Beim ER-Entwurf stehen deine Entitäten im Singular, der Tabellenname wird üblicherweise in den Plural gesetzt. Innerhalb der Tabelle werden die Attributnamen, eventuell mit einem Rollen-Suffix, als Feldnamen übernommen. Dabei solltest du auf Redundanzen verzichten, In einer Tabelle "REchnungen" ist "Nummer" oder auch "NR" okay, RE_NR hingegen nur "zweite Wahl".

Freundliche Grüße

cugar 13. Jan 2007 12:07

Re: Master / detail haut nicht hin!
 
Vielen Dank für Deine Mühe!
Werde die beiden Tabellen noch mal erstellen und versuche den Tipps zu folgen.

Schönes Wochenende noch!
cugar


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