異種データベース間の双方向レプリケーションツールDBMotoでは、スクリプトを使用することでカラムの結合・分割を行いながらデータを同期することも可能です。今回の記事では双方向レプリケーションにおいてカラムの結合・分割を実現するサンプルスクリプトとその設定方法をご紹介いたします。
1.カラムの結合
今回は例として、下記図のようにAS/400の2つの数値型カラムを結合して、SQL Serverの日付型カラムへとレプリケーションを行います。

まずはDBMoto管理画面左上にあるグローバルスクリプトボタンをクリックし、ポップアップされたDBMotoグローバルスクリプト画面で下記スクリプトをコピーします。VBスクリプトなのでスクリプト言語はVBに設定します。

Imports System
Imports System.Data
Imports Microsoft.VisualBasic
Imports DBMotoPublic
Imports DBMotoScript
Namespace DBRS
Public Class GlobalScript : Inherits IGlobalScript
'AS/400 to SQL Server CONVERTTODATETIME
Public Shared Function CONVERTTODATETIME (objDate As Object, objTime As Object) As Object
If (objDate Is Nothing OrElse objDate Is System.DBNull.Value) Or (objTime Is Nothing OrElse objTime Is System.DBNull.Value) Then
CONVERTTODATETIME = System.DBNull.Value
Else
CONVERTTODATETIME = New DateTime(Left(objDate.ToString(),4) , Mid(objDate.ToString(),5,2), Right(objDate.ToString(),2), Left(objTime.ToString(),2), Mid(objTime.ToString(),3,2), Right(objTime.ToString(),2))
End If
End Function
End Class
Public Class MappingRule : Inherits IMappingRule
End Class
Public Class CreateTableRule : Inherits ICreateTableRule
End Class
Public Class GlobalEvents : Inherits IGlobalEvents
End Class
End Namespace
その後、レプリケーションプロパティのフィールドマッピング設定から結合するカラムを指定します。今回はC2カラムとC3カラムを結合するので、C2カラムから出ている矢印を右クリック > 関数へのマッピング画面で下記関数を入力します。
CONVERTTODATETIME([C2],[C3])

関数入力後、指定したカラムからマッピングされていることが確認できます。

設定が完了したらレプリケーションを実行してみます。AS/400のデータが結合されSQL Serverにレプリケーションされることが確認できます。

2.カラムの分割
今度は逆にSQL Serverの日付型カラムを分割し、AS/400の2つの数値型カラムにレプリケーションを行う設定を行います。

グローバルスクリプトに下記スクリプトを追加します。
Imports System
Imports System.Data
Imports Microsoft.VisualBasic
Imports DBMotoPublic
Imports DBMotoScript
Namespace DBRS
Public Class GlobalScript : Inherits IGlobalScript
'AS/400 to SQL Server CONVERT TO DATETIME
Public Shared Function CONVERTTODATETIME (objDate as Object, objTime as Object) as Object
If (objDate Is Nothing OrElse objDate Is System.DBNull.Value) Or (objTime Is Nothing OrElse objTime Is System.DBNull.Value) Then
CONVERTTODATETIME = System.DBNull.Value
Else
CONVERTTODATETIME = new DateTime(Left(objDate.ToString(),4) , Mid(objDate.ToString(),5,2), Right(objDate.ToString(),2), Left(objTime.ToString(),2), Mid(objTime.ToString(),3,2), Right(objTime.ToString(),2))
End if
End Function
'SQL Server to AS/400 CONVERT TO NUMBER(yyyymmdd)
Public Shared Function CONVERTDATETONUMBER(objDate as Object) as Object
Dim dtDate as DateTime
If objDate Is Nothing OrElse objDate Is System.DBNull.Value Then
CONVERTDATETONUMBER = System.DBNull.Value
Else
dtDate = objDate
CONVERTDATETONUMBER = dtDate.Year * 10000 + dtDate.Month * 100 + dtDate.Day
End if
End Function
'SQL Server to AS/400 CONVERT TO NUMBER(hhmmss)
Public Shared Function CONVERTDATETOTIME (objDate as Object) as Object
Dim dtDate as DateTime
If objDate Is Nothing OrElse objDate Is System.DBNull.Value Then
CONVERTDATETOTIME = System.DBNull.Value
Else
dtDate = objDate
CONVERTDATETOTIME = dtDate.Hour * 10000 + dtDate.Minute * 100 + dtDate.Second
End if
End Function
End Class
Public Class MappingRule : Inherits IMappingRule
End Class
Public Class CreateTableRule : Inherits ICreateTableRule
End Class
Public Class GlobalEvents : Inherits IGlobalEvents
End Class
End Namespace
その後、レプリケーションプロパティのフィールドマッピング設定に分割するカラムを指定します。矢印ボタンをクリックし、逆向きレプリケーションの設定画面にした後、各カラムにドラック&ドロップでマッピングし、各マッピング画面でそれぞれ下記関数を入力します。
CONVERTDATETONUMBER([C2])
CONVERTDATETOTIME([C2])

下の画面はSQL ServerのC2カラムからAS/400のC3カラムにドラッグ&ドロップでマッピングした後に関数設定を行っております。
レプリケーションを実行してみると、SQL Serverのデータが分割されAS/400の各カラムにレプリケーションされることが確認できます。

関連したトピックス
- [DBMoto]数値型フィールドに入っている日時形式のデータを日時型フィールドにレプリケーションするには
- レプリケーションの際にnullを特定の値に変換する方法 その2【リアルタイムレプリケーションツールDBMoto】
- ジュリアンデートのレプリケーション【リアルタイムレプリケーションツールDBMoto】
- [DBMoto]関数を使用してレプリケーション時のデータを変換する方法(VB/C#言語選択、関数適用、ユーザ関数作成、置換関数、一括設定手順)
- [Syniti(旧DBMoto)]レコード競合(コンフリクト)発生時のレコード内容を出力する方法
- 複数の複製元サーバから1つの複製先サーバへの結合レプリケーションもDBMotoで簡単実現
- [DBMoto]「未マッピング使用」機能によるマッピング外のデータを活用したレプリケーション
- 複数のテーブルにあるレコードを1つのテーブルへ統合する際の注意点【リアルタイムレプリケーションツールDBMoto】
- Syniti Data Replication (旧DBMoto)でのスクリプトの書き方②:グローバルスクリプト
- [Syniti(DBMoto)][スクリプト] 特定カラムの値が変更となった場合、ターゲットのレコードを削除するサンプルスクリプト

RSSフィードを取得する