re:newalhttp://blog.flect.co.jp/cloud/からさらに引っ越しています2019-11-22Apexからレポートを実行しCSVで出力するSalesforceエンジニアの藤野です。Salesforceの主要な機能の一つであるレポートは、Apexから実行することもできます。公式のドキュメントとしては下記のものなどがあります。名前空間この記事では一例として、レポートの実行結果をCSVとして出力するコードを実装し、解説します。実行環境は下記のとおりです。Type」レポートを使用します。これは行、列ともにレベル1のグルーピングを行うマトリックスレポートです。Type」実行しました。レポート実行結果これに対して、ゴールは下記のCSVを出力することです。CSVファイル名はレポート名をそのまま使うものとします。合計:,880000.0,2.0E7,5000000.0,2100000.0,1.0E7,3.798E7また、このCSVはExcelでそのまま表示できるものとします。Pageを使う方法を採用しました。(参考)今回は下記3コンポーネントで構成しています。(レポートの実行、CSV化を行うクラス)各コンポーネントの関係は下記のようになっています。実装の構成なお、Report2CsvDownload.vfpはクエリパラメータにレポートのIDを受け取ることを想定しています。下記のように生成されたリンクから遷移します。実際のコードは下記のとおりです。</apex:repeat></apex:page>rows変数に格納されているコレクションを出力します。今回はStringのListを想定しています。Excelで表示できるCSVとするためにcontentType="text/csv;charset=Shift-JIS"を指定します。}}ページのパラメータから取得したレポートIDを使ってReport2Csvのインスタンスを作成し、CSC(StringのList)を取得します。レポートメタデータからレポート名を取得し、出力に使用しています。}}コードが長いため、メソッドごとに解説します。results.getReportExtendedMetadata();}レポートIDを受け取り、レポートを実行します。Reports.ReportManager.describeReport(reportId).getReportMetadata();レポートIDからReportMetadataを取得します。ReportMetadataは大まかに言うと、レポート実行前に取得可能なレポートの定義・絞り込み条件などの情報が収められています。false);レポートを実行します。第3引数のincludeDetailsにfalseを指定して詳細を出力しないようにしています。results.getReportExtendedMetadata();実行結果からReportExtendedMetadataを取得します。ReportExtendedMetadataはReportMetadataに対して、レポート実行後の情報を持っています。今回は主に、グルーピング項目の実行後の値を取得するために使います。matrixToRow(escapeMatrix(matrix));}レポート実行結果からCSVを組み立てます。makeHeaderメソッドで見出し部分を、makeMatrixメソッドで値を行列として組み立て、matrixToRowでCSVの形式にします。matrix;}見出し部分、つまり下記の部分を取得します。}ここで取得するのは行グルーピングの表示ラベルです。行グルーピングほしいのはローカライズされた表示名であり、これはReportExtendedMetadataクラスのgetDetailColumnInfoメソッドでとして取得できます。これは{グルーピングに使用した項目のAPI名:GroupingColumnクラスのインスタンス}のMapになっており、行・列両方のグルーピング情報が入っています。name=TYPE]}ここから行グルーピングの表示ラベルを取得するには項目のAPI名が必要です。そのため、ReportMetadataクラスのgetGroupingsDownメソッドで行グルーピングの設定を取得しています。列グルーピングも同様です。}列グルーピングReportMetadataクラスのgetGroupingsAcrossメソッドで列グルーピングの設定を取得し、その後、表示ラベルを取得します。次に、実際に列のグルーピングに使われた値の表示ラベルを取得します。総計列は固定値でラベルを追加しています。ここもローカライズされているので取得する方法がありそうなのですが、今回は見つけられませんでした。row.add('合計');総計列のラベルmakeMatrixメソッドレポートの行グルーピングラベルおよび、レコードデータ、総計列、総計行を埋めます。matrix;}データ部分レポートのデータおよび総計はファクトマップという形式で扱います。マトリックスレポートでは0始まりのインデックスを組み合わせてデータを取得します。総計行および総系列のインデックスはTです。this.results.getGroupingsDown().getGroupings();ReportResultsクラスのgetGroupingsDownメソッドから行グルーピングの情報を取得します。具体的には行をグルーピングした値、表示ラベル、ファクトマップで使える行の識別子(キー)などです。今回のレポートでは下記のような情報が取得できます。...それでは、行ごとの処理に入っていきます。row.add(this.extendedMetadata.getAggregateColumnInfo().get(aggregateKey).getLabel());;集計項目の表示ラベルここでは集計項目の表示ラベルを取得します。行・列グルーピング項目の表示ラベルと同様に、ReportMetadataクラスにAPI項目名が、ReportExtendedMetadataクラスに表示ラベルが入っています。イテレーションしている理由は、グルーピングレベルが1より大きい場合getAggregates()の結果が複数になるためです。今回はレベル1なのでiは0で固定ですが......。この集計項目のインデックスは、値を表示するときにも必要になります。列の識別子(キー)も取得し、ファクトマップから値を取得します。ファクトマップのキーは行のキーと列のキーを!で連結した形になります。総計行の値の取得は他の行とほぼ同じです。分岐が複雑になるのを避けるために処理を分けています。最終的には処理をまとめたほうがいいと思います。}いずれもCSV出力のためにデータを整えるためのメソッドです。formatSummaryValueメソッドReports.SummaryValueとして取得したレポートの値をStringに変換します。小数は末尾の余分な0を削除するために四捨五入しています。escapeMatrixメソッドStringクラスのescapeCsvメソッドで2重リストをエスケープします。matrixToRowメソッドVFpageにStringのListで渡すために、二重リストの内側のリストを,で連結します。今回紹介した実装は行列1レベルのマトリックス形式以外には対応していません。実際、他のレポート形式にも対応させたコードも書いてみたのですが、なかなか共通化できず、個別の処理が必要になりました。本機能でレポート機能を汎用的に使えるようにするのはかなり大変だと思います。それよりも特定のレポートの値が必要な場合に決め打ちで実行する、という使い方で力を発揮するものだと思いました。GitHubで複数コンテナを利用したビルドを試し...こんにちは、Cariot事業部の遠藤です。専門知識に合格しました月別アーカイブはてなブログをはじめよう!flect_techさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。