« 2010年10月 | メイン | 2010年12月 »

2010年11月に作成された記事

2010年11月16日 (火)

Force.com IDE for Winter '11がリリースされました

Winter '11リリースに伴い、Force.com IDEがバージョンアップされていたので、
早速インストールしてみました(インストール方法はこちら)。

○変更点
Eclipse 3.6 Helios対応
Winter '11のメタデータAPIに対応
・ヘルプドキュメント・リファレンスドキュメントがWinter'11に対応

Winter '11のメタデータAPIに対応ということで、下記のオブジェクトにスキーマブラウザからアクセス可能になりました。

Report
・ReportFeed
・ReportTag
・CaseArticle
・ContentDocumentFeed
Dashboard
・DashboardFeed
・DashboardTag
・EventFeed
・KnowledgeArticleViewStat
・KnowledgeArticleVoteStat
・TaskFeed

ReportとDashboardで取得できる主な項目は以下の通りとなります。

○Report
・レポート名
・レポートの一意な名前
・説明
・最終実行日時

20101116_1

○Dashboard
・ダッシュボード名
・ダッシュボードの一意な名前
・説明
・ダッシュボード実行ユーザ
・フォルダID
・左/中央/右のサイズ
・背景色
・タイトル

20101116_2

各レポート/ダッシュボードの定義や抽出値は取得できないので、利用場面はあまりないかもしれませんが、基本情報が取得できるようになったということで、紹介しておきます。

2010年11月 9日 (火)

with sharingキーワードとwithout sharingキーワード

Apexはデフォルトでシステムモードで動作するので、全オブジェクトに対して全レコードの編集が可能です。

そのため、例えば、ユーザがVisualforceページでレコードを検索する場合、ユーザが参照権限を持たないレコードについても、検索できてしまいます。

ユーザが参照可能なレコードのみを検索できるようにするには、Apexクラスにwith sharingキーワードを付与します。
これによって、ユーザに適用されているレコードレベルの共有ルールを強制実行することができますユーザモードでの動作)。

public with sharing class SharingClass {

}

ここで注意しなくてはならないのは、with sharingキーワードを付与しても、オブジェクトのCRUD権限、項目のアクセス権限は、システムモードのままということです。ユーザがアクセスできないはずのオブジェクトや項目にアクセスできてしまいます。

オブジェクトのCRUD権限、項目のアクセス権限は、Apexでは制御できないので、開発者が、ユーザから隠されているデータを公開しないように注意してApexコードを書く必要があります。

逆に、ユーザに適用されている共有ルールを強制実行されないようにするには、without sharingキーワードを付与します。

public without sharing class NoSharingClass {

}

with sharingキーワードもwithout sharingキーワードも付与しない場合は、呼び出し元のApexクラスの設定が有効となります。
例えば、with sharingキーワードが付与されたApexクラスから、キーワードなしのApexクラスを呼び出した場合、ユーザに適用されている共有ルールが強制実行されます。呼び出し位置が最上位レベルの場合(最初に呼ばれるApexクラスの場合)は、システムモードでの動作となります。

動作モードを表にまとめるとこうなります。

呼び出し位置 キーワード
なし without sharing with sharing
最上位レベル システムモード システムモード ユーザモード
最上位レベル以外 呼び出し元のモードと同じ システムモード ユーザモード

ちなみに、トリガはシステムモードの動作となりますが(トリガにはキーワードを付けることができない)、トリガ内部でwith sharingキーワード付きのApexクラスを呼び出すことで、ユーザモードでの動作となります。

また、匿名ブロックは、ユーザモードでの動作となります。

2010年11月 1日 (月)

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

前回、ApexのDMLステートメントと失敗時の挙動の説明で、ロールバックの話が出たので、今回はApexのトランザクション制御の特性を紹介します。

トランザクションの開始

Apexスクリプトの開始と同時にトランザクションが開始されます明示的にトランザクションを開始することはできないので、注意が必要です。

コミット

Apexスクリプトが正常終了すると、コミットされます。これも明示的にコミットすることはできないので、注意が必要です。

セーブポイント

Database.setSavePoint()をコールして、セーブポイントを設定できます。

ロールバック

Apexスクリプトが異常終了すると、ロールバックされます
明示的にロールバックするには、Database.rollback(savepoint)をコールします(セーブポイントへのロールバックしかできません)。

以上のように、明示的に制御できるのは、セーブポイントの設定とロールバックだけで、他はApexが正常終了したか異常終了したかによって、自動的に行われます。きめ細かく制御できないので、この特性を理解した上でプログラムを組む必要があります。

最後に、トランザクション中での行ロックの取得方法と、Force.comプラットフォームでのトランザクションの分離レベルについて、紹介しておきます。

行ロックの取得

Apexコード中で実行するSOQLクエリに「For Update」キーワードを付けて、行ロックを取得することができます。行ロックはトランザクションがコミットまたはロールバックされるまで持続されます

例) Select Id From Account For Update

トランザクションの分離レベル

Force.comプラットフォームのトランザクションの分離レベルは、コミット済み読み取り(READ COMMITTED)で、変更することはできません。

更新したがまだコミットされていないデータは、他のトランザクションからは読み取られません。あるトランザクションが更新中のレコードを他のトランザクションが読み取ろうとしたときは、更新中トランザクションが終了するまで一定時間待ちます。一定時間を過ぎた場合は待っている方のトランザクションが失敗します。

※トランザクションの分離レベルについては、ここを参照のこと

採用情報

株式会社フレクトでは、事業拡大のため、
・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