使っているクラウドなどの小ネタ Advent Calendar 2024 19日目
画面のボタンからApexのクラスをコールするようにして実行すると問題なく機能します。
ただし、Apexバッチに組み込んで使うと下記のエラーになります。
You have uncommitted work pending. Please commit or rollback before calling out
まさにここで解説されているとおりの内容
なんのための制限かわかりませんが、(コールアウト実行 → 結果をリストやマップなどに保持)を繰り返す → レコード更新 とする必要があります。
最終的な対応
バッチ処理で使えるように一括処理を考慮したコードに書き直しました。
public static String calljobcan_org2(List<Jobcan053__c> j53List) {
if (j53List == null) return '';
Map<String,String> saveBodyMap = new Map<String,String>();
for (jobcan053__c j53 : j53List){
String stBody = callout_org(j53);//ここでコールアウトさせて、Jsonを得る
saveBodyMap.put(j53.Id,stBody);//Mapに保存する
}
List<Jobcan053__c> updateJ53List = new List<Jobcan053__c>();
for (jobcan053__c j53 : j53List){
String stBody = saveBodyMap.get(j53.Id);
if (stBody != null) {
//Jsonを使ってオブジェクトに値をセットする
Jobcan053__c j53new = createJobcan053(j53.Id,stBody);
updateJ53List.add(j53new);//結果はListに保存する
}
if (updateJ53List.size() >0) update updateJ53List;//一括更新
}
return '';
}