DBMotoのレプリケーションにおいて、お客様から以下のようなご質問をいただくことがあります。
レプリケーションの元となるデータベースで、数値型のフィールドに”20151118”といった形式で日付データが用意されています。
このデータをレプリケーション先にある日付型フィールドに適切な形に変換したいのですが、可能でしょうか。
これに対しての答えですが、DBMoto標準機能であるスクリプト機能を利用すれば変換可能です。
今回は、グローバルスクリプトに設定した関数を個別のレプリケーション(リフレッシュ・ミラーリング)のマッピングにて呼び出す方法を案内いたします。
※VBのスクリプトです。
※この記事を読み進めるためには、まずは以下の弊社ブログ記事をお読みいただきますよう、お願いいたします。
関数を使用してレプリケーション時のデータを変換する方法
■1:
グローバルスクリプトのウィンドウを開き、GlobalScriptクラスに以下のコードを挿入します。そのまま保存します。
Public Shared Function CONVERTNUMBERTODATE (objDate as Object) as Object If objDate Is Nothing OrElse objDate Is System.DBNull.Value Then CONVERTNUMBERTODATE = System.DBNull.Value Else CONVERTNUMBERTODATE = new DateTime(Left(objDate.ToString(),4) , Mid(objDate.ToString(),5,2), Right(objDate.ToString(),2)) End if End Function
■2:
各レプリケーションのプロパティから、マッピング画面を開き、対象のマッピングを右クリックして「関数へのマッピング」を選択します。
■3:
CONVERTNUMBERTODATE関数を入力します。
例:CONVERTNUMBERTODATE([DATETIME])
■4:
OKを押せば設定完了です。念のため正常に動作するか確認してください。
なお、この逆に、日時型フィールドのデータを数値型フィールドに日時形式で挿入させることも可能です。
以下のCONVERTDATETONUMBER関数を同じ手順で設定します。
※シンクロナイゼーション時の場合はサポートフォームよりお問い合わせください。
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
関連したトピックス
- [DBMoto][スクリプト]カラムを結合・分割したレプリケーション
- ジュリアンデートのレプリケーション【リアルタイムレプリケーションツールDBMoto】
- レプリケーションの際にnullを特定の値に変換する方法 その1【リアルタイムレプリケーションツールDBMoto】
- レプリケーションの際にnullを特定の値に変換する方法 その2【リアルタイムレプリケーションツールDBMoto】
- Syniti Data Replication (旧DBMoto)でのスクリプトの書き方②:グローバルスクリプト
- [Syniti(旧DBMoto)]レコード競合(コンフリクト)発生時のレコード内容を出力する方法
- [DBMoto]関数を使用してレプリケーション時のデータを変換する方法(VB/C#言語選択、関数適用、ユーザ関数作成、置換関数、一括設定手順)
- Syniti Data Replication (旧DBMoto)でのスクリプトの書き方③:グローバルスクリプト用の関数とイベント
- 外部DLL(COM)の使用方法【リアルタイムレプリケーションツールDBMoto】
- 双方向レプリケーション時のコンフリクト回避オプション【リアルタイムレプリケーションツールDBMoto】