tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:添付ファイルのデータ移行

添付ファイルのデータ移行でちょっとハマってしまったので移行方法をまとめておくことにしました。

はじめに

添付ファイルのデータ移行を行う場合はレコードの情報の他に実際にアップロードするファイルをローカル上に用意する必要があります。ウィークリーエクスポート機能でローカルにダウンロードすることができるのですが、この機能だと条件指定ができないので一度に全件ダウンロードされてしまう問題があります。

その問題を回避するため今回はAppExchangeにあるFileExporterを使用する方法で進めたいと思います。

FileExporterの基本的な使い方についてはこちらです。

AppExchange:FileExporterつかってみました
http://tyoshikawa1106.hatenablog.com/entry/2013/08/22/205301

データ移行検証の前提条件

今回は「AttachmentBeforeObject」に紐付く添付ファイルを「AttachmentAfterObject」に移行するという前提で進めます。
「AttachmentBeforeObject」と「AttachmentAfterObject」は外部ID項目「External ID」をキーに紐付けを行います。

対象レコードはそれぞれ2件ずつ用意しました。

AttachmentBeforeObject
f:id:tyoshikawa1106:20130826232850p:plain

f:id:tyoshikawa1106:20130826232914p:plain

AttachmentAfterObject
f:id:tyoshikawa1106:20130826232933p:plain

f:id:tyoshikawa1106:20130826232940p:plain

移行前なので「AttachmentAfterObject」に紐付く添付ファイルは0件の状態となります。

ツールの準備

最初に以下のツールを準備します。

  • FileExporter
  • データローダ 17.0
  • ファイルパス取得マクロ
  • 移行データ加工用EXCELファイル

ファイルパス取得マクロと移行データ加工用EXCELファイルはGitHubにアップしてあるので下記リンク先からダウンロードできます。

GitHub:tyoshikawa1106/AttachmentDataMigration
https://github.com/tyoshikawa1106/AttachmentDataMigration

※データローダのバージョンは17.0を使用してください。

※ダウンロードしたWorkフォルダはCの直下にある前提で進めたいと思います。

※FileExporterもWorkフォルダ内にある前提で進めていきます。

※フォルダパスを取得するマクロについては下記サイトを参考にさせて頂きました。

サブフォルダを含めてファイル一覧を取得する(WSHでDirコマンドを実行)
http://www.moug.net/tech/exvba/0060087.html

FileExporterで添付ファイルのダウンロード

必要なツールの準備が終わったらFileExporterで添付ファイルのダウンロードを行います。まずは取得条件の設定から行います。

取得条件の設定はFileExporterフォルダ内のbeans.xmlで行います。
1行目のwhereClauseで指定しているのが共通で使用されるWhereの条件です。
f:id:tyoshikawa1106:20130827003352p:plain

上で指定した条件の場合はAttachmentBeforeObjectに紐付く添付ファイルのみ取得するようになっています。ここを必要に応じて変更することで任意のレコードのみを取得することができます。

条件の設定が終わったら、+FileExporter.batを実行して添付ファイルをダウンロードします。ダウンロードされた添付ファイルはExported Attachmentsフォルダ内に保存されます。

f:id:tyoshikawa1106:20130827003836p:plain

f:id:tyoshikawa1106:20130827003846p:plain

これでFileExporterでの作業は完了です。

ファイルパスの取得

出力されたExported AttachmentsフォルダをWorkフォルダの直下に移動します。
f:id:tyoshikawa1106:20130827004217p:plain

GetFilePass.xlsmを起動します。
対象フォルダ欄にExported Attachmentsフォルダのパスを指定してファイル出力ボタンをクリックすると対象のファイル名とパスが出力されます。

f:id:tyoshikawa1106:20130827004355p:plain

データローダで既存レコードの取得

データ加工用に既存レコードをデータローダでエクスポートします。
対象オブジェクトは下記の3つです。

  • 添付ファイル
  • 移行元オブジェクト(AttachmentBeforeObject)
  • 移行先オブジェクト(AttachmentAfterObject)

データローダ実行時のクエリは以下の内容で実行しています。
添付ファイル
f:id:tyoshikawa1106:20130827004848p:plain

移行元オブジェクト
f:id:tyoshikawa1106:20130827004858p:plain

移行先オブジェクト
f:id:tyoshikawa1106:20130827004910p:plain


エクスポート後はAttachmentDataMigration.xlsxの対象シートに値を貼り付けます。
添付ファイル
f:id:tyoshikawa1106:20130827005121p:plain

移行元オブジェクト
f:id:tyoshikawa1106:20130827005207p:plain

移行先オブジェクト
f:id:tyoshikawa1106:20130827005239p:plain

ファイル名とパスの指定

AttachmentDataMigration.xlsxのファイル名とパスの欄にGetFilePass.xlsmで出力されたファイル名とパスを貼り付けます。これによりデータ移行に必要な情報がExcel関数で取得されます。

f:id:tyoshikawa1106:20130827005635p:plain

こんな感じで移行に必要なName項目などの値が自動でセットされます。
f:id:tyoshikawa1106:20130827005910p:plain

CSVシートに移行に必要な情報を貼り付け、名前つけて保存からCSVファイルとして保存します。作成されたCSVファイルをデータローダでINSERTすることでAttachmentAfterObjectに紐付く添付ファイルが登録されます。
f:id:tyoshikawa1106:20130827010405p:plain

f:id:tyoshikawa1106:20130827010727p:plain

移行先のオブジェクトに添付ファイルが紐付いています。
f:id:tyoshikawa1106:20130827010916p:plain

f:id:tyoshikawa1106:20130827010924p:plain


以上が添付ファイルのデータ移行を行う際の流れとなります。今回は添付ファイルを対象に実行していますが、コンテンツやドキュメントオブジェクトも同様の方法で移行できると思います。

追記

実際に使用した際にちょっとハマったことがあったのでそれについてもまとめてみました。

SFDC:FileExporterでハマった話
http://tyoshikawa1106.hatenablog.com/entry/2013/08/29/075158