Force.com FlowをVisualforceと合わせて使う

by Mitsuhiro Okamoto on 10月 31, 2011 at 07:26 午後

Flow Winter '12リリースでついにクラウドベースのFlow DesignerがBetaリリースされました。Flow Designerを使えば、今まではVisualforceを利用しなければ作成出来なかった、複数画面に渡るウィザードや入力内容によって条件分岐する画面などがコードを書かなくとも簡単に作成・編集できるようになります。

またApexクラスからやVisualforceタグを使ってFlowのコンポーネントへアクセスが可能ですので、Visualforce内にFlowページを埋め込むといったことも可能です。以下はFlowで入力されたCase番号からVFページ上にデータを読み込むサンプルです。

 

VisualforcePage : caseflow

<apex:page controller="FlowpageController" sidebar="false">
<div style="float: left; width: 400px; padding: 10px;">
  <flow:interview name="CaseFlow" interview="{!caseFlow}" reRender="myPanel" />
</div>
<apex:outputPanel id="myPanel" style="float: left; min-width:400px; padding: 10px;">
  <apex:pageBlock title="ケース内容">
    <apex:pageBlockSection columns="1">
      <apex:outputField value="{!sourceCase.ID}"/>
      <apex:outputField value="{!sourceCase.CaseNumber}"/>
      <apex:outputField value="{!sourceCase.Subject}"/> 
    </apex:pageBlockSection> 
  </apex:pageblock>
</apex:outputPanel>
</apex:page>

 

<flow:interview>タグによってflowをVFページ上に配置できます。このタグはreRender属性を持っているので、フローの遷移時にダイナミックに再描画する箇所を指定できます。

以下はApexコントローラクラスです。

Apex Class : FlowpageController

public with sharing class FlowpageController {

    public Flow.Interview.CaseFlow caseFlow {get;set;}

    public Case sourceCase{
        get{
            try{
                List<Case> results = [SELECT Id,CaseNumber,Subject FROM Case Where CaseNumber = :caseFlow.vaCaseNo];
                if(results.size() !=0){
                    return results[0];
                }
            }catch(System.QueryException e){
                //just Demo, ignore;
            }
            return new Case();
        }
        set;
    }
    
    public FlowpageController(){
        caseFlow = new Flow.Interview.CaseFlow(new Map<String, Object>());
    }
}

 


こちらではFlow.Interview.<フロー名>というクラスが宣言されている所が確認できます。

 

エンドユーザの方はForce.com Flowだけを使って画面開発することが多いでしょうが、開発者の方は是非Visualforceともインテグレーションして、より高度な画面デザインにチャレンジしてみて下さい。

Force.com IDE Winter '12 対応バージョンリリース

by Mitsuhiro Okamoto on 10月 28, 2011 at 03:06 午後

Forceidecloudlogo

Force.comアプリケーションを開発するための統合開発環境であるForce.com IDEに、Winter '12対応のバージョンがリリースされました。

変更点は主にWinter '12で新たに追加されたメタデータや、@Readonlyの様なApexの拡張された構文に対応した点です。

使い慣れたEclipseベースの開発環境でForce.comのアプリケーションを開発したい方は、Force.com IDEをお使いください。

Force.com IDE
http://wiki.developerforce.com/index.php/JP:Force.com_IDE

Dreamforce '11 開発者向けブレイクアウトセッション動画

by Mitsuhiro Okamoto on 10月 27, 2011 at 11:56 午前

Df_devzone

Dreamforce '11中の各種開発者向けのブレイクアウトセッションの動画がYoutubeにアップロードされました。

Dreamforce '11 | Developer Force
http://developer.force.com/dreamforce/11/

 

こちらでは各Force.com、Database.com、Heroku等の各プロダクトの紹介からDeepなHack Sessionまで、80以上もの様々なセッションが視聴可能となっています。

例えば、

Apex Design Patterns and Best Practices - Apexを書く上で重要なTipsやデザインパターンを解説
Siteforce An Introduction - Siteforceの基本的な機能のご紹介 

といったものから

Scala, Akka, and Play!: An Introduction in the Cloud - TypeSafeのHavoc氏によるScalaのセッション
Using Node.js on Heroku - Heroku上にNode.jsを使ってアプリケーションをデプロイ

等、その内容も様々です。

基本的には全て英語なのですが、我々日本人が観るのにちょっと助けになるTipsがYoutubeにはあります。

YouTubeでは自動キャプション機能と呼ばれるもので、動画内の音声を字幕にしてくれる機能があります。英語で聞くけどちょっと細かなところ聞き取れない場合はこちらをご利用下さい。

さらに、このキャプションは翻訳もできますので、日本語で字幕を見たい場合はこちらも有効にすると良いかもしれません。音声認識&翻訳なのでかなりおかしな所もありますが、助かりますね。

Youtube2

Dreamforceで発表されたセッションのいくつかは、12月14日開催のCloudforce Japanで講演する予定ですのでこちらもご期待ください!!

IDE in the Cloud!!

by Mitsuhiro Okamoto on 10月 26, 2011 at 11:22 午後

Devconsole

英語のものですが、Winter 12'で正式リリースとなるDeveloper Console(開発者コンソール)の動画がアップロードされています。

新しいコンソールには数多くの新機能が追加されていますが、簡単にご紹介します。

 

 




Apexクラスのリアルタイム編集

今までのApexクラスやApexトリガの編集では、「保存ボタンを押した後に初めて構文エラーが分かる」といった挙動でしたが、新しいコンソールではコードを編集した瞬間に構文エラーを検知します。
また、コンソールからApexクラスの新規作成、該当コード上から参照しているオブジェクトの抽出など、Online IDEとして充分利用出来る強力な機能が実装されています。

 

Heap Dump機能

今回の正式リリースで最も注目される機能の一つであるこのHeap Dumpでは、いわゆるブレイクポイント的な機能が利用できます。一般的なブレイクポイントとの違いは、実際に動作を一時停止させるわけで無く、名前の通りポイントを置いた箇所のコードが実行された時点のHeap(変数の状態など)を保存し、後から参照出来るようになっている点です。これでもう今までの様にデバッグ用のコードを埋める必要はなくなりました。

 

強化されたDebug Log

デバッグログも大幅に強化されています。ログレベルに応じた各種ログ表示の他に実行時に各コードブロックがどれぐらいの時間を要したのかをグラフィカルに表示するタイムライン機能なども備えています。

 

 

その他数多くの機能がありますので、是非実際触って試してみてください。開発者コンソールはHeap Dumpの機能以外は既にDeveloper Editionで利用可能です。 

Development as a Service!!

Force.comとADFSでシングルサインオン

by Mitsuhiro Okamoto on 10月 25, 2011 at 02:48 午後

Samlxmlorglogo

Force.comでは2008年のWinter 10'リリースから、SAML2.0によるシングルサインオンをサポートしています。

以下の記事では、2010年5月からSAML2.0のサポートを開始したMicrosoft Active Directory Federation Servicesとのシングルサインオン方法を具体的に解説しています。Force.comを社内システム(ADFS)とを一度の認証でシームレスに利用したい方は是非ご参照下さい。

Force.com と Microsoft Active Directory フェデレーションサービスの連携によるシングルサインオン http://wiki.developerforce.com/index.php/JP:Single_Sign-On_with_Force.com_and_Microsoft_Active_Directory_Federation_Services

 

またForce.comでは SAML2.0 SPではなくIdP側の機能もサポートしています。例えばForce.com組織を2つ用意し、一つをIdP、もう片方をSPとしてSSOすることも可能です。ヘルプ内以下のページの「Salesforce から Salesforce へのシングルサインオンの設定」をご覧下さい。

 

ID プロバイダとサービスプロバイダの使用例
https://ap.salesforce.com/help/doc/ja/identity_provider_examples.htm

 

日本人 Force.com MVP 第1号 〜 讃岐 行さん 〜

by Mitsuhiro Okamoto on 10月 24, 2011 at 11:25 午前

DeveloperForceコミュニティには、Force.comプラットフォームと開発者コミュニティの発展に大きな貢献をした方を表彰する「Force.com MVP Program」というものがあります。

こちらに今年8月、日本人初の受賞者としてSanuki Ikou(讃岐 行)さんが選ばれました。おめでとうございます!!

Sanuki Ikou : Force.com MVP 
http://developer.force.com/mvp_profile_sanuki

讃岐さんを9月にサンフランシスコで開催されたDreamforce 2011にご招待する予定だったのですが調整が付かなかったため、記念の盾や帽子、Blackberry Playbookなどなどを賞品として先日送らせて頂きました。


Photo2


ご本人からのTweetはこちら
https://twitter.com/#!/i_sanuki/status/127288589125029888

 

Force.com MVPの選出は今後も継続して行われます。MVPの選出には以下の様な活動を積極的に行っている方が対象となります。

  • Force.comテクノロジーをBlogの様なメディアを使って啓蒙
  • Force.com Discussion Boardsでの多大な貢献 
  • Hackathon(ハッカソン)への参加など、テクノロジーへのチャレンジ
  • Code ShareCookBook等、オープンソースプロジェクトへの貢献 
  • DreamforceやCloudstockでのテクニカルセッションへの登壇など

 

次はどなたがMVPになるでしょうか!是非チャレンジしてみてください。

Force.comモバイルアプリ事始め(iOS & Android)

by Mitsuhiro Okamoto on 10月 21, 2011 at 12:16 午後

Mobileimage Force.com及びDatabase.comにはiOSやAndroid端末に対応したアプリケーション開発に特化したツールキットが用意されています。

これらのツールキットを使えば、Force.comへのOAuth2認証/認可や、本来は複数のプロセスから構成されるレコードデータの検索や登録といった処理を簡単に実行できます。各プラットフォーム毎の言語でラッピングしているため、すぐにコーディングをはじめられます。

両ツールキットの基本的な使用方法をまとめた記事を公開しましたので、是非御覧ください。






Force.com Toolkit for iOS の基本を学ぶ http://wiki.developerforce.com/index.php/JP:Getting_Started_with_the_Force.com_Toolkit_for_iOS

 

Force.com Toolkit for Android の基本を学ぶ http://wiki.developerforce.com/index.php/JP:Getting_Started_with_the_Force.com_Toolkit_for_Android

書籍「Force.comのすべて ~設計・開発 実践マニュアル~」発売

by Mitsuhiro Okamoto on 10月 20, 2011 at 03:30 午後

Book_2日経BP社より、 テラスカイの今岡純二さん著「Force.comのすべて ~設計・開発 実践マニュアル~」が発売されました。またセールスフォース・ドットコムでも監修をさせて頂いてます。

本書ではForce.com上でアプリケーションを開発するに当たって必要な技術的トピックに加えて、要件定義の手法や非機能要件に対する考え方にまで言及しており、実際に業務でForce.comを使った開発をしている方々は非常に参考になると思います。

また、第10章「Force.comを使いこなす」の章は、ある程度Force.comに慣れた開発者にも意外と知られていないお役立ちTipsが多く収録されているのでお勧めです。

 

Winter '12ではSiteforceやForce.com Flow、Schema Builderがリリースされるなど、Force.comは常に進化し続けるため全てを網羅するのは難しいですが、プラットフォームの根底部分を開発者としてしっかり理解する上で良い書籍ですので、是非お手に取って(可能であれば購入して:-) )ご覧下さい。

 

Force.comのすべて ~設計・開発 実践マニュアル~

Amazon - http://www.amazon.co.jp/gp/product/482223455X

Winter ’12の新機能 - Visualforce Charting

by Salesforce.com Japan on 10月 19, 2011 at 06:41 午後

Chart 数週間ほど前、DaveCarollとSandeep Bhanotが行ったWebinarでWinter 12'リリースのプラットフォーム新機能について解説されました。

その中の一つにSandeepがデモしたVisualfroceチャートがあります。
これはWinter '12でパイロットリリースの機能で、カスタマイズした複雑なチャートをVisualforceのコンポーネントやタグだけで実現出来るものです。
シンプルなパイチャートから、左のスクリーンショットの様に棒グラフ&折れ線グラフを複合した複雑なものまで、標準のVFチャートコンポーネントをを使って表現できます。
このチャートでは2つの異なるデータが一つのチャートに入っています。棒グラフは月毎のトータルの売上を表しています。折れ線グラフは月毎の受注した商談数を表しています。
以下がVFページのサンプルです。

 



Visualforce Page : OppsChart

<apex:page controller="OppsChartController" showHeader="false" sidebar="false"> 
    <apex:sectionHeader title="Opportunity Analysis for 2011"/> 
    <apex:chart height="380" width="700" data="{!oppDataWithMonthNames}"> 
        <apex:legend position="right"/> 
        <apex:axis type="Numeric" position="left" fields="monthlyRev" title="Revenue ($)"/> 
        <apex:axis type="Category" position="bottom" fields="month" title="Month of the Year"> 
        <apex:chartLabel rotate="315"/> 
        </apex:axis> 
        <apex:barSeries title="Monthly Sales" orientation="vertical" axis="left" xField="month" yField="monthlyRev"> 
            <apex:chartTips height="20" width="120"/> 
        </apex:barSeries> 
        <apex:axis type="Numeric" position="right" fields="noOfClosedOpps" title="Opportunities Closed" grid="true"/> 
        <apex:lineSeries title="Closed-Won" axis="right" xField="month" yField="noOfClosedOpps" fill="true" 
            markerType="cross" markerSize="4" markerFill="#FF0000"/> 
    </apex:chart> 
</apex:page> 



こちらはApexコントローラ側

Apex : OppsChartController

public with sharing class OppsChartController {
    public OppsChartController (){}
    public List getOppDataWithMonthNames() {
        AggregateResult[] result = [SELECT SUM(amount) monthlyRev, COUNT(name) noOfClosedOpps,
                                    CALENDAR_MONTH(CloseDate) month,
                                    CALENDAR_YEAR(CloseDate) year
                                    FROM Opportunity GROUP BY CALENDAR_YEAR(closeDate),
                                    CALENDAR_MONTH(CloseDate), stageName
                                    HAVING stageName='Closed Won' AND
                                    CALENDAR_YEAR(CloseDate) = 2011];
        List oppsData = new List();
        for (AggregateResult a : result)
        {
            Datetime d=Datetime.newInstance((Integer)a.get('year'),(Integer)a.get('month'), 1);
            OpportunityData opp = new OpportunityData(d.format('MMM'),
                                                      (Integer)a.get('noOfClosedOpps'),
                                                      (Double)a.get('monthlyRev'));    
            oppsData.add(opp);
        }
        return oppsData;
    }

    public class OpportunityData
    {
        public String month { get; set; }
        public Integer noOfClosedOpps { get; set; }
        public Double monthlyRev { get; set; }

        public OpportunityData(String mon, Integer noOfOpps, Double rev)
        {
            month = mon;
            noOfClosedOpps = noOfOpps;
            monthlyRev = rev;
        }
    }
}

 

上記のコードをもう少し解説していきます。

1) VFチャート コンポーネント/タグ:

Winter ’12でVisualforceのライブラリに様々なChartタイプをサポートするコンポーネント及びタグが追加されました。この高度なコンポーネントはを使うには、まず <apex:chart>(3行目)タグを利用する必要があります。
またいくつかの属性をを持っていますが、一番必要な属性は'data'です。'data'属性にチャートにバインドさせるデータを指定します。 <apex:chart>コンポーネントは複数の入れ子のコンポーネントを持つことができ、表示させたいChartタイプを指定します。
現在は3つのChartタイプをサポートしていて、パイチャート(<apex:pieSeries>), バーチャート(<apex:barSeries>) そしてラインチャート(<apex:lineSeries>)があります。 サンプルの様に、バーチャートとラインチャートは同一チャート上に重ねて表示することが可能です。それぞれのバーチャートとラインチャートは<apex:axis>コンポーネントを使用した2つのaxis(軸)が必要となります。ポジションとタイプ(‘Numeric’ もしくは ‘Category’)を軸ごとに属性に定義できます。

注意として、2つの異なるデータチャートで軸をシェアすることができます。バーチャートとラインチャートでは同じX軸(今年の月毎)を共有しています。

 

2) VFとのデータのバインディング :

VFチャートではデータとチャートをバインドするのにいくつかの方法が用意されています。<apex:chart>コンポーネント内の‘data’ 属性に、Controller/extensionからreturnされるSObjectもしくはApex ObjectのListを設定します。SObjectのListの場合、単純にSObjectのフィールドをチャート上のデータにプロットします。またはApex Objectをreturnさせることもできます。

このサンプルの場合はまず、<AggregateResult>としてSOQLクエリより取得したリストがあります。ここでSOQLのCALENDAR_MONTHファンクションは数値(1-12)を返しますが、チャートでは文字列を表示たいので、Monthの値を数値から文字列へ変更するシンプルなWrapperクラス(OpportunityData)を使って適切なデータを作成しています。 <apex:chart>コンポーネントの'data'属性にControllerメソッドバインディングすることに加え、バーチャートやラインチャートがどのSObject/Objectのフィールド/プロパティを利用するのかをX軸及びY軸に定義する必要があります。これは<apex:axis>コンポーネントの'fields'属性と、<apex:barSeries>/<apex:lineSeries>コンポーネントの‘xField’と‘yField’ 属性で設定できます。

最後に、より高度なユースケースとして、ChartをVFページ中に定義したJavascriptのfunctionもしくはJavascriptのArrayにバインドさせることも出来ます。Javascript functionとのバインディングでは、データをJavascript Remotingを使ってSalesforceから取得することも可能です。

この場合Javascriptによって取得されるデータは、VF Chartがレンダリングされるより前に取得されます。Javascript remotingの詳細についてはVisualforce Developers Guideの該当ページを確認してみて下さい。

 

3) その他: 

VF Chartingには他にも<apex:chartTips>や<apex:chartLabel>の様な、チャートの表示を調整する為のコンポーネントがいくつか用意されています。

サンプル中では、9行目に<apex:chartLabel>コンポーネントを使用して月のテキストを回転させています。その他の詳細はこれらのコンポーネントをVisualforce Developers Guideで確認して下さい。

 

このサンプルがVFチャート機能で何が出来るのかを理解するのに役立ちますでしょうか?数行のコードを書くだけでレポート等の分析機能と同じような高度なチャートが作成できます。また、ダッシューボードにこのカスタムVFページを埋め込むことによって、カスタムチャートを表現することも可能です。チャートはJavascriptによってレンダリングされるため(Flashや外部プラグインはいりません)、これらのカスタムチャートはVisualforceページに対応しているモバイルデバイスならば表示可能です。

 

VFチャートはWinter '12ではパイロットリリースとなっています。まずはDE or Sandbox組織上で有効化するよう、セールスフォース・ドットコムのサポートに依頼してください。今すぐ試してみましょう!!

Visualforceでの数値の丸め方式について

by Tetsuo Ajima on 10月 4, 2011 at 11:23 午前

apex:outputText

上記ページに、Visualforce上で数値の書式を指定する、下記のサンプルコードが記載されています。

<apex:outputText value="{0, number, 000,000.00}">
       <apex:param value="{!Account.AnnualRevenue}" />
 </apex:outputText>
</apex:page>


この記述方法では、端数の丸めに"Half-Even"という方式が採用されます。
"Half-Even"は米国の金融機関で広く用いられている方式で、中間の値を丸める際に切り上げではなく偶数側に寄せるという方法になります。
切り上げと切り捨てが平等に行われることから、計算結果がぶれないことが期待できるとされています。
この、"最近接偶数への丸め"という方式はIEEE 754、ISO-31 および JIS Z 8401規則Aで定義されています。

(例) 13.5 -> 14
(例) 14.5 -> 14
(例) 15.5 -> 16
(例) -13.5 -> -14
(例) -14.5 -> -14
(例) -15.5 -> -16

一方、Force.comプラットフォームの標準ページレイアウト、レポート、Visualforceのapex:outputFieldコンポーネントでは"Half-Up"という方式が採用されており、絶対値ベースで四捨五入を行うという方法になります。
この方式はJIS Z 8401の規則Bで定義されています。

(例) 13.5 -> 14
(例) 14.5 -> 15
(例) 15.5 -> 16
(例) -13.5 -> -14
(例) -14.5 -> -15
(例) -15.5 -> -16

ちなみに、日本国内においては、"四捨五入"として単純に中間値の切り上げとなる方法も広く用いられています。

(例) 13.5 -> 14
(例) 14.5 -> 15
(例) 15.5 -> 16
(例) -13.5 -> -13
(例) -14.5 -> -14
(例) -15.5 -> -15


最初に挙げた、Visualforceページ内でフォーマットパターンを指定する方式では常に"Half-Even"となってしまうため、これを"Half-Up"として他の箇所と揃えるには、Visualforceコントローラ内で値の丸め処理を行う必要があります。
Decimalクラスのround()メソッドやsetScale()メソッドは丸め方式を指定可能です。

(例) Integer int = Decimal.valueOf(-14.5).setScale(0, RoundingMode.HALF_UP).intValue();