1. Map<Id, List<sObject>>の使い方
Mapに入れてるListの取り出し方とかputの仕方とかを良く忘れるのでメモ。
Map<Id, List<sObject>> map = new Map<Id, List<sObject>>();
for (sObject s : newObjs) {
String key = s.Id;
if (!map.containsKey(key)) map.put(key, new List<sObject>());
map.get(key).add(s);
}
2. バッチ実行中にカウントデータを引き継ぎたい
うっかり忘れてインスタンス変数が毎度リセットされてしまってはまることがある。
Database.Statefulを忘れてはいけない(戒め)。
global class batchName implements Database.Batchable<sObject> , Database.Stateful {
private Integer errCount;
}
3. 特定の権限がないユーザで実行してエラー
with sharingでシステム管理者以外のユーザで実行してから不具合に気が付くことがある。
共有設定回りはwith sharingにするかwithout sharingにするかきちんと考える。
Spring'19からはInherited Sharingも使用可能に。
4. トリガの中で入力チェックする
Trigger.isBeforeでaddErrorするとエラーにできる。
for (sObject s : Trigger.new) {
s.addError('errorMessage');
}
プロセスビルダーと相性が悪いので設計はきっちりと。
5. VFのApexタグを使用している要素のIdの取得
要素の順番で":"区切りでIdが設定されるので後方一致で検索すると取得でききる。
$("input[id$='idName']")
apex:repeatしている場合、Idの前に項番が付く(0:idName、1:idName、2:idName~)。
覚えておくとjavascriptで処理をするときにたまに役立つ。
6. Lightningコンポーネントの表示切替とか
フラグの切り替えとかを手なりでsetCallbackの後ろに書いたりするとCallbackの前に呼ばれて意図しない動きになるので注意が必要。ちゃんと処理の順番を考える。
7.クエリに必要な項目の全取得
オブジェクトのスキーマ情報を取得して全項目をクエリに含めてreturnする。
親子やサブクエリが作りたい場合はとりあえず第2引数で渡す形に。
public static String getQueryString(String objectName) {
return getQueryString(objectName, new List<String> ());
}
public static String getQueryString(String objectName, List<String> addColumns) {
String fields = '';
String comma = '';
// Fieldマップ取得
Map<String, Schema.SObjectField> fieldMap = Schema.getGlobalDescribe().get(objectName).getDescribe().fields.getMap();
for(Schema.SObjectField item : fieldMap.values()) {
fields += comma + item.getDescribe().getName();
comma = ',';
}
// 追加項目を設定
for (String item : addColumns) { fields += comma + item; }
return 'SELECT ' + fields + ' FROM ' + objectName;
}
権限とか意識するならこちらの記事がきれいでした。
これからも忘れては調べというのを繰り返す気がするので何度も忘れるようなものはメモしたいところ。