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

Werte von MemDataBook in RemoteDataBook übernehmen

Allgemeine Fragen zur Entwicklung von und mit JVx.

Werte von MemDataBook in RemoteDataBook übernehmen

Postby alladinbp » Thu Nov 10, 2011 11:45 am

Ich schaffe es nicht die Werte aus der DataRow bzw diesem MemDataBook in das "echte" RemoteDataBook zurückzuschreiben. Hängt es vielleicht damit zusammen, dass das RemoteDataBook eigentlich readonly ist und ich es nur kurz beschreibbar mache? Die Writeback-Table ist gesetzt. Im Moment will ich nur den Namen übernehmen. "toSave" ist eine DataRow.

Code: Select all
debug(toSave);

// Zeile selektieren die geändert wurde:
         rdbCustomerData.setSelectedRow(rdbCustomerData.searchNext(new Equals("ID", toSave.getValue("ID"))));
         
         debug(rdbCustomerData.getDataRow(rdbCustomerData.getSelectedRow()));
         
         rdbCustomerData.setReadOnly(false);
         
         // Alle Werte aus der DataRow übernehmen:
         rdbCustomerData.setValue("NAME", toSave.getValue("NAME"));
         
         debug(rdbCustomerData.getDataRow(rdbCustomerData.getSelectedRow()));
         
         //rdbCustomerData.setUpdateEnabled(true);
         
         rdbCustomerData.saveSelectedRow();
         //rdbCustomerData.saveAllRows();
         
         debug(rdbCustomerData.getDataRow(rdbCustomerData.getSelectedRow()));
         
         rdbCustomerData.setReadOnly(true);


Beim ersten debug sehe ich den geänderten Wert in der Ausgabe, bei den nächsten beiden nicht mehr.
Was mache ich falsch?
alladinbp
 
Posts: 39
Joined: Tue Oct 11, 2011 2:27 pm

Re: Werte von MemDataBook in RemoteDataBook übernehmen

Postby Support@SIB » Thu Nov 10, 2011 12:33 pm

Um solche Probleme zu finden, bitte das Logging aktivieren. Vor allem die Packages:

Code: Select all
//Server Log
com.sibvisions.rad.persist.level = ALL
//Client Log
com.sibvisions.rad.model.level = ALL

sind interessant. Dann ist zu sehen ob kommuniziert wird.

Zuerst wäre interessant ob die korrekte Zeile gefunden wurde:

Code: Select all
rdbCustomerData.searchNext(new Equals("ID", toSave.getValue("ID")))

sollte >= 0 liefern.

Die erste debug Zeile liefert den "neuen" Wert weil Sie das MemDataBook ausgeben - ok.
Das zweite debug kann nur den "alten" Wert ausgeben, sofern die Row korrekt gefunden wurde - weil noch kein setValue passiert ist.
Das dritte debug sollte den "neuen" Wert anzeigen, sofern die Tabelle nicht readonly und update enabled ist.
Das RemoteDataBook muss auch writeback enabled sein!
Prüfen Sie bitte welche PKs auf ihrem RemoteDataBook definiert sind, z.B.:

Code: Select all
System.out.println(StringUtil.toString(rdbCustomerData.getRowDefinition().getPrimaryKeyColumnNames())));


Wir kennen die Einstellungen des RemoteDataBooks leider nicht um genauere Aussagen zu treffen.

Einen Verbesserungsvorschlag für Ihren Code wäre noch:

Code: Select all
setReadOnly(false);
try
{
    ...
}
finally
{
    setReadOnly(true);
}
User avatar
Support@SIB
 
Posts: 353
Joined: Mon Sep 28, 2009 1:56 pm

Re: Werte von MemDataBook in RemoteDataBook übernehmen

Postby alladinbp » Thu Nov 10, 2011 12:58 pm

Logging ist aktiviert, zumindest für das .persist Package. Es kamen keine Meldungen hinzu wie ich das .model Package hinzugenommen habe.

searchNext findet die korrekte Zeile.

Hier die Ausgaben.

debug(toSave); stimmt
Code: Select all
10.11.2011 11:44:12 [ FINE        ] at.alladin.vms.client.customer.CustomerManagementPanel saveTest (Line: 244)
                                    ChangeableDataRow: {ID=1, NAME=Karolin Ehrlichmannnnnnnn}, UID=0


System.out.println(StringUtil.toString(rdbCustomerData.getRowDefinition().getPrimaryKeyColumnNames())); gibt ID aus, das stimmt auch.
Code: Select all
[ID]


debug(rdbCustomerData.getDataRow(rdbCustomerData.getSelectedRow())); stimmt auch, da ich die erste Zeile hergenommen habe ist diese auch vorselektiert.
Code: Select all
10.11.2011 11:44:12 [ FINE        ] at.alladin.vms.client.customer.CustomerManagementPanel saveTest (Line: 255)
                                    ChangeableDataRow: {ID=1, NAME=Karolin Ehrlichmann}, UID=null


Wird nicht wissentlich von mir ausgelöst.
Code: Select all
10.11.2011 11:44:12 [ FINE        ] select(SELECT * FROM v_customer_data, null, from Row 0, MinimumCount 11) in 3ms                      com.sibvisions.rad.persist.jdbc.DBAccess fetch (Line: -1)


debug(rdbCustomerData.getDataRow(rdbCustomerData.getSelectedRow())); stimmt auch, jetzt wurde die erste Zeile nochmal selektiert, aber noch nicht gespeichert.
Code: Select all
10.11.2011 11:44:12 [ FINE        ] at.alladin.vms.client.customer.CustomerManagementPanel saveTest (Line: 262)
                                    ChangeableDataRow: {ID=1, NAME=Karolin Ehrlichmann}, UID=null


debug(rdbCustomerData.getDataRow(rdbCustomerData.getSelectedRow())); stimmt dann nicht mehr, hier sollte ja schon gespeichert sein.
Code: Select all
10.11.2011 11:44:12 [ FINE        ] at.alladin.vms.client.customer.CustomerManagementPanel saveTest (Line: 269)
                                    ChangeableDataRow: {ID=1, NAME=Karolin Ehrlichmann}, UID=null


Weitere Ausgaben gibt es nicht.

Code: Select all
rdbCustomerData.setWritebackEnabled(true);
rdbCustomerData.setUpdateEnabled(true);


Führe ich zur Sicherheit aus. Am Server ist es so definiert:

Code: Select all
dbsCustomerData = new DBStorage();
         
dbsCustomerData.setDBAccess(getDBAccess());
dbsCustomerData.setFromClause("v_customer_data");
dbsCustomerData.setWritebackTable("customer");
         
// Keine Automatischen LinkReferences
dbsCustomerData.setAutoLinkReference(false);
         
dbsCustomerData.open();
alladinbp
 
Posts: 39
Joined: Tue Oct 11, 2011 2:27 pm

Re: Werte von MemDataBook in RemoteDataBook übernehmen

Postby Development@SIB » Thu Nov 10, 2011 1:56 pm

Wir haben versucht Ihr Problem in einem Testfall nachzuvollziehen, jedoch ohne Erfolg. Das Problem tritt nicht auf.

Das Server Objekt entspricht ihrem Objekt und wurde hier weggelassen.

Code: Select all
      RemoteDataBook rdbTest = new RemoteDataBook();
      rdbTest.setName("dbs");
      rdbTest.setDataSource(rdsTest);
      rdbTest.open();
      
      rdbTest.insert(false);
      rdbTest.setValue("NAME", "Karl Klamm");

      rdbTest.insert(false);
      rdbTest.setValue("NAME", "Max Mustermann");
      rdbTest.saveAllRows();

      rdbTest.setReadOnly(true);
      //not needed
      rdbTest.setUpdateEnabled(false);
      
      IChangeableDataRow row = rdbTest.getDataRow(0);
      
      row.setValue("NAME", "JVx changed");

      System.out.println("CURRENT SELECTED = " + rdbTest.getSelectedRow());
      
      rdbTest.setSelectedRow(0);
      
      rdbTest.setReadOnly(false);
      //not needed
      rdbTest.setUpdateEnabled(true);
      
      rdbTest.setValue("NAME", row.getValue("NAME"));
      
      System.out.println(rdbTest.getDataRow(0));

Die Ausgabe:

Code: Select all
CURRENT SELECTED = 1
ChangeableDataRow: {ID=0, NAME=JVx changed}, UID=null


Wenn die Zeile:

Code: Select all
rdbTest.setValue("NAME", row.getValue("NAME"));

auskommentiert wird, dann erhalten Sie die Ausgabe:

Code: Select all
CURRENT SELECTED = 1
ChangeableDataRow: {ID=0, NAME=Karl Klamm}, UID=null


Bitte prüfen Sie den Testfall in Ihrer Applikation!

Haben Sie auf Ihrem RemoteDataBook ev. event listener registriert?
User avatar
Development@SIB
 
Posts: 325
Joined: Mon Sep 28, 2009 1:54 pm

Re: Werte von MemDataBook in RemoteDataBook übernehmen

Postby alladinbp » Fri Nov 11, 2011 12:40 pm

Development@SIB wrote:Haben Sie auf Ihrem RemoteDataBook ev. event listener registriert?


Das war der richtige Tipp. Ich hatte zu testzwecken, bzw wenn sich Werte ändern dass dann etwas aktualisiert wird einen valueChanges Listener registriert.

Code: Select all
rdbCustomerData.eventValuesChanged().addListener(this, "rdbCustomerDataValuesChanged");


Ah ok in dem habe ich rdbCustomerData.reload(); aufgerufen. Das ist scheinbar zu früh. Wobei, grade fällt mir auf, dass das unnötig ist, weils ja automatisch verändert wird und somit schon die neuen Werte hat, oder?

Gibt es eine Möglichkeit, dass das DataBook aktualisiert wird, wenn sich direkt in der Datenbank, zum Beispiel durch ein anderes Programm, Werte ändern? Oder müsste man das alle paar Sekunden neuladen?
alladinbp
 
Posts: 39
Joined: Tue Oct 11, 2011 2:27 pm

Re: Werte von MemDataBook in RemoteDataBook übernehmen

Postby Support@SIB » Fri Nov 11, 2011 1:31 pm

Wenn Sie Werte ändern, aktualisiert JVx die Zeile automatisch. Ein Reload ist nicht nötig! Das funktioniert sowohl bei insert als auch bei update. Sie könnten ja in der DB einen Trigger oder am Server einen Trigger Event verwenden um Werte zu ändern/ergänzen.

Um ein Gefühl für den Einsatz der DataBook Events zu bekommen, können Sie hier nachsehen.


JVx hat keinen Mechanismus implementiert um auf DB Änderungen automatisch zu reagieren. Wenn Sie ständig reloaden geht das zulasten des Netzwerks, wäre aber eine Option. Das Thema ist auch etwas heikel, wenn es z.B um große Datenmengen geht.

Wenn Sie allerdings eine Lösung suchen um Änderungen durch andere Nutzer die ebenfalls Ihre Applikation verwenden, zu bekommen könnte JVx schon helfen. JVx hat einen CallBack Mechanismus integriert mit dem Sie Änderungen am Server mit Callback Actions abrufen könnten (asynchron). Sie müssen natürlich am Server die Storage Events verwenden und statisch die Änderungen cachen, aber das ist nicht mit viel Aufwand verbunden.
Am Client können dann die Änderungen in das RemoteDataBook übernommen werden, wenn z.B writeback deaktiviert wird vor der Übernahme der aktuellen Werte.
User avatar
Support@SIB
 
Posts: 353
Joined: Mon Sep 28, 2009 1:56 pm

Re: Werte von MemDataBook in RemoteDataBook übernehmen

Postby alladinbp » Fri Nov 11, 2011 2:07 pm

Support@SIB wrote:Wenn Sie allerdings eine Lösung suchen um Änderungen durch andere Nutzer die ebenfalls Ihre Applikation verwenden, zu bekommen könnte JVx schon helfen. JVx hat einen CallBack Mechanismus integriert mit dem Sie Änderungen am Server mit Callback Actions abrufen könnten (asynchron). Sie müssen natürlich am Server die Storage Events verwenden und statisch die Änderungen cachen, aber das ist nicht mit viel Aufwand verbunden.
Am Client können dann die Änderungen in das RemoteDataBook übernommen werden, wenn z.B writeback deaktiviert wird vor der Übernahme der aktuellen Werte.


Ja genau das brauche ich.
Danke!
alladinbp
 
Posts: 39
Joined: Tue Oct 11, 2011 2:27 pm


Return to Development (DE)