Salesforce エンジニア初心者がハマった事・注意すべき事


仕事でSalesforce上に外部向けサイトをつくる必要がありました。
(Java経験はありましたが)Salesforceに関してはまったくの初めてだったので、ハマった事や注意すべき事をまとめていきます。

レコードタイプIDを取得する際はスキーマを使う

Apexからオブジェクトに対してDMLを発行する際や、ヒープやCPUサイズ等に ガバナ制限 というものが関わってくる。
これはトランザクション単位でカウントされ、これらの制限を超えるとアプリケーションエラーとなる。

(基本的にアプリケーション実行中は開発者コンソールのログから、ガバナ制限を確認しながら開発を進めた方がよい)

特に気をつける点としては、繰り返し処理内のDMLで、動的にレコードタイプを検索した上でオブジェクト参照するパターンが起こり得ると思います。
そのため、レコードタイプを検索する場合は、次のように スキーマ を使うことでガバナ制限を増やさずにレコードタイプIDを取得することができました。

public ID getRecordTypeId(String objName, String recordTypeName) {
    return Schema.getGlobalDescribe().get(objName).getDescribe().getRecordTypeInfosByDeveloperName().get(recordTypeName).getRecordTypeId();
}

オブジェクト削除する際の権限について

オブジェクトを作成・編集・削除する際は実行ユーザの権限によって大きく影響されます。

権限によっては参照権限もつかないため、アプリケーション上で次のエラーが発生します。

first error: INSUFFICIENT_ACCESS_OR_READONLY, ...

この問題を解決する簡単な方法ですが、システム権限を付与してしまうことです。(ただし外部向けアプリケーションの場合は、逆に意図せずデータを書き換えてしまう可能性があるため、そのへんは留意)

WithoutSharing ws = new WithoutSharing();
ws.insertNewCase(newCase, dmo);

private without sharing class WithoutSharing {
    public void insertNewCase(Case newCase, Database.DMLOptions dmo) {
        database.insert(newCase, dmo);
    }
}

WithoutSharingクラスを継承する。


これからも追記予定