カテゴリ「新機能」の記事

2016年7月 7日 (木)

Partial Copy Sandboxについての考察

入社2年目の和田(佳)です。
業務では、
Salesforceを土台としたSFA/CRMソリューションをお客様に届けるプレイングマネージャ的役割を担っています。
こちらへの投稿は初めてですが宜しくお願いします。

今回は、 Salesforce Summer '16 にて有効となったSandboxライセンスである、
 Partial Copy
について考察してみようと思います。

Partial Copy Sandboxライセンスの特徴

端的に言えば、Developer(Pro)とFullの間を取った特徴を持っています。
Fullの場合は全レコードがコピーされたSandbox環境が作成されますが、
Partialの場合はその名が表す通り、本番環境を部分的にコピーして作成されるSandbox環境になっています。
特に、以下の3点が特徴的です。

  • Sandboxテンプレートに対応するサンプルデータが投入される
  • 更新間隔は5日間
  • 容量は5GB

利用条件

Enterprise Edition、Unlimited Editionの場合のみ、
どちらも1ライセンス使用することが出来ます。

利用方法

事前にSandboxテンプレートを作成しなければならない点が従来と異なりますが、特に難しい点はありません。
本番環境にログインした状態で、
 設定>リリース>Sandbox
から、以下の作業を実施します。

Sandboxテンプレートを作成する

「Sandboxテンプレート」タブにて、「新規Sandboxテンプレート」を押下
名前や説明を記入し、サンプルデータ投入対象としたいオブジェクトを指定し保存

Partial Copy Sandbox環境作成時にSandboxテンプレートを指定する

「Sandbox」タブにて、「新規Sandbox」を押下
Partial CopyのSandboxライセンスにて「次へ」を押下
名前や説明を記入し、Sandboxテンプレートを指定して作成

利用場面を考える

さて、本題はここからです。
Partial Copy Sandbox環境はどのような場合に効果的でしょうか。
結論から書いてしまうと、
従来のFullSandbox環境を利用する場面の内、
性能テスト以外の用途においては代替しうる環境であると考えます。

考えの根拠として私は、

  • Sandboxテンプレートに対応するサンプルデータが投入される
  • 更新間隔は5日間

の2点に注目しました。
それはこの2点が、
テストの効率・精度向上やデグレードリスクの低減に寄与することにつながると考えたからです。

テストの効率・精度が向上しデグレードリスクが低減されている状態が非常に健全であるという考えには、
システム開発に携わる多くの方は賛同頂けることと思います。
ではなぜそれが今回取り上げるPartial Copy Sandbox環境で実現しやすいのかというと、
構成や時間経過の面から本番環境との差異を少なくすることができるからです。
DevOpsを実現しやすい、と言えばイメージしやすいかもしれません。

サンプルデータが投入されることで、
データ投入の負荷が軽減されるのみならず、
よりリアリティのあるテストを実施することが可能となる上、
余計なマージ工数の発生を押さえられることによる改修影響の局所化が達成されます。
これは、
プロダクトやサービスのライフサイクルが短期化しお客様の要望にスピーディーに柔軟に対応する必要があっても(当社がまさにそうです)なお、
開発&テスト、リリースをよりスムーズに行うことができる可能性を持っていることを意味します。
例えば結合テスト環境としてPartial Copy Sandbox環境を確保し、
複数の開発者がそれぞれのDeveloper(Pro)環境で開発したモジュールをこちらにリリースするといった仕組みにハマるのではないでしょうか。

注意事項

とは言えネガティブな面にも注意は必要で、私は2点あると考えています。

  • サンプルデータはあくまで本番データの一部である
  • Partial Copy Sandbox環境そのものがまだ枯れていない

サンプルデータはあくまで本番データの一部である

サンプルデータと言うと取引先名"ほげほげ"、取引先責任者名"山田太郎"というのを想像しがちですが、
適当な値を持ったレコードというわけではなく、本番に格納されている値をもったレコードで、これはFull同様です。
そのため、適宜マスクなどの対応が必要であることは認識しておく必要があります。

Partial Copy Sandbox環境そのものがまだ枯れていない

冒頭に Salesforce Summer '16 にて有効となったSandboxライセンスと述べた通り、
まだまだ新技術です。
新技術には不具合もつきものなので、こちらなどを参考に、過信しないこと、事前にアタリをつけておくことが肝心かと思います。

まとめ

Partial Copy Sandbox環境は、従来のFullSandbox環境の代わりになる可能性を秘めています。
ここでの考察を踏まえ実組織への適用・浸透を進めて行きたいと思いますので、
その結果を追ってこちらで報告できればと思います。

参考

各サンドボックスライセンスの比較

DeveloperDeveloper ProPartial CopyFull
更新間隔 1 日 1 日 5 日 29 日
データのコピー なし なし あり あり
サイズ 200 MB 1 GB 5 GB 本番組織と同じ
テンプレート/サンプリング なし/なし なし/なし あり/あり あり/なし
Developer Sandbox のバンドル N/A 5 10 15

Salesforce Summer '16 リリースノート

https://resources.docs.salesforce.com/202/latest/ja-jp/sfdc/pdf/salesforce_summer16_release_notes.pdf

2014年11月 3日 (月)

Queueableインタフェースを使った非同期処理実行

エンジニアの谷隈です。

Winter'15から導入された新機能Queueableインタフェースについて書きます。


Queueableインタフェースはfutureメソッドと機能的にはすごく似ています。
どちらも非同期に処理を実行する仕組みです。
ドキュメントで謳われている両者の違い、Queueableインタフェースを利用するメリットは次の2点です。

・ジョブIDを取得して、進行状況を監視できる
・ジョブの連鎖が可能(Winter'15時点では2連鎖まで。Spring'15で無制限になる予定。)

次のコードはQueueableインタフェースを実装したクラスの簡単なサンプルです。
非同期に実行したい処理をexecuteメソッドの中に書きます。

public class QueueableExample implements Queueable {
    public void execute(QueueableContext context) {
		String n = 'Queueable_' + DateTime.now().getTime();
        Account a = new Account(Name=n,Phone='(03) 1234-1234');
        insert a;        
    }
}

処理のキューへの登録にはsystem.enqueueJobメソッドを使用します。
キューに入れられた処理の開始タイミングは呼び出し側のトランザクション完了後の模様。

ID jobID = System.enqueueJob(new QueueableExample());
System.debug('jobID = '+ jobID);

1トランザクション中でキューに登録できるジョブ数は50。
ガバナ制限を超えてキューにジョブを登録しようとした場合は、例外が発生します。

System.LimitException: Too many queueable jobs added to the queue: 51

ジョブの進行状況の取得はAsyncApexJobレコードを検索して取得できます。

AsyncApexJob jobInfo 
	= [SELECT Status,NumberOfErrors FROM AsyncApexJob WHERE Id=:jobID];

futureメソッドとの違いで、ちょっと面白いと思ったのはバッチジョブ内からもキューへの登録/実行が可能な点です。(バッチからfutureメソッドを呼び出した場合は例外が発生)
ただ、現時点では制限により1つしかキューにジョブを追加できないので使えるケースはかなり限られそうです。

最近の派手系追加機能と比べるといかんせん地味なQueueableですが、その内容はfutureメソッドからの順当な進化系なので抑えておいて損はない機能だと思います。


リリースノート
http://docs.releasenotes.salesforce.com/ja-JP/winter15/release-notes/rn_apex_queueing_jobs.htm

The New Apex Queueable Interface
https://developer.salesforce.com/blogs/engineering/2014/10/new-apex-queueable-interface.html

2014年9月30日 (火)

意外と知らないSalesforce Tips (8~10)

玉澤です。
意外と知らないSalesforce Tipsの残り3つを紹介します。


8. Salesforce標準のログイン画面をブランディングする

Salesforceの標準のログイン画面を変えたいお客様の会社のイメージでブランディングしたいときに役立つTipsです。

下記の手順で、Salesforce標準のログイン画面をカスタマイズできます。

まず、[管理]→[ドメイン管理]→[私のドメイン]から組織のサブドメインを登録します。
※組織のサブドメインは一度しか登録できないため、慎重に選択してください。

20140930_81

登録したら、↓のような画面になるので、「こちらをクリックしてログインしてください」を押下して、
ドメインのテストを実施します。

20140930_82
テスト後、↓のような画面になるので、「ユーザにリリース」を押下して、リリースします。
※新しいドメイン名をリリースした後は、元に戻せません。リリース後は、すべてのユーザが新しいドメインにリダイレクトされるので、注意してください。

20140930_83
リリース後、ログインページのブランド設定が表示されるので、ロゴ、背景色、右フレームのURLを表示します。

20140930_84
設定後、リリースしたドメインにアクセスすると、↓のように、ログイン画面がカスタマイズされて表示されるようになります。

20140930_85

9. タブのデフォルト表示を「最近使った○○」ではなくする

タブをクリックしたときに、「最近使った○○」(※○○はオブジェクト名)というビューではなく、通常のビュー画面をデフォルト表示したい場合に役立つTipsです。

20140930_91 まず、通常のビュー画面を表示するVisualforceページを作成します。↓のコードを書けばOKです。

<apex:page tabStyle="Rsv2__c"> ・・・オブジェクト名を指定
  <apex:enhancedList type="Rsv2__c" ・・・オブジェクト名を指定
             customizable="false" 
             height="600" 
             rowsPerPage="50" />
</apex:page>


次に、タブのデフォルト表示を変更したいオブジェクトの設定画面を開き、「ボタン、リンク、およびアクション」セクションで、タブの設定編集リンクをクリックします。

20140930_92
タブの設定編集画面で、上書き手段で「Visualforceページ」を選択し、先程作成したVisualforceページを選択します。

20140930_93
すると、タブをクリックしたときに、「最近使った○○」というビューではなく、通常のビュー画面が表示されるようになります。

20140930_94
10. レコード詳細画面にグラフを表示する

レコードの詳細画面にグラフを表示したいときに役立つTipsです。対象のレコードに関連するレポート結果だけをグラフ表示できます。

ここでは、取引先レコードの詳細画面で、その取引先の商談をフェーズ毎に集計したグラフを表示する方法を例に説明します。

まず、レポートをグラフ付きで作成します(今回の例では、標準の商談レポートタイプで、フェーズ毎に集計したサマリレポートを作成します)。

20140930_101

20140930_102
次にグラフを表示したいオブジェクトのページレイアウトの設定画面を表示します。レポートグラフのセクションに、先程作成したレポートが表示されているので、ドラッグ&ドロップでレイアウトに追加します(今回の例では、取引先のページレイアウトを表示し、先程作成したレポートグラフを追加します)。

20140930_103
追加後、プロパティ設定で、表示サイズ、タイトル表示の有無、絞り込み条件を設定します。
グラフは、元々のレポートの集計結果から、更に絞り込み条件で指定した項目で絞り込んだ結果が表示されます(今回の例では、取引先IDを指定して、その取引先の商談だけが表示されるようにします)。

20140930_104設定すると、↓のように、レコード詳細画面でグラフが表示されるようになります(今回の例では、取引先レコードの詳細画面で、その取引先の商談をフェーズ毎に集計したグラフが表示されます)。

20140930_105

2014年6月 1日 (日)

Visualforce Remote Objectsを使ったデータ更新

エンジニアの谷隈です。

Spring'14からパイロットリリースされている新機能「Visualforce Remote Objects」でのデータ取得について前回検証しました。
今回は更新処理について検証します。

ちなみに「Visualforce Remote Objects」というのはVisualforce上からJavaScript経由でセールスフォース上のオブジェクトデータを操作(取得・作成・更新・削除)する仕組みです。

○使い方

「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フィールドへの使用を宣言しています。
apexのタグの使い方はデータ取得の場合と同じです。

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

var obj = new SObjectModel.Test__c();
obj.set('Id', 'a00U0000006eU8fIAE');
obj.set('DateField__c', new Date());

obj.update(function(error, result, event){
    // 更新完了後の処理
});

JavaScript側のコードは、apexタグにより生成されたモデルを利用してデータの操作を行います。
データの更新には「update」functionを使用します。
上の例は最も使うであろう呼び出し方で書いていますが、「update」function にはいくつか呼び出し方にバリエーションがあります。

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

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

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

データの更新にはapexタグで生成されたモデルの「update」functionを使います。

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

パターン① シンプルなupdate

「update」functionの一番シンプルな呼び出し方は、引数無しでfunctionを呼び出すだけの形になります。

var obj = new SObjectModel.Test__c();
obj.set('Id', 'a00U0000006eU8fIAE');
obj.set('DateField__c', new Date());

obj.update();

ドキュメントには上の形の変形パターンとして引数でセットする値をオブジェクトで渡す形の説明がありましたが、実際に試してみたところこちらは正しく動作しませんでした。
何か試し方が悪かったのかもしれません。

var obj = new SObjectModel.Test__c();
obj.update({
	Id: 'a00U0000006eU8fIAE',
	DateField__c: new Date()
});

いずれにしろ、シンプルな呼び出しのパターンではupdate処理が成功したかどうかが確認できないので使うケースはあまり無さそうです。

パターン② updateの結果をコールバックfunctionで処理する

「update」functionは引数に実行結果を処理するコールバックfunctionを指定して呼び出すこともできます。

var obj = new SObjectModel.Test__c();
obj.set('Id', 'a00U0000006eU8fIAE');
obj.set('DateField__c', new Date());

obj.update(function(error, result, event){
    // 更新完了後の処理
});

使うとしたらこれが一番活躍するパターンだと思われます。
引数にコールバックfunctionを指定します。

更新処理完了後、ここで指定したfunctionが呼び出されるので、処理結果に応じた後処理を行うことができます。

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

基本、retrieveの時と同じですが一部格納されるデータに違いがあります。

コールバックfunctionの引数

引数説明
error エラーメッセージが格納されます。正常終了時はnullです。
results 更新処理で影響を受けたオブジェクトのIDが配列で返されます。
event DML操作の詳細情報が格納されます。

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

パターン③ 複数レコードを一括で更新する

最後は複数レコードを一括で更新する呼び出し方です。
第1引数に更新するオブジェクトのIDの配列、第2引数に更新する値を指定したオブジェクト、第3引数にコールバックfunctionを指定します。

var obj = new SObjectModel.Test__c();
obj.update(
    ['a00U0000006eU8fIAE','a00U0000006eU8eIAE']
    ,{DateField__c: new Date(2020,8,1)}
    ,function(error, result, event){
        // 更新完了後の処理
    }
);

この一括更新は指定した全オブジェクトを同じ値に更新することしかできないので、使いどころは限られてくると思います。

○その他気になるポイント

・バリデーションエラー

バリデーションエラー発生時の動きは必須項目設定、入力規則、その他の場合、すべて同じです。
コールバックfunctionのerrorオブジェクトにエラーメッセージが設定されて帰ってきます。

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

簡易にチェックするならerrorがnullでないかで確認が可能です。

また、同様な情報はeventオブジェクトにも含まれています。

・トランザクション

トランザクションはDML操作のfunction呼び出し単位になります。
トランザクションを考慮した処理を実装したい場合は別の方式を考える必要がありそうです。

Best Practices for Using Remote Objects
https://www.salesforce.com/us/developer/docs/pages/Content/pages_remote_objects_considerations.htm

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

オブジェクト権限に読み取りしかない場合、updateの呼び出し結果はエラーになります。
項目レベルセキュリティについては読み取りのみの項目の場合も更新できました。
これは裏側の実装がapexだからということなのかもしれません。

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

・日付/日時型の扱い

日付/日時型の値は取得時にはローカルタイムゾーンでDate型に変換されて表示されます。
ここまでは問題ありません。
ところが保存時はJavaScript上のDateの時間がGMT+0000扱いされている様で、SF上で9時間加算されます。
結果、日本環境だと取得してそのまま保存するだけで9時間加算されてしまいます。
今がパイロットだからということであれば良いのですが、修正されない様であれば注意が必要です。

○おまけ

Summer'14のリリースでVisualforce Remote Objectsに機能追加がされる様です。
主な追加機能。
・検索処理時に指定できる条件の追加(lte, gte, ne, order by)
・upsert()操作の追加
・デフォルトの処理のオーバーライドが可能になる

Visualforce Remote Objects Enhancements
https://developer.salesforce.com/releases/release/Summer14/Visualforce+Remote+Objects+Improvements

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月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版なので正式リリースされるか分かりませんが、設定手順が簡単になると嬉しいです。



2012年10月15日 (月)

開発者コンソールにテストツールとクエリエディタが増えました

Winter '13で、開発者コンソールが機能強化されました!

今回は、増えた機能の中からテストツールクエリエディタの利用方法をご紹介します。

○テストツール

テストツールは、開発者コンソール上でテストの実行と結果の表示、カバーされているコードの色付き表示、テストコードの編集ができる機能です。

利用方法

1. 開発者コンソールを開き、「Tests」タブをクリックします。

20121015_1

2. 「New Run」ボタンを押下し、テストするクラスを選択し、「Run」ボタンを押下します。

20121015_2

3. テストが実行され、テスト結果が表示されます。

20121015_3

4. 右側の「Overall Code Coverage」に、すべてのクラスのカバー率が表示されます。

  カバー状態を見たいクラスを選択すると、
  下の画面に、カバーされているコードが青色で、
  カバーされていないコードが赤色で表示されます。

20121015_4

5. 3.の状態で、下側のテストクラス名をクリックすると、Apexコードが表示されます。
  そのまま編集して保存できるので、
  開発者コンソールだけで、テストコードのカバレッジ上げが可能です。

20121015_5_2


○クエリエディタ

クエリエディタは、開発者コンソール上でSOQLの実行 及び 抽出結果の編集ができる機能です。簡単な検索やデータの編集をしたい場合に、重宝すると思います。

利用方法

1. 開発者コンソールを開き、「Query Editor」タブをクリックします。

2. SOQLを入力して、「Execute」ボタンを押下します。
  失敗の場合は、↓のように、エラーが表示されます。

20121015_6

3. 成功の場合は、下に抽出結果が表示されます。

20121015_7

4. セルをダブルクリックすると値を編集できます
  編集後、「Save Rows」ボタンを押下すると、保存できます。

20121015_8

 「Insert Rows」ボタンで新しい行の追加、
 「Delete Rows」ボタンで行の削除もできます。

 「Create New」ボタンで新規作成画面、
 「Open Detail Page」ボタンで詳細画面、
 「Edit Page」ボタンで編集画面
 を表示することもできます。

2012年5月15日 (火)

テストメソッドがアクセスできるデータが変わりました

Spring '12でリリースされたAPI 24.0以降では、テストメソッドは、テストメソッドが作成したデータのみにアクセスできるようになりました

API 23.0(Winter '12)以前は、テストメソッドは組織の全てのデータにアクセスできたので、大きな変更点です。

これまでも、「既存データに依存するテストコードを書いてしまうと、テスト実行時点のデータの状態によって、テストの結果が変ってしまう」という問題がありました。

そのため、テストメソッド内でデータを作成して、そのデータを使ってテストする方法が推奨されていましたが、API 23.0以前では、テストメソッドは組織の全てのデータにアクセスできたので、既存データに依存するテストコードを書くことができてしまいました。

API 24.0以降を使えば、度々見かけるこの問題が生じることはなく、テストコードの品質を高めることができそうです。

○API 23.0以前の挙動

API 23.0 以前のテストコードは、引き続き、組織の全てのデータにアクセスすることができます。Spring '12のリリースが原因で、今まで動作していたテストコードが動作しなくなることはありません。

○API 24.0以降で、組織の全てのデータにアクセスしたい場合

API 24.0以降でも、↓のように「IsTest(SeeAllData=true) アノテーション」を使用することで、組織の全てのデータにアクセスすることができます。

@isTest
private class HogeControllerTest {
    @isTest(SeeAllData=true)
    static void testMethod1() {
        // 組織の全てのデータにアクセス可能
    }
}

○API 24.0以降で、常にアクセス可能なデータ

組織またはメタデータオブジェクトの管理に使用する次のオブジェクトは、そのままテストでアクセスできます。

・User
・Profile
・Organization
・RecordType
・ApexClass
・ApexTrigger
・ApexComponent
・ApexPage

2011年12月12日 (月)

Visualforce Chartingの利用方法

Winter '12で、Visualforceページでグラフ表示ができる機能Visualforce Charting」がリリースされました。

今までは、レポート・ダッシュボードのグラフをVisualforceで表示することができず、Visualforceでグラフを表示するには、Google Chartなどの他のサービスを利用しなければなりませんでした。

せっかくSalesforceにレポート・ダッシュボードのグラフ表示機能があるのに、他のサービスを使わないとVisualforceでグラフ表示ができないのは、とても残念だったのですが、Visualforce Chartingを使えば、Visualforceページでグラフ表示ができるようになります。

但し、まだPilotリリースのため、Developer Edition、Sandboxでのみ利用可能です。また、利用するにはセールスフォース・ドットコムのサポートへの連絡が必要です。

○サンプルコードと画面

Visualforce Chartingで、リードソース別のリード数を円グラフ、棒グラフ、折れ線グラフで表示した画面とソースコードを記載します。

(折れ線グラフは例としては適切ではないですが、ご容赦下さい。)

サンプル画面

20111212

Visualforceのサンプルコード


  
  
    
    
    
  
  
  
  
    
    
    
    
      
    
    
    
  

  
  
    
    
    
      
              
    
    
  

Apexのサンプルコード

public class ChartController {
  // グラフに表示するデータセット用の内部クラス
  public class ChartData {
    public ChartData(
      String name, Integer data){
      this.name = name;
      this.data = data;
    }
   
    public String name {get; set;}
    public Integer data {get; set;}
  }
 
  // グラフに表示するデータセットのリスト
  public List<ChartData> dataList {get; set;}

  public ChartController(){
    dataList = new List<ChartData>();
    for(AggregateResult r :
      [Select count(Name) cnt, LeadSource
       From Lead GROUP BY LeadSource]) {
      
       dataList.add(
         new ChartData(
           (String)r.get('LeadSource'),
           (Integer)r.get('cnt')));
    }
  }
}

○利用方法

Visualforce Chartingでグラフ表示するには、<apex:chart>タグを利用します。

まず、<apex:chart>タグのdata属性に、グラフ表示するデータセットを指定します。
データセットは、SObjectのリスト または Apexクラスのリストを指定します。

次に、<apex:chart>タグの子要素に、
・グラフ
・軸
・凡例
のタグを設定していきます。

以下では、グラフ、軸、凡例のタグの設定方法を説明します。


○グラフ

Visualforce Chartingで、現在サポートしているグラフの種類は、
・円グラフ
・棒グラフ
・折れ線グラフ
3種類です。

棒グラフと折れ線グラフは重ねて表示することが可能です(<apex:chart>タグの子要素に、棒グラフと折れ線グラフのタグを指定します)。

・円グラフ

<apex:pieSeries>タグで設定します。

labelField:ラベルに対応するデータセットのフィールド名
dataField:データに対応するデータセットのフィールド名
ColorSet:表示色の種類("#00F,#0F0,#F00"など)

・棒グラフ

<apex:barSeries>タグで設定します。

title:グラフタイトル
orientation:棒グラフの向き(horizontal:横、vertical:縦)
axis:対応させる軸の位置(left、right、top、bottom)
xField:x軸の値に対応するデータセットのフィールド名
yField:y軸の値に対応するデータセットのフィールド名

・折れ線グラフ

<apex:lineSeries>タグで設定します。

title:グラフタイトル
axis:対応させる軸の位置(left、right、top、bottom)
xField:x軸の値に対応するデータセットのフィールド名
yField:y軸の値に対応するデータセットのフィールド名
fill:折れ線の下部を塗りつぶす(true、false)
markerType:マーカーのタイプ(circle:○印、cross:×印)
markerSize:マーカーのサイズ(ピクセル単位)
markerFill:マーカーの色(#ff0000など)

○軸

<apex:axis>タグで設定します。

title:軸のタイトル
type:データ型(Numeric:数値、Category:カテゴリ)
position:軸の表示位置(left、right、top、bottom)
fields:軸に対応するデータセットのフィールド名
grid:グリッド線の表示(true、false)
gridFill:グリッド線の色
dashSize:目盛線の表示幅(ピクセル単位)

○凡例

<apex:legend>タグで設定します。

position:凡例の表示位置(left、right、top、bottom)



Visualforce Chartingのタグや属性の詳しい利用方法は、「Visualforce Developer Guide」を参照してください。

2011年10月28日 (金)

Salesforce for Social Mediaを使ってみよう

今年に入って、TwitterFacebookなどのソーシャルメディアの利用者が急増していることもあって、最近、Salesforceの導入を検討しているお客様から、ソーシャルメディアを分析したいという要望をよく聞くようになってきました。

そこで、今回は、Salesforce上で、TwitterとFacebookの情報を分析できるSalesforce for Social Media (Salesforce for Twitter and Facebook v4)をご紹介します

・自社のソーシャルメディアの利用状況を分析したい
・自社のソーシャルメディアとつながりのあるユーザを分析したい
・自社のソーシャルメディアでやりとりするメッセージを管理したい
・自社の注力するキーワードのクチコミ分析をしたい
という要望にはぴったりのアプリです。

ものすごい高度な分析機能は備えてはいないものの、簡単に導入できて、無料で使えるので、手始めに使ってみるにはもってこいだと思います。
Salesforceを導入されている企業様は、是非試してみては如何でしょうか。

○インストール

AppExchangeのここからインストールします。

リードと取引先責任者については、「Salesforce for Social Media」用のページレイアウトがインストールされるので、利用するプロファイルにインストールされたページレイアウト(「SfSocial Lead Layout」「SfSocial Contact Layout」)を割り当てます。

右上のアプリケーションで、「Salesforce for Social Media」を選択し、「Salesforce Social」タブを選択すると、↓の画面になるので、「『設定』ページに進んで」の部分をクリックして下さい。

20111026_1

↓の画面になるので、そのまま「保存」を押下してください。
(URL短縮機能を利用する場合は、ここからBit.lyのAPIキーを発行して、入力してください。)

20111026_2

これで、インストールは完了です。

以下では、「Salesforce Social Media」の各タブごとのできること、設定方法、利用イメージを紹介して行きます。

○Twitter アカウント

・できること
 自社のTwitterアカウントとツイートやDMをやりとりしたユーザを、リードや取引先責任者に取り込んで管理したり、ツイートやDMをケースに取り込んで管理することができます。

・設定方法
1. 自社のTwitterアカウントでTwitterにログインしておきます。

2. 次に、「Twitter アカウント」タブをクリックし、「新規」を押下し、自社のTwitterアカウント情報とユーザやツイートの管理方法を入力して、保存します。
   - Twitter アカウント名 : 任意の文字列
   - ユーザ名 : Twitterのアカウント名(@flect_jp なら flect_jp)
   - パスワード : そのまま

   -不明な Twitter ユーザ名 :
    自社のTwitterアカウントとツイートやDMをやりとりしたユーザに対するアクションを↓から選択します。
    何もしない/リードに登録/取引先責任者に登録/個人取引先に登録

   -ケース自動作成を有効化 :
    ONにすると、やりとりしたツイートやDMをケースに取り込みます。

20111026_3

3. 保存したら、「Twitterユーザー名を検証」を押下します。Twitterの連携アプリの認証画面になるので、「連携アプリを認証」をクリックすれば、検証完了です。

4. 「Salesforce Social」タブをクリックし、左側の「検索をスケジュール」をクリックします。「Twitter アカウント検索」で、作成したTwitterアカウントの検索実行間隔を10分~24時間の範囲で選択し、「有効化」を押下します。

20111026_4

これで準備は完了です。あとは設定したスケジュールで、検索が自動的に実行されます。

・利用イメージ
 検索が実行されると、↓のようにユーザ(「著者情報を取得」を押下しています)やツイートが取り込まれます。

20111026_5

20111026_6

 また、Twitterアカウント詳細画面の「会話」関連リストに、ツイートが取り込まれます。

20111026_7

○Twitter検索

・できること
 自社が注力するキーワードを指定しておくと、そのキーワードを含むツイートやツイートしたユーザを取り込むことができます。

・設定方法
 1. 「Twitter 検索」タブをクリックし、「新規」を押下し、検索キーワードとユーザの管理方法を入力して、保存します。
   -Twitter 検索名 : 任意
   -Twitter のキーワード検索 : 検索したいキーワード
   -不明な Twitter ユーザ名 : 「Twitter アカウント」と同様なので、上記参照のこと

20111026_8

  2. 「Salesforce Social」タブをクリックし、左側の「検索をスケジュール」をクリックします。「Twitter 検索」で、作成したTwitter 検索の検索実行間隔を10分~24時間の範囲で選択し、「有効化」を押下します。

これで準備は完了です。あとは設定したスケジュールで、検索が自動的に実行されます。

・利用イメージ
 検索が実行されると、↓のようにユーザ(「Twitter情報の更新」を押下しています)やツイートが取り込まれます。

20111026_9

 また、Twitterアカウント詳細画面の「会話」関連リストに、ツイートが取り込まれます。

20111026_10

 「会話」に取り込んだツイートの詳細画面から、Facebookの「いいね!」を押したり、組織のChatterに投稿したり、ネガティブなツイートにチェックを付けたり、ケースを作成したりすることができます。

20111026_11

○Facebookページ

・できること
 自社のFacebookページのウォールに投稿やコメントしたユーザを、リードや取引先責任者に取り込んで管理したり、投稿やコメントをケースに取り込んで管理することができます。

・設定方法
 1. 「Facebook ページ」タブをクリックし、「新規」を押下し、
      Facebookページ名とユーザの管理方法を入力して、保存します。
   -名前 : Facebookページ名
   -不明なユーザ : 「Twitter アカウント」と同様なので、上記参照のこと

  2. 保存したら、「検証」を押下します。
     Facebookのログイン画面になるので、自社のFacebookページのアカウント情報を入力すれば、検証完了です。
   ※ 現在、Facebookページの名称が日本語だと、エンコードされて表示されてしまうバグがありますが、動作には問題ないようです

20111026_12

  3. 「Salesforce Social」タブをクリックし、左側の「検索をスケジュール」をクリックします。「Facebook ページ」で、作成したFacebook ページの検索実行間隔を10分~24時間の範囲で選択し、「有効化」を押下します。

これで準備は完了です。あとは設定したスケジュールで、検索が自動的に実行されます。

・利用イメージ
 検索が実行されると、Twitter アカウントと同様に、ユーザや投稿・コメントが取り込まれます。

○ダッシュボード、レポート

Salesforce for Social Mediaには、
・ツイート数の遷移
・キーワード毎のツイート数
・否定的なツイート数
など、利用頻度が高そうなダッシュボード、レポートが用意されています。勿論、カスタマイズも可能です。

20111026_13

○その他の機能

・手動検索
 手動で検索を実施したい場合は、「Salesforce Social」タブ → 「さらに会話を取得」で検索可能です。

・ソーシャルメディアへの投稿
 ↓のように、Salesforce上から、Twitter、Facebook、Chatterへの投稿を同時に実施可能です。また、投稿にはあらかじめ作成しておいたテンプレートを使用することができます。

20111026_14

以上、駆け足でしたが、Salesforce for Social Mediaのご紹介でした。是非お試し下さい。

※ もっと詳しい情報は、ここからダウンロードできる英語版のセットアップガイドで確認して下さい。