個人的ちょっと便利なSOQL 10選

# これはなに？
- Salesforceで日々〇〇どこだっけ？となった際の備忘録です。誰かの役に立てればと思い書かせていただきます。


# 1. 組織情報を取得する

https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_organization.htm

```sql
SELECT Id, IsSandbox, OrganizationType FROM Organization LIMIT 1
```

|項目|説明|
|---|---|
|Id|組織ID|
|IsSandbox|sandbox（TRUE）|
|OrganizationType|組織のエディション情報|

# 2. レコードタイプ情報を取得する

https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_recordtype.htm

```sql
SELECT Id, Name, DeveloperName, SobjectType, IsActive
FROM RecordType
```

|項目|説明|
|---|---|
|Id|レコードタイプID|
|Name|レコードタイプ表示ラベル|
|DeveloperName|レコードタイプAPI参照名|
|SobjectType|レコードタイプに対応したオブジェクト名|
|IsActive|有効（TRUE）|

# 3. レコードタイプで絞り込む

もちろんレコードタイプIDそのままでも絞り込めますが、


```sql
SELECT Id, Name FROM Account WHERE RecordTypeId = '0xxxxxxxxxx'
```

レコードタイプのAPI参照名で絞り込み

```sql
SELECT Id, Name FROM Account WHERE RecordType.DeveloperName = 'DeveloperName'
```

レコードタイプの表示ラベルで絞り込み

```sql
SELECT Id, Name FROM Account WHERE RecordType.Name = 'Name'
```

レコードタイプの表示ラベルが `01_〇〇企業`となっている場合に、部分一致検索もできるので便利です。

```sql
SELECT Id, Name FROM Account WHERE RecordType.Name LIKE '%01_%'
```

|項目|説明|
|---|---|
|RecordTypeId|レコードタイプID|
|RecordType.Name|レコードタイプ表示ラベル|
|RecordType.DeveloperName|レコードタイプAPI参照名|

# 4. キューの情報を取得する

https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_group.htm

```sql
SELECT Name, DeveloperName FROM Group WHERE Type = 'Queue'
```

|項目|説明|
|---|---|
|Name|キュー表示ラベル|
|DeveloperName|キューAPI参照名|

# 5. 選択リストの情報を取得する

## 1. `FieldDefinition`から取得したい選択リストの`DurableId`を取得

https://developer.salesforce.com/docs/atlas.en-us.234.0.api_tooling.meta/api_tooling/tooling_api_objects_fielddefinition.htm

```sql
SELECT DurableId
FROM FieldDefinition
WHERE EntityDefinition.DeveloperName='Account' 
AND QualifiedAPIName = 'Industry' 
```

|項目|説明|
|---|---|
|DurableId|項目につけられた一意の識別子|
|EntityDefinition.DeveloperName|オブジェクトAPI参照名|
|DeveloperName|選択リストのAPI参照名|

## 2. `PicklistValueInfo`から選択リストを取得

https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_picklistvalueinfo.htm

EntityParticleIdを条件に追加し、`FieldDefinition`から取得したDurableIdでフィルターをかけます
標準のAccountのIndustry項目のDurableIdは`'Account.Industry'`なので以下のように実行すると取得できます。

```sql
SELECT Value, Label
FROM PicklistValueInfo
WHERE EntityParticleId = 'Account.Industry'
```

|項目|説明|
|---|---|
|Value|選択リスト値のAPI参照名|
|Label|選択リスト値の表示ラベル|
|EntityParticleId|FieldDefinitionから取得した、DurableId|


# 6. 特定のオブジェクトの項目情報取得

https://developer.salesforce.com/docs/atlas.en-us.234.0.api_tooling.meta/api_tooling/tooling_api_objects_fielddefinition.htm

```sql
SELECT DeveloperName, Label, DataType,
	LastModifiedDate
FROM FieldDefinition
WHERE EntityDefinition.DeveloperName = 'ObjectName'
```

|項目|説明|
|---|---|
|DeveloperName|項目のAPI参照名|
|Label|項目の表示ラベル|
|DataType|データ型|
|LastModifiedDate|項目定義最終更新日時|
|EntityDefinition.DeveloperName|オブジェクトAPI参照名|

# 7. スケジュール済みのJOBを取得

https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_cronjobdetail.htm

https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_crontrigger.htm


```sql
SELECT State, Id, StartTime, EndTime, CronExpression,
	CronJobDetail.Name, NextFireTime,
	PreviousFireTime
FROM CronTrigger
WHERE CronJobDetail.JobType = '7'
```


|項目|説明|
|---|---|
|State|ジョブの現在の状況|
|Id|スケジュール済みJOB ID|
|StartTime|ジョブの開始日時|
|EndTime|ジョブの終了日時|
|CronExpression|スケジュール cron 定義|
|CronJobDetail.Name|スケジュール済みジョブの名前|
|CronJobDetail.JobType|スケジュール済みジョブの種別|
|NextFireTime|次に実行される予定の日時|
|PreviousFireTime|最近ジョブを実行した日時|

>JobType
1 — データのエクスポート
3 — ダッシュボードの更新
4 — レポート作成スナップショット
6 — Scheduler フロー
7 — スケジュール済みの Apex
8 — レポート実行
9 — 一括処理ジョブ
A — レポート通知

>State
WAITING — ジョブは実行待ちです。
ACQUIRED — ジョブはシステムによって選択され、まもなく実行されます。
EXECUTING — ジョブは実行中です。
COMPLETE — トリガは起動済みです。再度起動するようにスケジュールされていません。
ERROR — トリガ定義にエラーがあります。
DELETED — ジョブは削除されました。
PAUSED — パッチおよびメジャーリリース時にジョブがこの状況になる可能性があります。リリースが終了すると、ジョブの状況は自動的に WAITING または他の状況に設定されます。
BLOCKED — ジョブの 1 つのインスタンスを実行中に、2 つ目のインスタンスの実行が試行されています。この状況は、最初のジョブインスタンスが完了するまで続きます。
PAUSED_BLOCKED — リリースが行われているため、ジョブはこの状況になっています。リリースが終了し、実行中のジョブのインスタンスが他になければ、ジョブの状況は別の状況に設定されます。

# 8. Apexのテスト結果を取得

https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_apextestresult.htm

```sql
SELECT Id,
	ApexClass.Name, MethodName, Message, Outcome
FROM ApexTestResult
```

|項目|説明|
|---|---|
|Id|テスト結果 ID|
|ApexClass.Name|ジョブの開始日時|
|MethodName|テストメソッド名|
|Message|テスト失敗が発生した場合の例外エラーメッセージ|
|Outcome|テストメソッドの実行結果 （Pass Fail CompileFail Skip）|

# 9. レコードトリガーフローを取得する

https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_flowdefinitionview.htm

```sql
SELECT ApiName, TriggerType, Label, Description, IsActive
FROM FlowDefinitionView
WHERE TriggerType = 'RecordAfterSave'
	OR TriggerType = 'RecordBeforeSave'
```

|項目|説明|
|---|---|
|ApiName| フロー定義の API 参照名|
|TriggerType|フローを実行するトリガ種別|
|Label|フロー定義の表示ラベル|
|Description|フロー定義情報|
|IsActive|有効（TRUE）|

>TriggerType
EventDrivenJourney — 将来の使用のために予約されています。
PlatformEvent — フローは、プラットフォームイベントメッセージを受信すると開始されます。この値は API バージョン 49.0 以降で使用できます。
RecordAfterSave — フローは、レコードの保存後に開始されます。この値は API バージョン 49.0 以降で使用できます。
RecordBeforeSave — レコードの作成または更新により自動起動フローをトリガし、追加の更新をレコードに加えてからレコードをデータベースに保存します。この値は API バージョン 48.0 以降で使用できます。
Scheduled — スケジュールされた時刻にフローが開始されます。この値は API バージョン 47.0 以降で使用できます。
processType が AutoLaunchedFlow の場合にのみ使用できます。この項目は、API バージョン 47.0 以降で使用できます。

# 10. 日付関数/日付リテラルを使って絞り込み

https://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_date_functions.htm

`CALENDAR_YEAR(CreatedDate)`で作成日の年の部分が取得できるので、
年単位での集約やフィルタリングが可能になります。
他にも`CALENDAR_QUARTER()`という四半期を表すものや、`WEEK_IN_MONTH()`で月の何週目かを表したりなど
便利です。

```sql
SELECT CreatedDate, Amount
FROM Opportunity
WHERE CALENDAR_YEAR(CreatedDate) = 2022
```

https://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_dateformats.htm

`CreatedDate=THIS_WEEK`で今週作成されたデータとなります。
他にも`LAST_WEEK` `LAST_MONTH`など実行日を基準に日付データをフィルタリングできるものになってます。

```sql
SELECT Id, Name FROM Opportunity WHERE CreatedDate = THIS_WEEK
```


# 最後に

最後まで読んでいただき
ありがとうございます。
Salesforce関連のことに関してまだまだですので、

こっちのSOQLも開発時に便利だよ！等の情報もお待ちしております。