This website uses cookies for visitor traffic analysis. By using the website, you agree with storing the cookies on your computer.More information

Problem mit n:m Beziehung

Allgemeine Fragen zur Entwicklung von und mit JVx.

Problem mit n:m Beziehung

Postby alladinbp » Mon Nov 14, 2011 7:20 pm

Hallo,

ich versuche mich gerade an Master/Detail Beziehungen. Bei 1:n hatte ich bis jetzt kein Problem und das hat auch sehr nett funktioniert mit JVx. Jetzt geht es aber um eine n:m Relation wobei ein und die selbe Tabelle untereinander verknüpft wird.
Die Tabelle customer wird über eine Zwischentabelle mit sich selbst verknüpft. customer <---> customer.

Im Code habe ich dann ein MemDataBook, welches genau einen Customer beinhält. Das soll jetzt über customer2beneficiary mit einer Liste an Customern verbunden werden. Der folgende Code funktioniert prinzipiell, allerdings wird mir immer nur ein richtig verknüpfter Datensatz angezeigt. Liegt das daran, dass das MemDataBook nur einen Customer hat? Aber dieser Customer kann mehrere "Begünstigte" andere Customer haben, somit müssten mir doch diese alle angezeigt werden. Ich wüsste auch nicht, dass da ein Limit dabei ist?

Code: Select all
IChangeableDataRow tmpRow = mdbCustomerData.getDataRow(0);
      
       mdbCustomerData = new MemDataBook();
       mdbCustomerData.setRowDefinition(tmpRow.getRowDefinition());
       mdbCustomerData.setName("__test_");
      
       //mdbCustomerData.setMasterReference(new ReferenceDefinition(new String[] { "ID" }, rdbCustomerToBeneficiary, new String[] { "CUSTOMER_ID" }));
      
       mdbCustomerData.open();
      
       mdbCustomerData.insert(false);
       mdbCustomerData.setValues(null, tmpRow.getValues(null));

            ////////
      
      // Master DataBook muss zuerst geöffnet sein
      
      rdbCustomerToBeneficiary.setDataSource(dataSource);
      rdbCustomerToBeneficiary.setName("customerToBeneficiary");

      rdbCustomerToBeneficiary.setMasterReference(new ReferenceDefinition(new String[] { "CUSTOMER_ID" }, mdbCustomerData, new String[] { "ID" }));
      
      rdbCustomerToBeneficiary.open();

      /////////////////

      rdbCustomerData.setDataSource(dataSource);
      rdbCustomerData.setName("customerData");
      
      rdbCustomerData.setMasterReference(new ReferenceDefinition(new String[] { "ID" }, rdbCustomerToBeneficiary, new String[] { "BENEFICIARY_ID" }));
      
      rdbCustomerData.open();
alladinbp
 
Posts: 39
Joined: Tue Oct 11, 2011 2:27 pm

Re: Problem mit n:m Beziehung

Postby Support@SIB » Mon Nov 14, 2011 8:51 pm

Ihre Tabellen Beziehungen liefern immer alle Details zum selektierten Master. Sie können das im Prinzip beliebig tief schachteln. Ein Beispiel für eine n:m Beziehung ist in unserem showcase zu finden. Dort gibt es die Tabellen:

CONTACTS (ID, ...)
EDUCATIONS (ID, ...)
...und die Beziehung zwischen den beiden...
CONT_EDUC (ID, CONT_ID, EDUC_ID)

In der Contacts Maske (mit oder ohne Auto Link Cell Editoren) können Sie das Ergebnis sehen, ggf. Source Code ansehen.
User avatar
Support@SIB
 
Posts: 349
Joined: Mon Sep 28, 2009 1:56 pm

Re: Problem mit n:m Beziehung

Postby alladinbp » Tue Nov 15, 2011 11:27 am

Ich hatte mir den Code in der Showcase Applikation schon vorher angeschaut. Sie bauen damit dann einen LinkedCellEditor, ich brauche hier aber ein RemoteDataBook für eine Tabelle.
Ich habe die Kunden Tabelle mit id als Primary Key, und die Zwischentabelle mit der Kunden-Id und der AnderenKunden-Id. Die MasterReferences setze ich wie im Code oben.
Es funktioniert ja prinzipiell. Wenn eine Kunden-Id nicht in der Zwischentabelle eingetragen ist wird in der UITable nichts angezeigt, wenn sie eingetragen ist schon. Allerdings wird immer nur 1 Datensatz angezeigt, egal wie oft die Kunden-Id in der Zwischentabelle eingetragen ist.

JVx setzt folgendes SQL-Statement ab:
Code: Select all
15.11.2011 10:21:37 [ FINE        ] com.sibvisions.rad.persist.jdbc.DBAccess fetch (Line: -1)
                                    select(SELECT m.customer_id, l1.name CUSTOMER_NAME, m.beneficiary_id, l2.name BENEFICIARY_NAME FROM customer2beneficiary m INNER JOIN public.customer l1 ON m.customer_id = l1.id
                                    INNER JOIN public.customer l2 ON m.beneficiary_id = l2.id
                                     WHERE m.customer_id = ?, [1], from Row 0, MinimumCount 11) in 2ms


Wenn ich dieses Statement händisch in der Datenbank ausführe, bekomme ich für eine bestimmte Id zum Beispiel:

32;"Frank Metzger";10;"Leah Kuefer"
32;"Frank Metzger";49;"Aldo Lendero"
32;"Frank Metzger";44;"Eric Kuester"

Also "sieht" JVx, dass der Datensatz 32 mehrere andere Kunden hat. Nur wird mir in der UITable trotzdem nur der erste von den 3 angezeigt. RowCount vom DataBook ist auch nur 1.

Ich frage also nocheinmal woran das liegen kann. Stimmen meine MasterReferences nicht? Was ich mir nur schwer vorstellen kann, da ich die richtigen Daten bekomme, nur eben zu wenige. Oder liegt es daran, dass ich ein MemDataBook mit einer Zeile (hat zb Datensatz 32 siehe oben) mit 2 RemoteDataBooks verknüpfe und ich deswegen komischerweise nur 1 Zeile in der UITable sehe?
alladinbp
 
Posts: 39
Joined: Tue Oct 11, 2011 2:27 pm

Re: Problem mit n:m Beziehung

Postby Support@SIB » Tue Nov 15, 2011 4:42 pm

Ist vielleicht anhand eines konkreten Beispiels einfacher:

Code: Select all
memCustomer
 - [ID = 32] - selectedRow

rdbCustomerToBeneficiary (Detail zu memCustomer)
 - Customizer_ID = 32, beneficiary_id = 10 - selectedRow
 - Customizer_ID = 32, beneficiary_id = 49
 - Customizer_ID = 32, beneficiary_id = 44

rdbCustomer (Detail zu rdbCustomerToBeneficiary )
 - ID = 10 - selectedRow


Wenn Sie rdbCustomizer anzeigen, sehen Sie natürlich nur 1 Zeile aufgrund der Master/Detail Referenz. Die rdbCustomerToBeneficiary Tabelle könnte für die Anzeige verwendet werden um alle Zeilen darzustellen

2 Fragen:
  • Wozu/Warum verwenden Sie das MemDataBook - hier könnte auch ein RemoteDataBook verwendet werden.
  • Warum wurde eine Master/Detail Beziehung zwischen rdbCustomerToBeneficiary und rdbCustomer hergestellt.

Eine Master/Detail Beziehung stellt immer alle Detail Sätze zu einem selektierten Master dar!
User avatar
Support@SIB
 
Posts: 349
Joined: Mon Sep 28, 2009 1:56 pm

Re: Problem mit n:m Beziehung

Postby Support@SIB » Tue Nov 15, 2011 4:52 pm

Sie könnten auch anstatt einer Master/Detail Beziehung zwischen memCustomer und rdbCustomerToBeneficiary einen Filter auf rdbCustomerToBeneficiary, mit der Master-ID, setzen, wenn Sie das MemDataBook nur für die Master/Detail Beziehung benötigen?

Und wenn Sie eine DataRow verwenden, könnten Sie auch Editoren mit der Row verknüpfen?
User avatar
Support@SIB
 
Posts: 349
Joined: Mon Sep 28, 2009 1:56 pm


Return to Development (DE)