[DBMoto][スクリプト]カラムを結合・分割したレプリケーション

異種データベース間の双方向レプリケーションツールDBMotoでは、スクリプトを使用することでカラムの結合・分割を行いながらデータを同期することも可能です。今回の記事では双方向レプリケーションにおいてカラムの結合・分割を実現するサンプルスクリプトとその設定方法をご紹介いたします。

1.カラムの結合

今回は例として、下記図のようにAS/400の2つの数値型カラムを結合して、SQL Serverの日付型カラムへとレプリケーションを行います。

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

[/vb]

その後、レプリケーションプロパティのフィールドマッピング設定から結合するカラムを指定します。今回はC2カラムとC3カラムを結合するので、C2カラムから出ている矢印を右クリック > 関数へのマッピング画面で下記関数を入力します。
CONVERTTODATETIME([C2],[C3])

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

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

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

グローバルスクリプトに下記スクリプトを追加します。

[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 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

[/vb]

その後、レプリケーションプロパティのフィールドマッピング設定に分割するカラムを指定します。矢印ボタンをクリックし、逆向きレプリケーションの設定画面にした後、各カラムにドラック&ドロップでマッピングし、各マッピング画面でそれぞれ下記関数を入力します。
CONVERTDATETONUMBER([C2])
CONVERTDATETOTIME([C2])

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です