Freigeben über


Ermitteln und Lösen von Konflikten

Bei Datenaktualisierungsoperationen, speziell in Mehrbenutzerumgebungen, möchten Sie möglicherweise herausfinden, welche Felder geändert wurden oder welches die originalen bzw. die aktuellen Werte in den geänderten Feldern sind. Die Visual FoxPro-Zwischenspeicherung sowie die Funktionen GETFLDSTATE( ), GETNEXTMODIFIED( ), OLDVAL( ) und CURVAL( ) ermöglichen Ihnen herauszufinden, welche Felder geändert wurden, und helfen, die geänderten Daten zu finden und die aktuellen, ursprünglichen und bearbeiteten Werte zu vergleichen, so dass Sie entscheiden können, wie ein Fehler oder ein Konflikt zu behandeln ist.

So ermitteln Sie eine Änderung in einem Feld

  • Verwenden Sie nach einer Aktualisierungsoperation die GETFLDSTATE( )-Funktion.

GETFLDSTATE( ) wird bei nicht zwischengespeicherten Daten eingesetzt; trotzdem kann diese Funktion um so wirksamer verwendet werden, wenn Sie die Datensatzpufferung aktiviert haben. Verwenden Sie GETFLDSTATE( ) beispielsweise im Code der Schaltfläche Überspringen in einem Formular. Wenn Sie den Datensatzzeiger verschieben, prüft Visual FoxPro den Status aller Felder im Datensatz, wie im nachfolgenden Beispiel erläutert:

lModified = .F.
FOR nFieldNum = 1 TO FCOUNT( ) && Check all fields 
   if GETFLDSTATE(nFieldNum) = 2  && Modified
      lModified = .T.
      EXIT && Insert update/Save routine here.
   ENDIF && See the next example
ENDFOR

So ermitteln und suchen Sie einen geänderten Datensatz in im Zwischenspeicher befindlichen Daten

GETNEXTMODIFIED( ), mit Null als Parameter, findet den ersten geänderten Datensatz. Wenn ein anderer Benutzer Änderungen an einer zwischengespeicherten Tabelle vornimmt, verursachen alle Änderungen, die mit Hilfe des TABLEUPDATE( )-Befehls im Zwischenspeicher entdeckt werden, einen Konflikt. Sie können die den Konflikt verursachenden Werte auswerten und den Konflikt auflösen, indem Sie die Funktionen CURVAL( ), OLDVAL( ) und MESSAGEBOX( ) verwenden. CURVAL( ) gibt den aktuellen Wert des auf der Festplatte befindlichen Wertes zurück, wohingegen OLDVAL( ) den Wert im Datensatz zur Zeit der Zwischenspeicherung ausgibt.

So ermitteln Sie den Originalwert eines Feldes im Zwischenspeicher

OLDVAL( ) gibt den Wert des Feldes im Zwischenspeicher zurück.

So ermitteln Sie den aktuellen, auf der Festplatte befindlichen Wert eines Feldes im Zwischenspeicher

CURVAL( ) gibt den aktuellen, auf der Festplatte befindlichen Wert eines Feldes im Zwischenspeicher vor allen Änderungen zurück.

Sie können nun eine Fehlerbehandlungsprozedur erstellen, bei der die aktuellen und ursprünglichen Werte verglichen werden, wodurch Sie feststellen können, ob die aktuelle Änderung übergeben werden soll oder ob in einer Mehrbenutzerumgebung eine frühere Änderung an den Daten akzeptiert werden soll.

Im folgenden Beispiel werden die Funktionen GETNEXTMODIFIED( ), CURVAL( ) und OLDVAL( ) verwendet, um den Benutzer während einer Aktualisierungsoperation zu informieren und ihm eine Wahlmöglichkeit zu bieten. Dieses Beispiel setzt bei der Entdeckung des ersten geänderten Datensatzes ein und könnte beispielsweise in den Code der Schaltfläche Aktualisieren oder Speichern in einem Formular eingebunden werden.

Click-Ereigniscode für die Schaltfläche "Aktualisieren" oder "Speichern"

Code Kommentar
   nCurRec = GETNEXTMODIFIED (nCurRec)
   DO WHILE nCurRec <> 0
   GO nCurRec
   RLOCK( )
Schleifendurchlauf im Zwischenspeicher.

Sperrt den geänderten Datensatz.
   FOR nField = 1 TO FCOUNT(cAlias)   
      cField = FIELD(nField)
      IF OLDVAL(cField) <> CURVAL(cField)
         nResult = MESSAGEBOX("Data was ;
            changed by another user. ;
            Keep changes?", 4+48+0, ;
            "Modified Record")
Sucht nach Konflikten.

Vergleicht den ursprünglichen Wert mit dem aktuellen Wert auf der Festplatte und fragt dann beim Benutzer eine Konfliktbehandlungsmethode ab.
         IF nResult = 7   
            TABLEREVERT(.F.)   
            UNLOCK RECORD nCurRec   
         ENDIF
      ENDIF
   ENDFOR
   nCurRec = GETNEXTMODIFIED(nCurRec)
ENDDO
Falls der Benutzer "Nein" auswählt, diesen Datensatz zurücksetzen und dann die Sperre entfernen.




Sucht den nächsten geänderten Datensatz.
TABLEUPDATE(.T., .T.)   
Erzwingt eine Aktualisierung aller Datensätze.

Ermitteln von Konflikten mit Hilfe von Memofeldern

Sie können die CompareMemo-Eigenschaft verwenden, um zu steuern, wann Memofelder zur Ermittlung von Aktualisierungskonflikten verwendet werden. Diese Ansichten- und Cursor-Eigenschaft legt fest, ob Memofelder (Typ M oder G) in die WHERE-Klausel der Aktualisierung einbezogen werden. In der Standardeinstellung, Wahr (.T.), werden Memofelder in die WHERE-Klausel einbezogen. Setzen Sie diese Eigenschaft auf Falsch (.F.), werden Memofelder nicht in die WHERE-Klausel der Aktualisierung einbezogen, und zwar ungeachtet der UpdateType-Einstellungen.

Die optimistische Konfliktermittlung in Memofelder ist deaktiviert, wenn die CompareMemo-Eigenschaft auf Falsch (.F.) festgelegt wird. Für eine Konfliktermittlung bei Werten in Memofeldern müssen Sie also CompareMemo auf Wahr (.T.) festlegen.

Regeln für den Umgang mit Konflikten

Der Umgang mit Konflikten, wie sie in Mehrbenutzerumgebungen auftreten, kann das Schreiben von umfangreichem und sich wiederholendem Code erforderlich machen. Eine umfassende Konfliktlösungsroutine erledigt folgende Aufgaben:

  • Ermitteln des Konflikts
  • Identifizieren der Art und Position des Konflikts
  • Verfügbarmachen von ausreichenden Informationen, so dass der Benutzer den Konflikt auf intelligente Weise lösen kann

Ein Beispiel für eine Konfliktlösungsroutine finden Sie in der Klasse datachecker in Samples.vcx im Visual FoxPro-Verzeichnis ...Samples\Classes. Fügen Sie die Klasse einfach zu einem Formular hinzu, und rufen Sie die CheckConflicts-Methode vor allen anderen Operation auf, bei der zwischengespeicherte Daten in die Tabelle geschrieben werden, beispielsweise vor dem Verschieben des Datensatzzeigers, wenn Sie mit Zeilenpufferung arbeiten, vor dem Schließen einer Tabelle oder vor dem Ausgeben von TABLEUPDATE( ).

Siehe auch

Konfliktverwaltung | Programmieren für freigegebenen Zugriff | Verwaltung von Updates mit Sichten | GETFLDSTATE( ) | GETNEXTMODIFIED( )