Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TDBGrid mit Master/Detail? (https://www.delphipraxis.net/207645-tdbgrid-mit-master-detail.html)

NoGAD 18. Apr 2021 11:40

Datenbank: egal • Version: egal • Zugriff über: ttable

TDBGrid mit Master/Detail?
 
Hallo,

ist mit einem normalen DBGrid möglich, Daten aus verschiedenen Tabellen einer einzelnen Datenbank in den Spalten anzeigen zu lassen?

Momentan werden nur Einträge aus Tabelle 1 angezeigt, in Spalte 3 des DBGrid möchte ich aber lieber statt des Index auf Tabelle 2 den Inhalt des zweiten Feldes von Tabelle 2 anzeigen lassen.

(In einer DBLookup - Komponente (Combobox, z.B.) funktioniert das ja auch mittels Listfield.)

LG Mathias :-)

Uwe Raabe 18. Apr 2021 12:30

AW: TDBGrid mit Master/Detail?
 
Wenn ich dich richtig verstanden habe, dann kannst du das mit einem Lookup-Feld in Tabelle 1 lösen - ganz ähnlich wie mit der DBLookupComboBox.

DeddyH 18. Apr 2021 12:32

AW: TDBGrid mit Master/Detail?
 
Vergiss TTable und nimm eine Query, in der Du die beiden Tabellen zusammenjoinst.

Neumann 18. Apr 2021 12:54

AW: TDBGrid mit Master/Detail?
 
Wenn man Daten nur Anzeigen will, dann macht man schon beim Zugriff einen entsprechenden Select mit Joins o.Ä. Wenn die Daten editierbar sind, ist Lookup sinnvoll, etwa um Artikel leicher einer Gruppe zuordnen zu können oder wenn nur bestimmte Werte erlaubt sind.

NoGAD 18. Apr 2021 13:13

AW: TDBGrid mit Master/Detail?
 
Habt ihr (leicht) verständliche Tutorials (bitte in deutsch) für dieses Problem für mich?

Mir reicht es, wenn die Daten angezeigt werden.


LG Mathias

DeddyH 18. Apr 2021 13:30

AW: TDBGrid mit Master/Detail?
 
Nimm eine Query und gib in der Eigenschaft SQL sinngemäß etwas wie
SQL-Code:
SELECT
  T1.Feld1, T1.Feld2, ..., T2.Feld
FROM
  Tabelle1 T1
  JOIN Tabelle2 T2 ON T2.ID = T1.Tabelle2ID
ein. Die Feld- und Tabellennamen musst Du natürlich durch Deine eigenen Bezeichner ersetzen.

NoGAD 18. Apr 2021 16:22

AW: TDBGrid mit Master/Detail?
 
Zitat:

Zitat von DeddyH (Beitrag 1487342)
Nimm eine Query und gib in der Eigenschaft SQL sinngemäß etwas wie
SQL-Code:
SELECT
  T1.Feld1, T1.Feld2, ..., T2.Feld
FROM
  Tabelle1 T1
  JOIN Tabelle2 T2 ON T2.ID = T1.Tabelle2ID
ein. Die Feld- und Tabellennamen musst Du natürlich durch Deine eigenen Bezeichner ersetzen.

Und in welchem Ereignis wird das dann aufgerufen?


OnAfterScroll?

LG Mathias

DeddyH 18. Apr 2021 16:37

AW: TDBGrid mit Master/Detail?
 
Du weist die SQL-Anweisung zu und rufst dann Query.Open auf. Wenn das Grid über eine TDatasource mit der Query verknüpft ist, siehst Du sofort die Daten.

NoGAD 18. Apr 2021 16:38

AW: TDBGrid mit Master/Detail?
 
Vielen Dank, ich versuche mein Glück :-)

LG Mathias

Commander Tom 20. Apr 2021 11:56

AW: TDBGrid mit Master/Detail?
 
Man kann das aber auch über ein persistentes Nachschlagefeld im Query lösen. Dazu muss man in der Query mit Rechtsklick ein neues Nachschlagefeld anlegen und dann aus der zweiten Tabelle das anzuzeigende Feld angeben. Es muss dazu natürlich ein Fremdschlüssel auf die zweite Tabelle existieren, dies scheint aber in diesem Beispiel gegeben zu sein.

Das neue Feld kann man dann einfach im Grid anzeigen lassen und auch sonst überall verwenden.

NoGAD 20. Apr 2021 13:09

AW: TDBGrid mit Master/Detail?
 
Hallo Thomas, danke für deinen Beitrag. Meine Datenbank und die Tabellen werden erst zur Laufzeit erzeugt. Die Anbindungsobjeke ebenfalls.

Momentan nutze ich auch nur für die Erstellung der DB/Tables SQL, ansonsten läuft alles über TTable.

Weiterhin bin ich leider noch nicht so weit mit den Abfolgen vertraut, als dass ich wüsste, was Du mir versuchen wolltest, zu erklären. 😔

LG Mathias

Commander Tom 22. Apr 2021 01:14

AW: TDBGrid mit Master/Detail?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nun ja, man kann in einer Table oder Query mit Rechtsklick -> Fields Editor die persistenten Felder der Tabelle oder Query aufrufen. Nun lässt sich im Field Editor auch ein neues Nachschlagefeld anlegen, das Daten aus anderen Tabellen verwenden kann (siehe angehängtes Beispiel). Dieses Nachschlagefeld lässt sich dann in jedem datensensitiven Grid als Spalte verwenden.

Mehr dazu erfährst Du hier: http://docwiki.embarcadero.com/RADSt...der_definieren

Wie gesagt, eignet sich nicht für jeden Anwendungsfall. Wenn man keine persistenten Felder zur Laufzeit verwendet, macht das dann auch keinen Sinn. Dann verwendet man lieber gleich von vorneherein SQL-Joins. In manchen Anwendungsfällen ist es eine schnelle und elegante Möglichkeit, wie man Felder aus vielen anderen Tabellen im Grid verwenden kann, kommt halt immer darauf an, wie man vorgeht.

NoGAD 22. Apr 2021 12:21

AW: TDBGrid mit Master/Detail?
 
Huhu Thomas,

eine Nachfrage habe ich noch.

Für ein Lookup-Feld muss in beiden Tabellen jeweils der gleiche Tabellenfeldname existieren?

LG

Commander Tom 22. Apr 2021 13:11

AW: TDBGrid mit Master/Detail?
 
Hallo Mathias,

nein, muss nicht sein. Die beteiligten Felder für die Nachschlagefelder gibst Du ja bei der Definition alle mit an:

Name: Der neue Feldname in der Master-Tabelle
Komponente: Name des Feldes in Delphi (wird anhand der Eingabe des Namens vorgeschlagen)
Typ: Feldtyp entsprechend des Feldinhalts
Größe: Größe des neuen Feldes in der Master-Tabelle
Schlüsselfelder: Das Schlüsselfeld in der Master-Tabelle
Datenmenge: Die Query oder Table der Detail-Tabelle
Schlüssel: Das Schlüsselfeld in der Detail-Tabelle
Ergebnisfeld: Das darzustellende Feld aus der Detail-Tabelle

NoGAD 22. Apr 2021 17:53

AW: TDBGrid mit Master/Detail?
 
Danke für die Erklärung.

Ich habe versucht es zur Laufzeit einzubauen, es kommt immer die Fehlermeldung, dass das Feld 'book_author' nicht existiert.

Die Tabelle wurde erstellt, im Anschluss wird das Lookup-Feld angelegt. Mein Code für das Lookup-Feld sieht jetzt so aus:

Delphi-Quellcode:
var
  NewField: TField;
begin
    if Table2.FieldDefs.Updated = False then
      Table2.FieldDefs.Update;
    if Table12FindField('lfAuthor') = nil then
    begin
      NewField := TStringField.Create(Table2);
      NewField.FieldName := 'lfAuthor'; // Lookup Field Author
      NewField.SetFieldType(ftString); // String
      NewField.Size:=255;
      NewField.KeyFields := 'book_author'; // Field aus Table1
      NewField.LookUpDataset := Table1;
      NewField.LookUpKeyFields := 'id'; // Field aus Table2
      NewField.LookUpResultField := 'autor_nachname'; // Field aus Table2, welches über die id, die in 'book_author' steht, angezeigt werden soll
      NewField.FieldKind := fkLookup;
      NewField.DataSet := Table2;
    end;

Neumann 22. Apr 2021 18:42

AW: TDBGrid mit Master/Detail?
 
Wenn Table1 die ID für den Lookup enthält, dann muss da die Lookup-Geschichte definiert werden. Eigentlich ganz einfach zusammencklickbar, wenn man persistente Felder benutzt.

Einfach Dataset - Feldeditor - Neues Feld bei Tabelle1.

Manuell sollte es aber auch gehen.

NoGAD 22. Apr 2021 21:13

AW: TDBGrid mit Master/Detail?
 
Zitat:

Zitat von Neumann (Beitrag 1487654)
Wenn Table1 die ID für den Lookup enthält, dann muss da die Lookup-Geschichte definiert werden. Eigentlich ganz einfach zusammencklickbar, wenn man persistente Felder benutzt.

Einfach Dataset - Feldeditor - Neues Feld bei Tabelle1.

Manuell sollte es aber auch gehen.


Die ID aus Tabelle1 ist eine Referenz auf Tabelle2, als Integer. Also in Tabelle2 stehen Werte, die im DBGrid erscheinen sollen, owohl eigentlich nur Tabelle1 im DBGrid angezeigt wird.

LG Mathias

Uwe Raabe 22. Apr 2021 22:13

AW: TDBGrid mit Master/Detail?
 
Dann müsste es aber eher so aussehen:
Delphi-Quellcode:
      NewField := TStringField.Create(Table1);
      NewField.FieldName := 'lfAuthor'; // Lookup Field Author
      NewField.SetFieldType(ftString); // String
      NewField.Size:=255;
      NewField.KeyFields := 'book_author'; // Field aus Table1
      NewField.LookUpDataset := Table2;
      NewField.LookUpKeyFields := 'id'; // Field aus Table2
      NewField.LookUpResultField := 'autor_nachname'; // Field aus Table2, welches über die id, die in 'book_author' steht, angezeigt werden soll
      NewField.FieldKind := fkLookup;
      NewField.DataSet := Table1;

NoGAD 23. Apr 2021 05:34

AW: TDBGrid mit Master/Detail?
 
Guten Morgen!

Nochmal zum Verständnis für mich:

das Feld lfAuthor darf nicht existieren, damit das ganze funktionieren soll?


@Uwe Raabe: Danke, leider gibt es immer noch den Fehler, dass das Feld: book_author (gibt es in table1) nicht existiert.

Lasse ich im Code: NewField.DataSet := Table1; weg, lauft es durch, aber das Lookup-Feld wird im DBGrid nicht angezeigt.

LG

Uwe Raabe 23. Apr 2021 08:30

AW: TDBGrid mit Master/Detail?
 
Mach doch mal ein komplettes Beispiel, damit wir genau wissen, was wo ist und was nicht.

NoGAD 25. Apr 2021 23:05

AW: TDBGrid mit Master/Detail?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,


es hat eine Weile gedauert, ich hatte noch andere Sachen zu tun.

Anbei mein Projekt.

In der Unit: Hauptformular.pas ist betreffende Passage ab Zeile 430.

Delphi-Quellcode:
function TForm_Hauptformular.Create_MyABSTable: Boolean;
{ :: Create Query(s) and Table(s) if not exists - }

Für die Kompilierung werden noch viele Komponenten benötigt, die ich teilweise selbst erstellt habe. Außerdem ABS Database.

Für Hinweise wäre ich sehr dankbar :-)

Habt einen schönen Start in die neue Woche.


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