1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

仕事で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クラスを継承する。


これからも追記予定

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?