Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

DXE: TMyTable: LookupField zeigt erst nach EDIT etwas an

7 views
Skip to first unread message

Kai Wesely

unread,
May 20, 2013, 9:33:40 AM5/20/13
to
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

unread,
May 20, 2013, 1:47:04 PM5/20/13
to
> 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

unread,
May 21, 2013, 4:43:13 AM5/21/13
to
Am 20.05.2013 19:47, schrieb 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.
>
> 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?
>
> 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;
>
> 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

unread,
May 25, 2013, 10:18:14 AM5/25/13
to
Am 20.05.2013 15:33, schrieb 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?
0 new messages