LoginSignup
4
6

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-09-26

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

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

SOQLとSOSL

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

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クエリで返すことができるレコードの合計数を返す

 ★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

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
動的 SOQL
ガバナ制限
Limtクラス
Databaseクラス
Exceptionクラス
カスタム例外
共有

デベロッパー試験に関する記事

Salesforce 認定 Platform デベロッパー 合格までのあれこれ
デベロッパー勉強メモ:Salesforceの基本
デベロッパー勉強メモ:データモデリング
デベロッパー勉強メモ:プロセスの自動化とロジック① ←当記事
デベロッパー勉強メモ:プロセスの自動化とロジック②
デベロッパー勉強メモ:ユーザインタフェース
デベロッパー勉強メモ:テスト、デバッグ、リリース 

4
6
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
4
6