当ブログではアフィリエイト広告を利用しています

設計 開発

【重要】設計・開発時・テストのレビュー観点(クリティカルな失敗を防ぐために)

クリティカルなものを備忘として残しておく。あとで整理

【重要】設計・開発時のレビュー関連(アンチパターン)

権限設計

①組織の共有設定、共有ルールを利用する前提で権限設定を行う場合、1オブジェクト当たり最大で300までの共有ルールしか設定できないことに注意が必要

サポートへ依頼することで、最大500まで拡張することは可能(エンティティごとの共有ルールの最大数の拡張)

公式のヘルプサイト:https://help.salesforce.com/s/articleView?id=000384485&type=1

ただし、共有ルールを大量に用いる場合は処理性能に影響が出る可能性が高いため性能要件も合わせて確認が必要

もし1オブジェクトあたり500以上のグループやユーザに対して共有ルールを設定する必要があるという場合でも拡張はできないため、個別に権限付与のSObjectのShareオブジェクトに対してレコードを生成するようなトリガーなどの処理を開発して対応が必要となります。

要件定義の段階で、必用な権限グループの総数は確認するようにしておきましょう。

データモデルの設計

①主従関係構築する際、1つの親レコードに対して、最大何件の子レコードが関連するか。

10万件を超過することが予想される、且つ、親レコードは削除処理の対象となることがある場合には、参照関係に変更できないか検討する。

※参照関係でも、カスケードオプションは付けないようにする必要がある!!

積み上げ集計などが必要な場合はトリガーやバッチ処理で代替することを検討したほうがよいです。

例えば、バッチ処理で、主従関係の子レコードを10万件以上削除したあとに、親レコードを削除しようとすると以下のようなエラーが発生します。

「Delete failed. First exception on row 0 with id a035h00000TE1BGXXX; first error: DELETE_OPERATION_TOO_LARGE, Cascade deleting too many records: occurring when cascading to」

カスケード削除(親と一緒に関連する子レコードなどを削除する)の場合に、削除対象のレコード数が多すぎて削除できない制約

Salesforceではカスケード削除は10万件までの上限でハードコーディングされているようで変更不可とのこと。

子レコード削除後は、ごみ箱に入って、完全に物理削除されるまで通常何日か必要です。その間は親レコードが削除できなくなるため、バッチ処理などで親子セットで削除すると親だけ最後に削除できず上記エラーが発生します。

ApexTrigger(トリガ)の設計・開発

注意ポイント

Apexバッチの設計・開発

注意ポイント

①大量データを扱うバッチ処理の中では、基本的に集計関数は利用しないこと

Startメソッドの中で、QueryLocatorの代わりにAggregateResultのIteratorなどを使っていないか。データが少量の場合は、成功するが大量の場合は、queryMore()が発生して以下のエラーが発生するので要注意!

「Aggregate query does not support queryMore(), use LIMIT to restrict the results to a single batch」

対方針:集計が必要な処理はSOQLの集計関数ではなく、For文などの繰り返し処理で計算させること。

フローの設計・開発

【画面処理フロー】

注意ポイント

①要素の割り当てが2000回を超過する繰り返し処理設計となっていないか

フローでは、要素の割り当てのガバナ制限があります。繰り返し処理で変数の割り当て処理が多い場合、以下のエラーが発生する可能性があります。

「お客様の組織はこの機能に対する最大限度を超えました。」

(対処方法)

上記エラーが出る場合は、要素の割り当て数を少なくするしかないため、大量データの加工などが必要な処理はフローではなく、トリガーまたは画面の開発を行う必要があります。

注意ポイント

②値の重複チェックを実施するときに不正な値が含まれていないかチェックしているか

フローのテキストコンポーネントに入力された値を使って、すでに登録済みのデータと重複チェックをする場合、テキスト前後の半角/全角SP(スペース)やタブをTrimしない状態で重複チェックをすると、SOQLでの検索では、スペースなどが含まれた状態で検索されるため重複とならないが、レコードを登録する(INSERT・UPSERTなど)の際には、自動的にトリムされるため重複エラー(DML Exception)が発生します。

例えば取引先番号"ACC123"のレコードが取引先に存在する場合に、画面で入力された” A123 "をSOQLで検索すると別の文字列のためレコードは検索されず重複なしと判断できます。

ただし、INSERT時には、Salesforceでは自動的に前後がトリムされるため"ACC123"としてレコードを登録しようとして重複エラーが発生します。

重複チェックをする項目については、上記が考慮された設計となっているかチェックする必要があります。

モバイルアプリケーションを利用する場合

注意ポイント

①以下、モバイルで制限されている機能を利用していないかチェック

・動的関連リスト(Summer22)を利用している場合、モバイルでは対応していないためタブが表示されなくなる(2022/7/7月時点の情報)

→(対策)標準の関連リストを利用もしくは、List Editorの利用 (こちらの記事を参考)

・Lightning web componentで開発した機能を呼び出すアクションを利用する場合、モバイルでは対応していない(2022/7/7月時点の情報)

→(対策)こちらについては、Aura Componentでアクションボタンを作成して、ラップすることで回避可能

 

上記のほかモバイルの考慮事項は、公式サイトで最新状況を確認してください。

-設計, 開発