Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.



Published on

  • 5ページ目の改行問題ですが、末尾に「{!''}」つけたら改行できるらしいです。
    Are you sure you want to  Yes  No
    Your message goes here


  1. 1. VISUALFORCEでCSV … ちょっとハマったこと 今岡 純二
  2. 2. 自己紹介Twitter: @junojisan所属:株式会社テラスカイ  SFDC/Force.com導入/システム連携  Apex、Visualforce好き  本とか書いてます  MVP
  3. 3. パフォーマンスを良くする設計指針Apexのガバナ制限1回のトランザクションでSOQLクエリーにより取得できる合計レコード数:50,000件Visualforceの制限コレクションには、最大 1,000 個の項目を含められる  apex:repeat  apex:dataTable  apex:pageBlockTable
  4. 4. 制限の拡張<apex:page readOnly=“true”>DML発行は実行されないが… 取得できるレコード数:1,000,000件 コレクション内の項目数:10,000件 CSV出力に使えるかも!
  5. 5. VFでCSV出力<apex:page controller="DownloadCSVController" action="{!createCsv}" sidebar="false" showHeader="false" contentType="text/csv;charset=Windows-31J;#{!fileName}.csv"> <apex:repeat value="{!accounts}" var="acc"> <apex:outputText value="{!acc.Name}" />, <apex:outputText value="{!acc.BillingState}" />, <apex:outputText value="{!acc.BillingCity}" /> </apex:repeat></apex:page> apex:outputTextによる項目出力 の改行は本来はありません
  6. 6. 汎用的な実装CSVRow CSVColumnrowNo : Integer 1 * value : Stringcolumns : List<CSVColumn> // 行の繰り返し <apex:repeat value="{!csvRows}" var="row"> // カラムの繰り返し <apex:repeat value="{!row.columns}" var="col"> <apex:outputText value="{!col.value}“ />, </apex:repeat> </apex:repeat>
  7. 7. 実際に試してみて…CSVの項目数:25カラム 1,000件 10,000件 20,000件 40,000件 An internal server error has occurred An error has occurred while processing your request. The support team has been notified of the problem. If you believe you have additional information that may be of help in reproducing or correcting the error, please contact Salesforce Support. Please indicate the URL of the page you were requesting, any error id shown on this page as well as any other related information. We apologize for the inconvenience. Thank you again for your patience and assistance. And thanks for using!
  8. 8. エラー発生原因1. サーバサイドの処理で2分経過した2. オブジェクト数が100万に達している// 行の繰り返し<apex:repeat value="{!csvRows}" var="row"> // 項目の繰り返し <apex:repeat value="{!row.columns}" var="col"> 4万件 <apex:outputText value="{!col.value}" />, 25カラ </apex:repeat> ム</apex:repeat> readOnly=“true”(100万に拡張) 4万×25カラム = 100万
  9. 9. まとめ 1/2VFで時間のかかる処理をする  そもそも設計おかしいかも?  2分の制限を忘れない  非同期/BatchApexを検討する  apex:actionPoller で処理状況を見せる
  10. 10. まとめ 2/2CSV出力を検討するなら  標準レポートのCSV出力を第1に検討  VFでやるならデータ量/パフォーマンスに注意  複雑なデータ加工やZip圧縮が必要なら…Heroku連携 EAIツール連携 データ加工/圧縮 データ加工/圧縮 API APIリクエス レスポン リクエス レスポン ト ス ト ス