Salesforceで名寄せするためのツールを作成

## きっかけ

Salesforceってマージ機能はあるけど名寄せする候補の材料をシステム的に出力する機能はないな～と思いJavaですごく簡単な名寄せツール作ったときのメモ書き。

## ツールの内容

* Salesforceの取引先のデータをAPIで取得する
* Java1.8で取引先名が重複していたらファイル出力する→後は目視確認。

## 手順

### 1.WSCを使い自分の環境用のSalesforceのJarファイルを作成する

* Salesforceにログインして設定、APIからWSDLをダウンロード（名前をwsdl.xmlとつけた）
![sfdc1.png](https://qiita-image-store.s3.amazonaws.com/0/230829/74dcabe2-26b0-4d43-a666-0c7b2a5a84b7.png)

* 以下のサイトにアクセスしてプロジェクトのファイルをダウンロード
https://github.com/forcedotcom/wsc

* Eclipseを起動してダウンロードしたファイルをインポート
* 実行、Mavenビルドを選択してゴールPackageを入力してJar作成
![sfdc2.png](https://qiita-image-store.s3.amazonaws.com/0/230829/4e3858e8-daae-1270-cf1b-37c4b2b3fc54.png)

* 作成したら以下のコマンド入力。inputwsdlfileは上記でダウンロードしたWSDLファイルを指定する

```sh:Javaコマンド
java -jar target/force-wsc-42.0.0-uber.jar <inputwsdlfile> <outputjarfile>
例）java -jar target/force-wsc-42.0.0-uber.jar wsdl.xml original.jar
```

### 2.Eclipseでプロジェクト作成

* Eclipseで新規プロジェクト作成、Mavenプロジェクトを選択

* 上記で作成したjarファイルをプロジェクトに配置する
　（今回、libファイルを作成してその直下においた）
![sfdc3.png](https://qiita-image-store.s3.amazonaws.com/0/230829/42c43a9b-82c9-3bcf-aa4e-200518b54cc7.png)

* pom.xmlに上記で作成したJarと関連ライブラリを追加する

```xml:pom.xml
<dependency>
	<groupId>net.original</groupId>
	<artifactId>originalJar</artifactId>
	<version>1.0</version>
	<scope>system</scope>
	<systemPath>${basedir}/lib/original.jar</systemPath>
</dependency>
<dependency>
	<groupId>com.force.api</groupId>
	<artifactId>force-wsc</artifactId>
	<version>42.0.0</version>
</dependency>
<dependency>
	<groupId>com.force.api</groupId>
	<artifactId>force-partner-api</artifactId>
	<version>42.0.0</version>
</dependency>
```
* public static void mainに以下のメソッドを追加

```java:App.java
package sfdc.api;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Calendar;

import com.sforce.soap.enterprise.EnterpriseConnection;
import com.sforce.soap.enterprise.QueryResult;
import com.sforce.soap.enterprise.sobject.Account;
import com.sforce.soap.enterprise.sobject.SObject;
import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;

/**
 * Salesforce Connect
 *
 */
public class App
{
    public static void main( String[] args )
    {
    	ConnectorConfig config = new ConnectorConfig();
    	config.setUsername("ログインID");
    	config.setPassword("パスワード＋セキュリティトークン");
    	// Soapサービスのバージョンは更新されるので以下のサイトを参考
    	// https://help.salesforce.com/articleView?id=000126966&language=ja&type=1
    	String soapEndpoint = "https://login.salesforce.com/services/Soap/c/40.0";
    	config.setAuthEndpoint(soapEndpoint);
    	System.out.println("\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");

       try {
    	   EnterpriseConnection connection = new EnterpriseConnection(config);
    	   QueryResult queryResults = connection.query("SELECT Id,Name,LastModifiedDate FROM Account Order by Name");
    	   SObject[] records = queryResults.getRecords();
    	   String beforeId = "";
    	   String beforeName = "";
    	   for(SObject record : records) {
    		   String name = ((Account) record).getName();
			   String id = ((Account) record).getId();
			   Calendar lastModifiedDate = ((Account) record).getLastModifiedDate();
	   		   System.out.println("sfid{" + id + "}");
			   if(name.equals(beforeName)) {
				   fileWriter("重複しています[" +  beforeName + "], sfid{" + beforeId + "}");
				   fileWriter("重複しています[" +  name + "], sfid{" + id + "}");
			   }
			   beforeId = id;
			   beforeName = name;
    	   }
    	   System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

    	} catch (ConnectionException ce) {
    	  ce.printStackTrace();
    	}
    }

    private static void fileWriter(String name) {
        try {
            File f = new File("nayose.txt");
            BufferedWriter bw = new BufferedWriter(new FileWriter(f, true));
            bw.write(name);
            bw.newLine();
            bw.close();
          } catch (IOException e) {
            System.out.println(e);
          }
    }
}

```

* Salesforceで重複したデータがある場合、実行すると以下のようなテキストが出力される

```
重複しています[田中太郎], sfid{0017F10xxxxxxxxxx}
重複しています[田中太郎], sfid{0015A02xxxxxxxxxx}
```