Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » MobiLink - Erste Orientierung » Einführung in die MobiLink-Technologie » Einführungen in das MobiLink-Beispiel Contact » Das Beispiel Contact synchronisieren

 

Produkte im Beispiel Contact synchronisieren

Die Skripten für die Product-Tabelle veranschaulichen die Konflikterkennung und -lösung.

Die Product-Tabelle befindet sich in einer eigenen Publikation, getrennt von den anderen Tabellen, damit sie separat übertragen werden kann. Wenn z.B. Preisänderungen vorgenommen werden und der Vertriebsmitarbeiter über eine langsame Verbindung synchronisiert, kann er die Produktänderungen per Download übertragen, ohne die eigenen Änderungen in Customer und Contact per Upload übertragen zu müssen.

Geschäftsregeln

Die einzige Änderung, die in der entfernten Datenbank vorgenommen werden kann, ist die Änderung in der Mengenspalte, wenn ein Auftrag angenommen wird.

Downloads
  • download_cursor   Das folgende download_cursor-Skript liest alle Zeilen ein, die seit der letzten Synchronisation der entfernten Datenbank geändert wurden:
    SELECT id, name, size, quantity, unit_price
    FROM product
    WHERE last_modified >= ?
    AND active = 1

  • download_delete_cursor   Das folgende download_delete_cursor-Skript entfernt alle Produkte, die vom Unternehmen nicht mehr vertrieben werden. Diese Produkte sind in der konsolidierten Datenbank als inaktiv markiert:
    SELECT id, name, size, quantity, unit_price
    FROM product
    WHERE last_modified >= ?
    AND active = 0

Uploads

Nur UPDATE-Vorgänge werden von der entfernten Datenbank per Upload übertragen. Die wichtigste Funktion dieser Upload-Skripten ist die Prozedur zur Erkennung und Lösung von Konflikten.

Wenn zwei Vertriebsmitarbeiter Aufträge entgegennehmen und dann synchronisieren, werden beide Aufträge von dem Wert in der Spalte quantity der Tabelle Product subtrahiert. Wenn Samuel Singer beispielsweise eine Bestellung für 20 Baseballkappen (Produkt-ID 400) aufnimmt, ändert er die Menge von 90 zu 70. Wenn Pamela Savarino eine Bestellung für 10 Baseballkappen erhält, ändert sie die Spalte in ihrer Datenbank von 90 zu 80.

Wenn Samuel Singer seine Änderungen synchronisiert, wird der Wert in der Mengenspalte in der konsolidierten Datenbank von 90 auf 70 geändert.Wenn Pamela Savarino ihre Änderungen synchronisiert, wäre der richtige Vorgang, den Wert auf 60 zu setzen. Diese Änderung wird dadurch erreicht, dass der Konflikt erkannt wird.

Das Konflikterkennungsschema umfasst die folgenden Skripten.

  • upload_update   Das folgende upload_update-Skript führt eine einfache UPDATE-Anweisung in der konsolidierten Datenbank aus:
    UPDATE product
    SET name = ?, size = ?, quantity = ?, unit_price = ?
    WHERE product.id = ?

  • upload_fetch   Das folgende upload_fetch-Skript ruft eine einzelne Zeile aus der Tabelle Product ab und vergleicht sie mit den alten Werten der per Upload übertragenen Zeile. Wenn die beiden Zeilen verschieden sind, wird ein Konflikt erkannt.
    SELECT id, name, size, quantity, unit_price
    FROM Product
    WHERE id = ?

  • upload_old_row_insert   Wenn ein Konflikt erkannt wird, werden die alten Werte in die Tabelle product_conflict eingefügt, damit das resolve_conflict-Skript darauf zugreifen kann. Die Zeile wird mit dem Wert "O" (für Old – Alt) in der Spalte row_type eingefügt.
    INSERT INTO DBA.product_conflict(
     id, name, size, quantity, unit_price, row_type )
    VALUES( ?, ?, ?, ?, ?, 'O' )' )

  • upload_new_row_insert   Das folgende Skript fügt die neuen Werte der per Upload übertragenen Zeile in die Tabelle product_conflict ein, damit das resolve_conflict-Skript darauf zugreifen kann:
    INSERT INTO DBA.product_conflict(
     id, name, size, quantity, unit_price, row_type )
    VALUES( ?, ?, ?, ?, ?, 'N' )

Konfliktlösung
  • resolve_conflict   Das folgende Skript löst den Konflikt, indem es die Differenz zwischen neuen und alten Zeilen dem Mengenwert in der konsolidierten Datenbank hinzurechnet.
    UPDATE Product
    SET p.quantity = p.quantity
                  - old_row.quantity
                  + new_row.quantity
    FROM Product p,
         DBA.product_conflict old_row,
         DBA.product_conflict new_row
    WHERE p.id = old_row.id
        AND p.id = new_row.id
        AND old_row.row_type = 'O'
        AND new_row.row_type = 'N'