最近あったSalesforce落とし穴

はじめに

この記事は チームスピリット Advent Calendar 2020 の16日目の記事です。

他の方々が面白い記事を書いているのでぜひご覧ください。

adventar.org

 

本題

タイトルのとおり、最近あった Salesforce でのコーディングミスについて書きます。

書くことで忘れないようにする自戒を込めた記事です。

f:id:mihoko_az:20201216205453p:plain

落とし穴のイメージ図

 

Apex から カスタムオブジェクトのレコードタイプを取得する場合、以下のようなコードが書いてありました。

String recordTypeId = [ SELECT Id FROM RecordType WHERE DeveloperName = 'TestA' and SObjectType = 'customObj1__c'].Id;

レコードタイプの取得方法はさまざまな方法があります。

今回は SOQL で、レコードタイプ名とカスタムオブジェクト名を条件にして取得していました。

このコード自体は間違っておらず、名前空間が存在しない環境では正常に動作します。

そう、名前空間が存在する環境で正常に動作しないのです。

カスタム オブジェクト名をリテラルで書いている箇所が問題です。

名前空間がある環境でのカスタムオブジェクト名は、namespace__customObj1__c というようになります。

名前空間がつくことを考慮して、カスタムオブジェクト名を指定する必要があります。

 

今回は以下のように修正しました。 

Schema を使ってオブジェクト名を取得するようにしました。

String recordTypeId = [ SELECT Id FROM RecordType WHERE DeveloperName = 'TestA' and SObjectType = :customObj1__c.sObjectType.getDescribe().getName()].Id;

 

🤔 🤔 🤔 

...今になると、SOQL でやらずに全て Schema で済ませてしまったほうがよかったのではないかと気づきました。

String recordTypeId = 
customObj1__c.sObjectType.getDescribe().getRecordTypeInfosByDeveloperName().get('TestA').getRecordTypeId();

 SOQL の発行回数の削減ができるので、こうすればよかったなぁ。

 

おわりに

ささいなことですが、ブログに書いてみたことで気付きがありました。

書いてみるものですねぇ。こういうのは素直に嬉しいです。

これに味を占めて、またアウトプットするようにします。

みなさまの失敗談、お待ちしています。