Werte von MemDataBook in RemoteDataBook übernehmen
7 posts
• Page 1 of 1
Werte von MemDataBook in RemoteDataBook übernehmen
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.
Beim ersten debug sehe ich den geänderten Wert in der Ausgabe, bei den nächsten beiden nicht mehr.
Was mache ich falsch?
- 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
Um solche Probleme zu finden, bitte das Logging aktivieren. Vor allem die Packages:
sind interessant. Dann ist zu sehen ob kommuniziert wird.
Zuerst wäre interessant ob die korrekte Zeile gefunden wurde:
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.:
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
//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);
}
-
Support@SIB - Posts: 353
- Joined: Mon Sep 28, 2009 1:56 pm
Re: Werte von MemDataBook in RemoteDataBook übernehmen
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
System.out.println(StringUtil.toString(rdbCustomerData.getRowDefinition().getPrimaryKeyColumnNames())); gibt ID aus, das stimmt auch.
debug(rdbCustomerData.getDataRow(rdbCustomerData.getSelectedRow())); stimmt auch, da ich die erste Zeile hergenommen habe ist diese auch vorselektiert.
Wird nicht wissentlich von mir ausgelöst.
debug(rdbCustomerData.getDataRow(rdbCustomerData.getSelectedRow())); stimmt auch, jetzt wurde die erste Zeile nochmal selektiert, aber noch nicht gespeichert.
debug(rdbCustomerData.getDataRow(rdbCustomerData.getSelectedRow())); stimmt dann nicht mehr, hier sollte ja schon gespeichert sein.
Weitere Ausgaben gibt es nicht.
Führe ich zur Sicherheit aus. Am Server ist es so definiert:
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
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.
Die Ausgabe:
Wenn die Zeile:
auskommentiert wird, dann erhalten Sie die Ausgabe:
Bitte prüfen Sie den Testfall in Ihrer Applikation!
Haben Sie auf Ihrem RemoteDataBook ev. event listener registriert?
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?
-
Development@SIB - Posts: 325
- Joined: Mon Sep 28, 2009 1:54 pm
Re: Werte von MemDataBook in RemoteDataBook übernehmen
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
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.
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.
-
Support@SIB - Posts: 353
- Joined: Mon Sep 28, 2009 1:56 pm
Re: Werte von MemDataBook in RemoteDataBook übernehmen
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
7 posts
• Page 1 of 1