Memos About Salesforce

Salesforceにハマってたこと!

Dataloader マッピングファイル 外部キー設定 参照項目の外部キー設定 Upsert

こんにちは、管理人の@Salesforce.Zです。

データローダ項目の対応付けの定義は公式サイトでも記載しており、

みんなできるかと思っております。

そして、バッチを設定、Dataloaderを動かし、「Insert」オペレーションを別の記事に記載したので、ご参考にどうぞう

中にはシンプルなマッピングファイルを書いてあります。

しかし、「Upsert」のオペレーションを試すには、外部キーの設定はどうしたらいいか、わからないよね?

読んだら得ること

★ バッチでDataloaderを動かしUpsertオペレーションのマッピングファイル設定

目次

Upsertオペレーション

サンプル構成ファイル

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="ContactUpsert"
        class="com.salesforce.dataloader.process.ProcessRunner"
        singleton="false">
        <description>AccountUpsert job gets the account record from the CSV file and inserts it into Salesforce.</description>
        <property name="name" value="ContactUpsert"/>
        <property name="configOverrideMap">
            <map>
                <entry key="sfdc.useBulkApi" value="true"/>
                <entry key="sfdc.debugMessages"
                        value="true"/>
                <entry key="sfdc.endpoint"
                        value="https://your_instans_name.salesforce.com"/><!-- csxx or APx-->
                <entry key="sfdc.username"
                        value="your_user_name@example.com"/>
                <entry key="sfdc.password"
                        value="your_secret_key_encrypt_with_your_pass_word"/>
                <entry key="process.encryptionKeyFile" 
                        value="F:\key.txt"/><!-- your secret key file path -->
                <entry key="sfdc.timeoutSecs"
                        value="600"/>
                <entry key="sfdc.loadBatchSize"
                        value="200"/>
                <entry key="sfdc.entity"
                        value="Contact"/><!-- you want to upsert object API name -->
                <entry key="process.operation"
                        value="upsert"/><!-- Upsert operation set -->
                <entry key="sfdc.externalIdField" value="ConNo__c"/><!-- set Contact or other object Foreign Key Field API Name -->
                <entry key="process.mappingFile" 
                        value="F:\contact_mappingfile_sample.sdl"/><!-- set you set mapping file path -->
                <entry key="dataAccess.name" 
                        value="F:\contact_data_.tsv"/><!-- you prepared tsv file for csv file path -->
                <entry key="process.outputSuccess" 
                        value="F:\logs\Contact_success.csv"/><!-- set you want to save success csv file out put path in your PC-->
                <entry key="process.outputError" 
                        value="F:\Contact_error.csv"/><!-- set you want to save error csv file out put path in your PC-->
                <entry key="dataAccess.type"
                        value="csvRead"/>
                <entry key="process.initialLastRunDate" 
                        value="2005-12-01T00:00:00.000-0800"/>
            </map>
        </property>
    </bean>
    <bean id="accountExtract"
          class="com.salesforce.dataloader.process.ProcessRunner"
          singleton="false">
      <description>csvAccountExtract job gets account info from salesforce and saves info a CSV file."</description>
        <property name="name" value="accountExtract"/>
        <property name="configOverrideMap">
            <map>
                <entry key="sfdc.entity" value="Account"/>
                <entry key="sfdc.extractionRequestSize" value="500"/>
                <entry key="sfdc.extractionSOQL" value="Select Id, Name FROM Account Where RecordType.DeveloperName = 'Kokyaku'/>
                <entry key="process.operation" value="extract"/>
                <entry key="dataAccess.type" value="csvWrite"/>
                <entry key="dataAccess.name" value="F:\Account_output_file.csv"/><!-- set you save extract account csv file out put path in your PC-->
            </map>
        </property>
    </bean>
    <bean id="accountUpdate"
          class="com.salesforce.dataloader.process.ProcessRunner"
          singleton="false">
        <description>Update Account job gets account info from salesforce and saves info a CSV file."</description>
        <property name="name" value="accountUpdate"/>
        <property name="configOverrideMap">
            <map>
                <entry key="sfdc.entity" value="Account"/>
                <entry key="process.operation" value="update"/>
                <entry key="process.mappingFile" value="F:\sdl\accountUpdateMap.sdl"/><!-- set your PC path :mapping sdl file-->
                <entry key="dataAccess.writeUTF8" value="true"/>
                <entry key="process.outputError" value="F:\log\Account_yyyymmdd_err.csv"/><!--set yourself path in your PC-->
                <entry key="process.outputSuccess" value="F:\logs\Account_yyyymmdd.csv"/><!--set yourself path in your PC-->
                <entry key="dataAccess.type" value="csvRead"/>
                <entry key="dataAccess.name" value="F:\Account_Data_file.csv"/><!--set yourself path in your PC-->
            </map>
        </property>
    </bean>
</beans>

サンプルマッピングファイル

#Account object:Foreign key Field is ForeignKey__c(Unique)
#This mappingfile is upsert contact data mapping
#Contact object:Foreign Key Field is ConNo__c(Unique & custom field),It will set at XML file with PARAMETER "sfdc.externalIdField"
#This file hava to UTF-8, Not UTF-8(BOM) or else, if so before "ForeignKey__c" May be exist ¥ then can not mapping and occur error
#【=】left is file header
#【=】right is salesforce contact field API
ForeignKey__c=Account:ForeignKey__c
ConNo__c=ConNo__c

サンプルバッチファイル

REM /D is move current directry between different drive opition
REM excute windows batch file have to move salesforce dataloader bin directry
cd /D "C:\Program Files (x86)\salesforce.com\Data Loader\bin" current directry have to exixt process.bat file, default is dataloader bin folder
REM repalece "F:\process-conf.xml" to your PC process-conf.xml path, repalce "AccountUpsert" to you want to operation name in process-con.xml file
call process.bat "F:\process-conf.xml" AccountUpsert

外部キー設定

process-conf.xmlファイルにある sfdc.externalIdFieldの部分が取引先責任者レコードの外部キーを設定する場所である

contact_mappingfile_sample.sdlファイルにある

ForeignKey__c=Account:ForeignKey__c

の部分が取引先責任者の参照項目:取引先(Account)への外部キーをマッピングする設定です。

カスタムオブジェクトの場合下記になります。

ForeignKey__c=CustomObject__r:ForeignKey__c

クエリはドット表記でアクセスするが、マッピングファイルでは、:表記になります。

クエリ例

標準オブジェクトクエリ例
Select Id, Name, Account.Name From Contact
カスタムオブジェクトクエリ例
Select Id, Name, ParentCustomObject__r.Name From CustomObject__c

バッチファイルの拡張

upsertすると、成功csvログや失敗csvログの名前はprocess-conf.xmlファイルでは、固定にしているが

名前を変えることもできる、antを使用しない前提では、rename file nameでやるしかないかと思います。

REM /D is move current directry between different drive opition
REM excute windows batch file have to move salesforce dataloader bin directry
cd /D "C:\Program Files (x86)\salesforce.com\Data Loader\bin" current directry have to exixt process.bat file, default is dataloader bin folder
REM repalece "F:\process-conf.xml" to your PC process-conf.xml path, repalce "AccountUpsert" to you want to operation name in process-con.xml file
call process.bat "F:\process-conf.xml" ContactUpsert

上記のようにContactUpsertプロセスを実行後に指定したパス通りにログを吐き出すはずです。

改善版バッチファイル

REM /D is move current directry between different drive opition
REM excute windows batch file have to move salesforce dataloader bin directry
cd /D "C:\Program Files (x86)\salesforce.com\Data Loader\bin" current directry have to exixt process.bat file, default is dataloader bin folder
REM repalece "F:\process-conf.xml" to your PC process-conf.xml path, repalce "AccountUpsert" to you want to operation name in process-con.xml file
call process.bat "F:\process-conf.xml" ContactUpsert

rem 日付
set d=%date%
rem 時間
set t=%time: =0%

rem 日付時間:文字列
set timeyyyymmddhhmmss=^"%d:~-10,4%%d:~-5,2%%d:~-2,2%%t:~0,2%^%t:~3,2%^%t:~6,2%^"

cd /D F:\logs
REM ファイル名を別名にする
ren Contact_success.csv Contact_%timeyyyymmddhhmmss%_success.csv
ren Contact_error.csv Contact_%timeyyyymmddhhmmss%_err.csv

リファレンス

Dataloader自動設定例 Dataloader自動化 insert

Excel csvファイルの日付項目

データローダで、csvファイルを用いて、データを登録する場合、日付項目はややこしくて、

yyyy-mm-ddT00:00:00.000Zの形でデータを用意しないと登録できないため、

下記のExcel数式は参考になるかもしれない

A1に日付データが入っている場合、

=text(A1,"yyyy")&"-"&text(A1,"mm")&"-"&text(A1,"dd")&"T00:00:00.000Z"