2012年5月7日月曜日

外部ファイル出力について-その2

外部ファイルのリンクを作成する場合、普通にaタグでリンクさせるとファイルは出力されるもののページも遷移してしまい、何もない画面になってしまいます。ヘッダーも表示されないので戻るボタンを押すしかなく、少々具合が悪いです。
この問題は非表示のインラインフレームを作成することで回避可能です。具体的には以下のようなコードになります。
   Visual Force Page

2012年5月2日水曜日

外部ファイル出力について-その1

SalesForceのレポートは簡単かつ強力なのですが、お客様によってはExcelでの出力を求められる機会は少なくないと思います。そこでWord,Excel,PDFの各形式でのファイル出力を試してみました。

まず、もとになる表をVisualForceで作成してみます。
今回はコントローラを使用せず、単純にTableタグで作成された表を使用します。(素材はこちらのサイトを使用させていただきました。)
このページのapex:pageタグはこのようになっています。なにもありません。
   Visual Force Page


1.Microsoft Word

apex:pageタグを以下のように編集すると、Microsoft Word形式で出力できます。
   Visual Force Page

captionタグ、thタグで囲まれた部分は、改ページ時に次ページ以降にも列見出しとして継承されていることがわかります。また、わかりずらいのですが表の中のリスト項目に注目してください。このリストの要素はcodeタグで囲まれているのですが、この部分は自動的に等幅フォント(MSゴシック)が使用されています。
なお、ファイル名の拡張子をdocxとするとエラーになります。


2.Microsoft Excel

apex:pageタグを以下のように編集すると、Microsoft Excel形式で出力できます。
   Visual Force Page

セルの結合もきちんと反映されています。codeタグで囲まれた部分も等幅フォントになっています。ただし、印刷時にWordのような見出し行の固定は設定されませんでした。
当然、計算式を埋め込んだりもできません。


3.PDF

PDFの場合は、MSOffice系とは方法が異なります。VisualforceからPDF出力をする場合、pageタグのrenderAs要素に"PDF"を設定するのですが、そのままではブラウザに表示されてしまいファイルに名前を付けて保存することができません。そのためPDFで書き出すページをインクルードさせてファイル出力を行います。従って、VisuarForceページは、2つ必要になるわけです。
まず、ファイルを出力するページは、こんな感じです。出力対象ページをインクルードしているだけの簡単なものです。
   Visual Force Page

次にインクルードされるページです。PDF出力する場合は、ヘッダーに書式を書かなければなりません。
書式の書き方はこちらのサイトを参考にさせていただきました。
   Visual Force Page
どうもPDFの書式設定はあまり自由度がないみたいなので(特にフォントまわり)、Office環境があるなら、WordかExcelで出力したほうが見栄えは良くできそうです。

2012年5月1日火曜日

date型とdatetime型についてあれこれ-その2

続きです。

4.和暦変換
APEXには残念ながら元号は用意されていないので、和暦の変換は関数を作る必要があります。

   APEX クラス

日付型の比較対象データを作成するのに、date.newinstance()を使用しない方法がありそうなのですが、
今のところ良い知恵がありません。

date型とdatetime型についてあれこれ-その1

SalesForceのdatetime型の取り扱いは少々注意が必要です。

1.現在の取り方の違い
データ型メソッド結果
date型date.today()Tue May 01 00:00:00 GMT 2012
datetime型datetime.now()Tue May 01 06:31:59 GMT 2012
string型に変換datetime.now().format('yyyy/MM/dd hh:mm:ss')2012/05/01 03:31:59

datetime型でタイムスタンプを取得する場合、now()を使用するとタイムゾーンがGMTで返ってきてしまいます。
formatを使用すると、ローカルのタームゾーンに変換されます。datetime型の場合、メソッドを活用することでタイムゾーンを変えることができます。
詳しくはこちら。http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_datetime.htm

2.date型のフォーマット
date型のフォーマットは、書式を細かく設定するものではないようです。
date.today().format('yyyy/MM/dd') は、エラーになります。
date型のフォーマットは、ユーザーのロケーションに合わせた日付の形式に変えてくれるだけのようで、
date.today().format() とすると、単純に 2012/05/01 という文字列が返ってきます。

3.datetime型のフォーマット
datetime型のformatメソッドの書式はJavaと同様です。VB出身者はフォーマットの書式で戸惑うかもしれません。
ポイントは大文字と小文字で意味が異なるという点です。
書式結果
yyyy/MM/dd hh:mm:ss2012/05/01 04:00:29 ○
yyyy/mm/dd hh:mm:ss2012/00/01 04:00:29 ×
yyyy/MM/DD HH:MM:SS2012/05/122 16:05:759 ×
YYYY/MM/DD HH:MM:SS は、エラーになります。

参考:書式パターン文字一覧
文字説明
G 紀元 AD
y 1996, 96
M July, Jul, 07
w 年における週 27
W 月における週 2
D 年における日 189
d 月における日 10
F 月における曜日 2
E 曜日 Tuesday, Tue
a 午前/午後 PM
H 一日における時(0~23) 0
k 一日における時(1~24) 24
K 午前/午後の時(0~11) 0
h 午前/午後の時(1~12) 12
m 30
s 55
S ミリ秒 978
z タイムゾーン Pacific Standard Time, PST, GMT-08:00
Z タイムゾーン -0800

2012年4月13日金曜日

複数の言語が含まれているデータをインポートする


ひとつのオブジェクトの中に、複数の言語が存在するデータをインポートする方法です。
例えば、何かの名称のマスターとして使用する場合に、日本語名、英語名、韓国名、中国語名のカラムがある場合のデータインポート方法です。
オブジェクトを作成し、名称を翻訳サイト等で変換しながら各項目に入力してみると、問題無く各言語が登録できます。
しかし、データローダを使用する場合はどうでしょうか?

ExcelでCSVを作成する場合、文字コードがShift-JISで保存されます。そのため、保存したCSVをメモ帳で開くと、韓国語や一部の中国語が文字化けしているのがわかります。
このファイルをデータローダに読み込ませても、文字は化けたままです。したがって、UTF-8に正しく変換されたCSVを用意する必要があります。

なんとかExcelのデータをUTF-8で保存できないかと調べたところ、Excel2007では「Web文書」で保存する時にオプションでUTF-8が選べることがわかりました。

以下、具体的な方法です。
「名前を付けて保存」ダイアログのツールメニューからWebオプションを選択します。
エンコードを「Unicode(UTF-8)」に設定します。
文書形式を「Webページ」で保存すると、UTF-8にエンコードされたデータが保存されます。
しかし、この文書はHTMLなので当然データローダにかけることはできません。また、ブラウザの画面をコピーしてメモ帳に貼り付けても、CSVにはなりません。

そこでExcelの計算式を利用して、カンマ区切りのデータを1セルに納めてしまいます。

再度「Webページ」で保存し、ブラウザで開きます。
文書全体を選択し、メモ帳に貼り付け、CSV形式で保存すると、データローダで読み込める多言語のCSVファイルになります。

多少面倒ではありますが、1件ずつ手打ちするよりは良いと思います。

2012年4月6日金曜日

VisualForceで jQuery Mobile を使用する。

SalesForceがMobileSDKと関連ドキュメントを続々リリースしているようなので、この先あまりニーズは無いかもしれませんが、VisualForce での jQuery Mobile を使用する場合のポイントです。

1.jQueryの取得
jQueryのホームページから、jQuery、jQueryMobileのリソースをダウンロードし、静的リソースに格納。
なお、CSSはThemeRollerを使うと便利ですが、このへんの使い方は割愛します。

2.VisualForcePageの作成
VisualForceでjQueryMobileを使用するには、VisualForce内にhead部とbody部を作成し、通常のjQueryMobileと同様のコードを書けば、問題無く動作します。
タグと静的リソースの参照は以下のようになります。
   Visual Force Page

ポイント1
<apex:page>
タグの"standardStylesheets"を"false"にすること。こうしないとページにSalesForceのスタイルシートが適用されてしまいます。

ポイント2
機器の縦横の向きを変更した場合に、自動的に表示幅を合わせるために、metaタグでviewportの設定をしています。jQueryMobileのサンプルでは、
<meta name="viewport" content="width=device-width, initial-scale=1"/>
となっていますが、これだとiPhone,iPadではうまく動作しませんでした(横向きにしたときにサイズがオーバーする)。
<meta name="viewport" content="width=device-width, minimum-scale=1, maximum-scale=1"/>
とすることで、正しく表示されるようになりました。

なお、一応これでVisualForceの画面がモバイルサイトっぽくなりますが、あくまでこれは個別のページをjQueryMobileで表示しているに過ぎず、ログイン画面やホーム画面はPC用の画面のままということになります。

2012年3月30日金曜日

VisualForceからJavaScriptを経由してApexのメソッドにパラメータを渡す。

VisualForceからApexのメソッドにパラメータを渡す。 の発展形です。
VisualForceからJavaScriptを経由してApexメソッドにパラメータを渡します。

基本は以下の株式会社ウフル様の技術ブログに書いてある通りです。
[salesforce]JavaScriptからVisualforceコントローラのメソッドにアクセスする方法

以下、実際自分が作成したコードを、パラメータの流れを追う形で整理してみます。

1.JavaScriptの呼び出し
VisualForceのコマンドボタンから、JavaScriptの関数を呼び出します。
JavaScriptには、引数'hoge'が渡されます。
   Visual Force Page

2.JavaScriptから、ActionFunctionの呼び出し
1で引数として渡された値をもとに、色々とJavaScriptの処理を行います。
ここでは単純にapex:actionFunctionの引数として使用します。
ActionFunctionの関数名は、actionfunctionタグの"name"属性に定義されている名称です。
   JavaScript

3.ActionFunctionからコントローラのApexメソッドを呼び出し
ActionFunctionの"name"属性には、このActionFunctionの名前を定義します。
そして"action"属性には、コントローラのメソッド名を設定します。
JavaScriptから渡されたパラメータは、"apex:param"タグで定義されたパラメータで受け取ります。
なお、ActionFunctionは、不要でもreRender属性を設定しないと動かないようです。
   Visual Force Page

4.Apexメソッドの実行
コントローラ側では、パラメータを受け取るための変数を用意し、getparametersメソッドを使用して、パラメータを取得します。この際、getに設定するパラメータ名は"apex:param"の"name"属性に設定した名称になります。
   コントローラ

これで、VisualForceからコントローラのメソッドを呼び出す前に、JavaScriptでいろいろとできるようになります。