Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DBGrid und mehrere Tabellen (https://www.delphipraxis.net/127227-dbgrid-und-mehrere-tabellen.html)

BackOrifice 9. Jan 2009 14:13

Datenbank: MS SQL Server • Version: 2000 • Zugriff über: dbExpress

DBGrid und mehrere Tabellen
 
Hallihallo,

ich nutze zum Anzeigen und - und das ist das Problem - zum Editieren von Datensätzen in Tabellen ein DBGrid. Folgender Verbindungsaufbau:

SQLConnection -> SimpleDataSet -> DataSource -> DBGrid

Ich hole mir die Datensätze: SimpleDataSet.CommandText :=
SQL-Code:
SELECT t.anfang, t.ende, ti.titel, ti.inhalt, g.name_grp
FROM termin t, termin_inhalt ti, gruppe g
WHERE t.inhalt_id = ti.inhalt_id
AND ti.gruppen_id = g.gruppen_id
Jetzt ist die Options des DBGrids auch mit goEditing gesetzt und ich möchte zbs. den Titel in dem Grid ändern.

Der springende Punkt dabei ist, dass anscheinend das DataSet beim Updaten nicht mit mehreren Tabellen zurecht kommt. Egal wie der CommandText aussieht, bei mehr als einer Tabelle schmeisst beim ApplyUpdates(0) die Runtime eine Exception: "Ungültiger Spaltenname xy"
Ich hab bis jetzt absolut keine Ahnung, wie ich das Problem umgehen/verhindern kann. Ein InnerJoin behebt die Sache auch nicht.

Hat irgendeiner von euch eine Idee dazu? Ich wäre um jeden Tipp dankbar.

nahpets 9. Jan 2009 14:52

Re: DBGrid und mehrere Tabellen
 
Hallo,

benutzt Du immer dieses eine SQL oder auch schon mal unterschiedliche?
Mach mal vor dem Öffnen der Datenmenge ein DBGrid.Columns.Clear, dann werden die Spalten neu erstellt und passen zur Datenmenge. Die Spaltentitel muss Du dann jedesmal neu machen, wenn sie nicht mit den Spaltennamen übereinstimmen sollen.
Mit Tabellenalias zu arbeiten ist zwar schön und macht das alles etwas kürzer, aber versuch doch mal, ob es ohne Alias funktioniert:
SQL-Code:
SELECT termin.Anfang, termin.Ende, termin_inhalt.Titel, termin_inhalt.Inhalt, gruppe.Name_Grp
FROM termin, termin_inhalt, gruppe
WHERE termin.inhalt_id = termin_inhalt.inhalt_id
AND termin_inhalt.gruppen_id = gruppe.gruppen_id
Heißt die Fehlermeldung wirklich Spalte xy?
Wenn Du im SQL bei den Spaltennamen ein bisserl auf Groß-/Kleinschreibung achtest, sieht es im DBGrid auch ohne explizites Setzen der Spaltentitel ein bisserl schöner aus, eventuell sind die Anwender dann ja damit schon zufrieden und Du kannst Dir das Ändern der Spaltentitel sparen :wink:

BackOrifice 9. Jan 2009 15:19

Re: DBGrid und mehrere Tabellen
 
Hi, danke für die Antwort.

Das Statement ist immer das Selbe, statisch also. Die Columns erstell ebenfalls statisch, in devTime. Dort setze ich dann auch Eigenschaften, die ich dringend brauche.
Das Ändern des Aliases auf den Tabellennamen selbst bringt leider gar keine Besserung.

Prinzipell geht es mir nur ums Ändern. Alles andere funktioniert tiptop.

nahpets 9. Jan 2009 15:31

Re: DBGrid und mehrere Tabellen
 
Hallo,
dann verate uns doch mal, welche Spalte er meint nicht zu finden, sicherlich nicht die Spalte xy, eventuell kommt ja dann der aha-Effekt.

Zum Nichtfinden kommen (meiner Meinung nach) infrage:

termin.Anfang
termin.Ende
termin_inhalt.Titel
termin_inhalt.Inhalt
gruppe.Name_Grp
termin.inhalt_id
termin_inhalt.inhalt_id
termin_inhalt.gruppen_id
gruppe.gruppen_id

was eigentlich erstmal unwahrscheinlich zu sein scheint. Ist es wirklich eine Spalte, die hier nicht aufgeführt ist, so liegt entweder ein Fehler bei der Konfigurations des DBGrids vor oder die Datenbank will mehr aktualisieren, als Du in der Abfrage an Daten holst.

BackOrifice 9. Jan 2009 16:41

Re: DBGrid und mehrere Tabellen
 
Exception 1) Klasse TDBXError mit der Meldung
'SQL State 42S22 SQL Error Code: 207'
Ungültiger Spaltenname 'name_grp'
42S22 SQL Error Code: 207
Ungültiger Spaltenname 'titel'
42S22 SQL Error Code: 207
Ungültiger Spaltenname 'titel' (wohlgemerkt, Titel 2x)

Exception 2) Klasse TDatabaseError mit der Meldung
'Datensatz wurde nicht gefunden, es wurde kein Schlüssel angegeben'



....

nahpets 9. Jan 2009 17:01

Re: DBGrid und mehrere Tabellen
 
Hallo,

bitte mal die Strukturen aller Tabellen posten, haben mehrere 'ne Spalte Titel?

Eventuell (eher sicherlich) musst Du die ID's der Tabellen mit ins DBGrid nehmen, da die Datenbank anscheinend mit den selektierten Spalten keine eindeutige Zuordnung hinbekommt. Was soll letztendlich aktuallisiert werden? Alle selektierte Spalten oder nur Anfang und Ende. Sind das 1:1-Beziehungen oder 1:n, im zweiten Fall kann es Dir ja passieren, das mehr Datensätze aktualisiert werden, als Du möchtest. name_grp klinkt mir jedenfalls so, als wäre das eine Bezeichnung, die für eine Gruppe von Terminen infrage kommen könnte und eine Änderung ja dann für die gesamte Gruppe durchgeführt würde.

Die ID-Spalten musst Du dann auf die Breite 0 setzen bzw. das DBGrid hat im Attribut Columns ja auch ein Visible, damit kannst Du die dann ausblenden. Nicht änderbare Spalten kannst Du dann auch noch auf ReadOnly setzen.

Eventuell kommt das Problem aber auch daher, dass dem Grid ja nur die "reinen" Spaltennamen bekannt sind und nicht die zugehörigen Tabellen und dann die Datenbank bei der Änderung nicht weiß, zu welcher Tabelle die Spalten gehören, halte das aber eher für unwahrscheinlich.

Alternative: Mache eine View mit Deinem SQL und lese die Daten aus der View ins DBGrid, dann könnte die Datenbank anhand der Viewdefinitionen ermitteln, was in welche Tabelle soll. Aber ohne das jetzt auszuprobieren, kann ich Dir nicht sagen, ob's 'ne Lösungsmöglichkeit ist.

[OT]Bin jetzt gleich weg, eine Antwort von mir kommt dann frühestens Montag.[/OT]


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