APEX チュートリアル: Apex プログラミング クラスとコーディング例

Salesforce の Apex とは何ですか?

Apex は、Software as a Service (SaaS) および Customer Relationship Management (CRM) を構築するために Salesforce によって開発されたオブジェクト指向の厳密に型指定されたプログラミング言語です。 Apex は、バックエンドデータベースサポートとクライアントサーバーインターフェイスを提供することで、開発者がサードパーティ SaaS アプリケーションを作成し、システムイベントにビジネスロジックを追加できるように支援します。

Apex は、開発者がボタンのクリック、関連レコードの更新、Visualforce ページなどのシステム イベントにビジネス ロジックを追加するのに役立ちます。 Apex の構文は Java と似ています。 Salesforce に登録する CRMがどのように機能するかを学ぶ

Apexプログラミング言語の特徴

Salesforce Apex の重要な機能は次のとおりです。

  • Apex は大文字と小文字を区別しない言語です。
  • apex を使用して、sObject レコードに対して INSERT、UPDATE、UPSERT、DELETE などの DML 操作を実行できます。
  • apex では、SOQL (salesforce オブジェクトクエリ言語) および SOSL (salesforce オブジェクト検索言語) を使用して sObject レコードをクエリできます。
  • を作成することができます 単体テスト それらを実行して検証します コードカバレッジ apex のコードの効率性も向上します。
  • Apex はマルチテナント環境で実行され、 Salesforce ユーザーが共有リソースを制御できないようにするガバナ制限をいくつか定義しました。 Salesforce ガバナ制限を超えるコードは失敗し、エラーが表示されます。
  • Salesforce オブジェクトは、apex のデータ型として使用できます。 例えば ​​-
    Account acc = new Account();

    ここで、Account は標準の Salesforce オブジェクトです。

  • Apex は、Salesforce リリースごとに自動的にアップグレードされます。

開発者が Apex を選択すべき場合

Apex コードは、ビジネス シナリオが複雑すぎる場合にのみ記述してください。plex また、Salesforce が提供する事前構築された機能を使用して実装することはできません。

Following Apex コードを記述する必要があるいくつかのシナリオは次のとおりです。

  • Salesforce と他のアプリケーションを統合する Web サービスを作成します。
  • soobject にカスタム検証を実装します。
  • DML 操作の実行時にカスタム Apex ロジックを実行します。
  • 既存のワークフロー フローおよびプロセス ビルダー機能を使用して実装できない機能を実装するため。
  • 設定する email サービス、e のコンテンツ、ヘッダー、添付ファイルの処理を含める必要があります。mail apexコードを使用します。

Apexの動作構造

この Apex チュートリアルでは、Apex の動作構造について学びます。

Following apex コードのアクションの流れは次のとおりです。

  • 開発者のアクション: 開発者が作成したすべての apex コードは、開発者がコードをプラットフォームに保存するときに apex ランタイムインタープリタが理解できる一連の命令にコンパイルされ、これらの命令はメタデータとしてプラットフォームに保存されます。
  • エンドユーザーのアクション: ユーザーイベントが apex コードを実行すると、プラットフォームサーバーはメタデータからコンパイルされた命令を取得し、結果を返す前に apex インタープリターを通じて実行します。
Apexの動作構造
Apexの動作構造

Apex 構文

変数宣言

apex は厳密に型指定された言語であるため、apex でデータ型を使用して変数を宣言することが必須です。

例:

contact con = new contact(); 

ここでは、変数 con が contact をデータ型として宣言されています。

SOQL クエリ

SOQL は Salesforce オブジェクト クエリ言語の略です。 SOQL は、Salesforce データベースから sObject レコードを取得するために使用されます。 例えば-

Account acc = [select id, name from Account Limit 1]; 

上記のクエリは、Salesforce データベースからアカウント レコードを取得します。

ループステートメント

Loop ステートメントは、リスト内のレコードを反復処理するために使用されます。 反復回数はリスト内のレコードの数と同じです。 例えば:

list<Account>listOfAccounts = [select id, name from account limit 100];
// iteration over the list of accounts
for(Account acc : listOfAccounts){
	//your logic
}

上記のコード スニペットでは、listOfAccounts はリスト データ型の変数です。

フロー制御ステートメント

フロー制御ステートメントは、特定の条件に基づいてコードの一部の行を実行する場合に役立ちます。

例:

list<Account>listOfAccounts = [select id, name from account limit 100];
// execute the logic if the size of the account list is greater than zero
if(listOfAccounts.size() >0){
	//your logic
}

上記のコード スニペットは、データベースからアカウント レコードをクエリし、リストのサイズをチェックしています。

DML ステートメント

DML はデータ操作言語の略です。 DML ステートメントは、Salesforce データベース内のデータを操作するために使用されます。 例えば ​​-

Account acc = new Account(Name = ‘ Test Account’);
Insert acc; //DML statement to create account record.

Apex開発環境

この Apex プログラミング チュートリアルでは、Apex 開発環境について学びます。

Apex コードはサンドでも開発可能box Salesforce の開発者版。

コードを開発するのがベスト プラクティスです。 the sandbox 環境に展開してから、実稼働環境にデプロイします。

Apex開発環境

Apex コード開発ツール: Following は、Salesforce のすべてのエディションで apex コードを開発するために使用できる XNUMX つのツールです。

  • Force.com開発者コンソール
  • Force.com IDE
  • Salesforce ユーザーインターフェースのコードエディター

Apex のデータ型

Following apex でサポートされているデータ型は次のとおりです。

プリミティブ

整数、 Double、Long、Date、Date Time、String、ID、および Boolean は、プリミティブ データ型とみなされます。すべてのプリミティブ データ型は、参照ではなく値によって渡されます。

コレクション

ApexではXNUMX種類のコレクションが利用可能

  • リスト: インデックスに基づいて順序付けされたプリミティブ、sObject、コレクション、または Apex オブジェクトのコレクションです。
  • セット: 固有のプリミティブの順序付けされていないコレクション。
  • マップ: プリミティブ、sObject、コレクション、または Apex オブジェクトなどの単一の値にマップされる一意のプリミティブ キーのコレクションです。

sオブジェクト

これは Salesforce の特殊なデータ型です。 の表に似ています。 SQL SQL の列に似たフィールドが含まれます。

列挙型

Enum は、指定された識別子の有限セットの XNUMX つの値を格納する抽象データ型です。

クラス

オブジェクト

これは、Apex でサポートされる任意のデータ型を指します。

インターフェース

Apex アクセス指定子

Following apex でサポートされているアクセス指定子です。

公共

このアクセス指定子は、名前空間内の apex によって使用されるクラス、メソッド、変数へのアクセスを許可します。

プライベート

このアクセス指定子は、ローカルまたはコードのセクション内で使用されるクラス、メソッド、変数へのアクセスを提供します。定義されています。 すべての手法において、アクセス指定子が定義されていない変数には、デフォルトのアクセス指定子が private になります。

保護されました

このアクセス指定子は、Apex クラスを定義している内部クラスで使用されるメソッド、変数へのアクセスを許可します。

グローバル

このアクセス指定子は、名前空間内および名前空間外の apex によって使用されるクラス、メソッド、変数へのアクセスを許可します。 必要になるまでグローバル キーワードを使用しないことをお勧めします。

Apex のキーワード

共有あり

このキーワードを使用してクラスが定義されている場合、現在のユーザーに適用されるすべての共有ルールが適用され、このキーワードが存在しない場合、コードはシステム コンテキストで実行されます。

例:

public with sharing class MyApexClass{
// sharing rules enforced when code in this class execute
}

共有せずに

このキーワードを使用してクラスが定義されている場合、現在のユーザーに適用されるすべての共有ルールは強制されません。

例:

public without sharing class MyApexClass{
// sharing rules is not enforced when code in this class execute
}

静的

変数 Method は static キーワードで定義され、一度初期化されてクラスに関連付けられます。 静的変数、メソッドは、クラスのインスタンスを作成せずに、クラス名で直接呼び出すことができます。

定数であるメソッドは、final キーワードで定義されており、オーバーライドできません。 例えば:

public class myCls {
static final Integer INT_CONST = 10;
}

この INT_CONST 変数の値をオーバーライドしようとすると、例外が発生します – System.FinalException: Final 変数はすでに初期化されています。

返品

このキーワードはメソッドから値を返します。 例えば:

public String getName() {
return  'Test' ;
}

ヌル

これは null 定数を定義し、変数に割り当てることができます。 例えば

 Boolean b = null;

バーチャル

クラスが virtual キーワードを使用して定義されている場合、クラスを拡張したりオーバーライドしたりできます。

抽象

クラスが abstract キーワードを使用して定義されている場合、そのクラスには、キーワード abstract を含むメソッドが少なくとも XNUMX つ含まれている必要があり、そのメソッドにはシグネチャのみが必要です。

例えば、

public abstract class MyAbstrtactClass {
abstract Integer myAbstractMethod1();
}

頂点文字列

文字列は、文字数制限のない文字のセットです。 例えば:

String name = 'Test';

Salesforce の String クラスによって提供される組み込みメソッドがいくつかあります。 フォロwing 頻繁によく使用される関数は次のとおりです。

省略形(最大幅)

このメソッドは、文字列を指定された長さに切り詰め、指定された文字列の長さが指定された長さより長い場合はその文字列を返します。他のwiseの場合は、元の文字列を返します。 maxWidth 変数の値が 4 未満の場合、このメソッドは実行時例外を返します – System.StringException: 最小省略幅は 4

例:

String s = 'Hello World';
String s2 = s.abbreviate(8);
System.debug('s2'+s2); //Hello...

Capitalize()

このメソッドは、文字列の最初の文字をタイトルケースに変換して返します。

例:

String s = 'hello;
String s2 = s.capitalize();
System.assertEquals('Hello', s2);

含む(部分文字列)

このメソッドは、メソッドを呼び出す String に指定された部分文字列が含まれている場合に true を返します。

String name1 = 'test1';
String name2 = 'test2';
Boolean flag = name.contains(name2);
System.debug('flag::',+flag); //true

等しい(文字列またはID)

このメソッドは、渡されたパラメータが null ではなく、メソッドを呼び出している文字列と同じバイナリ シーケンスの文字を示している場合に true を返します。

ID 値を比較するときに、ID の長さが等しくない場合があります。 たとえば、15 文字の ID を表す文字列が 18 文字の ID を表すオブジェクトと比較される場合、このメソッドは true を返します。 例えば:

Id idValue15 = '001D000000Ju1zH';
Id idValue18 = '001D000000Ju1zHIAR';
Boolean result4 = stringValue15.equals(IdValue18);
System.debug('result4', +result4); //true

上記の例では、equals メソッドは 15 文字のオブジェクト ID と 18 文字のオブジェクト ID を比較しており、これらの ID が両方とも同じバイナリ シーケンスを表す場合、true を返します。

大文字と小文字を区別して比較するには、このメソッドを使用します。

escapeSingleQuotes(stringToEscape)

このメソッドは、文字列内の単一引用符の前にエスケープ文字 (\) を追加して返します。 このメソッドは、動的 SOQL クエリの作成中に SOQL インジェクションを防止します。 この方法では、すべての一重引用符がデータベース コマンドではなく、囲み文字列としてみなされるようになります。

例:

String s = 'Hello Tom';
system.debug(s); // Outputs 'Hello Tom'
String escapedStr = String.escapeSingleQuotes(s);
// Outputs \'Hello Tom\'

削除(部分文字列)

このメソッドは、メソッドを呼び出す文字列から、指定された部分文字列の出現をすべて削除し、結果の文字列を返します。

例えば、

String s1 = 'Salesforce and force.com';
String s2 = s1.remove('force');
System.debug( 's2'+ s2);// 'Sales and .com'

部分文字列(開始インデックス)

このメソッドは、startIndex の文字から始まり文字列の最後までの部分文字列を返します。

例:

String s1 = 'hamburger';
String s2 = s1.substring(3);
System.debug('s2'+s2); //burger

逆行する ()

このメソッドは、文字列のすべての文字を反転して返します。 例えば:

String s = 'Hello';
String s2 = s.reverse();
System.debug('s2::::'+s2);// olleH  // Hello

トリム(): このメソッドは、文字列から先頭の空白をすべて削除し、それを返します。

valueOf(変換対象)

このメソッドは、オブジェクトに渡された文字列表現を返します。

アペックスガバナ制限

Apex ガバナ制限は、ランウェイ Apex コードとプロセスが共有リソースを制御せず、マルチテナント環境上の他のユーザーの処理に違反しないことを保証するために、apex ランタイム エンジンによって強制される制限です。 これらの制限は、各 Apex トランザクションに対して検証されます。 フォロwing は、各頂点トランザクションに対して Salesforce によって定義されたガバナ制限です。

Description リミット
で実行できる SOQL クエリ sync不正なトランザクション 100
A で実行できる SOQL クエリsync不正なトランザクション 200
SOQL クエリで取得できるレコード 50000
Database.getQueryLocator で取得できるレコード 10000
Apex トランザクションで実行できる SOSL クエリ 20
SOSL クエリで取得できるレコード 2000
Apex トランザクションで実行できる DML ステートメント 150
DML ステートメント、Approval.process、database.emptyRecycleBin の結果として処理できるレコード 10000
Apex トランザクションで実行できるコールアウト。 100
Apex トランザクションで実行されているすべてのコールアウトの累積タイムアウト制限 120 seconds
System.enqueueJob を使用してキューに追加できる頂点ジョブの制限 50
各 Apex トランザクションの実行時間制限 10 minutes
apexクラスとトリガーで使用できる文字の制限 1万人
CPU 時間制限 sync不正なトランザクション 10,000ミリ秒
の CPU 時間制限sync不正なトランザクション 60,000ミリ秒

Apex ゲッターとセッター

Apex プロパティは apex 変数に似ています。 apexプロパティにはゲッターとセッターが必要です。 ゲッターとセッターを使用すると、プロパティ値にアクセスまたは変更する前にコードを実行できます。 get アクセサー内のコードは、プロパティ値が読み取られるときに実行されます。 プロパティ値が変更されると、set アクセサー内のコードが実行されます。 get アクセサーを持つプロパティは読み取り専用とみなされ、set アクセサーを持つプロパティは書き込み専用とみなされ、get アクセサーと set アクセサーの両方を持つプロパティは読み取り/書き込みとみなされます。 apex プロパティの構文:

public class myApexClass {
// Property declaration
	access_modifierreturn_typeproperty_name {
	get {
			//code  
		}
		set{
			//code
		}
	}

ここで、access_modifier はプロパティのアクセス修飾子です。 return_type はプロパティの dataType です。 property_name はプロパティの名前です。

以下は、get アクセサーと set アクセサーの両方を持つ apex プロパティの例です。

public class myApex{
	public String name{
		get{ return name;}
		set{ name = 'Test';}
	}
}

ここで、プロパティ名は name であり、パブリック プロパティであり、文字列 dataType を返します。

get および set ブロックに何らかのコードを含めることは必須ではありません。 これらのブロックは空のままにして、自動プロパティを定義できます。 例えば:

public double MyReadWriteProp{ get; set; } 

Get および set アクセサーは、アクセス修飾子を使用して定義することもできます。 アクセサーが修飾子を使用して定義されている場合、アクセサーはプロパティのアクセス修飾子をオーバーライドします。 例えば:

public String name{private get; set;}// name is private for read and public to write.

アペックスクラス

apex クラスは、オブジェクトの作成元となるブループリントまたはテンプレートです。 オブジェクトはクラスのインスタンスです。

Salesforce で apex クラスを作成するには、次の XNUMX つの方法があります。

開発者コンソール

Force.com IDE

Apexクラスの詳細ページ。

apex では、トップレベルクラスとも呼ばれる外部クラスを定義できます。また、内部クラスと呼ばれる外部クラス内のクラスを定義することもできます。

外部クラスの宣言では、global や public などのアクセス修飾子を使用することが必須です。

内部クラスの宣言でアクセス修飾子を使用する必要はありません。

apex クラスは、class キーワードに続いてクラス名を使用して定義されます。

Extends キーワードは、apex クラスによって既存のクラスを拡張するために使用され、implements キーワードは、apex クラスによってインターフェイスを実装するために使用されます。

Salesforce Apex は複数の継承をサポートしていません。apex クラスは既存の apex クラスを XNUMX つだけ拡張できますが、複数のインターフェースを実装できます。

apex クラスにはユーザー定義のコンストラクターを含めることができ、ユーザー定義のコンストラクターが使用できない場合は、デフォルトのコンストラクターが使用されます。 コンストラクター内のコードは、クラスのインスタンスが作成されるときに実行されます。

Apex クラスの構文例:

public class myApexClass{
// variable declaration
//constructor
	public myApexClass{
	}
//methods declaration
}

new キーワードは、apex クラスのインスタンスを作成するために使用されます。 以下は、apex クラスのインスタンスを作成するための構文です。

myApexClass obj = new myApexClass();

アペックストリガー

Apex トリガを使用すると、DML 操作の実行前と後にカスタム Apex を実行できます。

Apexサポートはこちらからwing XNUMX 種類のトリガー:

Before トリガー: これらのトリガーは、レコードがデータベースに保存される前にフィールドの値を検証および更新するために使用されます。

トリガー後: これらのトリガーは、レコードがデータベースにコミットされた後にシステムによって設定されたフィールド (レコード ID、LastModifiedDate フィールド) にアクセスするために使用されます。 これらのフィールドの値は、他のレコードを変更するために使用できます。 トリガーの後に起動されるレコードは読み取り専用です。

かさばるトリガーを作成することがベスト プラクティスです。 バルキー トリガーは、単一のレコードだけでなく、一度に複数のレコードを処理できます。

apex トリガーの構文:

trigger TriggerName on ObjectName (trigger_events) {
	//Code_block
 }

ここで、TriggerName はトリガーの名前、ObjectName はトリガーを書き込むオブジェクトの名前、trigger_events はカンマで区切られたイベントのリストです。

Following apex トリガーでサポートされるイベントは、挿入前、更新前、削除前、挿入後、更新後、削除後、復元後です。

静的キーワードは Apex トリガでは使用できません。 内部クラスに適用できるすべてのキーワードを Apex トリガで使用できます。

実行時コンテキストを返すすべてのトリガーによって定義される暗黙的な変数があります。 これらの変数はシステムで定義されます。 トリガークラス。 これらの変数はコンテキスト変数と呼ばれます。 以下のスクリーンショットは、apex トリガーでサポートされているコンテキスト変数を示しています。

アペックストリガー

アペックストリガー

Following apex トリガーのコンテキスト変数の考慮事項は次のとおりです。

  • DML 操作では、trigger.new とtrigger.old を使用しないでください。
  • Trigger.new は削除できません。
  • Trigger.new は読み取り専用です。
  • Trigger.new は、トリガーの前にのみ同じオブジェクトのフィールドの値を変更するために使用できます。

以下のスクリーンショットは、さまざまなトリガー イベントにおける特定のアクションに関する考慮事項を示しています。

アペックストリガー

アペックストリガー

Apexのバッチクラス

Salesforce のバッチ クラスは、通常に処理すると頂点ガバナーの制限を超える大量のレコードを処理するために使用されます。バッチクラスはコードを実行しますsync恐ろしく。

Following バッチ クラスの利点は次のとおりです。

  • バッチ クラスはデータをチャンク単位で処理します。チャンクの処理が失敗した場合、正常に処理されたすべてのチャンクはロールバックされません。
  • バッチ クラス内のすべてのデータ チャンクは、ガバナ実行制限内でコードが実行されることを保証する新しいガバナ制限セットを使用して処理されます。
  • データベース。 バッチ可能インターフェイスをバッチ クラスとして使用するには、apex クラスによって実装する必要があります。 バッチ クラスで実装する必要がある XNUMX つのメソッドが提供されます。

Following は、データベースによって提供される XNUMX つの方法です。 バッチ可能なインターフェース:

1.start()

このメソッドは、インターフェースメソッドexecuteによって処理されるレコードまたはオブジェクトのスコープを生成します。 バッチの実行中に、一度だけ呼び出されます。 このメソッドは、Database.QueryLocator オブジェクトまたは Iterable を返します。 Database.QueryLocator オブジェクトを使用した SQL クエリによって取得されるレコードの数は 50 万レコードですが、反復可能を使用すると、SQL クエリによって取得できるレコードの総数は 50000 のみになります。 Iterable は com の生成に使用されますplex バッチクラスのスコープ。

start メソッドの構文:

global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContextbc) {}

2.実行()

このメソッドは、データの各チャンクの処理に使用されます。 レコードのチャンクごとに、実行メソッドが呼び出されます。 デフォルトの実行バッチ サイズは 200 レコードです。 Execute メソッドは XNUMX つの引数を取ります。

Database.BatchableContext オブジェクトへの参照、

List などの sObject のリスト、またはパラメータ化された型のリスト。 実行メソッドの構文:

global void execute(Database.BatchableContext BC, list<P>){}

3.finish()

finish メソッドは、バッチ クラスの実行中に XNUMX 回呼び出されます。 後処理操作は、finish メソッドで実行できます。 例: 確認メールを送信します。mail。 このメソッドは、すべてのバッチが処理されるときに呼び出されます。 Finish メソッドの構文:

global void finish(Database.BatchableContext BC){}

Database.BatchableContext オブジェクト

データベースの各メソッド。 Batchable インターフェイスには、Database.BatchableContext オブジェクトへの参照があります。

このオブジェクトは、バッチ ジョブの進行状況を追跡するために使用されます。

Following BatchableContext によって提供されるインスタンス メソッドです。

  • getChildJobId(): このメソッドは、現在処理されているバッチ ジョブの ID を返します。
  • getJobId(): このメソッドはバッチ ジョブの ID を返します。

以下はバッチ クラスの構文です。

global class MyBatchClass implements Database.Batchable<sObject> {
	global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContextbc) {
// collect the batches of records or objects to be passed to execute
}
global void execute(Database.BatchableContextbc, List<P> records){
// process each batch of records
}
global void finish(Database.BatchableContextbc){
// execute any post-processing operations
}
}

Database.executeBatch メソッド

Database.executeBatchメソッドはバッチクラスの実行に使用されます。

このメソッドは 200 つのパラメータを取ります: 処理されるバッチ クラスのインスタンス、バッチ サイズを指定するオプション パラメータ、指定されていない場合はデフォルト サイズの XNUMX が使用されます。

Database.executeBatch の構文:

Database.executeBatch(myBatchObject,scope)

バッチ クラス名 MyBatchClass を実行します。

MyBatchClassmyBatchObject = new MyBatchClass(); 
Id batchId = Database.executeBatch(myBatchObject,100);

データベース.ステートフル

バッチ クラスはデフォルトではステートレスです。 実行メソッドが呼び出されるたびに、オブジェクトの新しいコピーが受信され、クラスのすべての変数が初期化されます。

Database.stateful は、バッチ クラスをステートフルにするために実装されています。

バッチ クラスが データベース 、ステートフル インターフェイスでは、すべてのインスタンス変数の値が保持されますが、静的変数はトランザクション間でリセットされます。

まとめ

  • Apex は厳密に型指定されたオブジェクト指向です プログラミング言語 Force.com プラットフォーム上でコンパイルおよび実行される
  • Apex プログラミング言語は大文字と小文字を区別しない言語です
  • Apex のアクションの流れは 1 種類あります。 2) 開発者のアクション XNUMX) エンドユーザーのアクション
  • Apex は、Salesforce と他のアプリケーションを統合する Web サービスの作成に役立ちます。
  • apex でサポートされるデータ型は次のとおりです: 1).プリミティブ 2) コレクション 3) sObject、Enum、4) クラス、5) オブジェクトとインターフェイス
  • Public、Private、Protected、Global は Apex によるサポートとして指定されています
  • Apex で使用するキーワードは次のとおりです: 1) 共有あり、2) 共有なし、3) 静的、4) 最終、5) 戻り、6) Null、7) 仮想、8) 抽象
  • 文字列は文字制限のない文字のセットです
  • Apex ガバナー制限は、滑走路の Apex コードとプロセスを保証するために Apex ランタイム エンジンによって強制される制限です。
  • ゲッターとセッターを使用すると、プロパティ値にアクセスまたは変更する前にコードを実行できます。
  • Salesforce で apex クラスを作成するには、1) 開発者コンソール、2) Force.com IDE、3) Apex クラス詳細ページの XNUMX つの方法があります。
  • Apex トリガを使用すると、DML 操作の実行前と後にカスタム Apex を実行できます。
  • Salesforce のバッチ クラスは、通常に処理すると頂点ガバナーの制限を超える大量のレコードを処理するために使用されます。