Tips

同期または複製するフィールド名のリストをプログラムで作成する

日付2010/10/27
ID76183 (英語原文参照)
バージョンv12
プラットフォームMac/Win

SQLの複製コマンドを使用する場合, 対象となるフォールドを列挙する必要があります。そのようなSQLをタイプ入力するのは大変かもしれません。下記の例では, システムテーブル_USER_COLUMNSからBLOB以外のフィールドを抽出しています。

// If another table needs to be sync'd, add the name to this array.
APPEND TO ARRAY($tablesToSync_at;"Groups")
APPEND TO ARRAY($tablesToSync_at;"Members")
APPEND TO ARRAY($tablesToSync_at;"People")
APPEND TO ARRAY($tablesToSync_at;"Tasks")
APPEND TO ARRAY($tablesToSync_at;"Meetings")

$numTables_l:=Size of array($tablesToSync_at)

For ($i;1;$numTables_l)

   $currentTable_t:=$tablesToSync_at{$i}

   // Build table definition for SYNCHRONIZE statement.
   $tableDef_t:=$currentTable_t+" ( "

   // All fields to be sync'd must be enumerated.
   Begin SQL
   SELECT COLUMN_NAME FROM _USER_COLUMNS
   WHERE ( TABLE_NAME = :$currentTable_t )
   /* SYNCHRONIZE doesn't really work with BLOBs so don't sync these field types. */
   AND NOT ( DATA_TYPE = 18 )
   AND NOT ( DATA_TYPE = 12 )
   INTO :$fieldNames_at;
   End SQL

    // Append the fields on to the statement.
   $numFields_l:=Size of array($fieldNames_at)
   For ($j;1;$numFields_l)
      If ($j=$numFields_l)
         $tableDef_t:=$tableDef_t+$fieldNames_at{$j}+") "
      Else 
         $tableDef_t:=$tableDef_t+$fieldNames_at{$j}+", "
      End if 
   End for 

    // Table definition is complete

End for 

作成したフィールドのリストを使用し, SQLのSYNCHRONIZEコマンドを完成させることができます。

$statement_t:="SYNCHRONIZE LOCAL TABLE "+$tableDef_t
$statement_t:=$statement_t+" WITH "
$statement_t:=$statement_t+" REMOTE TABLE "+$tableDef_t
$statement_t:=$statement_t+" FOR REMOTE STAMP :remoteStamp_l,"
$statement_t:=$statement_t+" LOCAL STAMP :localStamp_l"
$statement_t:=$statement_t+" LOCAL OVER REMOTE"
$statement_t:=$statement_t+" LATEST REMOTE STAMP :latestRemoteStamp_l,"
$statement_t:=$statement_t+" LATEST LOCAL STAMP :latestLocalStamp_l;"

Begin SQL
   EXECUTE IMMEDIATE :$statement_t;
End SQL