統合データベースの一部のテーブルは、複数のリモート・データベースに属するローを持ちます。各リモート・データベースは統合データベース内にローのサブセットを持ち、さらにそのサブセットは他のリモート・データベースと重複しています。顧客テーブルの場合は、こうしたことがよく起こります。この場合、顧客テーブルと複数のリモート・データベース間で多対多の関係があり、通常、この関係を表すテーブルが存在します。download_cursor イベントと download_delete_cursor イベントのスクリプトでは、関係を表すテーブルにダウンロードされるテーブルをジョインする必要があります。
CustDB サンプル・アプリケーションでは、この方法を ULOrder テーブルに使用します。ULEmpCust テーブル上での ULCustomer と ULEmployee の関係は、多対多の関係です。
各リモート・データベースは、ULOrder テーブルから、emp_id カラムの値が Mobile Link ユーザ名と一致するローのみを受信します。
CustDB アプリケーションの ULOrder テーブルで、SQL Anywhere バージョンの download_cursor スクリプトを使用した例を次に示します。
SELECT o.order_id, o.cust_id, o.prod_id, o.emp_id, o.disc, o.quant, o.notes, o.status FROM ULOrder o , ULEmpCust ec WHERE o.cust_id = ec.cust_id AND ec.emp_id = {ml s.username} AND ( o.last_modified >= {ml s.last_table_download} OR ec.last_modified >= {ml s.last_table_download}) AND ( o.status IS NULL OR o.status != 'Approved' ) AND ( ec.action IS NULL ) |
このスクリプトは非常に複雑です。スクリプトを見ると、リモート・データベースのテーブルを定義するクエリには、統合データベースのテーブルを複数指定できることがわかります。このスクリプトは、次のすべての条件に一致する ULOrder のローをすべてダウンロードします。
ULOrder の cust_id カラムと ULEmpCust の cust_id カラムが一致する。
ULEmpCust の emp_id カラムが同期ユーザ名と一致する。
注文、または従業員と顧客の関係に対する最終更新日がどちらも、同期ユーザ用の最新の同期時間よりも新しい。
ステータスは "Approved" 以外である。
ULEmpCust のアクション・カラムを使用して、削除するカラムにマークを付けます。その目的は、現在説明している内容には関係ありません。
download_delete_cursor スクリプトを次に示します。
SELECT o.order_id FROM ULOrder o, ULEmpCust ec WHERE o.cust_id = ec.cust_id AND ec.emp_id = {ml s.username} AND ( o.last_modified >= {ml s.last_table_download} OR c.last_modified >= {ml s.last_table_download} ) AND ( o.status IS NULL OR o.status != 'Approved' ) AND ( ec.action IS NULL ) |
リモート・データベースから "Approved" のローがすべて削除されます。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |