カテゴリ「Apex」の記事

2010年10月25日 (月)

ApexのDMLステートメントと失敗時の挙動

ApexのDMLステートメントには、スタンドアローン形式とメソッド形式があり、いずれかのレコードが失敗した時の動作に違いがあります

○スタンドアローン形式

・記述例:
insert obj;

・いずれかのレコードが失敗した場合の動作:
全てのレコードがロールバックされる。

○メソッド形式

・記述例:
Database.insert(obj, option);

・いずれかのレコードが失敗した場合の動作:
オプションが未指定またはtrueの場合、全てのレコードがロールバックされる。
オプションがfalseの場合、レコードは個別に成功 or 失敗となる。
失敗したレコードは無視され、処理が最後まで実行される

通常はスタンドアローン形式を使用し、バッチ処理など、個別レコードで失敗しても処理を続行したいときに、メソッド形式を使用すると良いでしょう。

一つ注意しなければいけないのは、いずれの形式であっても、 処理の成功/失敗によらず、コミットはされないということです。Apexが異常終了した際には、どちらの形式を使用していても、全てのレコードがロールバックされます。

2010年9月 7日 (火)

Apexで承認プロセスを操作するには?

有効な承認プロセスに対して、Apexから承認申請や承認/却下を行うことができます。

承認申請はApproval.ProcessSubmitRequestクラスで行います。
ソースコードはこんな感じ↓

// プロセスの作成
Approval.ProcessSubmitRequest psr
= new Approval.ProcessSubmitRequest();

// 申請するオブジェクトの設定
psr.setObjectId(objectId);

// 次の承認者の設定(自動割当の場合はnull)
psr.setNextApproverIds(new Id[] {UserInfo.getUserId()});

// プロセス実行
Approval.ProcessResult submitResult = Approval.process(psr);

// 成功 or 失敗の確認
System.assert(submitResult.isSuccess());

// 状態の確認
// Pending:未承認、Approved:承認済み、
// Rejected:却下、 Removed:取消済み
System.assertEquals(
'Pending', submitResult.getInstanceStatus());

// 承認申請により作成された
// ProcessInstanceWorkitemオブジェクトのIDを取得
// (承認申請すると、ProcessInstanceWorkitemオブジェクトに
// レコードが作成される)
List<Id> newWorkItemIds = submitResult.getNewWorkitemIds();

承認/却下はApproval.ProcessWorkitemRequestクラスで行います。
ソースコードはこんな感じ↓

// プロセスの作成
Approval.ProcessWorkitemRequest pwr
= new Approval.ProcessWorkitemRequest();

// 承認するProcessInstanceWorkitemオブジェクトのIDの設定
pwr.setWorkitemId(newWorkItemIds.get(0));

// 次の承認者の設定
// (自動割当や最終承認の場合はnull)
pwr.setNextApproverIds(new Id[] {UserInfo.getUserId()});

// アクションの設定
// Approval:承認、Reject:却下、
// Removed:削除<システム管理者のみ>
pwr.setAction('Approval');

// コメントの設定
pwr.setComments('コメント');

// プロセス実行
Approval.ProcessResult workitemResult
= Approval.process(pwr);
System.assert(workitemResult.isSuccess());
System.assertEquals(
'Approved', workitemResult.getInstanceStatus());

上の例では、ProcessInstanceWorkitemオブジェクトのIDを、
承認申請時の結果から取得していますが、SOQLで検索して取得する方法もあります

承認フローで利用するオブジェクトは、以下の4つです。
ProcessInstance:参照のみ可
ProcessInstanceHistory:アクセス不可
ProcessInstanceStep:参照のみ可
ProcessInstanceWorkitem:参照、更新、削除のみ可

どのオブジェクトに対してもレコードの作成ができないので、オブジェクトのレコード操作によって、申請や承認といった承認フローの操作をすることはできません

承認プロセスの操作はApproval.ProcessSubmitRequestクラスとApproval.ProcessWorkitemRequestクラスで行い、未承認オブジェクトや承認者などのデータ取得時に、これらのオブジェクトを利用します。

2010年8月17日 (火)

スケジュール実行するApexのテストメソッドと実行時刻の詳細設定

今回は前回の続きで、スケジュール実行するApexのテストメソッドの書き方と実行時刻の詳細設定方法のお話。

スケジュール実行するApexのテストは、

・Test.startTestメソッド
System.scheduleメソッド
・Test.stopTestメソッド

の順に呼び出すことで、実施します。

System.scheduleメソッドは、Apexをスケジュール設定するメソッドで、
・第1引数:ジョブ名(任意の名前)
・第2引数:クーロン式(実行時刻を設定)
・第3引数:Apexクラスのインスタンス

を受け取り、ジョブIDを返します。

クーロン式は、'0 0 0 3 9 ? 2022'のような式で、左から順に秒、分、時、日、月、曜日、年を表しています(年は省略可)。

<クーロン式の例 ・・・ 詳しい説明は こちら

・'0 0 13 * * ?':毎日13時に実行
・'0 0 10 ? * MON-FRI':月~金の10時に実行

テスト時に、System.scheduleメソッドで設定した実行時刻になるのを待つ必要はありません。Test.stopTestメソッドをコールすることで、System.scheduleメソッドで設定したジョブが実行され、ジョブの処理結果を確認することができるようになっています。

ソースコードはこんな感じ↓

// テストメソッド
static testMethod void hogeClassTest() {
	// テストデータ準備

	// テスト開始
	Test.startTest();
	
	// Apexをスケジュールに登録
	String jobId = 
		System.schedule('TestScheduledApex',
		'0 0 * * * ?', new HogeClass());
	
	// テスト終了(登録したスケジュールが実施される)
	Test.stopTest();

	// テストデータの確認
}

前回、『画面からの設定だと、「1日に1回しかスケジューリングできない」「1時間単位でしかスケジューリングできない」』と書きましたが、System.scheduleメソッドを利用すれば、1日に複数回実行することや、分単位で実行することも可能となるので、細かく設定したいときはこちらが便利です。

2010年8月10日 (火)

Apexをスケジュール実行する方法

Winter '10 API バージョン17.0から、Apexをスケジュール実行できるApex Schedulerが利用できるようになりました。これはかなり便利。

画面からの設定だと、「1日に1回しかスケジューリングできない」「1時間単位でしかスケジューリングできない」といった制約はありますが、これがあれば、日次バッチや週次バッチが作れちゃいます

やり方は簡単。ApexクラスにSchedulableインタフェースのexecuteメソッドを実装するだけです。executeメソッドの中にスケジュール実行させたい処理を記述します。

実装例はこちら↓

global class HogeClass implements Schedulable {
    global void execute(SchedulableContext sc) {
// スケジュール実行させたい処理
    }
}

後は、このクラスをスケジューリング設定してあげれば完了です。
「アプリケーションの設定」→「開発」→「Apexクラス」→「Apexをスケジュール」を押下すると、こんな画面↓になるので、先ほど作ったクラスを「Apexクラス」に設定してあげて下さい。

ここで、「Apexクラス」には、Schedulableインタフェースを実装したクラスしか設定できないので注意して下さい。

20100810_1

20100810_2

スケジューリングされていることは、「管理者設定」→「監視」→「スケジュール済みジョブ」で確認できます↓

スケジュール実行を取り消したい場合は、ここから削除します。

20100810_3

採用情報

株式会社フレクトでは、事業拡大のため、
・Salesforce/Force.comのアプリケーション開発
・HerokuやAWSなどのクラウドプラットフォーム上
でのWebアプリケーション開発
エンジニア、マネージャーを募集中です。

未経験でも、これからクラウドをやってみたい方、
是非ご応募下さい。

フレクト採用ページへ

会社紹介

  • 株式会社フレクトは、
      ・認定コンサルタント
      ・認定上級デベロッパー
      ・認定デベロッパー
    が在籍している、セールスフォースパートナーです。
    また、heroku partnersにも登録されています。
    herokuパートナー
    株式会社フレクト
    Salesforce/Force.com
    導入支援サービス
    弊社の認定プロフェッショナルが支援致します。
    ・Visualforce/Apexによるアプリ開発
    ・Salesforceと連携するWebアプリ開発
    も承っております。
    セールスフォースご検討の際は、
    お気軽にお問合せください。

Twitter

リファレンス

■Developer's Guide(リファレンス)
・Apex  HTML | PDF | 日本語PDF | ガバナ制限
・Visualforce  HTML | PDF
・Web Services API  HTML | PDF | 日本語PDF
・Bulk API  HTML | PDF
・REST API  HTML | PDF | 日本語PDF
・Metadata API  HTML | PDF
・Migration Tool  HTML | PDF
・AJAX Toolkit  HTML | PDF
・Data Loader PDF | 日本語PDF

■早見表 (日本語)
数式
Apex
Visualforce
Web Services API
Chatter