Discussion:
DXE: TMyTable: LookupField zeigt erst nach EDIT etwas an
(zu alt für eine Antwort)
Kai Wesely
2013-05-20 13:33:40 UTC
Permalink
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
Stefan Graf
2013-05-20 17:47:04 UTC
Permalink
Post by Kai Wesely
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
Kai Wesely
2013-05-21 08:43:13 UTC
Permalink
Post by Stefan Graf
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.
Naja, wie gesagt, bei den anderen zahlreichen "Beziehungen" der Tabellen
funktioniert es ja. Abgesehen davon scheint es mir etwas umständlich,
das Ganze "zu Fuß" zu erledigen. Zumal die Verknüpfung ja auch
Automatismen enthält, die z.B. die Master-IDs beim Hinzufügen von
Detail-Datensätzen automatisch setzen. Das erspart eine ganze Reihe von
stupiden Event-Handlern und ist, meiner Meinung nach, damit auch
übersichtlicher.
Post by Stefan Graf
Auch das von direkten Änderungen in den Grids kann ich nur abraten.
Spätestens bei Multiuser-Betrieb gibt das nur noch Chaos.
Welche Alternative schlägst Du vor?
Post by Stefan Graf
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 habe durchaus auch schon das eine oder andere erlebt. In diesem Fall
hat es aber doch den Anschein, das Grid sei nicht verantwortlich (o;
Post by Stefan Graf
Ich selber nutze ein erweitertes SMDBGrid und würde gerne irgend wann
mal auf das DBGrid von DevExpress umstellen.
Gegen DevExpress hätte ich auch nichts, jedoch muß ich da erstmal drauf
sparen (o;
SMDBGrid werde ich mir mal anschauen. Auf den ersten Blick sieht es aber
etwas "alt" aus.
Kai Wesely
2013-05-25 14:18:14 UTC
Permalink
Post by Kai Wesely
Wechselwirkung durch eine der Beziehungen? Möglicherweise sehe ich ja
den Wald vor lauter Bäumen nicht.. Bin für jede Hilfe dankbar.
Hat jemand von Euch evtl. Master/Detail-Verbindungen mit mehreren
Verknüpften Feldern wo es NICHT zu dem genannten Problem führt?
Lesen Sie weiter auf narkive:
Loading...