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


異種データベース間の双方向レプリケーションツール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の各カラムにレプリケーションされることが確認できます。

関連したトピックス

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください