Verwalten von Datenkonflikten in der Client/Server-Beispielanwendung
Wenn die Daten in der Quelltabelle geändert werden, während sie von einem anderen Benutzer bearbeitet wird, tritt möglicherweise ein Konflikt auf. Es stehen Ihnen verschiedene Verfahren zur Verfügung, um den Konflikt im Bereich Aktualisierungsoptionen des Client/Server-Beispielformulars zu lösen.
Wenn Sie unter Aktualisierungsoptionen die Option Erzwingen aktivieren, werden alle Datenänderungen, die vorgenommen wurden, nachdem Sie mit der Bearbeitung begonnen haben, überschrieben, sobald Sie die Daten mit den von Ihnen vorgenommenen Änderungen aktualisieren.
Wenn Sie unter Aktualisierungsoptionen die Option Konflikte lösen aktivieren, erkennt die Client/Server-Beispielanwendung Konflikte, während sie auftreten, und ermöglicht es Ihnen, die zueinander in Konflikt stehen Daten anzuzeigen und zu entscheiden, ob Sie die vorliegenden Änderungen außer Kraft setzen oder Ihre eigenen Änderungen verwerfen möchten. Wenn Sie die Option Konflikte lösen nicht aktivieren, werden die Daten nicht aktualisiert, falls ein Konflikt festgestellt wird:
IF THIS.parent.chkConflicts.Value
THISFORM.ResolveConflicts
ELSE
WAIT WINDOW 'Update failed' NOWAIT TIMEOUT 5
ENDIF
Wenn Sie unter Aktualisierungsoptionen die Option Geschäftsregeln aktivieren, aktualisiert die Anwendung die Daten entsprechend den von Ihnen festgelegten Geschäftsregeln. Weitere Informationen zur Option Geschäftsregeln finden Sie unter Implementieren von Geschäftsregeln in die Client/Server-Beispielanwendung.
So erzeugen Sie einen Datenkonflikt
- Führen Sie zwei getrennte Instanzen von Visual FoxPro aus, um zu simulieren, dass mehrere Benutzer auf die Datenbank zugreifen.
- Führen Sie in jeder Instanz die Client/Server-Beispielanwendung aus.
- Aktivieren Sie in beiden Arbeitssitzungen einen Zwischenspeicherungsmodus.
- Stellen Sie sicher, dass das Kontrollkästchen Erzwingen in keiner der beiden Instanzen von Visual FoxPro aktiviert ist.
- Nehmen Sie in jeder der beiden Arbeitssitzungen Änderungen an denselben Feldern in derselben Tabellenzeile vor.
- Aktualisieren Sie die Tabelle in einer der Arbeitssitzungen.
- Aktualisieren Sie die Tabelle in der anderen Arbeitssitzung.
Wenn Sie das zweite Mal Aktualisieren wählen, versucht die folgende Codezeile im Click-Ereignis von cmdUpdate die Tabelle zu aktualisieren.
llUpdate = TABLEUPDATE(lnUpdateType, llForce)
Wenn llForce auf Wahr (.T.) festgelegt wurde, werden die in der anderen Sitzung vorgenommenen Änderungen außer Kraft gesetzt. Wenn llForce auf Falsch (.F.) festgelegt wurde, wird ein Datenkonflikt erkannt, und die TABLEUPDATE( )-Funktion gibt den Wert Falsch zurück. Wenn llUpdate auf Falsch festgelegt wurde, wird die ResolveConflicts-Methode aufgerufen:
IF llUpdate
WAIT WINDOW 'Update succeded' NOWAIT TIMEOUT 5
ELSE
frmConflicts = CREATEOBJECT('Conflicts')
frmConflicts.Show
ENDIF
Code im Activate-Ereignis des Formulars Conflicts erstellt einen Cursor mit drei leeren Datensätzen, um die aktuellen, die alten und die geänderten Werte der Zeile anzuzeigen.
=AFIELDS('aEmployee')
SELECT 0
CREATE CURSOR CS_CONFLICTS FROM ARRAY aEmployee
APPEND BLANK
APPEND BLANK
APPEND BLANK
Code, der der Next-Methode des Formulars Conflicts zugeordnet ist, füllt den Cursor, der das Konfliktraster mit den alten, neuen und geänderten Werten darstellt. Die folgende FOR-Schleife fügt z. B. einen Datensatz mit den alten Werten in die Tabelle ein:
FOR m.i = 1 TO ALEN(aEmployee, 1)
REPLACE (aEmployee[m.i,1]) WITH ;
OLDVAL(aEmployee[m.i,1], lcEmployee)
ENDFOR
Wenn Benutzern genau angezeigt wird, worin die Datenkonflikte bestehen, befinden sie sich in einer günstigeren Ausgangsposition, zu entscheiden, ob sie die neuen Werte außer Kraft setzen, die von ihnen vorgenommenen Änderungen rückgängig machen oder den Konflikt ignorieren möchten.
Code im Click-Ereignis von cmdUpdate im Formular Conflicts erzwingt die Aktualisierung:
llUpdate = TABLEUPDATE(.F., .T.)
Code im Click-Ereignis von cmdRevert verwirft die Änderungen, die Benutzer vorgenommen haben:
lnRows = TABLEREVERT(.F.)
Wenn Benutzer im Formular Conflicts auf Ignorieren klicken, wird die Verarbeitung bei den anderen Konflikten der Tabelle fortgesetzt.
Siehe auch
Lösungsbeispiele | Client/Server-Beispiel | Client/Server-Beispielanwendung: Klassen | Client/Server-Beispielanwendung: Datenbank | Implementieren von Geschäftsregeln in die Client/Server-Beispielanwendung | Datenaktualisierung in der Client/Server-Beispielanwendung