【Salesforce】【資格】デベロッパー勉強メモ：プロセスの自動化とロジック①

デベロッパー試験勉強時にまとめたメモ書きです。内容が間違っていたら優しくご指摘ください。
他投稿は[デベロッパー試験に関する記事](#デベロッパー試験に関する記事)からどうぞ。

**あくまでも個人のメモ書きなので信用しすぎてはいけません。**
[参考](#参考)にSalesforce公式ページを載せていますので、最新かつ正しい情報をご確認ください。

# SOQLとSOSL
・SOQLで取得できるデータの型
　　Integer
　　sObject、List<sObject>
　　AggregateResult
　　List<AggregateResult>　
・1 回のSOQLクエリに指定できるリレーションの数
　　子-親リレーションは55個以下 5レベル以下
　　親-子リレーションは20個以下 複数レベル不可

:::note info
Spring’21リリース　全項目取得
・FIELDS(ALL) - すべての項目を抽出
・FIELDS(CUSTOM) - すべてのカスタム項目を抽出
・FIELDS(STANDARD) - すべての標準項目を抽出
:::

・SOSLで取得できるデータの型
`List<List<sObject>>`

# 動的SOQLと動的SOSL　
・SOQLまたはSOSLを実行時に文字列として実行
　　動的SOQL：Database.query
　　動的SOSL：search.query
・SOQL/SOSLインジェクション対策
　　→escapeSingleQuotes()を使用する
　　→静的クエリとバインド変数を使用する

# ガバナ制限
1トランザクション内に下記のガバナ制限を超えると、処理がすべてロールバックされエラーとなる

| 種類 | 回数 | レコード数 |
|:-:|:-:|:-:|
|SOQL|100|50000|
|SOSL|20|2000(1回)|
|DML等※|150|10000|
|Database.getQueryLocator||10000|
|HTTPコールアウト|100||
|sendEmailメソッド|10||

※DML、Approval.process、database.emptyRecycleBin等

# Limitクラスのメソッド（すべて引数無し）
　getCpuTime()　現在のトランザクションで使用された Salesforce サーバの CPU 時間 (ミリ秒単位) を返す
　getDMLRows()　DML、Database.emptyRecycleBin()などで処理されたレコードの数を返す
　getLimitDMLRows()　DML、Database.emptyRecycleBin()などで処理できるレコードの合計数を返す
　getDMLStatements()　コールされた DML  (insert、update、または database.EmptyRecycleBin メソッドなど) の数を返す
　getLimitDMLStatements()　コールできるDMLまたは database.EmptyRecycleBin()の合計数を返す
　getQueries()　発行されたSOQLクエリの数を返す
　getLimitQueries()　発行できるSOQLクエリの合計数を返す
　getQueryRows()　SOQLクエリで返されたレコード数を返す
　getLimitQueryRows()　SOQLクエリで返すことができるレコードの合計数を返す

:::note info
　★get ＝ 処理された数
　　getLimit ＝処理できる数
　★Rowsなし　＝　回数
　　Rows ＝ レコード数
:::

# Databaseクラスのメソッド
　convertLead(leadToConvert, allOrNone★)　リード取引開始によって取引先、取引先責任者、(商談) を作成する
　executeBatch(batchClassObject)　指定したクラスの一括処理ジョブを送信する
　emptyRecycleBin(recordまたはlistOfSObjects)　ごみ箱から完全に削除する
　query(queryString)　SOQLクエリする
　setSavepoint()　戻り値（savepoint）は変数として保存可、rollback()でデータベースをその時点に復元できる
　rollback(databaseSavepoint)　savepoint変数で指定された状態に復元する　※メールも送信されない
　insert(recordsToInsert, allOrNone★)　作成
　update(recordsToUpdate, allOrNone★)　更新
　upsert(recordsToUpsert, externalIdField, allOrNone★)　外部IDまたはID更新、既存レコードがなければ作成
　merge(masterRecord, duplicateRecord)　重複レコードをマスタにマージ（関連レコードの親も変更）し、重複レコードを削除　　　　　　　　　　　　　　
　delete(recordIDs, allOrNone★)　削除
　undelete(recordsToUndelete, allOrNone★)　ごみ箱から復元
　★OKレコードのみコミットの場合は`false`

:::note info
OKレコードのみインサートされるのは、、
　✕　Insert records
　✕　Database.Insert(records,true)
　〇　Database.Insert(records,false)
:::


# Exceptionクラス 組み込み例外
　AsyncException　非同期コールのエンキュー失敗など、非同期処理に関する問題を示す例外
　BigObjectException　Big Objectレコードに関する問題 (アクセスまたは挿入試行中の接続タイムアウトなど)
　CalloutException　外部システムへのコールアウトの失敗など、Web サービス処理に関する問題を示す例外
　DmlException　insertでレコードの必要項目が欠落している場合など、DMLに関する問題を示す例外
　EmailException　送信の失敗など、メールに関する問題を示す例外
　ExternalObjectException　外部オブジェクトに関する問題 (外部システムへのアクセス試行中の接続タイムアウトなど)
　InvalidParameterValueException　無効なパラメータがメソッドに渡されたときの例外
　LimitException　ガバナ制限を超えたときの例外　**この例外はキャッチできません**
　JSONException　JSONの逐次化処理および並列化処理に関する問題を示す例外
　ListException　範囲外のインデックスへのアクセスなど、リストに関する問題を示す例外
　MathException　0による除算など、算術演算に関する問題を示す例外
　NoAccessException　アクセス権がないレコードへのアクセスなど、承認されないアクセスに関する問題を示す例外
　NoDataFoundException　削除されたレコードへのアクセスなど、存在しないデータに関する問題を示す例外
　NullPointerException　null参照
　TypeException　valueOf()を使用した文字列「a」の整数への変換など、型の変換に関する問題を示す例外
　QueryException　★SOQLクエリに関する問題を示す例外

★QueryException
　sObject単一変数に対する、レコードを返さないまたは複数レコードを返すクエリの割り当てで起こる
　``Account al = [SELECT Id FROM Account WHERE Name='存在しない名前'];``
　   →エラーになる　System.QueryException: List has no rows for assignment to SObject
　``List<Account> al = [SELECT Id FROM Account WHERE Name='存在しない名前'];``
　　→エラーにならない
　``Account al = [複数レコードが返るSOQL];``
　 →エラーになる　System.QueryException: List has no rows for assignment to SObject

★Exceptionクラスのメソッド
　getCause()　例外の原因を取得
　getLineNumber()　例外発生箇所の行番号を取得
　getMessage()　エラーメッセージを取得
　getStackTraceString()　スタック追跡を取得
　getTypeName()　DMLException、ListException、MathException などの例外種別を取得
　initCause(e)　原因を設定
　setMessage(msg)　エラーメッセージを設定

★Exceptionクラスのメソッド（特殊）
　getDmlFieldNames(Index of the failed record)　エラーレコードの原因となった項目を取得
　getDmlId(Index of the failed record)　エラーレコードのIDを取得 
　getDmlMessage(Index of the failed record)　エラーレコードに関するエラーメッセージを取得
　getNumDml()　エラーレコードの数を取得

★そのほか例外クラスについて
・例外クラスは、例外・カスタム例外の継承（extends）が必須です。
・例外クラス名の末尾には、exceptionをつける必要がある
・例外クラスは以下の4つの暗黙的なコンストラクタが組み込まれており、追加することも可能
　　引数のない例外　　　　　　　　　　　　``throw new MyException();``
　　エラーメッセージ　　　　　　　　　　　``throw new MyException('This is bad');``
　　Exception型　　　　　　　　　　　　　　``throw new MyException(e);``
　　エラーメッセージとException型　　　　　``throw new MyException('This is bad', e);``
　　※Exception型は原因の特定やスタック追跡ができる

# その他
・Apex変数
　　変数はブロックの任意の箇所で定義できる
　　平行ブロックは同じ変数名を付けれる
　　静的変数は一回のトランザクションのコンテキスト内に保持される
・共有
　　with sharing　　　共有ルールを考慮する
　　without sharing　　共有ルールを考慮しない
　　※内部クラスは外部クラスの共有設定を継承しない
　　※拡張クラスは親から共有設定を継承する
・for文
　　通常　``for (integer  i = 0 ; i < 10 ; i++ ) { /*code_block*/ }``
　　拡張　``for (Account acc : accs){/*code_block*/}`` 
　　　　　　　※ListやSetの要素数が不明な時は↑を使う
　　SOQL　``for (Account acc : [(SOQL)]){/*code_block*/}``
　　SOSL　``for (List<SObject> records : [(SOQL)]){/*code_block*/}``

# 参考
↓Salesforce公式の開発者ガイドやヘルプページなどのリンクになっています
[SOQLとSOSL](https://developer.salesforce.com/docs/atlas.ja-jp.232.0.apexcode.meta/apexcode/langCon_apex_SOQL.htm)
[動的 SOQL](https://developer.salesforce.com/docs/atlas.ja-jp.232.0.apexcode.meta/apexcode/apex_dynamic_soql.htm)
[ガバナ制限](https://developer.salesforce.com/docs/atlas.ja-jp.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_apexgov.htm)
[Limtクラス](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_limits.htm)
[Databaseクラス](https://developer.salesforce.com/docs/atlas.ja-jp.210.0.apexcode.meta/apexcode/apex_methods_system_database.htm)
[Exceptionクラス](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_exception_methods.htm)
[カスタム例外](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_exception_custom.htm)
[共有](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_keywords_sharing.htm)

# デベロッパー試験に関する記事
[Salesforce 認定 Platform デベロッパー 合格までのあれこれ](https://qiita.com/piepie1231/items/8da91897192dc44584be)
[デベロッパー勉強メモ：Salesforceの基本](https://qiita.com/piepie1231/items/bd94f6c3780f68b89251)
[デベロッパー勉強メモ：データモデリング](https://qiita.com/piepie1231/items/1ea83e14b553698f2aff)
[デベロッパー勉強メモ：プロセスの自動化とロジック①](https://qiita.com/piepie1231/items/407aad4ef1de5da297df) ←当記事
[デベロッパー勉強メモ：プロセスの自動化とロジック②](https://qiita.com/piepie1231/items/e5eeb25ae2af0f79fd58)
[デベロッパー勉強メモ：ユーザインタフェース](https://qiita.com/piepie1231/items/179e5a39a98d65cb238d)
[デベロッパー勉強メモ：テスト、デバッグ、リリース](https://qiita.com/piepie1231/items/b90b82ec643b0cf5715b)