[Power Automate] DataLoaderの一括InsertをPADから実行する

ROBINコード

**REGION 定数定義
# パス定義:処理ファイル
SET FilePathInputData TO $'''C:\\works\\dataloader\\test\\csv\\data.csv'''
SET FilePathSuccessRecord TO $'''C:\\works\\dataloader\\test\\log\\success.csv'''
SET FilePathErrorRecord TO $'''C:\\works\\dataloader\\test\\log\\error.csv'''
SET FilePathResultLog TO $'''C:\\works\\dataloader\\test\\result\\result.log'''
# パス定義:バックアップファイル
SET BackupFilePathInputData TO $'''C:\\works\\dataloader\\history\\csv'''
SET BackupFilePathSuccessRecord TO $'''C:\\works\\dataloader\\history\\success'''
SET BackupFilePathErrorRecord TO $'''C:\\works\\dataloader\\history\\error'''
SET BackupFilePathResult TO $'''C:\\works\\dataloader\\history/result'''
**ENDREGION
**REGION DataLoader実行
File.ReadTextFromFile.ReadTextAsList File: FilePathInputData Encoding: File.TextFileEncoding.UTF8 Contents=> FileContents
SET InputRecordCount TO FileContents.Count - 1
@@copilotGeneratedAction: 'False'
Scripting.RunDOSCommand.RunDOSCommandAndFailOnTimeout DOSCommandOrApplication: $'''C:\\works\\dataloader\\test\\exec.bat''' Timeout: 60 StandardOutput=> CommandOutput StandardError=> CommandErrorOutput ExitCode=> CommandExitCode
**ENDREGION
**REGION 実行結果確認
File.ReadTextFromFile.ReadTextAsList File: FilePathSuccessRecord Encoding: File.TextFileEncoding.UTF8 Contents=> FileContents
SET SuccessRecordCount TO FileContents.Count - 1
File.ReadTextFromFile.ReadTextAsList File: FilePathErrorRecord Encoding: File.TextFileEncoding.UTF8 Contents=> FileContents
SET ErrorRecordCount TO FileContents.Count - 1
IF InputRecordCount = SuccessRecordCount THEN
    Display.ShowMessageDialog.ShowMessage Title: $'''【成功】処理完了''' Message: $'''インポート件数   :%InputRecordCount%
登録(成功)件数:%SuccessRecordCount%
登録(失敗)件数:%ErrorRecordCount%''' Icon: Display.Icon.Information Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed
ELSE
    Display.ShowMessageDialog.ShowMessage Title: $'''【失敗】一括登録完了''' Message: $'''インポート処理に失敗しました。
result.logを確認してください。

インポート件数   :%InputRecordCount%
登録(成功)件数:%SuccessRecordCount%
登録(失敗)件数:%ErrorRecordCount%''' Icon: Display.Icon.Information Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed
END
**ENDREGION
**REGION バックアップ移動
File.Move Files: FilePathInputData Destination: BackupFilePathInputData IfFileExists: File.IfExists.DoNothing MovedFiles=> MovedFiles
File.RenameFiles.RenameAddDateOrTime Files: MovedFiles[0] DateTimeToAdd: File.DateTimeToAdd.Current DateTimePosition: File.AddTextPosition.AfterName DateTimeSeparator: File.Separator.Underscore DateTimeFormat: $'''yyyyMMdd_hhmmss''' IfFileExists: File.IfExists.DoNothing RenamedFiles=> RenamedFiles
File.Move Files: FilePathSuccessRecord Destination: BackupFilePathSuccessRecord IfFileExists: File.IfExists.DoNothing MovedFiles=> MovedFiles
File.RenameFiles.RenameAddDateOrTime Files: MovedFiles[0] DateTimeToAdd: File.DateTimeToAdd.Current DateTimePosition: File.AddTextPosition.AfterName DateTimeSeparator: File.Separator.Underscore DateTimeFormat: $'''yyyyMMdd_hhmmss''' IfFileExists: File.IfExists.DoNothing RenamedFiles=> RenamedFiles
File.Move Files: FilePathErrorRecord Destination: BackupFilePathErrorRecord IfFileExists: File.IfExists.DoNothing MovedFiles=> MovedFiles
File.RenameFiles.RenameAddDateOrTime Files: MovedFiles[0] DateTimeToAdd: File.DateTimeToAdd.Current DateTimePosition: File.AddTextPosition.AfterName DateTimeSeparator: File.Separator.Underscore DateTimeFormat: $'''yyyyMMdd_hhmmss''' IfFileExists: File.IfExists.DoNothing RenamedFiles=> RenamedFiles
File.Move Files: FilePathResultLog Destination: BackupFilePathResult IfFileExists: File.IfExists.DoNothing MovedFiles=> MovedFiles
File.RenameFiles.RenameAddDateOrTime Files: MovedFiles[0] DateTimeToAdd: File.DateTimeToAdd.Current DateTimePosition: File.AddTextPosition.AfterName DateTimeSeparator: File.Separator.Underscore DateTimeFormat: $'''yyyyMMdd_hhmmss''' IfFileExists: File.IfExists.DoNothing RenamedFiles=> RenamedFiles
**ENDREGION

Exec.bat

cd C:\works\dataloader\test
"C:\Program Files (x86)\Salesforce\dataloader_v60.0.1\bin\process.bat" ./ TestDataInsert ./ > result/result.log

Process-conf.xml

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" 
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
  <bean id="TestDataInsert"
      class="com.salesforce.dataloader.process.ProcessRunner"
      scope="prototype">
    <description>Let's Insert!</description>
    <property name="name" value="TestDataInsert"/>
    <property name="configOverrideMap">
       <map>
         <!-- SalesforceのURL「https://...salesforce.com -->
         <entry key="sfdc.endpoint" value="★"/>
         <!-- ログイン用のメールアドレス -->
         <entry key="sfdc.username" value="★"/>
         <!-- ログイン用のパスワード(暗号化) -->
         <entry key="sfdc.password" value="★"/>
         <!-- エンティティ -->
         <entry key="sfdc.entity" value="Case"/>
         <!-- 区分:登録 -->
         <entry key="process.operation" value="insert"/>
         <!-- 読み書き:csvから読み取り -->
         <entry key="dataAccess.type" value="csvRead"/>
         <!-- 暗号鍵へのファイルパス -->
         <entry key="process.encryptionKeyFile" value="C:/works/dataloader/test/key/sample.key"/>
         <!-- 登録データへのファイルパス -->
         <entry key="dataAccess.name" value="C:/works/dataloader/test/csv/data.csv"/>
         <!-- ケースマッピングへのファイルパス -->
         <entry key="process.mappingFile" value="C:/works/dataloader/test/map/test.sdl"/>
         <!-- 実行結果のファイルパス -->
         <entry key="process.outputSuccess" value="C:/works/dataloader/test/log/success.csv"/>
         <entry key="process.outputError" value="C:/works/dataloader/test/log/error.csv"/>
         <entry key="sfdc.debugMessagesFile" value="C:/works/dataloader/test/log/trace.log"/>
         <entry key="sfdc.debugMessages" value="true"/>
         <!-- タイムアウト秒 -->
         <entry key="sfdc.timeoutSecs" value="10"/>
         <!-- ロールバック件数 -->
         <entry key="dataAccess.writeBatchSize" value="1000"/>
         <!-- 余計なログファイルの出力を防止 -->
         <entry key="process.enableLastRunOutput" value="false"/>
         <entry key="process.initialLastRunDate" value="2005-12-01T00:00:00.000-0800"/>
         <entry key="sfdc.externalIdField" value="Oracle_Id__c"/>
     </map>
   </property>
</bean>
</beans>

フォルダ構造

C:/works/dataloader
├─history
│ ├─csv
│ ├─error
│ ├─result
│ └─success
└─test
 ├─csv
 ├─key
 ├─log
 ├─map
 └─result

フロー一覧

1分解説

ほとんどが変数定義、ファイル移動であるため正味の処理はバッチを叩いているだけである。
バッチを実行すると「log4j」などのファイルが自動で作られるため、PAD側で削除してもいいかもしれない。