複数レコードをプリンターから印刷する
商談オブジェクトの複数のレコードのデータを、Apex 一括処理ジョブによってバッチ単位で印刷を実行します。
参考
Apex 一括処理ジョブからプロシージャーを呼び出す場合、レコード IDのリストをプロシージャー呼び出しのパラメーターとして指定する実装が考えられますが、SOQLにレコード IDのリストを含めるとSOQL全体が長くなり、Salesforceの制限によりエラーが発生します。
Apex 一括処理ジョブでは、Database.executeBatch メソッドのscopeパラメーターにより、バッチごとの最大レコード数が指定できるため、scopeパラメーターを調整の上、プロシージャー実行時にSOQLエラーにならないように実装してください。最大レコード数の目安は、最大で500程度です。
バッチ処理で分割された場合、プロシージャが複数回呼び出され、印刷データもバッチ単位での処理になります。
500件以上のレコードを、1回のプロシージャー呼び出しで処理したい場合は、「複数レコードをinvoiceAgent 文書管理にアーカイブする」のように、プロシージャーのクエリー条件にて対象レコードを絞り込む方法を検討してください。
ボタンとプロシージャーの設定のポイント
プリンターから印刷するために、次の設定をします。
ボタンの作成時
[SVFボタン設定]画面-[SVFボタン情報]-
-[アクション]タブで、
を有効化
プロシージャーの作成時
[プロシージャー]画面-[アクション]で、「ダイレクトプリント」を選択
レコードごとにページを区切るために、次の設定をします。
ボタンの作成時
[SVFボタン設定]画面-[SVFボタン情報]-
-[ファイル]タブ-[帳票レイアウトの切り替え]で、[レコード単位で切り替える]を有効化
パラメーターを設定します。
パラメーターの設定時
名前
既定値
クォーテーション
説明
limit
1
なし
Apex クラス「SvfCloudDirectPrintBatch」によって、値が指定されます。
id
(設定なし)
なし
Apex クラス「SvfCloudDirectPrintBatch」によって、カンマ区切りで連結したレコード IDが指定されます。
レコードの抽出条件を、メインクエリー条件で設定します。
クエリー条件の設定時
フィルター
ソート
リミット
オフセット
メインクエリー条件
id in ( ${id} ) *1
(設定なし)
${limit}
${offset}
*1 カンマ区切りで連結したレコード IDを、IN 句に指定します。
Apex クラスのサンプル

Apex クラス「SvfCloudDirectPrintBatch」を呼び出しを、Apex 一括処理ジョブに追加します。対象のレコードを500件ずつ処理するように指定しています。
SVF Cloud Managerで作成したプロシージャー「OpportunityProcedure_DirectPrint」を呼び出します。
SvfCloudProcedure(共通のApex クラス)
すべてのサンプルが使用する、共通のApex クラスです。
executeBatch
// Apex 一括処理にて、バッチ単位でプロシージャー呼び出しを非同期に実行します。 SvfCloudProcedure proc = new SvfCloudProcedure ( 'a0xxxXXX', // テナントID 'svfCloudCertName', // 「証明書と鍵の管理」に登録した証明書の名前 UserInfo.getUserName(), // SVF CloudからSalesforce RESTを実行するSalesforceユーザ名 'OpportunityProcedure_DirectPrint' // SVF Cloud Managerで定義したプロシージャーの名前 ); Database.executeBatch( new SvfCloudDirectPrintBatch ( proc, 'SELECT Id FROM Opportunity WHERE CloseDate = THIS_MONTH', // 今月が完了予定日のレコード 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' // 出力したいプリンターID ) ,500 // *1 );
*1 Database.executeBatch メソッドのscopeパラメーターは、最大で500程度としてください。大きすぎると、SVF CloudからSOQLを実行する際、エラーとなる場合があります。
SvfCloudDirectPrintBatch
global with sharing class SvfCloudDirectPrintBatch implements Database.Batchable< sObject >, Database.AllowsCallouts { private SvfCloudProcedure proc; private String query; private String printerId; global SvfCloudDirectPrintBatch(SvfCloudProcedure proc, String query, String printerId){ this.query=query; this.proc = proc; this.printerId = printerId; } global Database.QueryLocator start(Database.BatchableContext BC){ return Database.getQueryLocator(query); } global void execute(Database.BatchableContext BC, List< sObject > scope){ // プロシージャーのパラメーター"id"に設定するレコード IDのリストを作成します。 List<String> idList = new List<String>{}; for(sObject s : scope){ idList.add(s.id); } // プリンターIDを指定します。 Map<String,String> params = null; if ( printerId != null ){ params = new Map<String,String>{ 'printer' => this.printerId }; } try { // プロシージャーを実行します。 String actionId = proc.executeProcedure(idList,params); // 処理状況を確認します。 proc.waitStatus(60); } catch (SvfCloudProcedure.SvfCloudException e){ System.debug(e); throw e; } catch (CalloutException e){ System.debug(e); throw e; } } global void finish(Database.BatchableContext BC){ } }