SOAP API(wsc)で地理位置情報型や時間型を扱う #salesforce

Advent Calendarの季節になりましたね。世のエンジニアの1年間のノウハウが放出されるイベント、楽しみです。

さてそんな中、Advent Calendarとまったく関係のない記事になりますw(エントリを逃したとも言う…)

SFDC謹製のJavaAPIクライアントであるWSC (Force.com Web Service Connector)を使って、ちょっとクセのある(?)「地理地情報型(Location)」や、Summer'17でパイロットリリースされた「時間データ型(Time)」を操作する時のやり方についてのメモです。

地理位置情報型・時間型の扱い方

先に結論ですが、それぞれ以下のように扱うことで、利用できます。

  • 地理位置情報型
    • 緯度と経度を別々に扱えばOK。例えば項目のAPI参照名が FooLocation__c の場合は、 緯度が FooLocation__Latitude__s, 経度が FooLocation__Longitude__s のようになる
  • 時間型
    • "00:00:00.000Z" の形式

地理位置情報型、以下のIssueにある通り、少し前まではダウンロードしてきたWSDLに手を加えないと使えなかったのですが、今は直っているみたいですね*1

github.com

また、時間データ型についてはベータなので、今後変更になる可能性もある気もしますが、現時点での結果ということで…。

サンプルコード

レコード1件をINSERTする場合の例。

public class Sample {

    private static final Logger log = LoggerFactory.getLogger(Sample.class);

    public static void main(String... args) throws Exception {
        ConnectorConfig config = new ConnectorConfig();
        config.setUsername("[ログイン名]");
        config.setPassword("[パスワード]");

        PartnerConnection connection = Connector.newConnection(config);
        
        SObject obj = new SObject("Hoge__c");
        obj.setField("Name", "test");
        obj.setField("Time1__c", "12:00:00.000Z"); // これで 12:00 として時間が登録される
        obj.setField("Location1__Latitude__s", "35.1");
        obj.setField("Location1__Longitude__s", "135.2");

        SaveResult[] results = connection.create(new SObject[]{obj});

        for (SaveResult result : results) {
            log.info("{} {} {}", result.getId(), result.getSuccess(), result.getErrors());
        }
    }
}

実行環境

  • Java 8
  • WSC : "42.0.0" タグ
  • Partner WSDL : API Version 41.0

*1:しれっと会社のGitHubアカウントで +1 していますが。