2013年6月26日 (水)

VisualforceでCSVファイルとExcelファイルを出力するには

今回は、VisualforceでCSVファイルとExcelファイルを出力する方法をご紹介。

○CSVファイル

CSVファイルを出力するには、↓のように、pageタグのcontentTypeに「application/vnd.ms-excel」を指定します。contentTypeに「#<ファイル名>」と記述することで、ファイル名を指定できます。後は、カンマ区切りでヘッダ及びデータを出力するだけです。

・Visualforceページ

<apex:page contentType="application/vnd.ms-excel;charset=Windows-31J;#test.csv" controller="CsvController">
  <apex:outputText escape="true" value="{!csvHeader}" />
  <apex:repeat value="{!recordList}" var="record" id="csvList">{!record}</apex:repeat>
</apex:page>

○Excelファイル(表だけの場合)

Excelファイルに表を出力するには、↓のように、pageタグのcontentTypeに「application/vnd.ms-excel」を指定します。後は普通にHTMLで表を出力すればOKです。表は<table>タグで書いても、<apex:pageBlockTable>タグで書いても構いません。

・Visualforceページ 例1

<apex:page contenttype="application/vnd.ms-excel;charset=Windows-31J#test1.xls" controller="ExcelController">
  <table>
    <tr><td colspan="2">タイトル</td></tr>
    <tr><td>列1</td><td>列2</td></tr>
  </table>
</apex:page>

・Visualforceページ 例2

<apex:page contenttype="application/vnd.ms-excel;charset=Windows-31J#test2.xls" controller="ExcelController">
  <apex:pageBlock title="取引先責任者一覧">
    <apex:pageBlockTable value="{!account.Contacts}" var="item">
      <apex:column value="{!item.LastName}"/>
      <apex:column value="{!item.FirstName}"/>
    </apex:pageBlockTable>
  </apex:pageBlock>
</apex:page>

・出力されるExcelファイル

test1.xlsをダウンロード

○Excelファイル(表以外にも細かく指定したい場合)

複数のシートを出力したい、印刷範囲を指定して出力したいなど、表だけではなく、少し凝ったExcelファイルを出力したい場合は、Offirce2007以降で採用されているOpen XMLファイル形式で出力しますOffice2003以前では開けないので注意!)。

Open XMLファイルで出力するには、↓のように、pageタグのcontentTypeに「text/xml」を指定し、Open XMLファイル形式に則って記述します(Visualforceページの2~3行目のXMLバージョンとMSO アプリケーションの部分は、Visualforceページの構文の都合上、Visualforceページに直接書けないため、コントローラに記載しています)。同様の方法で、Wordファイルも出力可能です。

・Visualforceページ

<apex:page contenttype="text/xml;charset=UTF-8#test.xml" controller="Excel2Controller">
<apex:outputText escape="true" value="{!xmlVer}" />
<apex:outputText escape="true" value="{!xmlApp}" />
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <Worksheet ss:Name="Sheet1">
  <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="4" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="13.5">
   <Row ss:AutoFitHeight="0">
    <Cell><Data ss:Type="String">表1</Data></Cell>
    <Cell><Data ss:Type="String"></Data></Cell>
   </Row>
   <Row ss:AutoFitHeight="0">
    <Cell><Data ss:Type="String">列1</Data></Cell>
    <Cell><Data ss:Type="String">列2</Data></Cell>
   </Row>
   <Row ss:AutoFitHeight="0">
    <Cell><Data ss:Type="String">あ</Data></Cell>
    <Cell><Data ss:Type="String">A</Data></Cell>
   </Row>
   <Row ss:AutoFitHeight="0">
    <Cell><Data ss:Type="String">い</Data></Cell>
    <Cell><Data ss:Type="String">B</Data></Cell>
   </Row>
  </Table>
 </Worksheet>
 <Worksheet ss:Name="Sheet2">
  <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="4" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="13.5">
   <Row ss:AutoFitHeight="0">
    <Cell><Data ss:Type="String">表2</Data></Cell>
    <Cell><Data ss:Type="String"></Data></Cell>
   </Row>
   <Row ss:AutoFitHeight="0">
    <Cell><Data ss:Type="String">列1</Data></Cell>
    <Cell><Data ss:Type="String">列2</Data></Cell>
   </Row>
   <Row ss:AutoFitHeight="0">
    <Cell><Data ss:Type="String">ア</Data></Cell>
    <Cell><Data ss:Type="String">a</Data></Cell>
   </Row>
   <Row ss:AutoFitHeight="0">
    <Cell><Data ss:Type="String">イ</Data></Cell>
    <Cell><Data ss:Type="String">b</Data></Cell>
   </Row>
  </Table>
 </Worksheet>
</Workbook>
</apex:page>

・Apex(コントローラー)

public with sharing class Excel2Controller {
    public String getXmlVer() {
		return '<?xml version="1.0"?>' + '\r\n';
    }

    public String getXmlApp() {
		return '<?mso-application progid="Excel.Sheet"?>' + '\r\n';
    }
}

・出力されるXMLファイル

test.xmlをダウンロード

2013年4月23日 (火)

コンテンツ配信

Salesforceには、ファイルを共有する機能がいくつかありますが、その中でも、コンテンツ配信はファイル共有の方法を細かく制御することができるため、知っていると何かと便利です。

また、メモ&添付ファイルやドキュメントでは、Salesforce内でしかファイル共有できませんが、コンテンツ配信機能を使うと、Salesforceのアカウントを持たない人にもファイルを共有できます

Chatterファイルでもできるのですが、Chatterファイルに比べて、コンテンツ配信機能では、↓のようなこともできるようになっています。

・閲覧者にファイルのダウンロードを許可するのか、オンライン表示だけを許可するのかを制御できる(ファイルの内容は見せたいけど、ファイルは渡したくない場合に便利)
・有効期限を設定できる
・パスワードを設定できる
・コンテンツが参照/ダウンロードされた回数を追跡できる

手軽にファイル共有するならChatterファイル、ファイル共有の方法を細かく制御する必要がある場合はコンテンツ配信と、使い分けるとよいでしょう。

○使用方法

1. [設定] → [アプリケーションの設定] → [カスタマイズ] → [コンテンツ配信] → [設定] で、「コンテンツ配信を有効化」をONにします。

20130423_1_2

2. コンテンツ配信をしたいオブジェクトのページレイアウトで、関連リストに「関連コンテンツ」を追加します。

 ※「関連コンテンツ」の『コンテンツの検索』または『すべての検索』で、登録済のコンテンツを検索して、レコードに関連付けることができます。

20130423_2

20130423_3

3. 「関連コンテンツ」の『コンテンツの配信』をクリックして、新しいコンテンツ配信を作成します。

  ライブラリから検索して、既に作成したコンテンツを選択する方法と、
  ローカルのファイルをアップロードして、新規コンテンツを作成する方法があります。

20130423_4

4. 配信するコンテンツを選択したら、コンテンツ配信の設定を行います。下記の項目を設定できます。

配信方法
  ・受信者にブラウザでの参照を許可
  ・受信者に ○○での参照を許可(※ ○○はxlsなど)
  ・受信者に PDF形式での参照を許可

配信の設定
  ・最初に参照またはダウンロードされたら私に通知
  ・コンテンツに対するアクセス権を削除(有効期限
  ・コンテンツへのアクセスにパスワードが必要(パスワード有無

20130423_5

5. 設定を保存したら、配信作成完了です。
  配信用のリンクとパスワードが表示されるので、それをメールに貼って配信の通知をします。

20130423_6

  配信後は、↓の配信設定画面で設定変更できます。参照/ダウンロードの状況も確認できます。

20130423_7

  「最初に参照またはダウンロードされたら私に通知」を設定していると、↓の通知が自分宛に届きます。

20130423_8

2013年4月 4日 (木)

リリースの監視

Force.com IDEから組織にメタデータ/ソースコードをリリースするとき、実行されるテストコードが多いと結構時間がかかります。IDE上では、リリースの進捗状況やエラーの発生状況は表示されないので、いつリリースが終わるのか、エラーが発生しているのかが分からず、不安になります。

また、リリースが完了してから、Force.com IDEに結果が表示されるまでにはタイムラグがあるので(大体数分ですが、遅いときは数十分かかることもあります。ちなみに、タイムラグはメタデータAPIが非同期であるために発生します。)、IDEの画面だけを見ていると、実はリリースがもう終わってることに気が付かなかったりします。

こんなことを防ぐために、セールスフォースにはリリースの監視機能があります。リリースの監視機能によって、リリースの進捗状況とエラーの発生状況を把握でき、あとどのくらいでリリースが完了するのかを大体予測することができます。

使い方は、リリースをしている最中に、

[設定] → [アプリケーションの設定] → [リリース] → [リリースの監視]

を見るだけです。

↓のように、「処理中のリリース」「完了したリリース」が表示されます。
※但し、完了したリリースでも7日間経つと表示されなくなります。

20130404_1

リリースの監視で表示される情報の意味を記載しておきます。

・状況

説明
キュー 待ち状態
処理中 メタデータ/ソースコードのチェック処理中
テスト実行中 テスト実行中(現在実行中のテストメソッドが表示される)
完了 リリース正常終了 (但し、テストのカバレッジ75%未満だとリリース失敗するので注意!
エラーで完了 リリース異常終了 (チェック処理エラー または テスト失敗)

・コンポーネント
 リリースするメタデータ/ソースコードの数

・テスト
 テストの進捗状況とエラー発生状況
 テスト完了数/テスト総数 (エラー発生件数) で表示
 リリースに要する時間のほとんどはテストの時間なので、テストの進捗状況から
 リリースにあとどのくらい時間がかかるかを予測することができます。

リリースの監視では、エラーが発生してもエラーの内容までは教えてくれないのがちょっと残念なところです。エラーの内容を知るには、IDEのリリースが完了するのを待つ必要があります。この辺りは今後の改善を期待したいところです。

2012年10月23日 (火)

レポートのアクセス権限設定

レポートのアクセス制御として、

公開レポートを実行させたいけど、編集・削除はさせたくない
・公開レポートを新規作成させたいけど、編集・削除はさせたくない

などのニーズがあるかと思いますが、

レポートのアクセス権限は、設定がちょっとややこしいので、表にまとめてみました。

レポートの「実行」「作成」「変更・削除」をする権限があるかないかは、

・レポートフォルダの公開先
・レポートフォルダのアクセス権限
・プロファイルで付与されている権限

で決まります。

○レポートの実行 の権限あり/なし

プロファイルで「レポート実行」権限が付与されている場合は、非表示フォルダ以外にあるレポートを実行可能です。

プロファイルで「すべてのデータの参照」権限が付与されている場合は、すべてのレポートを実行可能です。

レポートフォルダ
の種類(公開先)
レポートフォルダ
のアクセス権限
プロファイルで
付与されている権限
レポート実行 すべての
データの参照
公開フォルダ(※1) 参照のみ
公開フォルダ 参照・更新
非表示フォルダ(※2) 参照のみ ×
非表示フォルダ 参照・更新 ×
共有フォルダ(※3) 参照のみ
共有フォルダ 参照・更新
個人フォルダ(※4)

○:権限あり
×:権限なし
-:関係なし

※1 公開先で「このフォルダは、ポータルユーザを含むすべてのユーザがアクセス可能です」
   または「このフォルダは、ポータルユーザを除き、すべてのユーザがアクセス可能です」
   を選択したフォルダ
※2 公開先で「このフォルダはすべてのユーザから非表示となります」を選択したフォルダ
※3 公開先で「このフォルダは次のグループに含まれるユーザのみアクセス可能です」を選択したフォルダ
※4 「私の非公開カスタムレポート」フォルダ

○レポートの新規作成 の権限あり/なし

プロファイルで「レポートの作成とカスタマイズ」権限が付与されている場合は、アクセス権限が「参照・更新」に設定されている公開フォルダ、共有フォルダ 及び 個人フォルダにレポートを作成可能です。

プロファイルで「公開レポートの管理」権限が付与されている場合は、すべてのフォルダにレポートを作成可能です。

レポートフォルダ
の種類(公開先)
レポートフォルダ
のアクセス権限
プロファイルで
付与されている権限
レポートの作成
とカスタマイズ
公開レポート
の管理
公開フォルダ 参照のみ ×
公開フォルダ 参照・更新
非表示フォルダ 参照のみ ×
非表示フォルダ 参照・更新 ×
共有フォルダ 参照のみ ×
共有フォルダ 参照・更新
個人フォルダ

○レポートの変更・削除 の権限あり/なし

プロファイルで「レポートの作成とカスタマイズ」権限が付与されている場合は、個人フォルダのレポートのみ変更・削除可能です。

プロファイルで「公開レポートの管理」権限が付与されている場合は、すべてのフォルダのレポートを変更・削除可能です。

レポートフォルダ
の種類(公開先)
レポートフォルダ
のアクセス権限
プロファイルで
付与されている権限
レポートの作成
とカスタマイズ
公開レポート
の管理
公開フォルダ 参照のみ ×
公開フォルダ 参照・更新 ×
非表示フォルダ 参照のみ ×
非表示フォルダ 参照・更新 ×
共有フォルダ 参照のみ ×
共有フォルダ 参照・更新 ×
個人フォルダ

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

2012年2月27日 (月)

Apex共有で所有者と同じロールへレコードを共有する方法

Salesforceでは、組織の共有設定が「非公開」に設定されている場合、
同じロールに属するユーザが所有するレコードは参照できません。
営業部ロールにAさんとBさんが属していた場合、Aさんが所有するレコードをBさんは参照できない

一方で、「同じロールに属するユーザが所有するレコードは参照できるようにしたい
営業部の誰かが所有するレコードは、営業部全員で参照できるようにしたい)」
という要望を頂くことは結構多いような気がします。

この要望は、↓の共有ルールを作成すれば実現できます。
所有者の所属:「営業部ロール」
共有先:「営業部ロール」
アクセス権:「参照のみ」

但し、この方法だと、このルールを適用するロールの数だけ共有ルールを作成しなければなりません。また、ロールの追加や変更の度に、共有ルールを追加・変更しなければなりません。

大規模な組織などで、ロールの数が多い場合や、ロールの追加・変更が多い場合は、
下記で紹介する方法で、トリガからApex共有を使って、自動的に対応するロールにレコードを共有すると良いでしょう。

トリガでApex共有を使って、レコード共有する方法

1. トリガを作成するオブジェクトに、Apex共有の理由を作成

理由表示ラベルと理由名を設定(どちらも任意の名称でOK)して、Apex共有の理由を作成します。

ここでは、
理由表示ラベル:所有者のロールへの共有
理由名:OwnerRoleSharingReason
と設定します。

20120227_1

2. トリガ作成

オブジェクトに所有者のロールへレコードを共有するトリガを作成します。
ここでは、Item__cというカスタムオブジェクトに作成する場合のソースコードを記載します。

Trigger ShareItemTrigger on Item__c (after insert, after update) {
  // レコードIDリストの作成
  // 所有者IDリストの作成
  List<ID> recordIdList = new List<ID>();
  List<ID> ownerIdList = new List<ID>();
  for(Item__c item : Trigger.new){
    recordIdList.add(item.Id);
    ownerIdList.add(item.OwnerId);
  }

  // 共有レコード追加リストの作成の
  // 共有先ユーザ/グループの設定のところで、
  // 所有者IDに対応するグループIDを取得したいので、
  // 「所有者ID-ロールID マップ」と
  // 「ロールID-グループID マップ」を作成する
  //
  // 所有者ID-ロールID マップの作成
  Map<Id, Id> ownerIdMap = new Map<Id, Id>();
  for(User u : [Select Id, UserRoleId From User 
                Where Id = :ownerIdList]) {
    ownerIdMap.put(u.Id, u.UserRoleId);
  }

  // ロールID-グループID マップの作成
  Map<Id, Id> roleIdMap = new Map<Id, Id>();
  for(Group grp : 
    [Select Id, RelatedId From Group 
     Where RelatedId = :ownerIdMap.values() 
     and Type = 'Role']) {
     roleIdMap.put(grp.RelatedId, grp.Id);
  }

  // 共有レコード追加リストの作成
  // (共有オブジェクトに追加するレコードを作成する)
  List<Item__Share> addShareList 
    = new List<Item__Share>();
  for(Item__c item : Trigger.new) {
    Item__Share shareObj = new Item__Share();

    // 共有レコードID
    shareObj.ParentId = item.Id;

    // 共有先ユーザ/グループ
    // (所有者のロールに対応するグループIDを設定)
    shareObj.UserOrGroupId = 
      roleIdMap.get(ownerIdMap.get(item.OwnerId)); 

    // アクセス権限
    // 参照のみ : read
    // 参照・更新 : edit
    shareObj.AccessLevel = 'read';
    
    // 共有の理由
    shareObj.RowCause = 
      Schema.Item__Share.RowCause.OwnerRoleSharingReason__c;

    addShareList.add(shareObj);
  }

  // 共有レコード削除リストの作成
  List<Item__Share> delShareList =
    [Select Id From Item__Share 
     Where ParentId = :recordIdList 
     and RowCause = 
     :Schema.Item__Share.RowCause.OwnerRoleSharingReason__c];

  try {
    // 共有の理由が「所有者のロールへの共有」である
    // 共有レコードを削除してから、追加する
    delete delShareList;
    insert addShareList;
  }
  catch(System.DmlException e) {  
  }
}

トリガ作成後に、レコードを追加・更新すると、所有者のロールにレコードが共有されるようになります。

レコードの詳細画面で「共有」を押下すると、↓のように、所有者のロールへ共有されていることが分かります。

20120227_2

2012年1月 6日 (金)

メールの送受信の制限

Salesforce導入時に、メールの送受信の制限を調べることが多いので、まとめてみました。(Winter '12時点での制限となりますので、その旨ご了承ください。)

「メール to ケース」「Apexによる送信メール」「ワークフロー系のメール」「それ以外のメール」で、それぞれ別にカウントされるのがポイントです。

対象 1日あたりの送受信件数
メール to ケース 2500通
Apexによる送信メール 1000通
・ワークフローの電子メールアラート
・承認プロセスの電子メールアラート
の合計
ユーザライセンス数(※1)×1000通
(但し、最大200万通まで)
上記以外のメール送受信の合計

・活動からのメール送信
・メール一括送信(※2)
・登録情報照会
・オンデマンド メール to ケース
など
ユーザライセンス数(※1)×1000通
(但し、最大100万通まで)

※1 メール送信が可能なユーザライセンス数の合計
  (Salesforceライセンス、Salesforce Platformライセンス、Chatter Onlyライセンスなどが含まれる)

※2 一度に送信可能な件数は、下記のようにエディションにより異なる
・Professional Edition:250通
・Enterprise Edition:500通
・Unlimited Edition:1000通

<参考>
Salesforce のエディションと制限
日次ワークフローメール制限

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年11月21日 (月)

SOQLでのコレクションとバインド変数の使用方法

今日は、SOQLでのコレクション(List、Set、Map)バインド変数に関する小技をご紹介。

○SetやMapでSOQLの結果を直接受け取る方法

SOQLの結果は通常Listで受け取りますが、↓のように、コンストラクタを使って、SetやMapで直接受け取ることができます。

// Listの場合

List<Account> accList = [Select Id From Account];


// Setの場合

// これはコンパイルエラー
Set<Account> accSet = [Select Id From Account];

// コンストラクタにSOQL結果のListを渡すとうまくいく
Set<Account> accSet
  = new Set<Account>([Select Id From Account]);


// Mapの場合

// これはコンパイルエラー
Map<Id, Account> accMap = [Select Id From Account];

// コンストラクタにSOQL結果のListを渡すとうまくいく
Map<Id, Account> accMap
  = new Map<Id, Account>([Select Id From Account]);

○IN句でコレクションを使用する方法

SOQLのIN句では、バインド変数にListとSetを使用できます。Mapは使用できませんが、Mapのvaluesメソッド または keySetメソッドで返すList または Setを渡すようにすると使用できます。

// Listの場合
List<String> nameList = new List<String>();
nameList.add('佐藤');
nameList.add('木村');

List<Contact> ctcList
  = [Select Id From Contact Where LastName IN :nameList];


// Setの場合
Set<String> nameSet = new Set<String>();
nameSet.add('佐藤');
nameSet.add('木村');

List<Contact> ctcList
  = [Select Id From Contact Where LastName IN :nameSet];


// Mapの場合
Map<String, String> nameMap = new Map<String, String>();
nameMap.put('佐藤', '佐藤');
nameMap.put('木村', '木村');

// これはコンパイルエラー
List<Contact> ctcList
  = [Select Id From Contact Where LastName IN :nameMap];

// Mapの値セットを渡したい時は、valuesメソッドで返すListを渡すとうまくいく
List<Contact> ctcList
  = [Select Id From Contact Where LastName IN :nameMap.values()];

// Mapのキーセットを渡したい時は、keySetメソッドで返すSetを渡すとうまくいく
List<Contact> ctcList
  = [Select Id From Contact Where LastName IN :nameMap.keySet()];

○動的SOQLでバインド変数を使用する方法

[]内のSOQLの中でないと、バインド変数は使用できないと思われがちですが、動的SOQLでもバインド変数が使用可能です。
↓のように、Database.queryメソッドに渡すSOQL文字列にそのままバインド変数を記述すれば使用できます。

// 動的SOQLでもバインド変数が使えます
String soql = 'Select Id From Case Where Priority In :priorityList';

List<String> priorityList = new List<String>();
priorityList.add('高');
priorityList.add('中');

List<Case> caseList = Database.query(soql);

採用情報

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