Page 1 of 1

Speichern beim Zeilenwechsel?

PostPosted: Sat Jun 04, 2011 10:06 pm
by jsmw
Mit 1.0 Beta (Vergleich mit 0.8) wird kein Speichern ausgeführt. Beim Wechsel der Zeile geht das Eingetragene verloren. Hat das etwas mit der Einstellung von DataRow, DataSource zu tung?
Code: Select all
      rdbUsers.setDataSource(dataSource);
      rdbUsers.setName("users");
      rdbUsers.open();
      System.out.println(rdbUsers);

Ausgabe:
Code: Select all
com.sibvisions.rad.model.remote.RemoteDataBook ::users::
  isOpen         = true
  RowDefinition :: [ID(storeable)(PK)][FIRSTNAME(storeable)][LASTNAME(storeable)] ... [COUNTRY_ID(storeable)][COUNTRY_NAME(storeable)]

  SelectedRow    = 0
Current DataPage:
  DataPage ::[users] ..., [4]=[3][Test][Tester][null][null][C][C-pass][null][null][null][2][Austria], ... , , CHANGES:

Re: Speichern beim Zeilenwechsel?

PostPosted: Sun Jun 05, 2011 10:30 am
by rjahn
Der DataSource und DataRow writeback isolation level sind grund verschieden. Der DataRow Level veranlasst die Speicherung bei jedem Zeilenwechsel. Der DataSource Level speichert bei Aufruf einer save Methode und daher nicht bei einem Zeilenwechsel. Der Data Source Level ist nicht standardmässig aktiviert und ist auch nicht für alle Anwendungsfälle die bevorzugte Lösung.

Eine unterschiedliche Behandlung in 0.8 und 1.0 beta-1 gibt es nicht. Außer den eingeflossenen Erweiterungen.

Das die eingegebenen Daten verloren gehen, kann viele Gründe haben wie z.B. wenn eine View zum Lesen und eine Tabelle zum Schreiben verwendet wird, kann es sein das nach dem Schreibvorgang die View noch immer die alten Daten anzeigt zu dem gleiche PK.

Anhand des geposteten Source Codes kann keine Hilfestellung gegeben werden, da weder die View, noch DBStorage noch das Datenmodell bekannt ist.

Um dem Problem auf die Spur zu kommen, einfach die Fehlerquellen reduzieren.

Re: Speichern beim Zeilenwechsel?

PostPosted: Sun Jun 05, 2011 5:47 pm
by jsmw
Keine View in Verwendung siehe unten:
Code: Select all
public DBStorage getUsers() throws Exception
   {
      DBStorage dbsUsers = (DBStorage)get("users");
      
      if (dbsUsers == null)
      {
         dbsUsers = new DBStorage();
         dbsUsers.setDBAccess(getDBAccess());
         dbsUsers.setFromClause("users");
         dbsUsers.setWritebackTable("users");
         dbsUsers.open();
         
         put("users", dbsUsers);
      }
      
      return dbsUsers;
   }

Habe zusätzlich versucht einen Datensatz einzufügen. Folgende Exception:

Code: Select all
FEHLER: Syntaxfehler bei »)«  Position: 20
Insert failed! - INSERT INTO users () VALUES () RETURNING id
javax.rad.model.ModelException: Execute Insert failed!
   at com.sibvisions.rad.model.remote.RemoteDataBook.executeInsert(Unknown Source)
   at com.sibvisions.rad.model.mem.MemDataBook.saveSelectedRow(Unknown Source)
   at com.sibvisions.rad.model.mem.MemDataBook.saveAllRows(Unknown Source)
   at com.sibvisions.rad.model.mem.MemDataBook.saveDetails(Unknown Source)
   at com.sibvisions.rad.model.mem.MemDataBook.saveDataRowLevelDetails(Unknown Source)
   at com.sibvisions.rad.model.mem.MemDataBook.setSelectedRow(Unknown Source)
   at com.sibvisions.rad.ui.swing.ext.JVxTable.mousePressed(Unknown Source)
   at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:263)
   at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:262)
   at java.awt.Component.processMouseEvent(Component.java:6264)
   at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
   at java.awt.Component.processEvent(Component.java:6032)
   at java.awt.Container.processEvent(Container.java:2041)
   at java.awt.Component.dispatchEventImpl(Component.java:4630)
   at java.awt.Container.dispatchEventImpl(Container.java:2099)
   at java.awt.Component.dispatchEvent(Component.java:4460)
   at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
   at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4235)
   at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
   at java.awt.Container.dispatchEventImpl(Container.java:2085)
   at java.awt.Window.dispatchEventImpl(Window.java:2478)
   at java.awt.Component.dispatchEvent(Component.java:4460)
   at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
   at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
   at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
   at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
   at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
   at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
   at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Vielleicht noch interessant:
Code: Select all
Caused by: javax.rad.persist.DataSourceException: Insert failed! - INSERT INTO users () VALUES () RETURNING id
                                       at com.sibvisions.rad.persist.jdbc.PostgreSQLDBAccess.insertPostgres(Unknown Source)
                                       at com.sibvisions.rad.persist.jdbc.PostgreSQLDBAccess.insertDatabaseSpecific(Unknown Source)
                                       at com.sibvisions.rad.persist.jdbc.DBAccess.insert(Unknown Source)
                                       at com.sibvisions.rad.persist.jdbc.DBStorage.executeInsert(Unknown Source)
                                       at com.sibvisions.rad.persist.AbstractStorage.insert(Unknown Source)
                                       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                                       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
                                       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
                                       at java.lang.reflect.Method.invoke(Method.java:597)
                                       at com.sibvisions.util.Reflective.call(Unknown Source)
                                       at com.sibvisions.util.Reflective.call(Unknown Source)
                                       at com.sibvisions.util.Reflective.call(Unknown Source)
                                       at com.sibvisions.rad.server.DefaultObjectProvider.invoke(Unknown Source)
                                       at apps.firstapp.frames.DBEdit.<users>.insert(Unknown Source)
                                       at com.sibvisions.rad.server.AbstractSession.executeWithSessionContext(Unknown Source)
                                       at com.sibvisions.rad.server.AbstractSession.executeIntern(Unknown Source)
                                       at com.sibvisions.rad.server.AbstractSession.execute(Unknown Source)
                                       at com.sibvisions.rad.server.Server.executeIntern(Unknown Source)
                                       at com.sibvisions.rad.server.Server.execute(Unknown Source)
                                       at com.sibvisions.rad.server.DirectServerConnection.call(Unknown Source)
                                       at javax.rad.remote.AbstractConnection.call(Unknown Source)
                                       ... 29 more
                                    Caused by: org.postgresql.util.PSQLException: FEHLER: Syntaxfehler bei »)«
                                      Position: 20
                                       at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
                                       at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
                                       at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
                                       at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
                                       at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
                                       at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)
                                       ... 50 more

Wie gesagt bei 0.8 hat es funktioniert.

Re: Speichern beim Zeilenwechsel?

PostPosted: Sun Jun 05, 2011 7:39 pm
by rjahn
Jetzt wäre noch die Tabelle interessant - zumindest das create Statement. Die DB ist PostgreSql?

Bitte probieren Sie die aktuelle Release JVx 0.9.

Re: Speichern beim Zeilenwechsel?

PostPosted: Sun Jun 05, 2011 8:12 pm
by jsmw
Bei V. 0.9 gleiches Verhalten:
- Änderungen verworfen
- Exception bei Neuanalge

DB ist PostgreSQL - Die gewünschten SQL-Scripts:
Code: Select all
CREATE TABLE users (
   id SERIAL NOT NULL,
   firstname VARCHAR(50),
   lastname VARCHAR(50),
   company VARCHAR(100),
   email VARCHAR(50),
   loginname VARCHAR (30),
   password VARCHAR(30),
   street VARCHAR(50),
   postalcode VARCHAR(5),
   city VARCHAR(30),
   country_id INTEGER,
   PRIMARY KEY (id),
   FOREIGN KEY(country_id) REFERENCES countries (id)
);

CREATE TABLE countries (
   id SERIAL NOT NULL,
   country VARCHAR(50),
   currency_id INTEGER,
   PRIMARY KEY (id),
   FOREIGN KEY(currency_id) REFERENCES currencies (id)
);

Re: Speichern beim Zeilenwechsel?

PostPosted: Sun Jun 05, 2011 9:01 pm
by rjahn
Dabei handelt es sich leider um einen Bug.
Weitere Details siehe Support System.

Re: Speichern beim Zeilenwechsel?

PostPosted: Mon Jun 06, 2011 8:32 pm
by jsmw
Wenn etwas zu testen wäre, Info posten.

Re: Speichern beim Zeilenwechsel?

PostPosted: Tue Jun 07, 2011 10:10 am
by Support@SIB
Solche Angebote werden immer gerne angenommen.
Das Problem wurde bereits im Source Code behoben, wird aber erst mit der nächsten BETA Version als Download verfügbar sein.

Sollten Sie die Änderungen früher testen wollen, dann können Sie jederzeit mit dem aktuellen JVx Source testen. Hierfür einfach diesen Anweisungen folgen und den Source Code aus dem SVN Repository abrufen.