Freigeben über


Verwaltung von Aktualisierungen mit Sichten

Sie können die Technologie zum Verwalten von Aktualisierungskonflikten, die in Visual FoxPro-Ansichten integriert ist, zum Bearbeiten von Mehrbenutzerzugriffen auf Daten verwenden. Mit Ansichten wird gesteuert, was an die der Ansicht zugrunde liegenden Basistabellen gesendet wird, und zwar mit Hilfe der WhereType-Eigenschaft. Sie können diese Eigenschaft sowohl für lokale als auch für Remoteansichten einstellen. Die WhereType-Eigenschaft bietet vier Einstellmöglichkeiten:

  • DB_KEY
  • DB_KEYANDUPDATABLE
  • DB_KEYANDMODIFIED (die Standardeinstellung)
  • DB_KEYANDTIMESTAMP

Indem Sie eine dieser vier Einstellungen wählen, steuern Sie, wie Visual FoxPro die WHERE-Klausel für die SQL-Aktualisierungsanweisung erstellt, die an die Basistabellen der Ansichten gesendet wird. Sie können die gewünschte Einstellung auf der Registerkarte Aktualisierungskriterien des Ansichts-Designers auswählen, oder Sie können mit Hilfe von DBSETPROP( ) die WhereType-Eigenschaft für eine Ansichtsdefinition festlegen. Zum Ändern der WhereType-Einstellung für den Cursor einer aktiven Ansicht verwenden Sie CURSORSETPROP( ).

Aufgabenstellung SQL WHERE-Option
Fehlschlagen der Aktualisierung, wenn ein Schlüsselfeld in der Quelltabelle geändert wurde Nur Schlüsselfelder
Fehlschlagen der Aktualisierung, wenn eines der als aktualisierbar gekennzeichneten Felder in der Remotetabelle geändert wurde Schlüssel und aktualisierbare Felder
Fehlschlagen der Aktualisierung, wenn Felder, die Sie lokal ändern, in der Quelltabelle geändert wurden Schlüssel und veränderte Felder
Fehlschlagen der Aktualisierung, wenn sich der Zeitstempel des Datensatzes in der Remotetabelle seit dem ersten Abrufen geändert hat (nur verfügbar, wenn die Remotetabelle eine Zeitstempelspalte besitzt) Schlüssel und Zeitstempel

Angenommen, Sie haben eine einfache Remoteansicht, die auf der sieben Felder umfassenden Tabelle Customer basiert: cust_id, company, phone, fax, contact, title und timestamp. Der Primärschlüssel für Ihre Ansicht ist cust_id.

Sie haben nur zwei Felder aktualisierbar gemacht: **** contact_name und contact_title. Sie möchten den Benutzer in die Lage versetzen, den Namen des Ansprechpartners im Unternehmen und dessen jeweiligen Titel von der Ansicht aus zu aktualisieren. Wenn sich jedoch andere Daten zu einem Unternehmen ändern, wie beispielsweise die Anschrift, dann sollen diese Änderungen über einen Koordinator vorgenommen werden, der die Auswirkungen der Änderungen für Ihr Unternehmen beurteilt, also beispielsweise, ob der Kunde dadurch in einen anderen Vertriebsbereich fällt. Nachdem Sie nun die Ansicht zum Senden von Aktualisierungen eingerichtet haben, können Sie die WhereType-Eigenschaft Ihren Vorstellungen entsprechend wählen.

Einmal angenommen, Sie ändern nun den Namen im Feld contact eines Kundendatensatzes, Sie ändern jedoch nicht den Wert in dem anderen aktualisierbaren Feld, dem Feld title. Ausgehend von diesem Beispiel erläutert der folgende Abschnitt, wie die Einstellung der WhereType-Eigenschaft sich auf die WHERE-Klausel auswirkt, die Visual FoxPro erstellt, um den neuen Namen des Ansprechpartners an die Basistabellen zu senden.

Nur das Schlüsselfeld vergleichen

Bei der am wenigsten restriktiven Aktualisierung verwenden Sie die DB_KEY-Einstellung. Die WHERE-Klausel zum Aktualisieren von Remotetabellen besteht nur aus dem mit der KeyField-Eigenschaft oder der KeyFieldList-Eigenschaft angegebenen Primärschlüsselfeld. Sofern der Wert im Primärschlüsselfeld in der Basistabelle nicht geändert oder gelöscht wurde, seit Sie den Datensatz abgerufen haben, läuft die Aktualisierung problemlos durch.

Im Fall des vorhergehenden Beispiels würde Visual FoxPro eine Aktualisierungsanweisung mit einer WHERE-Klausel vorbereiten, die den Wert im Feld cust_id mit dem im Feld cust_id der entsprechenden Zeile in der Basistabelle vergleicht:

WHERE OLDVAL(customer.cust_id) = CURVAL(customer_remote_view.cust_id)

Wird die Aktualisierungsanweisung nun an die Basistabelle gesendet, dann wird nur das Schlüsselfeld der Basistabelle geprüft.

Das Schlüsselfeld in Ihrer Ansicht wird mit seinem Gegenstück in der Basistabelle verglichen

Vergleichen des Schlüsselfeldes und der in der Ansicht geänderten Felder

Die DB_KEYANDMODIFIED-Einstellung, die Standardeinstellung, ist ein wenig restriktiver als DB_KEY. Mit DB_KEYANDMODIFIED werden nur das Schlüsselfeld und alle aktualisierbaren Felder, die in der Ansicht geändert wurden, mit ihrem jeweiligen Gegenstück in der Basistabelle verglichen. Falls Sie in der Ansicht einen Feldwert ändern, dieses Feld jedoch nicht aktualisierbar ist, werden die Felder nicht mit den Daten in der Basistabelle verglichen.

Die WHERE-Klausel zum Aktualisieren von Basistabellen besteht aus den mit der KeyFieldList-Eigenschaft angegebenen Schlüsselfeldern und allen anderen Feldern, die in der Ansicht aktualisiert werden. Im Fall des vorhergehenden Beispiels würde Visual FoxPro eine Aktualisierungsanweisung vorbereiten, mit der die Werte im Feld cust_id verglichen werden, da dies das Schlüsselfeld ist, und die Werte im Feld contact, da der Name im Feld contact geändert wurde. Obwohl das Feld title aktualisierbar ist, wird title nicht in die Aktualisierungsanweisung aufgenommen, da der Feldwert nicht geändert wurde.

Das Schlüsselfeld und die geänderten Felder in Ihrer Ansicht werden mit ihrem jeweiligen Gegenstück in der Basistabelle verglichen

Vergleichen des Schlüsselfeldes und aller aktualisierbaren Felder

Mit der DB_KEYANDUPDATABLE-Einstellung werden das Schlüsselfeld und alle aktualisierbaren Felder (unabhängig davon, ob sie geändert wurden) in der Ansicht mit ihrem jeweiligen Gegenstück in der Basistabelle verglichen. Falls das Feld aktualisierbar ist und das Feld in der Basistabelle geändert wurde, schlägt die Aktualisierung auch dann fehl, wenn Sie das Feld in der Ansicht nicht geändert haben.

Die WHERE-Klausel, die zum Aktualisieren von Basistabellen verwendet wird, besteht aus den mit der KeyField-Eigenschaft oder der KeyFieldList-Eigenschaft angegebenen Schlüsselfeldern und allen anderen aktualisierbaren Feldern. Im Fall des vorhergehenden Beispiels würde Visual FoxPro eine Aktualisierungsanweisung vorbereiten, die den Wert in den Feldern cust_id, contact und title mit dem der gleichen Felder in der entsprechenden Zeile der Basistabelle vergleicht:

Alle aktualisierbaren Felder in der Ansicht werden mit ihrem jeweiligen Gegenstück in der Basistabelle verglichen.

Vergleichen des Zeitstempels für alle Felder im Datensatz der Basistabelle

Die DB_KEYANDTIMSTAMP-Einstellung ist die restriktivste Art der Aktualisierung und nur verfügbar, wenn die Basistabelle über eine Zeitstempelspalte verfügt. Visual FoxPro vergleicht den aktuellen Zeitstempel des Datensatzes in der Basistabelle mit dem Zeitstempel, der zu der Zeit gültig war, als die Daten in die Ansicht eingelesen wurden. Hierbei schlägt die Aktualisierung fehl, wenn ein beliebiges Feld im Datensatz der Basistabelle zwischenzeitlich geändert wurde, auch wenn es sich hierbei nicht um ein Feld handelt, das Sie zu aktualisieren versuchen, und sogar dann, wenn sich ein nicht in Ihrer Ansicht vorhandenes Feld geändert hat.

Im Fall des vorhergehenden Beispiels bereitet Visual FoxPro eine Aktualisierungsanweisung vor, die den Wert im Feld cust_id und den Wert im Feld timestamp mit dem der gleichen Felder in der entsprechenden Zeile der Basistabelle vergleicht.

Der Zeitstempel des in der Ansicht befindlichen Datensatzes wird mit dem des Datensatzes in der Basistabelle verglichen

Um Daten in einer Ansicht, der mehrere Tabellen zugrunde liegen, erfolgreich mit der DB_KEYANDTIMESTAMP-Einstellung aktualisieren zu können, müssen Sie das Zeitstempelfeld für jede zu aktualisierende Tabelle in die Ansicht einbinden. Falls einer Ansicht beispielsweise drei Tabellen zugrunde liegen, von denen Sie jedoch nur zwei aktualisieren möchten, und die DB_KEYANDTIMESTAMP-Einstellung verwendet wird, müssen Sie die Zeitstempelfelder aus den beiden zu aktualisierenden Tabellen in das Resultset einbeziehen. Sie können auch die logischen Werte der CompareMemo-Eigenschaft verwenden, um zu ermitteln, ob Memofelder in die Konflikterkennung mit einbezogen werden.

Siehe auch

Verwalten der Leistung | Konfliktverwaltung | Programmieren für freigegebenen Zugriff | Registerkarte "Aktualisierungskriterien", Ansichts-Designer | DBSETPROP( ) | CURSORSETPROP( )