Mit der
doPreventEditDetails Methode erreicht man genau dieses Verhalten. Erst wenn der Master-Satz gültig gespeichert werden konnte wird ein eventAfterInserted gefeuert.
Falls gemeint ist, dass man dieses Verhalten auch bei einem Update haben will, funktioniert dies selbstverständlich auch mit
eventAfterUpdating (die Master-Zeile wurde geändert) und
eventAfterUpdated (die Master-Zeile wurde gültig gespeichert).
Die „
ing“ Events teilen einem mit, dass eine Zeile geändert wurde, und gespeichert werden muss.
Die „
ed“ Events teilen einem mit, dass die Zeile gültig gespeichert wurde.
Gegen unbeabsichtigtes Ändern kann man auch jederzeit z.B. einen Popup Dialog einblenden, der einem die Änderungen anzeigt, oder man stellt die geänderten Zeilen mit Hilfe des CellFormater Listeners unterschiedlich dar.
Als Source Beispiel für einen Lösch-Nachfrage Dialog:
- Code: Select all
ProjXUtil.addAskDeleteDialog(databook);
Die Implementierung dahinter:
- Code: Select all
private boolean bCheckDelete = false;
private IDataBook dbCheckDelete;
public void addAskDeleteDialog(IDataBook pDataBook)
{
pDataBook.eventBeforeDeleting().addListener(this);
}
public void dataBookChanged(DataBookEvent pDataBookEvent) throws ModelException
{
dbCheckDelete = pDataBookEvent.getChangedDataBook();
RemoteWorkScreen workscreen = getRemoteWorkScreen(dbCheckDelete);
if (workscreen != null && !bCheckDelete
&& dbCheckDelete.getWritebackIsolationLevel() != IDataBook.WriteBackIsolationLevel.DATASOURCE)
{
bCheckDelete = true;
try
{
((RemoteWorkScreenApplication)workscreen.getApplication()).showQuestion(
this, "Are you sure to delete this row?", "doDelete", "doCancelDelete");
}
catch (Throwable throwable)
{
throw new ModelException("Check delete Dialog could not be opened", throwable);
}
throw new SilentAbortException();
}
}
public RemoteWorkScreen getRemoteWorkScreen(IDataBook pDataBook)
{
IComponent comp = null;
IControl[] dataBookControls = pDataBook.getControls();
for (int i = 0; i < dataBookControls.length; i++)
{
if (dataBookControls[i] instanceof IComponent)
{
comp = ((IComponent)dataBookControls[i]).getParent();
}
}
while (comp != null && !(comp instanceof RemoteWorkScreen))
{
comp = comp.getParent();
}
return (RemoteWorkScreen)comp;
}
public void doDelete() throws Throwable
{
try
{
dbCheckDelete.delete();
}
finally
{
bCheckDelete = false;
}
}
public void doCancelDelete() throws ModelException
{
bCheckDelete = false;
}
Unserer Erfahrung nach ist der DATA_ROW WriteBackIsolationLevel der am meisten gewünschte Speichermodus von Kunden. Man hat nach jeder Zeile sofort die Gewissheit, dass alles korrekt eingegeben wurde und vor allem das alle Änderungen gespeichert wurden.
Im DATA_SOURCE Modus ist es immer wieder passiert dass ein Benutzer 10 und mehr Zeilen noch nicht gespeichert hat. Wenn er dann schnell die Applikation verlassen musste, sind Validierungsfehler aufgetreten, wie Unique Key, Gültigkeitsprüfungen, usw. Somit haben die Benutzer nur 2 Möglichkeiten: alles Verwerfen, weil sie wirklich eilig weg müssen, oder eine Zeile nach der anderen korrigieren, was natürlich dauern kann.
Im DATA_SOURCE Modus werden alle Änderungen einzeln commited, da JDBC Treiber standardmäßig auf Auto-Commit eingestellt sind.
Um dieses Verhalten zu ändern, muss man am Server folgende Funktionen in das Session Objekt einfügen:
- Code: Select all
public void beginTransaction() throws Exception
{
getDBAccess().getConnection().setAutoCommit(false);
}
public void commitTransaction() throws Exception
{
try
{
getDBAccess().commit();
}
finally
{
getDBAccess().getConnection().setAutoCommit(true);
}
}
public void rollbackTransaction() throws Exception
{
try
{
getDBAccess().rollback();
}
finally
{
getDBAccess().getConnection().setAutoCommit(true);
}
}
Speichern am Client:
- Code: Select all
try
{
getConnection().callAction(“beginTransaction“);
getDataSource().saveAllDataBooks();
getConnection().callAction(“commitTransaction“);
}
catch (Exception ex)
{
getConnection().callAction(“rollbackTransaction“);
}
Sie können dies auch allgemein in der Application durchführen, z.B.:
- Code: Select all
public void doSave() throws Exception
{
…
}