DXE: TMyTable: LookupField zeigt erst nach EDIT etwas an

20/05/2013 - 15:33 von Kai Wesely | Report spam
Hallo zusammen,

ich habe in Delphi XE Master-Detail-Verbindungen mehrerer Tabellen.
Soweit nichts Ungewöhnliches, jedoch enthàlt eine der Beziehungen eine
Verknüpfung von ZWEI Master- und Detail-Fields. Dies scheint zum Problem
beim Lookup zu führen, die ich nicht nachvollziehen kann.

Hintergrund ist die Entwicklung einer eigenen Warenwirtschaft.
Ein Produkt kann dabei in verschiedenen Produktkatalogen angezeigt
werden kann. Jeder Katalog hat dabei unterschiedliche Produktkategorien.
Der Nutzer wàhlt zunàchst das Produkt aus, dann den Katalog und sieht
daraufhin die dieser Konstellation zugeordneten Kategorien in einem Grid
und kann diese durch einen DBNavigator ergànzen.


Konkret:

MySQL-Tabellen:
"produkte": relevante Felder "ID" und "Bezeichnung"
"kataloge": relevante Felder "ID" und "Bezeichnung"
"kategorien": relevante Felder "ID", "KatalogID", sowie "Bezeichnung"
"produkt_kataloge": relevante Felder "ProduktID" und "KatalogID"
"produkt_kategorien": relevante Felder "ProduktID", "KatalogID" und
"KategorieID"

TMyTable-Komponenten (zugeordnete DataSources haben vorne ein DS statt
dem TB im Namen):
TBProdukte (TableName: "produkte")
TBKataloge (TableName: "kataloge")
TBKategorien (TableName: "kategorien")

TBKatalogKategorien (TableName: "kategorien"; MasterSource:
DSKategorien; MasterFields: "KatalogID"; DetailFields: "KatalogID")

TBProduktKataloge (TableName: "produkt_kataloge"; MasterSource:
DSProdukte; MasterFields: "ID"; DetailFields: "ProduktID")

TBProduktKategorien (TableName: "produkt_kategorien"; MasterSource:
DSProduktKataloge; MasterFields: "ProduktID;KatalogID"; DetailFields:
"ProduktID;KatalogID")

Desweiteren hat TBProduktkategorien ein LookUpField "Kategorie"
(LookupDataSet: TBKatalogKategorien; KeyFields: "KategorieID";
LookupKeyFields: "ID"; LookupResultField: "Bezeichnung")

Nun habe ich ein Grid (verwende das TBDAdvGrid von TMS, allerdings
scheidet das als Problemquelle aus), DataSource ist DSProduktKategorien,
Spalte 1 ist FieldName "Kategorie" (also das Lookup-Feld), Spalte 2 ist
FieldName "KategorieID".

In meinem Beispiel enthàlt das Grid nun 3 Zeilen, die Spalte "Kategorie"
ist leer, zeigt also keinen Text, die Spalte "KategorieID" zeigt die
korrekte ID der jeweiligen Kategorie, deren Bezeichnung eigentlich in
der Spalte "Kategorie" angezeigt werden müßte.
Klicke ich nun in eine der drei Zellen der Spalte "Kategorei", erscheint
die ComboBox, in welcher ich aus den Werten der TBKatalogKategorien
auswàhlen kann. Wenn ich nun in eine andere Zelle klicke, verschwindet
die ComboBox und in JEDER Zeile (also nicht nur in der zuvor
"bearbeiteten") steht in der Spalte "Kategorie" nun der korrekte Wert,
nàmlich die Bezeichnung der Kategorie mit der nebenstehenden ID.
Scrolle ich aber durch die Produkte, ist die Spalte "Kategorie" wieder
leer. Wiederhole ich die Prozedur mit der ComboBox, werden wieder alle
Werte korrekt angezeigt, aber eben nich ohne Nachhilfe..

Ich habe testweise über einen Button mal ein
ShowMessage(TBProduktKategorien.FieldByName('Kategorie').AsString + ': '
+ TBProduktKategorien.FieldByName('Kategorie').AsString);
gemacht. Das Feld "Kategorie" liefert auch hier einen leeren Wert
zurück. Es liegt also nicht am Grid. Werden die Werte nach dem
"Bearbeiten" im Grid angezeigt, liefert der obige Aufruf ebenfalls die
richtigen Werte.

Zusàtzlich habe ich mir die Anzahl der in TBKatalogKategorien
enthaltenen Datensàtze ausgeben lassen (also der Tabelle, die für das
Lookup herangezogen wird). Es sind sowohl vor dem "Edit" 86 Datensàtze,
als auch hinterher, wenn die Werte korrekt angezeigt werden. Es kann
also auch nicht daran liegen, dass nach einem Scroll die Master-Tabelle
die für da Lookup benötigten Datensàtze nicht enthàlt und daher "leer"
liefert.

Gibt es dafür einen Grund?? Alle Beziehungen sollten korrekt sein,
àhnliche Konstellationen haben nie zu einem solchen Problem geführt. Der
einzige Unterschied zum sonstigen Anwendungsfall ist, dass ich in der
Master-Detail-Beziehung von TBProduktKategorien ZWEI Felderpaare habe.
Ansonsten hatte ich bislang immer nur ein Paar. Daher vermute ich, dass
es eben an dieser doppel-Verknüpfung liegen könnte.

Ist das möglichweise ein generell so vorgesehenes Verhalten? Die
Möglichkeit, mehrere Felder zu verknüpfen, legt doch nahe, dass das auch
"erlaubt" ist. Oder habe ich etwas übersehen?? Möglicherweise ja eine
Wechselwirkung durch eine der Beziehungen? Möglicherweise sehe ich ja
den Wald vor lauter Bàumen nicht.. Bin für jede Hilfe dankbar.

Viele Grüße

Kai
 

Lesen sie die antworten

#1 Stefan Graf
20/05/2013 - 19:47 | Warnen spam
ich habe in Delphi XE Master-Detail-Verbindungen mehrerer Tabellen.
Soweit nichts Ungewöhnliches, jedoch enthàlt eine der Beziehungen eine
Verknüpfung von ZWEI Master- und Detail-Fields. Dies scheint zum Problem
beim Lookup zu führen, die ich nicht nachvollziehen kann.

Hintergrund ist die Entwicklung einer eigenen Warenwirtschaft.
Ein Produkt kann dabei in verschiedenen Produktkatalogen angezeigt
werden kann. Jeder Katalog hat dabei unterschiedliche Produktkategorien.
Der Nutzer wàhlt zunàchst das Produkt aus, dann den Katalog und sieht
daraufhin die dieser Konstellation zugeordneten Kategorien in einem Grid
und kann diese durch einen DBNavigator ergànzen.




Ohne jetzt da Problem bis in die Tiefe analysiert zu haben, rate ich Dir
dringend davon ob, diese Möglichkeit der DataSource so zu nutzen. Mach
die Master-Detail Anzeigen über den Event OnDataChange zu Fuss, dann
kannst Du spàter viel besser eingreifen und gehst allem Ärger aus dem Weg.

Auch das von direkten Änderungen in den Grids kann ich nur abraten.
Spàtestens bei Multiuser-Betrieb gibt das nur noch Chaos.

Deine Vermutung "TDAdvDBGrid als Problemquelle scheidet aus" ist auch
sehr mutig ;-) In den vergangen 8 Jahren mit TMS wurde ich schon des
öfteren eines Besseren belehrt ;-)

Ich selber nutze ein erweitertes SMDBGrid und würde gerne irgend wann
mal auf das DBGrid von DevExpress umstellen.

Stefan Graf

Ähnliche fragen