以前ののブログ記事で紹介した「レプリケーションの際にnullを特定の値に変換する方法 その1」は、テーブルのフィールドごとに設定する必要があったため、フィールドの数が多ければ多いほど設定に時間を要するというデメリットがありました。
今回紹介する方法は、同じテーブル内の同じデータタイプであれば、設定を1回で済ますことが可能で、設定に要する時間の短縮化が期待できます。
■スクリプトの準備
以下のスクリプトを準備します。
——————————
Imports System Imports System.Data Imports Microsoft.VisualBasic Imports DBMotoPublic Imports DBMotoScript Namespace DBRS Public Class GlobalScript : Inherits IGlobalScript Public Shared Function SetVAL(obj as Object, obj1 as Object) as Object If obj is DBNull.Value Then Return obj1 End if If obj is nothing Then Return obj End if If String.IsNullOrEmpty(obj.ToString()) = True Then Return obj1 Else Return obj End If End Function End Class Public Class MappingRule : Inherits IMappingRule <MappingRuleAttribute("CheckString", "Set function for NON nullable fields")> Public Function CheckString (ByVal bIsForth As Boolean, ByVal sSourceName As String, ByVal iSourceOrdinal As Integer, ByVal sSourceType As String, ByVal sTargetName As String, ByVal iTargetOrdinal As Integer, ByVal sTargetType As String, ByRef sExpression As System.Text.StringBuilder) As Boolean If sSourceName = sTargetName Then If sSourceType = "VARCHAR2" Then sExpression.Append("SetVal([" + sTargetName + "]," + """NODATA""" + ")") End If Return True Else Return False End if End Function End Class Public Class GlobalEvents : Inherits IGlobalEvents End Class End Namespace
——————————
■マッピング画面でのスクリプト適用
マッピング画面にて「Custom Mapping」から「CheckString」(グローバルスクリプトで設定した関数名)を選択します。
今まで手動で「Map to Expression」を起動する必要があったものが、自動で一括設定されます。
■データタイプが複数ある場合
今までの設定では1つのテーブルに対して1つのデータタイプのみの場合にしか適用できません。複数のデータタイプに対して設定を行う場合、スクリプトにてIf Elseによる条件分岐にて実現できます。例えば以下のように記述します。
——————————
If sSourceName = sTargetName Then If sSourceType = "VARCHAR2" Then sExpression.Append("SetVal([" + sTargetName + "]," + """NODATA""" + ")") Else If sSourceType = "CHAR" Then sExpression.Append("SetVal([" + sTargetName + "]," + """NODATA""" + ")") Else If sSourceType = "NUMBER" Then sExpression.Append("SetVal([" + sTargetName + "]," + """NODATA""" + ")") End If Return True Else Return False End if
——————————
関連したトピックス
- [DBMoto]関数を使用してレプリケーション時のデータを変換する方法(VB/C#言語選択、関数適用、ユーザ関数作成、置換関数、一括設定手順)
- Syniti Data Replication (旧DBMoto)でのスクリプトの書き方⑤:フィールドマッピング関数の書き方
- テーブル一括作成やマッピングをカスタマイズ:グローバルスクリプト[Syniti Replicate]
- レプリケーションの際にnullを特定の値に変換する方法 その1【リアルタイムレプリケーションツールDBMoto】
- ジュリアンデートのレプリケーション【リアルタイムレプリケーションツールDBMoto】
- [DBMoto][スクリプト]カラムを結合・分割したレプリケーション
- [Syniti(旧DBMoto)]レコード競合(コンフリクト)発生時のレコード内容を出力する方法
- 複数のテーブルにあるレコードを1つのテーブルへ統合する際の注意点【リアルタイムレプリケーションツールDBMoto】
- 複数の複製元サーバから1つの複製先サーバへの結合レプリケーションもDBMotoで簡単実現
- [DBMoto]「未マッピング使用」機能によるマッピング外のデータを活用したレプリケーション