« 2014年4月 | メイン | 2014年6月 »

2014年5月に作成された記事

2014年5月28日 (水)

Visualforce Remote Objectsを使ったデータ取得

エンジニアの谷隈です。

Spring'14からパイロットリリースされている新機能「Visualforce Remote Objects」を試してみました。
「Visualforce Remote Objects」というのはVisualforce上からJavaScript経由でセールスフォース上のオブジェクトデータを操作(取得・作成・更新・削除)する仕組みです。
APIコール数を消費しない、Apexコードの実装が不要といった特長があります。

今回はこの機能のうちデータ取得についての検証を行いました。

○使い方

「Visualforce Remote Objects」を使用する際の大まかな手順は次の2ステップになります。

Step

まずはイメージを掴むための、簡単なサンプルから。

コード例:Visualforce

<apex:remoteObjects >
  <apex:remoteObjectModel name="Test__c" fields="Id, Name, DateField__c, DateTimeField__c, CreatedDate"/>
</apex:remoteObjects>

「Visualforce Remote Objects」でオブジェクトのデータを操作する場合には、どのオブジェクトのどのフィールドを使用するかどうかをapexタグで宣言する必要があります。
上のコードはVisualforceページにTest__cオブジェクトを取得するためのタグを記載したコード例です。
Test__cオブジェクトのId, Name, DateField__c, DateTimeField__c, CreatedDateフィールドへの使用を宣言しています。

コード例 JavaScript

var som = new SObjectModel.Test__c();
som.retrieve({limit:22}, function(err, records){
	// データ取得後の処理
});

JavaScript側のコードは、apexタグにより生成されたモデルを利用してデータの操作を行います。
データの取得には「retrieve」functionを使用します。
retriveには第1引数に取得条件、第2引数に取得したデータを処理するコールバックfunctionを渡します。

実際にはこの後、画面に表示するための処理が必要になりますがSF上からデータを取得するという部分はこれだけです。

○apexタグについての詳細

サンプルはミニマムな例でしたが、「Visualforce Remote Objects」のapexタグにはいくつかオプションがあります。
ここでは指定できるオプションについて見ていきたいと思います。

・apex:remoteObjectsの属性

属性説明
jsNamespace タグにより生成されるJavaScriptの名前空間を指定できます。省略時はSObjectModelになります。
id 他のapexタグと同じです。
rendered 他のapexタグと同じです。

・apex:remoteObjectModelの属性

属性説明
name 利用するオブジェクトのAPI参照名を指定します。(必須)
jsShorthand 利用するオブジェクトのJavaScriptコード上での名前を指定します。省略時はnameと同じになります。
fields 利用するフィールドのAPI参照名をカンマ区切りで指定します。ここで指定しない場合はapex:remoteObjectFieldタグで利用するフィールドを指定します。
id 他のapexタグと同じです。
rendered 他のapexタグと同じです。

・apex:remoteObjectFieldの属性

属性説明
name 利用するフィールドのAPI参照名を指定します。(必須)
jsShorthand 利用するフィールドのJavaScriptコード上での名前を指定します。省略時はnameと同じになります。
id 他のapexタグと同じです。
rendered 他のapexタグと同じです。

各タグのドキュメントは下記です。
apex:remoteObjects
http://www.salesforce.com/us/developer/docs/pages/Content/pages_compref_remoteObjects.htm
apex:remoteObjectModel
http://www.salesforce.com/us/developer/docs/pages/Content/pages_compref_remoteObjectModel.htm
apex:remoteObjectField
http://www.salesforce.com/us/developer/docs/pages/Content/pages_compref_remoteObjectField.htm

○JavaScriptコードについての詳細

「Visualforce Remote Objects」利用時のJavaScriptコードの基本的な流れは次の2ステップです。

1. apexタグにより生成されたモデルのオブジェクトを生成
2. 生成したオブジェクトのメソッドを呼び出す。

データの取得にはapexタグで生成されたモデルのretrieve functionを使います。

Retrieving Records with Remote Objects
https://www.salesforce.com/us/developer/docs/pages/Content/pages_remote_objects_using_retrieve.htm

retieve function

retrieve functionは検索条件と取得結果を処理するコールバックfunctionの2つの引数を受け取ります。

RemoteObjectModel.retrieve({criteria}, callback_function)

・retieve functionの第1引数

第1引数にはデータを取得する条件をオブジェクトに格納して指定します。

プロパティ説明
limit データ取得件数を指定します。省略時は20で最大が100です。
offset データを取得する際に何件目から取得するかを指定します。省略時は1です。
Where データの取得条件を指定します。現在はeq,lt,gt,like,and,orが指定できます。

※limitに100以上の値を指定した場合の動きについて
エラーにはなりませんが100件までしかデータを取得できませんでした。

※Where条件の指定イメージ

{
  limit: 100,
  where: {
    or: {
      DateField__c: {gt: new Date(2014,05,01)},
      Name : {like: '田中%'}
    }
  }
}

Where条件の指定は上のような形式で記述します。
ちなみにドキュメントで利用可能な比較条件にnotが無かったのが気になったので、ダメ元で試してみましたがやはりnot条件は利用できない様です。

Format and Options for Remote Objects Query Criteria
http://www.salesforce.com/us/developer/docs/pages/Content/pages_remote_objects_using_retrieve_query_object.htm

・retieve functionの第2引数

第2引数には取得した結果を処理するコールバックfunctionを指定します。

function callback(error, results, event) { // ... }

コールバックfunctionの引数

引数説明
error エラーメッセージが格納されます。正常終了時はnullです。
result 取得結果レコードがモデルオブジェクトの配列で返されます。
event DML操作の詳細情報が格納されます。

※コールバックfunctionの第3引数について
コールバックfunctionの第3引数には処理結果がJavaScriptのオブジェクトとして格納されます。
retrieve()の結果を確認したところ次のものが格納されていました。
(statusCode, type, tid, ref, action, method, result, status)
ドキュメントには通常は第1,第2引数でエラーチェックを行い、第3引数はデバッグもしくは細かいエラー管理用として使用するとの記載があるのみで詳細には触れられていなかったので通常利用は想定されていないのかもしれません。

Remote Objects Callback Functions
http://www.salesforce.com/us/developer/docs/pages/Content/pages_remote_objects_callback_functions.htm

・モデルオブジェクトのフィールドへのアクセス

取得した結果レコードのオブジェクトのフィールド値へのアクセスはget() / set() functionを利用します。

var name = obj.get('Name');
obj.set('Name', name);

また、日付型、日付/日時型については共にJavaScriptのDateに変換された形で取得することができます。(タイムゾーンはローカルです。)

・オブジェクト権限と項目レベルセキュリティ

オブジェクト、項目レベルどちらの場合も権限がなければ呼び出し結果はエラーになります。
項目レベルセキュリティについてはその項目だけ取得できないという動きではないので注意が必要です。

Visualforce Remote Objects
http://www.salesforce.com/us/developer/docs/pages/Content/pages_remote_objects.htm

・その他制限事項

基本的にVisualforceの制限事項はすべて適用されます。
また、地図情報は取得できません。取得しようとしても何事もなかったのかのように無視されます。

Limitations of Remote Objects
http://www.salesforce.com/us/developer/docs/pages/Content/pages_remote_objects_limitations.htm

2014年5月27日 (火)

コードカバー率が正常に表示されない件について

エンジニアの川名です。

現在、私が運用を担当している組織にて、
Apexコードカバー率が正常に表示されない現象が発生しているため
これについてまとめたいと思います。


Salesforceではテストコードのカバー率が75%以上ないと本番組織にリリースする事ができません。
そのため組織全体のコードカバー率のチェックは本番リリースの際には欠かせない作業となっています。

ある日の本番リリース後、念のため本番組織のコードカバー率も確認しておこうと
[設定]→[開発]→[Apexクラス]と進んだApex一覧の画面の
「組織のコードカバー率を見積る」を押下したところ、なんと…!

Codecoverage_2

58%という目を疑うような数字が表示されました。

実は本番リリースに失敗しているのではないかとちょっと慌てて
リリース対象物を確認しましたが正常にデプロイされている様子。

これはおかしい。ということでサポートに問い合わせて現象について確認しました。
回答は以下。

・Winter'14以降で発生している不具合。
・テストクラスを持たないApexクラスの場合、コメントアウトや System.debug() などのコードもカバー率の母数に含まれてしまい、
 本来のカバー率よりも低い数字が表示されてしまっている。
・デプロイ時のコードカバレッジの算出はこの影響を受けていないため正常なカバレッジでデプロイが行われる。

とのことでした。


回避策として、すべてのApexクラスに対してテストクラスを作成することで正常なカバー率が算出されるようです。

以下でもケースとして上がっていました。
Summer'14でバグフィクス予定のようです。

Drop in Overal Code Coverage value due to incorrect count of class lines with 0% code coverage

https://success.salesforce.com/issues_view?id=a1p30000000T1m1


有効な行数がそもそも少ないクラスや大部分がコメントアウトされたクラスなどは
テストクラスの作成が後回しになってしまいがちですが、

・不要なクラスは本番組織に残しておかない。
・有効なクラスに対してはテストクラスを必ず作成する。

など、日頃から気をつけることが必要であると今回の件で感じました。

○おまけ

リリース関連の小ネタです。

本番リリースする際、リリース状況を確認することが出来ましたが
画面の更新を行いながら進捗をチェックする必要がありました。

Spring'14より、リリース状況を表すプログレスグラフが自動更新されるようになりました。
[設定]→[リリース]→[リリース状況]から確認することが出来ます。

Releasestatus

細かいですがリリース担当者としては地味に嬉しい機能ですね。

2014年5月22日 (木)

Salesforce1 Webinar セキュリティ&プッシュ通知編

こころです。

5/14にSalesforce1 Platformモバイル開発TipsWebinar 〜セキュリティ及びプッシュ通知編 〜 Webinarがありました。資料録画が公開されていますので詳しくはそちらをご覧ください。気づいた点をまとめてみました。


YouTube: Salesforce1 Platformモバイル開発Tips Webinar 〜セキュリティ及びプッシュ通知 編 〜

1.Salesforce1のpush通知とセキュリティ(標準機能設定)
2.モバイルSDKのプッシュ通知とセキュリティ(開発者向け)
という構成です。

1.Salesforce1のpush通知とセキュリティ
iPhoneアプリのバージョンは5.2 以降なので、試す場合はiPhoneの方はSalesforce1アプリを最新にアップデートしてください。

<PUSH>
TodoがPush通知できる(アプリからユーザの好きなタイミングで設定)
※ユーザーがが自分自身宛に作成したTodoはPushされないので注意
Apexで作成したTaskについてもPush通知できる。
Task pushtask = new Task(
                               OwnerId = <通知相手のUserId>,
                               WhatId   = <関連レコードのID>,
                               Subject   = <タイトル>, 
                               .....
                         );
insert pushtask;

<セキュリティ>

IP制限の緩和・・・リフレッシュトークンの有効期限の設定
トークンの強制失効を設定できる
高保証セッション=二要素認証
PIN保護(4桁以上)
ブランディング可能になったロゴ
など



2.モバイルSDKのプッシュ通知とセキュリティ
Pilot版で、Android向けとiOS向けが異なります。iOS向けは要iOSデベロッパー登録(有料)です
。(私はiPhoneユーザーなのでiPhoneで試してみました。Androidは割愛)

<Push通知について参考資料>

Salesforce Mobile Push Notifications
Implementation Guide

About Push Notifications

MobileSDKを使わずにSalesforceにアクセスするiPhoneアプリを作る【プッシュ通知編】

pom0325さんの記事で全く同じ事が詳しく紹介されています。



<PUSH>

Pushの仕組みはApple/Googleそれぞれ
Device Token(Androidの場合は Registration ID)を取得し、APN(Apple Push Notofication Service)とモバイルアプリ間で
トークンを受け渡してPush通知しています。

Appleの場合

1.証明書の作成(Wildcard AppIDは選択できない)

2.取得した証明書を、「 接続アプリケーション」>「モバイルアプリケーション設定」で登録

3.Push通知の実装

Messaging.PushNotification msg = new Messaging.PushNotification();
Map<String, Object> payload =
Messaging.PushNotificationPayload.apple( '<PUSHする内容>', '', null, null);

msg.setPayload(payload);
String userId1 = '<PUSHするユーザID>';
String userId2 = '';
.....

Set users = new Set();
users.add(userId1);
users.add(userId2);
.....

msg.send('<登録したアプリ名>', users);

※Badgeに表示される数値はPushする際に設定します。

<セキュリティ>

接続アプリケーションでできるセキュリティは設定はSalesforce1のセキュリティと同じ起動時にPIN保護の入力が求められるアプリが出来る(Mobile SDKのみ)
※設定後アプリケーションからログアウトし、再起動すると有効になる。

Androidの方はAndroid版で試してみてください。

Webinarまとめは以上です。

モバイルアプリ独特の機能であるPush通知とセキュリティについてフォーカスした内容でした。

セキュリティ権限設定が細かくできるのはSalesforce1アプリを個人の端末に入れて使用する場合などに色々なニーズに応えられるのではと思います。

Mobile SDKのPush通知についてはPilot版なので正式リリースされるか分かりませんが、設定手順が簡単になると嬉しいです。



採用情報

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