TDBGrid Anzeigen aus einer Anderen Tabelle

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
paulderfinne
Beiträge: 65
Registriert: Mi 27. Feb 2013, 18:24
OS, Lazarus, FPC: Linux (L 0.9.30.4-1.1 FPC 2.6.0)
CPU-Target: 32Bit

TDBGrid Anzeigen aus einer Anderen Tabelle

Beitrag von paulderfinne »

Ich habe eine TDBGrid und möchte eine Spalte aus einer Anderen Tabelle anzeigen. Kann man eine Spalte im DBGrid erzeugen, die so etwas enthält wie:

select AField1 from ATable1, ATable2 where ATable1.AField1=AField2.AField2;

Versteht ihr was ich meine?

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: TDBGrid Anzeigen aus einer Anderen Tabelle

Beitrag von MmVisual »

Ja, geht. Lese mal in der SQL Syntax unter JOIN
EleLa - Elektronik Lagerverwaltung - www.elela.de

paulderfinne
Beiträge: 65
Registriert: Mi 27. Feb 2013, 18:24
OS, Lazarus, FPC: Linux (L 0.9.30.4-1.1 FPC 2.6.0)
CPU-Target: 32Bit

Re: TDBGrid Anzeigen aus einer Anderen Tabelle

Beitrag von paulderfinne »

MmVisual hat geschrieben:Ja, geht. Lese mal in der SQL Syntax unter JOIN
danke für die Antwort MmVisual. Ich habe mich aber schlecht ausgedrückt. Nicht der SQL-Befehl ist mein Problem, sondern wie ich dem Grid klarmache, dass in einer speziellen Spalte nicht nur Felder einer speziellen Tabelle (die aus ZTable) sondern eben auch eine Spalte aus einer anderen Tabelle, die mit meiner verknüpft ist.

Vielleicht doch noch zur Erhelleung: Ich habe einen TZTable "Geworfen", darin eine Tabelle definiert und darauf ein Grid um diese Tabelle bearbeiten zu können. Anzeigen in dem Grid möchte ich aber ncht nur die Felder dieser Tabelle, sondern eben auch verknüpfte Felder. Wohl so ziemlich das Üblichste bei normierten Tabellen einer Datenbank. Bei einem TZQuery klappt das bei mir wunderbar,weil man dort von vornherein eine SQL-Abfrage definiert, aber bei Tables geht das so nicht.

Entschuldigt meine Unwissenheit. Vielleicht habe ich ja eine völlig doofe Startegie der Datenbehandlung gewählt?

baba
Beiträge: 265
Registriert: Mi 4. Apr 2007, 17:47

Re: TDBGrid Anzeigen aus einer Anderen Tabelle

Beitrag von baba »

Moin,

es gibt ein OnDraw-Ereigniss. Dort zeichnest Du Dein Grid selbst und kannst auf beliebige Daten zugreifen.

Oder Du läßt Dir das Feld mit dem Befehl "AS" umbenennen. "SELECT feld1, feld2, joinfeld AS neuerfeldname FROM ..."

Gruß
Baba.

paulderfinne
Beiträge: 65
Registriert: Mi 27. Feb 2013, 18:24
OS, Lazarus, FPC: Linux (L 0.9.30.4-1.1 FPC 2.6.0)
CPU-Target: 32Bit

Re: TDBGrid Anzeigen aus einer Anderen Tabelle

Beitrag von paulderfinne »

Danke für die Antwort, lieber Freund aus dem Norden.
baba hat geschrieben: es gibt ein OnDraw-Ereigniss. Dort zeichnest Du Dein Grid selbst und kannst auf beliebige Daten zugreifen.
Aha. Hast du vielleicht ein Beispiel? Damit ich mir ncicht alles aus den Fingern saugen muss?
baba hat geschrieben: Oder Du läßt Dir das Feld mit dem Befehl "AS" umbenennen. "SELECT feld1, feld2, joinfeld AS neuerfeldname FROM ..."
Aber wo trage ich diesen SQL-Befehl im ZTable ein? Oder im Grid?

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: TDBGrid Anzeigen aus einer Anderen Tabelle

Beitrag von hde »

ein Table kann man nicht so einfach selecten aber filtern.
aber warum nimmst du denn ZTable statt ZSQL?
und wenn du es halt kompliziert willst muss man etwas mehr programmieren, dann ist es mit "werfen" nicht getan. :|
hde

paulderfinne
Beiträge: 65
Registriert: Mi 27. Feb 2013, 18:24
OS, Lazarus, FPC: Linux (L 0.9.30.4-1.1 FPC 2.6.0)
CPU-Target: 32Bit

Re: TDBGrid Anzeigen aus einer Anderen Tabelle

Beitrag von paulderfinne »

hde hat geschrieben:ein Table kann man nicht so einfach selecten aber filtern.
Ja, das habe ich auch schon bemerkt.
hde hat geschrieben:aber warum nimmst du denn ZTable statt ZSQL?
Weil ich in die Tabelle schreiben wollte. Der Benutzer wählt eine Zeile aus dem Grid, und diese Zeile will ich "updaten". Nur soll er in einer Spalte nicht den tatsächlichen Wert, sondern den einer Verknüpften Tabelle sehen. Dachte, das geht irgnwie in dem Editierteil, das erscheint, wenn man auf die table doppelklickt.
hde hat geschrieben:und wenn du es halt kompliziert willst muss man etwas mehr programmieren, dann ist es mit "werfen" nicht getan. :|
Was ist denn daran kompliziert? Und ich habe schon ziemlich viel an dem Programm programmiert. Wenn das nicht geht, muss ich wohl eine Zsql "schmeißen" und mit dierektem SQL-Statement UPDATE ... arbeiten. Ja, ich taste mich halt so ran an die OOP.

Danke jedenfalls für die Hinweise (auch wenn sie nicht wirklich hilfrech waren ;)

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: TDBGrid Anzeigen aus einer Anderen Tabelle

Beitrag von hde »

ich arbeite halt grundsätzlich anders, beim Doppelcklick auf eine Gridzeile erscheint bei mir ein komplettes Editfenster.
wenn du es anders willst, versuch's mit lookup. aber es gibt für Lazarus diverse Zusatzpakete und da mag auch ein DBGrid bei sein dass mehr kann als das standard.
musst du dir halt die zeit nehmen und etwas experimentieren oder was selbst schreiben.
jde

paulderfinne
Beiträge: 65
Registriert: Mi 27. Feb 2013, 18:24
OS, Lazarus, FPC: Linux (L 0.9.30.4-1.1 FPC 2.6.0)
CPU-Target: 32Bit

Re: TDBGrid Anzeigen aus einer Anderen Tabelle

Beitrag von paulderfinne »

hde hat geschrieben:ich arbeite halt grundsätzlich anders, beim Doppelcklick auf eine Gridzeile erscheint bei mir ein komplettes Editfenster.
Aber genauso habe ich das auch gemacht. Hmm.. und beruht dein Grid auf eine Table oder eine Query?

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: TDBGrid Anzeigen aus einer Anderen Tabelle

Beitrag von hde »

paulderfinne hat geschrieben:beruht dein Grid auf eine Table oder eine Query?
das kommt natürlich ganz darauf an was ich zeigen und zur Auswahl stellen will, in aller Regel zqueries, oft mit joins aus mehreren Tabellen. Grids bei mir nur zur Auswahl, nie zum direkten editieren oder erfassen.
hde

Soner
Beiträge: 725
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: TDBGrid Anzeigen aus einer Anderen Tabelle

Beitrag von Soner »

Was du beschreibst hört sich nach Lookup-Felder an. z.B. Du hast in einer Adressentabelle nur PLZ und in der 2. TAbelle zu der PLZ veknüpfte Ort. Du kannst dann in eine Tabelle (TZTable) mit Lookup-Feld Ort auch zeigen und bearbeiten lassen.

paulderfinne
Beiträge: 65
Registriert: Mi 27. Feb 2013, 18:24
OS, Lazarus, FPC: Linux (L 0.9.30.4-1.1 FPC 2.6.0)
CPU-Target: 32Bit

Re: TDBGrid Anzeigen aus einer Anderen Tabelle

Beitrag von paulderfinne »

Ja, Soner, so dachte ich mir das. Danke für deine Antwort. Kannst du ein bisschen näher erklären, was lookup-Felder sind? Hat es was mit dem kleinen Editierfenster zu tun das aufpoppt wenn einen Doppelklick auf die Table macht? Da habe ich auch schon rumgefuhrwerkt. Allerdings kläglich erfolglos.

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: TDBGrid Anzeigen aus einer Anderen Tabelle

Beitrag von hde »

paulderfinne hat geschrieben:näher erklären, was lookup-Felder sind?
das hat dir doch Soner schon gut erklärt und auf lookup hab ich dich auch schon mal hingewiesen.

Wenn du Werte aus 2 Tabellen in einer Grid darstellen willst, dann hat das ja (hoffentlich) einen Grund? :wink:
Meist ist es der, wo Soner dir ein gutes Beispiel gegebe hat, du hast eine Kennzahl in der Haupttabelle z.B. die Postleitzahl, willst aber im Grid nicht die kennzahl anzeigen, sondern das was sich dahiner verbirgt, z B. den Namen des Ortes.
Sowas macht man Über Lookups
hde

Soner
Beiträge: 725
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: TDBGrid Anzeigen aus einer Anderen Tabelle

Beitrag von Soner »

paulderfinne hat geschrieben:..Kannst du ein bisschen näher erklären, was lookup-Felder sind? ...
Weitere Erklärung findest du im Netz. Such nach "delphi lookup feld".
paulderfinne hat geschrieben:... Hat es was mit dem kleinen Editierfenster zu tun das aufpoppt wenn einen Doppelklick auf die Table macht? Da habe ich auch schon rumgefuhrwerkt. Allerdings kläglich erfolglos.
Ja genau das. Ich habe immer mit der rechten Maustaste geklickt und aus der Menü "Felde bearbeiten" gewählt.
1. Im neuen Fenster fügst du erst reale Felder was schon in der Tabelle vorhanden ist. (Button mit "+"-Bild)
2. Dann klicke auf "Neues Feld ... hinzufügen. (Buttom mit Helftblatt-Bild).
3. In neuen Dialogfenster klicke auf Lookup und "Lookupdefinition" schreibst du das:
Schlüsselfelder: Verknüpfungsfeld aus der Haupttabelle bei unserem Beispiel PLZ.
Dataset: Tabellenname von der Nebentabelle, hier Ortetabelle.
Lookupkeys: Mit der Haupttabelle Verknüpftesfeld in der Nebentabelle
Ergebnisfelder: Feld auswählen das angezeigt werden soll, z.b. ORtname. Du kannst auch mehrere Felder angeben die mit Semikola ";" getrennt sind.

Bei der Benutzung muss man beachten, dass nebentabellen zuerst geöffnet werden. D.h. Nach dem Formulardesign beide Tabellen schließen (Eigenschaft--> Active:=false) und beim Starten des Programms erst Nebentabelle dann Haupttabelle aktivsetzen. Sonst gibt"s Exception wegen nicht gefundenes Feld.

Wenn du TZTable bei der Firebird-DB benutzt, dann muss man für "Autoinc"-Felder immer TZSequence-Komponente verwenden. Du kannst mit Zeos-Komponenten und Lazarus-Datacontrols genauso wie mit Delphis BDE arbeiten, mann vermißt nichts. Mann muß nur einige Kleinigkeiten wie TZSequence beachten.

Viel Glück.

Antworten