Talend + JDBC Driver で Microsoft Access のマスターを Salesforce Sales Cloud に同期

# はじめに
本資料は CData Software 社の JDBC Driver 及び、Talend 社の Talend Open Studio を利用してコーディングを行うことなく、Microsoft Access から Salesforce Sales Cloud (以下、Salesforce) 上のデータを更新する手法を説明しています。

![model_salesforce.PNG](https://qiita-image-store.s3.amazonaws.com/0/333450/a1bc805b-fa26-d989-ca2f-fdddec8f7bbe.png)

データ更新を行うシナリオとして、上図のように Talend + JDBC Driver にて Access のマスタデータを取得し、Salesforce の User オブジェクトの住所、氏名、携帯番号を更新する例を説明します。

# 検証環境
以下の環境にて検証を行っています。

 * Windows 10 Home バージョン 1803
 * Microsoft Access for Office 365 (64bit)
 * Java SE Runtime Environment 8 (1.8.0_181)
 * Talend Open Studio for Data Integration 6.5.1
 * CData JDBC Driver
  - CData JDBC Driver for Salesforce 2018J
  - CData JDBC Driver for Access 2018J

Microsoft Access (以下、Access) 及び、Java SE Runtime Environment 8 についてはインストール済みという前提で今後の説明を進めさせていただきます。
また、Access に関しては下記から Office 365 を取得し、1か月間に限り無料試用することも可能です。

 * https://products.office.com/ja-jp/try

# CData JDBC Driver for Salesforce インストール
1. 以下のサイトから Salesforce 用の CData JDBC Driver をダウンロードします。
 * https://www.cdata.com/jp/drivers/salesforce/download/jdbc/

2. ダウンロードしたファイルを任意の場所に展開し、コマンドプロンプトにて下記のコマンドを実行してください。
![JDBC_Salesforce_1.png](https://qiita-image-store.s3.amazonaws.com/0/333450/58d85886-912f-7b21-d83d-ab45c0be06c8.png)

3. インストーラーが起動しますので、必要な設問に回答し、インストールを完了させてください。


# CData JDBC Driver for Access インストール
1. 以下のサイトから Access 用の CData JDBC Driver をダウンロードします。
 * https://www.cdata.com/jp/drivers/access/download/jdbc/

2. ダウンロードしたファイルを任意の場所に展開し、コマンドプロンプトにて下記のコマンドを実行してください。
![JDBC_Access_1.png](https://qiita-image-store.s3.amazonaws.com/0/333450/63b9c82a-2e61-7afa-150e-283dc477b926.png)

3. インストーラーが起動しますので、必要な設問に回答し、インストールを完了させてください。

# Talend Open Studio インストール
Talend Open Studio の最新バージョンは 7.1.1 ですが、この版ではDB接続のタイプとして "General JDBC" が存在しないため、以下のサイトから Talend Open Studio for Data Integration 6.5.1 をダウンロードし、任意の場所に展開してください。

 * https://ja.osdn.net/projects/sfnet_talend-studio/downloads/Talend%20Open%20Studio/6.5.1/TOS_DI-20180116_1512-V6.5.1.zip/

# Salesforce Sales Cloud 開発者アカウントの取得
[Salesforce Sales Cloud 開発者アカウント、および、セキュリティトークン取得方法](https://qiita.com/kuwazzy/items/68bc7c4a5b36721cfe83)
を参考に 、Salesforce 開発者アカウント、および、セキュリティトークン取得方法を取得してください。
Salesforce には無償で利用できるライセンスとして「30日間の無償評価版」と、「開発者ライセンス」の2種類がありますが、「30日間の無償評価版」は、APIの利用制限があるため、「開発者ライセンス」を取得します。

# Access から Salesforce のデータ更新 事前準備

1.　Talend Open Studio を起動します。先ほど展開したフォルダ配下の TOS_DI-20180116_1512-V6.5.1\TOS_DI-win-x86_64.exe を起動します。

2.　下記の画面が表示されますので、"x" を押してください。
![Talend_Salesforce_1.png](https://qiita-image-store.s3.amazonaws.com/0/333450/b51731ff-bb26-f6b7-4af1-ea6b4979c3f7.png)

3.　下記の画面が表示されますので、"リポジトリ" の "ジョブ" を右クリックし、"ジョブの作成" を選択してください。
![Talend_Salesforce_2.png](https://qiita-image-store.s3.amazonaws.com/0/333450/09f10f77-44bc-d9ed-b6ef-9696c89f13ae.png)
![Talend_Salesforce_3.png](https://qiita-image-store.s3.amazonaws.com/0/333450/bd9c9e17-035e-6f18-316c-6c8399b49d83.png)

4.　下記の画面が表示されますので、"名" を入力(ここでは "TrialSalesforce1" とします)し、"Finish" ボタンを押してください。
![Talend_Salesforce_4.png](https://qiita-image-store.s3.amazonaws.com/0/333450/7f8361ec-6c15-98ed-ee67-779b08201aa8.png)

5.　下記のように画面が表示されます。
![Talend_Salesforce_5.png](https://qiita-image-store.s3.amazonaws.com/0/333450/635190c9-1b70-2a4c-7867-88051cabb8f7.png)

6.　次に Salesforce 用の JDBC接続を作成します。"リポジトリ" の "DB接続" を右クリックし、"DB接続の作成" を選択してください。
![Talend_Salesforce_6.png](https://qiita-image-store.s3.amazonaws.com/0/333450/6407f472-510a-4b9f-c38a-f47c97ef9e32.png)

7.　下記の画面が表示されますので、"名" を入力(ここでは "JDBC_Salesforce" とします)し、"Next" ボタンを押してください。
![Talend_Salesforce_7.png](https://qiita-image-store.s3.amazonaws.com/0/333450/092bc181-e140-c9af-224f-6f986d8879f1.png)

8.　下記の画面が表示されますので、"DBタイプ" として "General JDBC" を選択してください。
![Talend_Salesforce_8.png](https://qiita-image-store.s3.amazonaws.com/0/333450/136e71ab-3ec4-cd51-6b1a-0b778865513a.png)

9.　下記の画面が表示されますので、それぞれ次のように設定してください。
![Talend_Salesforce_9.png](https://qiita-image-store.s3.amazonaws.com/0/333450/ceed2ae3-7ce1-ed96-5110-605b71e40417.png)
<dl>
<dt>JDBC URL
  <dd>[Salesforce Sales Cloud 開発者アカウントの取得](#salesforce-sales-cloud-開発者アカウントの取得) にて作成した"ユーザ"、"パスワード"、"APIトークン"を用いて下記の文字列を作成し、設定してください。
```jdbc:salesforce:User=ユーザ;Password=パスワード;SecurityToken=トークン;```<br>
<dt>ドライバJar
  <dd>"外部モジュール" を選択し、"追加" ボタンを押し、先の [CData JDBC Driver for Salesforce インストール](#cdata-jdbc-driver-for-salesforce-インストール) でインストールしたパスから lib\cdata.jdbc.salesforce.jar を選択した後、"OK" ボタンを押してください。<br>
<dt>クラス名
  <dd>"cdata.jdbc.salesforce.SalesforceDriver" を選択してください。<br>
<dt>ユーザー名
  <dd>[Salesforce Sales Cloud 開発者アカウントの取得](#salesforce-sales-cloud-開発者アカウントの取得) にて設定したユーザを入力してください。<br>
<dt>パスワード
  <dd>[Salesforce Sales Cloud 開発者アカウントの取得](#salesforce-sales-cloud-開発者アカウントの取得) にて設定したパスワードを入力してください。<br>
</dl>

10.　"Finish" ボタンを押してください。
![Talend_Salesforce_10.png](https://qiita-image-store.s3.amazonaws.com/0/333450/5cc60978-1c6e-3025-4614-854573f1e951.png)

11.　"リポジトリ" の "メタデータ"、"DB接続" の下に "JDBC_Salesforce" が作成されますので、右クリックし、"スキーマ情報の取得" を選択してください。
![Talend_Salesforce_12.png](https://qiita-image-store.s3.amazonaws.com/0/333450/525f4489-6673-f8e9-bf92-cd510659b0d1.png)

12.　下記の画面が表示されますので、"Next" ボタンを押してください。
![Talend_Salesforce_13.png](https://qiita-image-store.s3.amazonaws.com/0/333450/f8e81c19-9574-853d-cdb2-f640b8323f84.png)

13.　"名" を展開し、"User" テーブルをチェックし、"Next" ボタンを押してください。
![Talend_Salesforce_14.png](https://qiita-image-store.s3.amazonaws.com/0/333450/6ae76cd4-5370-eb86-b771-fcc255d07e57.png)

14.　下記の画面が表示されますので、"Finish" ボタンを押してください。
![Talend_Salesforce_15.png](https://qiita-image-store.s3.amazonaws.com/0/333450/315cd8c1-d1c8-6748-139c-5f3151d4b1e8.png)

15.　"リポジトリ" の "メタデータ"、"DB接続"、"JDBC_Salesforce"、"テーブル" の下に "User" オブジェクトが作成されていることを確認できます。
![Talend_Salesforce_16.png](https://qiita-image-store.s3.amazonaws.com/0/333450/fcf0c69c-ec8e-7db3-bbf5-7457cea2eb90.png)

16.　15. の "User" オブジェクトを右クリックし、"クエリの編集" を選択してください。
![Talend_Salesforce_17.png](https://qiita-image-store.s3.amazonaws.com/0/333450/28e80202-5387-1e64-6525-77efe9a5e9c3.png)

17.　下記の画面が表示されますので、青枠の "SQLの実行" を押してください。
![Talend_Salesforce_18.png](https://qiita-image-store.s3.amazonaws.com/0/333450/4aba04a3-5caa-556b-72f3-d2cf4445fa16.png)

18.　"クエリの結果" にアカウントの一覧が表示されますので、[Salesforce Sales Cloud 開発者アカウントの取得](#salesforce-sales-cloud-開発者アカウントの取得) にて作成したアカウントの "Id" フィールドの値を記録してください。
![Talend_Salesforce_19.png](https://qiita-image-store.s3.amazonaws.com/0/333450/207129cf-1f21-6398-c421-d2aaef22347e.png)

19.　次に Access を起動し、下記の形で "User" テーブルを作成してください。
![Talend_Salesforce_27.png](https://qiita-image-store.s3.amazonaws.com/0/333450/ed92ac34-57bf-1248-bd40-bb4b542b7db5.png)

<dl>
<dt>Id
<dd>主キー</dd>
<dd>データ型: 短いテキスト</dd>
<dd>フィールドサイズ: 18</dd>
<dd>値要求: はい</dd>
<dd>インデックス: はい(重複なし)</dd><br>
<dt>MobilePhone, State, City, LastName, FirstName
<dd>データ型: 短いテキスト</dd>
<dd>フィールドサイズ: 255</dd>
<dd>値要求: いいえ</dd>
<dd>インデックス: いいえ</dd>
</dl>
また、データとして下記の値を登録してください。
<dl>
<dt>Id
<dd>18. で記録した "Id" フィールドの値<br>
<dt>MobilePhone
<dd>任意の値 (ここでは "080-0000-0001" とします)<br>
<dt>State
<dd>任意の値 (ここでは "宮城県" とします)<br>
<dt>City
<dd>任意の値 (ここでは "仙台市青葉区" とします)<br>
<dt>LastName
<dd>任意の値 (ここでは "苗字" とします)<br>
<dt>FirstName
<dd>任意の値 (ここでは "名前" とします)<br>
</dl>

20.　Talend に戻り、Access 用の JDBC接続を作成します。"リポジトリ" の "DB接続" を右クリックし、"DB接続の作成" を選択してください。

21.　下記の画面が表示されますので、"名" を入力(ここでは "JDBC_Access" とします)し、"Next" ボタンを押してください。
![Talend_Salesforce_21.png](https://qiita-image-store.s3.amazonaws.com/0/333450/179a1e0c-f4df-2f2d-b1ed-e879c68e513a.png)

22.　"DBタイプ" として "General JDBC" を選択し、それぞれ次のように設定してください。
<dl>
<dt>JDBC URL
<dd>Access のデータファイルのパスを "DataSource" として下記の文字列を作成し、設定してください。下記の "DataSource" の値は例ですので、各自の環境に合わせて変更してください。また、パスの区切りは "\" ではなく、"\\" としてください。</dd>
<dd>```jdbc:access:DataSource=C:\\works\\Database1.accdb;```</dd>
<dt>ドライバJar
<dd>"外部モジュール" を選択し、"追加" ボタンを押し、先の [CData JDBC Driver for Access インストール](#cdata-jdbc-driver-for-access-インストール) でインストールしたパスから lib\cdata.jdbc.access.jar を選択した後、"OK" ボタンを押してください。<br>
<dt>クラス名
<dd>"cdata.jdbc.access.AccessDriver" を選択してください。<br>
</dl>

23.　"Finish" ボタンを押してください。
![Talend_Salesforce_22.png](https://qiita-image-store.s3.amazonaws.com/0/333450/3e42e069-457c-bb45-0e4e-c67dbb2fec80.png)

24.　"リポジトリ" の "メタデータ"、"DB接続" の下に "JDBC_Access" が作成されますので、右クリックし、"スキーマ情報の取得" を選択してください。
![Talend_Salesforce_23.png](https://qiita-image-store.s3.amazonaws.com/0/333450/a03da874-f04f-4274-7f33-ce61de77d696.png)

25.　下記の画面が表示されますので、"Next" ボタンを押してください。
![Talend_Salesforce_30.png](https://qiita-image-store.s3.amazonaws.com/0/333450/b8175cbf-1d5f-fac3-7510-7ec72236d84e.png)

26.　"名" を展開し、"User" テーブルをチェックし、"Next" ボタンを押してください。
![Talend_Salesforce_24.png](https://qiita-image-store.s3.amazonaws.com/0/333450/ed1007e7-79f4-c3d6-eb49-92b7be57d325.png)

27.　下記の画面が表示されますので、"Finish" ボタンを押してください。
![Talend_Salesforce_28.png](https://qiita-image-store.s3.amazonaws.com/0/333450/fce6042f-1537-9b29-8680-e8bbb30d724c.png)

28.　"リポジトリ" の "メタデータ"、"DB接続"、"JDBC_Access"、"テーブル" の下に "User" オブジェクトが作成されていることを確認できます。
![Talend_Salesforce_26.png](https://qiita-image-store.s3.amazonaws.com/0/333450/a0875162-6381-c6fd-3212-bfc8a0ab124e.png)

事前準備はここまでとなります。

# Access から Salesforce のデータ更新 ジョブの作成
ここでは Access から Salesforce のデータ更新を行う事例として、Salesforce の User オブジェクトの住所、氏名、携帯番号を変更するジョブを作成します。

1.　Talend の "メタデータ"、"DB接続"、"JDBC_Access"、"テーブル"配下の "User" オブジェクトをジョブ "TrailSalesforce1" へドラッグ & ドロップすると、コンポーネント選択ダイアログが表示されますので、"tJDBCInput" を選択し、"OK"ボタンを押してください。
![Talend_Salesforce_Job_1.png](https://qiita-image-store.s3.amazonaws.com/0/333450/d0c62fc1-3506-5b7b-b6f8-7d8c8f20076f.png)
![Talend_Salesforce_Job_2.png](https://qiita-image-store.s3.amazonaws.com/0/333450/cd2d30cc-205e-b80d-3017-3d980a6bdb14.png)

2.　次に、"メタデータ"、"DB接続"、"JDBC_Salesforce"、"テーブル"配下の "User" オブジェクトをジョブ "TrailSalesforce1" へドラッグ & ドロップし、コンポーネント選択ダイアログから "tJDBCOutput" を選択し、"OK"ボタンを押してください。
![Talend_Salesforce_Job_3.png](https://qiita-image-store.s3.amazonaws.com/0/333450/e99a51c9-a5c9-d163-769d-82698b9b8b1f.png)

3.　"Palette" から "tMap" オブジェクトをジョブ "TrailSalesforce1" へドラッグ & ドロップしてください。
![Talend_Salesforce_Job_4.png](https://qiita-image-store.s3.amazonaws.com/0/333450/7a835669-a29f-ff0c-d358-358205c7bce1.png)

4.　"JDBC_Access" の "User" オブジェクトをクリックすると、下記のように変化するので、青枠の部分をクリックし、先ほど追加した "tMap" オブジェクトまでドラッグ & ドロップしてください。
![Talend_Salesforce_Job_5.png](https://qiita-image-store.s3.amazonaws.com/0/333450/809028e2-e77b-6790-8141-1c1984f709ff.png)

5.　同様に "tMap" オブジェクトをクリックし、青枠の部分を "JDBC_Salesforce" の "User" オブジェクトまでドラッグ & ドロップしてください。出力名の入力を求められますので、"toSalesforce" と入力し、"OK" ボタンを押してください。その後、"ターゲットコンポーネントのスキーマを取得しますか ?" と問われますので、"Yes"ボタンを押してください。
![Talend_Salesforce_Job_6.png](https://qiita-image-store.s3.amazonaws.com/0/333450/87fae014-c2ae-d427-c100-2a138437c1fb.png)

6.　"JDBC_Salesforce" の "User" オブジェクトをクリックし、"コンポーネント" タブの "データ操作" を "更新" に変更してください。
![Talend_Salesforce_Job_7.png](https://qiita-image-store.s3.amazonaws.com/0/333450/dc548349-aca9-9ad4-8e13-fcbc0a0f392b.png)

7.　"tMap" オブジェクトをダブルクリックすると、下記の画面が表示されます。右側の "toSalesforce" のフィールドを "Id", "MobilePhone", "State", "City", "LastName", "FirstName" だけ残して削除してください。削除は右下のスキーマエディタにてフィールドを選択した後、赤×ボタンにて行います。
![Talend_Salesforce_Job_15.png](https://qiita-image-store.s3.amazonaws.com/0/333450/7068fccc-606c-e51b-50af-ac48de2bac3b.png)

8.　次に、右上の "自動マップ" を押し、"JDBC_Access" の "User" オブジェクトと "JDBC_Salesforce" の "User" オブジェクトの各フィールドの紐付けを行います。 紐付け後、"OK" ボタンを押すと、"変更を反映しますか ?" と問われますので、"Yes"ボタンを押してください。
![Talend_Salesforce_Job_16.png](https://qiita-image-store.s3.amazonaws.com/0/333450/b8771858-936c-c781-dd7f-f28647457a07.png)

9.　"実行" タブの実行ボタンを押してください。
![Talend_Salesforce_Job_10.png](https://qiita-image-store.s3.amazonaws.com/0/333450/b1a68dc4-a370-2631-4881-0e407a6bc3ab.png)
![Talend_Salesforce_Job_11.png](https://qiita-image-store.s3.amazonaws.com/0/333450/c50ef228-126f-a486-a83f-7b9155f3e6f2.png)

10.　エラーがなく実行が完了した際、[Salesforce Sales Cloud 開発者アカウントの取得](#salesforce-sales-cloud-開発者アカウントの取得) にて作成したアカウントにて、Salesforce にログインし、右上のアイコンをクリックし、"設定" を開きます。
![Talend_Salesforce_Job_13.png](https://qiita-image-store.s3.amazonaws.com/0/333450/37b329f1-5a44-5722-84ba-c1baa161f02e.png)

11.　"個人情報" の "姓"、"名"、"携帯"、"都道府県"、"市区群" の値が [Access から Salesforce のデータ更新 事前準備](#access-から-salesforce-のデータ更新-事前準備) の 19. にて設定した値にて更新されていることを確認します。
![Talend_Salesforce_Job_17.png](https://qiita-image-store.s3.amazonaws.com/0/333450/e5c2f113-1906-472c-35a5-6211ecaaac90.png)