logo

サイト内検索
ココログ最強検索 by 暴想

最近のトラックバック

無料ブログはココログ

Force.com

Reports Connect for Salesforce: json型式のパラメーターによるsubreportの作成方法

単純なSOQLでは望んだ値が出力できなかったり、思ったような値の表示ができないケースがあると思います。今回はそのような場合で役立つ、JSON形式でのパラメータの受け渡しによる、Apex側での作成・加工方法について紹介いたします。

今回の記事で作成したjrxmlファイルは↓からダウンロードできます。

「jtestp.jrxml」をダウンロード

最初にJSONについて説明します。帳票オブジェクトのデータの確認画面に「読み込んだデータの構造」が出てきますが、これがJSONデータです。

Photo_2

ここにもうひとつ例を書いて説明すると、JSONとは以下のように記述したデータの記法を指します。

[
 {
 "項目名1":"値1",
 "項目名2":"値2"
 },
 {
 "項目名1":"値3",
 "項目名2":"値4"
 },
 {
 "項目名1":"値5",
 "項目名2":"値6"
 }
]

↑のように、オブジェクトの配列のかたちでパラメータを作成します。(CSVファイルをJSONに変換したイメージ)

このようなJSON形式のデータをApex側で作成することで、ほぼ無制限に好きな値をレポートに出力できます。

それではJSONデータを利用したレポートの作成方法について解説します。


まずはサンプルとしてApexクラス「JsonReport」を作成します。

Reports ConnectにおけるApexとVisualforceコーディングについては、この記事この記事を参照してください。

見ての通り、String型の変数jstrにJSON形式のデータが代入され、それをパラメータとして渡しています。

Visualforceページを作成して、このdoPrint()メソッドを呼び出してください。

JSONの項目名やパラメータ名には好きな名前をつけてください。


次にjrxmlファイルの作成について解説します。

JSON形式のパラメータの値は、Subreportで利用ができます。

Subreportについては、この記事を参照してください。


子帳票のjtestを作成します。

子帳票ではパラメータの項目名をFieldsに登録をして、あとは好きなようにレイアウトしてください。

Ko

親帳票のjtestpを作成します。

Parametersに今回使用するパラメータ名を登録してください。

Photo_3

その後、作成したjtestのjrxmlファイルを指定して作成したSubreportを配置します。

そのSubreportのdata source expressionには


$P{contactList}!=null&&!$P{contactList}.equals("null")?new JRBeanCollectionDataSource((Collection)net.arnx.jsonic.JSON.decode($P{contactList})):null


と記述します。

上記記述により、パラメータで渡されたJSON文字列をサブリポート側ではCSVの行(実態はBeanの配列)のように扱えます。

Subreport Expressionには"jtest.jasper"と記述します。

またjtestpファイルのプロパティのImportsの横のボタンを押して設定を追加します。

開いたダイアログのAddボタンを押して、以下のパッケージを設定してください。

net.sf.jasperreports.engine.data.*


最後に帳票オブジェクトtestを作成します。

メモ & 添付ファイルにjrxmlファイルを添付します。

パラメータに":" + "パラメータ名"を設定します。

帳票オブジェクトのSOQLは利用しない場合でも、空欄だとNullPointerExceptionが発生するため、なんらかの結果が出力されるSOQL文を登録してください。

Page

出力結果を見ればJSONの値が出力できていることが確認できます。

Photo_4

今回はコードに直接的に値を記述してJSONデータを作成しましたが、SOQLを発行してその結果を代入した変数の値を利用することも可能です。これによって、関連のないオブジェクトを基にした表の作成なども可能になります。

Reports Connect for Salesforce / for kintone QRコードの出力

Reports Connect for SalesforceReportsconnect for kintoneで、QRコードの出力がサポートされました。今回はその方法について解説します。

例として、出力する帳票はReports Connect for Salesforce 標準画面からの印刷呼び出し方法で使用した見積書を使用します。

まず、iReportで該当のjrxmlファイルを開きます。今回はヘッダー部分に、顧客名をQRコード化したものを出力する事にします。

まず、パレットからImageを選択してヘッダーにドラッグ・アンド・ドロップします。

20140924_14h02_17
Imageのプロパティで、Expression Classを「java.awt.Image」に設定します。

20140924_14h06_43
さらに、Imageのプロパティで、Image Expressionを以下のように設定します

com.google.zxing.client.j2se.MatrixToImageWriter.toBufferedImage(
     new com.google.zxing.qrcode.QRCodeWriter().encode(
      $F{Opportunity.Account.Name},
         com.google.zxing.BarcodeFormat.QR_CODE, 300, 300,
     com.google.common.collect.ImmutableMap.of(
         com.google.zxing.EncodeHintType.CHARACTER_SET,"UTF-8"))
)

20140924_14h08_43
ここで、Image Expressionに指定したコードに関して若干補足します。

Reportsconnectでは、QRコード出力にGoogleのZXingというライブラリーを使用しています。
ここの記述では、ZXingのクラスQRCodeWriterのencodeメソッドで、QRコードを作成しています。
encodeメソッドの引数は、

contents - The contents to encode in the barcode
format - The barcode format to generate
width - The preferred width in pixels
height - The preferred height in pixels
hints - Additional parameters to supply to the encoder

となっています。

少々、長い記述で、複雑そうですが、重要なのはcontentsがエンコードする文字列で、あとはwidthとheightで大きさを決めてやれば、それ以外は上記コードをコピペするだけでOKです。
この例では、contentsに顧客の名前のフィールドを設定し、顧客名をQRコード化しています。

なお、蛇足ながら、引数のhintsはパラメーターのMapを引き渡す様になっていて、
EncodeHintType.CHARACTER_SETに対して"UTF-8"を指定したMapを生成して渡しています。
ちなみに、

 com.google.common.collect.ImmutableMap.of(xxxx)

の部分は、パラメーターのMapの生成にGoogleのGuavaというライブラリーのImmutableMapを使用しています。

このように、iReportでImageを用いて簡単にQRコードを出力することが出来ます。

Reports Connect for Salesforce Salesforce1アプリへの組み込み その2

前回に引き続き、ReportsConnect for SalesforceのSalesforce1アプリへの組み込み方法について解説します。

今回は、ナビゲーションメニューから呼び出すVisualforceページとして組み込む方法について解説します。

帳票は「Reports Connect for Salesforce アプリケーションへの組込み方法」の記事で使用した帳票「ユーザーリスト」を使用します。

[Visualforceページの作成]

さっそくですが、Visualforceのソースは以下の様になります。

----------------------------------------------

<apex:page docType="html-5.0" standardStylesheets="false" showheader="false" sidebar="false">      <!--Include Stylsheets for the Mobile look and feel -->
      <apex:stylesheet value="{!URLFOR($Resource.MobileTempCommon,
                'common/css/app.min.css')}"/>
      <apex:includeScript value="{!URLFOR($Resource.MobileTempCommon,
                'common/js/jQuery2.0.2.min.js')}"/>
      <apex:includeScript value="{!URLFOR($Resource.MobileTempCommon,
                'common/js/zebra_datepicker.min.js')}"/>
      <apex:includeScript value="{!URLFOR($Resource.MobileTempCommon,
                'common/js/main.min.js')}"/>
      <apex:includeScript value="{!URLFOR($Resource.MobileTempCommon,
                'common/js/jquery.nouislider.min.js')}"/>      
<apex:form >
        <div id="result" style="display:none"/>
        <div class="form-control-group">
            <div class="form-control form-control-select">
                <select name="condition">
                    <option value=" ">全件</option>
                    <option value="where Profile.UserType='Standard'">Standard</option>
                </select>
            </div>
        </div>
    <kpsr:RCOne reportId="ユーザーリスト" direct="false"/>
</apex:form>
</apex:page>
------------------------------------------------

このページを「PrintUserOne」という名前で保存しました。
前回同様、apex:pageタグの指定とapex:stylesheetタグ、apex:includeScriptタグの指定は、「Mobile Design Templates」を使用する際のガイドライン通りのものです。

apex:formタグの中に、セレクトリストを用意してあります。これは、conditionというキーでSOQLのwhere節を設定できるようにして、ユーザーにProfile.UserTypeを絞り込む選択を可能にしているものです。
このあたりの仕組みは「Reports Connect for Salesforce アプリケーションへの組込み方法」の記事で行った方法と同様です。
さらに、apex:formタグの中にkpsr:RCOneタグを書きます。帳票名をreportIdに指定し、今回はdirect="false"と設定します。
kpsr:RCOneタグは、ディフォルトでは呼び出されるとすぐに帳票作成処理を起動しますが、direct="false"と設定すると、帳票作成処理を行うボタン表示して、ボタンによる帳票作成処理の起動を可能にします。

[ナビゲーションメニューへの組み込み]

このVisualforceページをSalesforce1のナビゲーションメニューに表示する設定を行います。手順は以下のとおりです。

Visualforceタブの作成

  1. 設定->作成->タブ
  2. Visualforceタブのセクションから新規を押す
  3. Visualforceページで 先ほど作成したPrintUserOneを選択
  4. タブラベルに「ユーザーリスト」を入力
  5. タブスタイルに適当に選択
  6. 次へ->次へ
  7. タブを含めるチェックをすべて外す
  8. 保存を押す
  9. PrintUserOneの編集リンクを押す
  10. モバイル準備完了をチェック、保存を押す

一回、保存した後、もう一度編集リンクを押して「モバイル準備完了」のチェックを入れる必要があります。また、Visualforce側の設定で「Salesforce モバイルアプリケーションでの使用が可能」のチェックが入っている必要があります。この両方のチェックを入れておかないと、ナビゲーションメニューの選択肢に該当のVisualforceページが出てきません。

20140305_14h23_31

ナビゲーションメニューに追加

  1. 設定->モバイル管理->モバイルナビゲーション
  2. PrintUserOneを追加
  3. 保存を押す

これで、ナビゲーションメニューにユーザーリストが出るようになります。

[実行]

20140305_14h30_24_2

メニューのユーザーリストを押すと、作成したVisualforceページが出力されます。

20140305_14h36_38

ボタンの表示名のディフォルトは、「印刷」です。この値はkpsr:RCOneタグの属性「buttonvalue」で変更できます。

この画面で、セレクトリストで条件を指定して、ボタンを押すと、帳票作成処理が起動され結果が表示されます。

20140305_14h40_26

前回の記事同様、PDFファイルは処理したユーザーのフィードの添付として作成され、右側のボタンを押すと該当のフィードのページに飛びます。

[カスタマイズ]

kpsr:RCOneタグは、ボタンのデザイン、結果の表示場所、帳票作成終了時の処理の追加等のカスタマイズができます。

上記、画面のボタンのデザインを自前のものに変えてみたいと思います。また、結果の表示位置を画面の一番上に移動して、さらに後処理を追加して処理完了時にボタンが消える様にしてみたいと思います。

カスタマイズしたVisualforceページのソースは以下のとおりです。

----------------------------------------------------

  <apex:page docType="html-5.0" standardStylesheets="false" showheader="false" sidebar="false">      <!--Include Stylsheets for the Mobile look and feel -->
        <apex:stylesheet value="{!URLFOR($Resource.MobileTempCommon,
                  'common/css/app.min.css')}"/>
        <apex:includeScript value="{!URLFOR($Resource.MobileTempCommon,
                  'common/js/jQuery2.0.2.min.js')}"/>
        <apex:includeScript value="{!URLFOR($Resource.MobileTempCommon,
                  'common/js/zebra_datepicker.min.js')}"/>
        <apex:includeScript value="{!URLFOR($Resource.MobileTempCommon,
                  'common/js/main.min.js')}"/>
        <apex:includeScript value="{!URLFOR($Resource.MobileTempCommon,
                  'common/js/jquery.nouislider.min.js')}"/>
 
  <script type="text/javascript">
   window.addEventListener("message",function(e){
     if(e.data.tag != "kps-reportsconnect"){
         return;
     }
      $("#pbutton").css("display","none");
   });
  </script>
  <apex:form >
          <div id="result" style="display:none"/>
          <div class="form-control-group">
              <div class="form-control form-control-select">
                  <select name="condition">
                      <option value=" ">全件</option>
                      <option value="where Profile.UserType='Standard'">Standard</option>
                  </select>
              </div>
          </div>
      <kpsr:RCOne reportId="ユーザーリスト" direct="false" resultelm="result">
      <div class="detail-view-header left-thumb with-action-panel" id="pbutton">
              <div class="content">
              <img class="thumb" src="http://business-icon.com/material/040.png"/><h2>印刷します</h2>
              </div>
      </div>   
      </kpsr:RCOne>
  </apex:form>
  </apex:page>
------------------------------------------------------

ボタンのデザインを独自に行うには、kpsr:RCOneタグの内部にHTMLで記述することで可能になります。今回は印刷アイコンと「印刷します」という文字をdivとして設定しました。

さらに、apex:formタグの直下にdivを追加して、kpsr:RCOneタグのresutelm属性にそのIDを指定することで、処理結果の表示をこの位置に設定することができます。

また、javascriptで後処理を書くことができます。

ReportsConnectでは、帳票作成処理終了時に、windowにメッセージが送られます。

  window.addEventListener("message",後処理);

という様にして、messageのイベントを拾って後処理を記述します。
ReportsConnectが返すメッセージ e.data オブジェクトの中身は以下のようになっています。

キー内容備考
tag kps-reportsconnect ReportsConnectが返すメッセージの識別用
message エラーの場合のエラーメッセージ エラーで無い場合は"ok"
id 作成した添付ファイルまたはFeedのID  
success 成功した場合true/失敗した場合false  
filename 作成したPDFファイル名  
parentid 添付ファイルの場合親オブジェクトのID

後処理では、まず、tagの内容を確認してReportsConnectからのメッセージ以外はreturnします。

ReportsConnectからのメッセージであれば、ボタンのdivを非表示にして消しています。

以上のカスタマイズを行った画面はこんな感じになりました。

20140305_15h42_40

印刷アイコンを押すと、ボタンが消えて、一番上に処理結果が表示されるようになりました。

20140305_15h44_21

このように、kpsr:RCOneタグを使用する事で、Salesforce1アプリ内から様々な形で、帳票作成処理を行う事ができます。

Reports Connect for Salesforce Salesforce1アプリへの組み込み その1

Reports Connect for Salesforce ver1.19よりSalesforce1アプリからのモバイル環境での帳票作成が可能になりました。

今回は、まずは、特定のレコードに紐づく帳票をカスタムアクションに組み込む方法を解説します。(これをSalesforce1ではObject-Specific Actionと言います)

帳票自体の作成方法は従来のものがそのまま使用できます。印刷する帳票は「標準画面からの印刷呼び出し方法」で紹介した、商談の請求書を印刷するものをそのまま使用します。

帳票自体の作成方法はこちらの記事を参考にしてください。

[事前設定]

Salesforce1アプリからReportsConnectを使用するためには、事前に印刷をするユーザーのプロファイルで、ReportsConnectの接続アプリケーションを使用可能にしておく必要があります。

Reports Connect for Salesforce ver1.19以降をインストールすると、自動的にReportsConnectの接続アプリケーションが登録されます。

まず、設定->アプリケーションを管理する->接続アプリケーションで、「kps-ReportsConnect」を選択して、許可されているユーザが「管理者が承認したユーザは事前承認済み」になっていることを確認して下さい。もし、他の設定になっている場合は、「管理者が承認したユーザは事前承認済み」にしておきます。

20140304_15h35_21

次に、設定->ユーザーの管理->プロファイルで印刷するユーザーのプロファイルを選択して編集ボタンを押すと「接続アプリケーションへのアクセス」という欄に、「kps-ReportsConnect」という接続アプリケーションが有りますので、ここにチェックを入れてください。

20140304_15h26_29

次に、Mobile Design Templatesの設定を行います。

Salesforce1環境で、モバイル的なルックアンドフィールを実現するためには、セールスフォースから提供されている「Mobile Design Templates」を使用するというガイドラインがセールスフォースから出されています。

ReportsConnectでは、このテンプレートのCSS等を前提にしていますので、必要なCSSやJSライブラリーを静的リソースに入れておく必要があります。

GitHubのMobile Design Templatesのページからサンプルコードをダウンロードします。

ダウンロードした中のcommonというフォルダーにCSSやJSが入っています。このフォルダーをフォルダーごとzipで圧縮します。

20140304_16h31_42

このzipファイルを適当な名前を付けて静的リソースにアップロードしてください。

20140304_16h34_40 この例では、「MobileTempCommon」という名前でアップロードしました。

以上で事前設定は終了です。

[Visualforceページの作成]

カスタムアクションで使用するVisualforceページを作成します。

ソースコードは以下のとおりです。

-----------------------------------

<apex:page docType="html-5.0" standardStylesheets="false" showheader="false" sidebar="false" standardController="Opportunity">
      <!--Include Stylsheets for the Mobile look and feel -->
      <apex:stylesheet value="{!URLFOR($Resource.MobileTempCommon,
                'common/css/app.min.css')}"/>
      <apex:includeScript value="{!URLFOR($Resource.MobileTempCommon,
                'common/js/jQuery2.0.2.min.js')}"/>
      <apex:includeScript value="{!URLFOR($Resource.MobileTempCommon,
                'common/js/zebra_datepicker.min.js')}"/>
      <apex:includeScript value="{!URLFOR($Resource.MobileTempCommon,
                'common/js/main.min.js')}"/>
      <apex:includeScript value="{!URLFOR($Resource.MobileTempCommon,
                'common/js/jquery.nouislider.min.js')}"/>   
      
<apex:form >
<kpsr:RCOne reportId="請求書"
    parms="{&quot;condition&quot;:&quot;where OpportunityId='{!$CurrentPage.parameters.id}'&quot;}"/>
</apex:form>               
</apex:page>

----------------------------------------

apex:pageタグの指定とapex:stylesheetタグ、apex:includeScriptタグの指定は、「Mobile Design Templates」を使用する際のガイドライン通りのものです。(事前設定でアップロードした静的リソースを指定しています)

商談のページからアクションとして呼び出すにはapex:pageタグにstandardController="Opportunity"の指定が必要になります。

ReportsConnectを呼び出すために、ReportsConnectのインストールで提供される「kpsr:RCOne」コンポーネントを使用します。

apex:formタグの中にkpsr:RCOneタグを書いてください。属性として、帳票名をreportIdに指定します。

なお、このタグはparms属性で、json形式で、iReportに渡すためのパラメーターを指定できます。今回指定したパラメーターは以下のようなjsonを意味しています。

{"condition" : "where OpportunityId='{!$CurrentPage.parameters.id}'"}

このままVisualforceページに書くとエラーになるので、ダブルコーテーションの部分は&quot;に置き換えてエスケープします。

この帳票レコードのSOQLは以前の記事にあるように「condition」というKeyを検索条件で置き換える様になっているため、key「condition」に対して、where節を設定して、該当のレコードをReportsConnect側で読めるようにしているわけです。

Object-Specific Actionの場合は、idパラメータに該当のレコードのidが渡って来ますので、{!$CurrentPage.parameters.id}としてID値を入手しています。

以上のページを「PrintSeikyuOne」という名前で保存しました。

[Visualforceページをカスタムアクションに組み入れる]

後は、上記のVisualforceページを商談のカスタムアクションに組み入れるだけです。この作業は一般的なモバイルのカスタムアクションの組み込み方法と変わりはありません。

具体的には、以下の様な手順になります。

カスタムアクションの作成

  1. 設定->カスタマイズ->商談->ボタン、リンク、およびアクション
  2. 新規アクションを押す
  3. アクション種別でカスタム Visualforceを選択
  4. Visualforceページで、今作成した「PrintSeikyuOne」を選択
  5. 表示ラベルに「請求書作成」を入力
  6. 保存を押す

カスタムアクションをページレイアウトに追加

  1. 設定->カスタマイズ->商談->ページレイアウト
  2. 現在使用しているレイアウトを編集
  3. パブリッシャーアクションでグローバルパブリッシャーレイアウトを上書きをクリック
  4. 適当なパブリッシャーアクションの位置に上記で作成した「請求書作成」をドラッグ
  5. 保存を押す

[Salesforce1での帳票作成処理]

以上で組み込み作業は完了なので、Salesforce1アプリから商談を見てみましょう。

印刷したい商談の詳細画面でプラスボタンを押します。

20140304_17h25_06

設定したカスタムアクション「請求書作成」のアイコンが出てくるのでこれを押す

20140304_17h26_56

すると、帳票作成処理が実行されます。

帳票作成が完了すると画面は以下の様にファイル名と、ボタンの表示に変わります。

PDFファイルは処理したユーザーのフィードの添付として作成されます。

20140304_17h28_431

右側のボタンを押すと、フィードの画面へ遷移します。

20140304_17h36_52_2

フィードの添付ファイルなので、後は、ファイルを開いたり、メールに添付して送信したり自由にできます。

次回は、特定のレコードと関連しない帳票をモバイルナビゲーションから呼び出す方法について解説します。

Reports Connect for Salesforce ログインユーザー固定化オプションの使用法

Reports Connect for Salesforceで、ログインユーザー固定化オプションが使用可能になりました。今回は、このオプションの使用法について解説します。

通常、Reports Connectの印刷処理は、処理を行うユーザー自身がOAuth2.0の認証を行い、その権限で処理されます。
ログインユーザー固定化オプションとは、すべてのユーザーからのReports Connectの印刷処理をあらかじめ設定したユーザーIDおよびパスワードを使用した認証によって行うものです。

これによって、sitesでのインターネット公開ページように、salesforceのユーザーがログインしていない環境での印刷処理や、バッチでの自動印刷等が可能になります。

ログインユーザー固定化オプションは、Reports Connect1.16以上からサポートされます。
それ以前のバージョンを使用中の方は、Reports ConnectのHPから最新版をダウンロードしてください。

なお、このオプションは有料オプションとなりますが、Developer Editionの管理ユーザーの環境からは無料で使用できます。今回は、Developer Editionを使用して解説します。

Reports Connect1.16に更新すると、帳票オブジェクトに以下のフィールドが追加されます。

ログインユーザーを固定化する
UIを使用しない
固定化ユーザ名
固定化ユーザーパスワード

旧バージョンから更新した場合は、帳票オブジェクトの画面レイアウトを修正してこれらのフィールドが表示されるようにしておきます。

20140110_11h24_54
まず、最初に、このオプションを使用して、sitesによるインターネット公開ページでの印刷を可能にしてみたいと思います。

簡単なVisualforceを作成してあらかじめ作成した「ユーザーリスト」という帳票を印刷するページを作成します。

なお、ReportsConnect for Salesforceでの帳票の作成方法は、こちらのページを参照してください。

20140110_14h02_53
単に、印刷ボタンがあるだけのページです。
ソースは以下のとおりです。

 <apex:page >
    <apex:form >
        <apex:pageBlock >
            <apex:pageBlockButtons location="top">
                <kpsr:RPConnect reportId="ユーザーリスト" />
            </apex:pageBlockButtons>
        </apex:pageBlock>
    </apex:form>
 </apex:page>

ReportsConnectが提供するRPConnectというコンポーネントを使用して、帳票「ユーザーリスト」を印刷します。

実際に、印刷ボタンを押すと、ポップアップのWindowが開いてユーザーリストをダウンロードする事ができます。

この、VisualforceページをSitesのVisualforceページに登録して、インターネット上に公開します。

20140110_11h36_58
見た目はあまり変わりませんが、このページは公開されているので、ログインしていない状態でもURLにアクセスするだけで誰でも見ることができます。

Salesforceにログインしていないユーザーがこの印刷ボタンを押すと、ポップアップのWindowが開きますが、そのWindowの中がログイン画面になってしまい、印刷はできません。

20140110_11h39_38
これは、ReportsConnectがOAuth2.0での認証を行おうとするためです。
(そのまま印刷できてしまったとしたら、ブラウザーの別タブ等ですでにSalesforceにログインしている可能性があります。明示的にログアウトしてから試してください。)

さて、この状態で、「ユーザーリスト」の印刷オブジェクトに設定を行って、ログインユーザー固定化してみます。

やり方は、該当の帳票オブジェクトに固定化したいユーザーのユーザー名とパスワードを設定して、「ログインユーザーを固定化する」のチェックを入れるだけです。
なお、パスワードにはパスワードの後ろにセキュリティトークンを連結した文字列を設定してください。

20140110_11h44_10
これで保存をして、先ほどの公開したページを一度再読み込みを行った上で、再度印刷ボタンを押すと。今度は、指定したユーザー名、パスワードで内部的に認証が行われるため、印刷処理が動き、PDFのダウンロードが出来るようになります。

20140110_11h47_10
以上のように、アプリケーションは一切修正すること無く、機能をインターネットに公開することが出来ました。

次に、ユーザーインタフェースを使用しない、バッチ的な印刷処理をやってみます。

帳票オブジェクトの「UIを使用しない」のチェックをオンにします。

20140110_11h51_42

これで、この帳票は、ポップアップWindow等のユーザーインタフェースを一切使用しないで印刷ファイルの作成が行われるようになります。

この状態で、帳票オブジェクトの画面の「印刷テスト」ボタンを押すと..

20140110_11h52_10

画面の上部にメッセージが表示されました。

20140110_11h53_12

これは、印刷処理の結果を示すメッセージで、No UI Mode Response:の後ろに、作成されたオブジェクトのIDとメッセージおよび、処理が成功したかどうかがJSON形式で表示されます。

このメッセージは、ApexのコードからはReportsConnectControllerのbatchMessageというプロパティで参照できます。

実は、もうこの段階で印刷処理は終わっています。

印刷ファイルは、ディフォルトで、実行ユーザーへのチャターフィードへの添付として作成されます。

ホーム画面を見ると、印刷ファイルが添付された投稿が作成されています。

20140110_11h54_27

さて、それではこの機能を使用して、時間起動で印刷処理を起動して、作成されたPDFファイルをメールの添付に付けて自動送信するApexコードを作成してみましょう。

時間起動が可能なApexクラスはSchedulableインターフェースを実装したglobalクラスとして実装する必要があります。

なお、ReportsConnectの印刷処理は内部でReportsConnectのサーバーへcall outを行います。時間起動処理では直接にcall outするとエラーになるため、別途futuerコールするメソッドを用意し、その中で行う必要があります。

Apexのソースコードは以下の様になります。

----------------------

global class BatchPrint  implements Schedulable{
  global void execute(SchedulableContext SC){
    futurePrint();
  }

  @future(callout=true)
  private static void futurePrint(){
    //①ReportsConnectControllerのインスタン作成して、印刷処理を実行
    kpsr.ReportsConnectController rc = new kpsr.ReportsConnectController();
    rc.setReportId('ユーザーリスト');
    rc.setNouiMode(true);
    rc.setFeedDescription('Batch印刷テスト');
    rc.goPrint();
    system.debug(rc.batchMessage);
    //②JSONの処理結果をBatchPrintResultに変換
    kpsr.BatchPrintResult res = (kpsr.BatchPrintResult) JSON.deserialize(rc.batchMessage,kpsr.BatchPrintResult.class);
    if(!res.success){
      //③エラーの場合チャターフィードを作成して通知
      FeedItem post = new FeedItem();
      post.Body = 'バッチ印刷が失敗しました!\n' + res.message;
      post.parentId = system.Userinfo.getUserId();
      insert post;
    } else {
      //④印刷処理が完了の場合はEmailfileattachmentを作成してコピーする
      FeedItem print = [select id,ContentFileName,ContentDescription,ContentData
        from FeedItem where id = :res.id];
      List<Messaging.Emailfileattachment> fas = new List<Messaging.Emailfileattachment>();
      Messaging.Emailfileattachment fa = new Messaging.Emailfileattachment();
      fa.setFileName(print.ContentFileName);
      fa.setBody(print.ContentData);
      fas.add(fa);
      //⑤Emailfileattachmentをメールに添付して自分に送信
      String uid =System.Userinfo.getUserId();
      User usr =[select id,name,Email from User where id = :uid];
      Messaging.SingleEmailMessage smail = new Messaging.SingleEmailMessage();
      smail.setToAddresses(new String[]{usr.Email});
      smail.setSubject(print.ContentFileName);
      smail.setPlainTextBody(print.ContentDescription);
      smail.setReplyTo(usr.Email);
      smail.setSenderDisplayName(usr.name);
      smail.setFileAttachments(fas);
      Messaging.sendEmail(new Messaging.SingleEmailMessage[] { smail });
    }
  }
}

----------------------

時間起動で呼び出されるexecuteメソッドからアノテーション@future(callout=true)を指定したfuturePrintメソッドを呼び出すようにします。

実際の処理はfuturePrintメソッド内に実装します

①ReportsConnectControllerのインスタン作成して、印刷処理を実行します。rc.setNouiMode(true);としてUIを使用しないモードを設定します。帳票オブジェクトに「UIを使用しない」のチェックが入っている場合はここで設定する必要はありません。

rc.setFeedDescriptionメソッドで、作成されるフィードに説明を追加する事ができます。

rc.goPrint();で印刷処理が、UI無しで処理されます。

②処理結果が、ReportsConnectControllerオブジェクトのbatchMessageにJSONで返りますので、処理結果をBatchPrintResultに変換します。

③エラーの場合(res.successがfalse)、誰も気づかないとますいので、チャターフィードを作成して通知するようにしておきます。

④印刷処理が完了の場合(res.successがtrue)は、res.idに作成されるチャターフィードのオブジェクトのIDが返るので、このオブジェクトを読んで、emailに添付するオブジェクトにコピーしてメールを送信します。

開発者コンソールのcntrl+eを押して実行プロンプトを開き、その中に以下の様に入力して実行するとテストすることができます。

 new BatchPrint().execute(null);

20140110_15h38_29

実行すると、帳票が添付されたフィードが投稿され、自分あてにPDFが添付されたメールが送られると思います。

20140110_16h12_07

後は、時間を指定して自動実行するために、このApexクラスをスケジュールすれば完了です。

なお、ログインユーザー固定化オプションを使用した場合、印刷処理のためのデータ・アクセスに関しては、固定化したユーザーの権限で行われますが、印刷ページ数制限に関しては、あくまでも実行中のユーザーのライセンスによって決まります。

以上のように、ApexクラスからUIの挙動に影響されること無くPDFファイルの作成が可能になるので、ある意味、PDF作成処理をAPI的に扱うことが可能になるオプションであると言えます。

アイデアしだいで、応用範囲が一気に広がると思われます。

このオプションについてはReporstConnectのHPのこちらを参照してください。

これでSalesforceでの帳票開発も楽々しかも無料 Reports Connect for Salseforce その3

Reports Connectサポートフォーラムを公開しました。

技術的質問はこちらへどうぞ

これでSalesforceでの帳票開発も楽々しかも無料 Reports Connect for Salseforce その2の続きです。

前回の記事で、帳票レイアウトファイルreport1.jrxmlが出来上がったので、これをReportsConnectの帳票に取り込みます。

やり方は簡単。Salesforceの帳票レコード画面から、該当の帳票レコードにファイル添付するだけ。

Irpds17_2
こんな感じで、添付できました。

Irpds18_2
では、印刷してみましょう、印刷テストボタンを押します。Irpds19_3
あれ~。こけた。例外が発生している模様。

Irpds20

こういう場合は、データの確認の方のボタンを押すと原因が分かりやすい。
Irpds21
なに、なに、例外が発生しています...
恐らくReportのプロパティのLnguageがGrrovyになっています...と。

親切にも問題解決のヒントを教えてくれます。

Irpds22
ヒントで指摘されたのは、iReportでいうと↓の個所。
左のウインドウで、Report名を選択して、右のプロパティのLannguageの個所。
たしかにGroovyになっています。

これは、iReportに付いてくるテンプレートがなぜかこういう設定になっているためにおこる現象と思われます。

この属性をGroovy→Javaに変更して保存して、再度、帳票レコードに添付し直します。

Irpds23

注:2013/09/10現在、ReportsConnectはGroovyをサポートするように修正されたため、上記エラーは発生しません。

今度は、いきなり印刷テストを押さずに、先にデータの確認を押してみる。
すると....あれ、また例外が発生。
ヒントを見ると、どうやらcherry.jpgファイルが必要なようだ。

Irpds24
帳票のヘッダーに使われているチェリーの絵だね。jrxmlを出力したフォルダーを見ると、同じフォルダーにcherry.jpgも出力されている。
このファイルも添付してやる。

Irpds25
チェリーの絵をアップロードして、再度データの確認を押すと、今度は例外が出ていないようなので、テスト印刷を押します。
すると、処理中のウィンドウからダウンロードのダイアログが出ました。

なお、私はFirefoxを使用していますが、他のブラウザーの場合はダウンロードの出方が違うと思います。

Irpds26

プログラムで開く でAdbe Readerで開けば...

Irpds27
おー、PDFの帳票がちゃんと出来上がりました。すごい!立派!

なお、IEの場合でダウンロードがうまくいかない場合は、以下のページあたりを参考にしてください。

IE でファイルのダウンロードができないときのトラブルシューティング

以上が、ReportsConnectを使用した帳票開発方法のご紹介。
SOQLさえ書けば、コードを一切書かずに帳票ができました。

さて、次回は、完成した帳票を自前のアプリケーションから出力する方法を解説します。

Reports Connect for Salesforce 複数の帳票を一つのPDFファイルとして出す

ReportsConnect 1.9 より、複数の帳票を一つのPDFファイルにして出力する事が可能になりましたので、その方法について解説します。

今回はReportsConnectのページからダウンロードしたサンプルプログラムの帳票、見積もりと、商品紹介をひとつのPDFファイルとして出力してみます。

まあ、こういう機能は、例えば見積もり書の後ろに申込書をつなげて、FAXで送り返してもらう、なんてケースで使えると思います。

帳票の連結は簡単です。ReportsConnect 1.9 より帳票オブジェクトに親の帳票オブジェクトへの参照が追加されています。これを使用して、見積もりと、商品紹介を、親オブジェクト「見積もり商品紹介」で括ります。

20130131_11h04_57

やり方は、まず親のオブジェクト「見積もり商品紹介」を新規帳票ボタンを押して作成します。とりあえず、名前だけ付けて保存します。

20130131_13h32_24

次に、子帳票オブジェクトとなる「見積もり」のオブジェクトの編集画面を開いて、親帳票の参照に今作った「見積もり商品紹介」を指定します。

また、連結順に1と入力して保存します。

なお、旧バージョンからバージョンアップした場合はこれらの項目が画面に表示されない場合があります。その場合は、帳票オブジェクトの設定画面から画面レイアウトを編集して新しく追加された項目を画面に追加してください。

20130131_11h09_40

同様に商品紹介のオブジェクトにも設定を行います。連結順は2とします。

20130131_11h11_19

これで、出来上がり、と言いたいところですが、この2つの帳票をいっぺんに処理するにあたって、使用するリクエストパラメーターの名前がかぶってしまうと問題が発生します。

今回、不幸にも使用する2つの子帳票オブジェクトで、同じ「condition」というパラメーターを使用しているため、ここを調整する必要があります。

商品紹介のオブジェクを編集して、SOQL上のパラメーターの名前を

:condition

  ↓

:conditions

と後ろにsをくっつけました。

その下のパラメーターの欄はこのオブジェクトの印刷テストボタンを押す時以外、使用しないのでどうでも良いのですが、一応直しておきます。

20130131_11h30_44

これで、再び親帳票オブジェクトの画面を開いて、子オブジェクトに指定していたそれぞれのパラメーターを両方2行にしてテキストボックスに入れます。行の順番は関係ありません。(パラメーターの置き換えは長さが長い順に行われる)

20130131_13h11_05

これで、試しに印刷ボタンを押してみると...

20130131_13h12_27

小帳票オブジェクトの連結順に指定した番号の順に帳票が連結されて、一つのPDFファイルになって出力されました。

実際のアプリケーションに組み込む方法は、従来と変わりません。指定する帳票名を親帳票の名前にするだけです。

アプリケーションへの組み込み方法に関しては、

Reports Connect for Salesforce 標準画面からの印刷呼び出し方法

Reports Connect for Salesforce アプリケーションへの組込み方法

を参照してください。

Reports Connect for Salesforce PDFファイルをオブジェクトに添付する

ReportsConnect 1.8 より、作成したPDFファイルをダウンロードする代わりに、特定のオブジェクトに添付する事が可能になりましたので、その方法について解説します。

ReportsConnect 1.8をインストールしたうえで、ReportsConnectの資料のページから、1.サンプルプログラムのインストールのリンクおよび、2.サンプルデータのダウンロードのリンクをクリックして、サンプルのプログラムとデータをダウンロードしてください。

サンプルプログラムには商談のカスタムボタンが3つ用意されています。
すべての商談を表示すると「帳票テスト商談」がありますのでこれを開きます。

3つのカスタムボタンは、レイアウトを編集するのリンクを押して、レイアウト編集画面のボタンの箇所からドラッグアンドドロップして画面に追加してください。

20130125_16h45_43

このボタンのうち、請求書印刷、見積印刷の2つは、押すとサブウインドウが開いて、PDFファイルのダウンロードとなります。

20130125_16h34_21
このようにカスタムボタンから、PDFファイルをダウンロードする実装に関しては、Reports Connect for Salesforce 標準画面からの印刷呼び出し方法を参考にしてください。

3つ目の商品紹介のボタンが、新機能、PDFファイルをオブジェクトに添付する例となっています。このボタンを押すと、サブウィンドウは表示されず、PDFファイルを該当の商談オブジェクトに添付して再び元の商談の画面に遷移します。

20130125_16h56_10
このように、PDFファイルを特定のオブジェクトに添付する場合、最も簡単な方法は該当の帳票オブジェクの項目「idパラメーターのオブジェクトに添付」にチェックを付ける事です。
20130125_15h50_24
これにより、リクエストパラメーターにidというパラメーターがある場合、その値のidのオブジェクトの添付ファイルとしてPDFファイルが保存されるようになります。
カスタムボタンを押した際に遷移する画面ではidパラメーターに該当のオブジェクトのidが設定されますので、うまい具合にそのオブジェクトに添付することができます。

(ただし、帳票画面の「印刷テスト」ボタンを押した際は、このチェックは自動的にoffになります。これは、帳票オブジェクト自体にPDFが添付されてしまわない様にするため、そのような仕様になっています)

また、添付後、ディフォルトでそのオブジェクトのページのPagereferenceが返されるので、あえてサブウインドウを開く必要はありません。カスタムボタンの動作には、「現在のウィンドウにサイドバー付きで表示」を設定します。

Ws000000
このボタンを押した際に呼び出されるVisualforceページのソースとコントローラーのソースは以下の通りです。

(コントローラーのメソッド、doPrintSsが呼び出される)

----------------

  <apex:page standardController="Opportunity" 
       extensions="OpportunityPrint" action="{!doPrintSs}">   </apex:page>

  public with sharing class OpportunityPrint {
    private kpsr.ReportsConnectController rc;

    public OpportunityPrint (ApexPages.StandardController controller) {
        rc = new kpsr.ReportsConnectController();
         
    }
   
    public Pagereference doPrintSk(){
        rc.setReportId('請求書');
        return doPrint();
    }

    public Pagereference doPrintMt(){
        rc.setReportId('見積り');
        return doPrint();
    }
   
    public Pagereference doPrintSs(){
        rc.setReportId('商品紹介');
        rc.getParms().put('condition','where ImageUrl__c <> NULL');
        //rc.setReturnUrl('/servlet/servlet.FileDownload');
        rc.goPrint();
        if(rc.goUrl!=null){
            Pagereference pr = new Pagereference(rc.goUrl);
            return pr;
        } else {
            return null;
        }
    }
   
   
    private Pagereference doPrint(){
        rc.getParms().put('condition','where OpportunityId=\''
                + System.currentPageReference()
                   .getParameters().get('id') + '\'');
        rc.goPrint();
        if(rc.goUrl!=null){
            Pagereference pr = new Pagereference(rc.goUrl);
            return pr;
        } else {
            return null;
        }
    }
}
-------------------------

なお、ReportsConnectController#setParentIdメソッドを使用してオブジェクトのidを設定すれば、任意のオブジェクの添付ファイルにすることができます。

また、ReportsConnectController#setReturnUrlメソッドで、遷移先のページを指定することもできます。
その際、リクエストパラメーターfileに、PDFファイルの添付ファイルのオブジェクトのidが返されるので、上記ソースでコメントアウトされている

//rc.setReturnUrl('/servlet/servlet.FileDownload');

の行のコメントアウトを外すと、ダウンロードサーブレットが動いてPDFが表示されますので試してみてください。

Reports Connect for Salesforce 標準画面からの印刷呼び出し方法

今回はReports Connect for Salesforceで作成した帳票を、Salesforceの標準画面から呼び出す方法について解説します。

まずは、新規に帳票を作成。今回は一から帳票を作るのでなく、Reports Connect for Salesforceの資料のページにあるサンプルテンプレートの「見積り」をダウンロードして作成します。

Sampledl

Reports Connect for Salesforceの帳票のタブから新規ボタンを押して、「見積り」という名前の新規帳票を作成します。

20121221_13h59_32

SOQLのテキストボックスには、先ほどダウンロードした見積りのzipファイルの中にある、soql.txtの中身を貼り付けます。

これで、一旦保存。

保存した帳票に、zipファイル内にある、estimate.jrxml(帳票のフォームファイル)とRCLogo.jpg(ロゴの絵)を添付します。

20121221_14h01_39

この状態で、有効なデータがあれば、帳票画面の印刷テストを押すと見積り書が出てくるはずですが、私の環境では「データが1件もありません」となってしまいました。

これは、商品の登録された商談が一件も無いためのようです。そこで、適当な商談を開いて、商品の追加ボタンを押して商品を登録します。

20121221_14h03_54

適当に商品を選んで選択ボタンを押すと、数量を入れる画面になるので、

20121221_14h04_56

数量もとりあえず、適当に入れて保存します。

これで、先程の見積りの帳票の印刷テストを押すと、見積り書が出てきました。

20121221_14h06_10

これを、商談の標準画面にカスタムボタンを配置して出力できるようにします。

やり方はまず、以下のソースコードのapexクラス「OpportunityPrint」を作成します。

------------------------

public with sharing class OpportunityPrint {
    private kpsr.ReportsConnectController rc;

    public OpportunityPrint (ApexPages.StandardController controller) {
        rc = new kpsr.ReportsConnectController(); //①
         
    }
   
    public Pagereference doPrintSk(){
        rc.setReportId('請求書');
        return doPrint();
    }

    public Pagereference doPrintMt(){
        rc.setReportId('見積り');  //②
        return doPrint();
    }
   
    private Pagereference doPrint(){ //③
        rc.getParms().put('condition','where OpportunityId=\''
                + System.currentPageReference()
                   .getParameters().get('id') + '\'');
        rc.goPrint();
        Pagereference pr = new Pagereference(rc.goUrl);
        return pr;
    }

}

---------------------------------------

上記コードの内容を解説しますと、

  1. コンストラクターでReportsConnectControllerのインスタンスを作成して、保持します。
  2. doPrintMtメソッドでコントローラに帳票の名前を設定します。
  3. その後、リクエストパラメーターのidに設定されている値を使って、SOQLのwhere分を作成しまし、パラメーター「coindition」に再設定します。(where  OpportunityId='値'となるように)
  4. コントローラーのgoPrintメソッドを呼び出し、goUrlに返ってくるURLに遷移します。

ここで、上の③で設定したwhere文が帳票のSOQL側に反映されるように、先程保存した帳票「見積り」のSOQL文に「:condition」を追加しておきます。こんな感じです。

20121221_15h33_59

次に、Visualforceページをひとつ作成します。

ソースは2行だけ、こんな感じ。

------------------------------------------------

<apex:page standardController="Opportunity" 
       extensions="OpportunityPrint" action="{!doPrintMt}"> </apex:page>

------------------------------------------------

このVisualforceページは、呼び出されると先ほど作成したapexクラス「OpportunityPrint」のdoPrintMtメソッドを呼び出します。

このVisualforceページにPrintMitsuという名前を付けて保存します。

20121221_14h11_47

次に、商談のカスタムボタンを作成します。

設定→カスタマイズ→作成→商談→ボタンとリンクの順にクリックします。

20121221_14h14_00商談のボタンとリンクの画面から新規ボタンを押します。

以下のように、見積り印刷というラベルのボタンを作成します。

動作に「新規ウインドウに表示」、内容のソースに先ほど作成したVisualforceを選択して保存します。

20121221_14h15_07 保存したら、出来上がった「見積り印刷」のリンクをクリックすると、作成したボタンの詳細画面が表示されます。ここの「ウインドウオープンプロパティ」のボタンを押すと、開くウインドウの大きさ等を設定できます。

20121221_15h49_13

今回は、幅を1000px 高さを400pxにして、チェックボタンをすべて外しておきました。

20121221_14h19_26

あとは、できたボタンを配置するだけ。

先ほど商品を追加した商談の画面を開いて、「レイアウトを編集する」のリンクをクリックします。

20121221_14h12_53

画面レイアウトの編集画面の上部の「ボタン」を選択すると、先程作ったボタン「見積り印刷」があるので、これをレイアウト上の、カスタムボタンの枠内にドラッグします。

20121221_14h16_01

これで、保存すれば出来上がり。

商談画面に「見積り印刷」ボタンが追加されます。

これを押すと、開いている商談の見積もり書が出力されます。

20121221_14h25_08

なお、apexクラス「OpportunityPrint」に、ついでに doPrintSkメソッドを入れてありますので、同じやり方で、サンプルテンプレートの請求書の印刷機能も作ることができます。



Reports Connect for Salesforce ダウンロード画面のカスタマイズ

Reports Connect for Salesforceでは、PDFダウンロード時に別Windowが開いて、このような画面が出ます。

Rc4dev01
この画面をカスタマイズすることができます。

自分のアプリケーションの名前を出すなど、アプリに応じて自由なデザインの画面にすることができます。

カスタマイズ可能な画面は以下の3種類です。

ダウンロード時の画面:dl.html
上記画面

印刷エラー時の画面:dlErr.html

Rc4dev02
印刷対象なしの画面:dlNodata.html

Rc4dev03
以上の3つのjspのオリジナルのソースコードは、以下のリンクからダウンロード可能です。

カスタマイズ方法は実に簡単です。上記jspファイルを参考に、カスタマイズしたhtmlファイルをjrxml等のファイルと同様に、帳票レコードに添付するだけです。

実際にカスタマイズができるか、やってみましょう。

上記リンクからダウンロードしたdl.jspのソースコードは以下のとおりです。

-------

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link type="image/x-icon" rel="shortcut icon"
    href="http://techsupport.kpscorp.jp/templates/newkokyakuroku/favicon.ico">
<link rel="stylesheet" type="text/css"
    href="${baseUrl}/resources/common.css">
<link rel="stylesheet" type="text/css"
    href="${baseUrl}/resources/extended.css">
<link rel="stylesheet" type="text/css"
    href="${baseUrl}/resources/elements.css">
<link rel="stylesheet" type="text/css"
    href="${baseUrl}/resources/security_page.css">
<style type="text/css">
#main-logo {
    display: block;
    font-size: 30pt;
    height: 80px;
    overflow: hidden;
    position: absolute;
    width: 300px;
    z-index: 12;
    margin-top: 0px;
    padding-top: 20px;
    padding-left: 10px;
    color: Snow;
}
</style>
<title>ダウンロードページ</title>
</head>
<body>
    <div id="pagewrap">
        <a id="main-logo"
            href="http://techsupport.kpscorp.jp/reportsconnect.html">ReportsConnect</a>
        <div id="headerwrap">
            <div id="header">
                <div id="headertext">KPSの印刷ソリューション</div>
                <!-- .header-text-->
            </div>
        </div>
        <!-- .headerwrap -->
        <div id="contentwrap">
            <div class="oauthcontent" id="oauthcontent" style="height: 259px;">
                <div id="client_details" style="padding-top: 50px;">
                    <img
                        src="${baseUrl}/resources/ReportsConnect.png">
                    <div id="client_description">印刷サーバーにPDFファイルの作成を要求しました。</div>
                </div>
                <div class="arrow"></div>
                <div id="perms_wrap" style="padding-top: 60px;">
                    <h2 id="shorih">ただ今処理中...</h2>
                    <div class="oauth_text bullets">
                        PDFファイルのダウンロードが始まるまで、少々お待ちください。</div>
                    <div class="oauth_text">
                        ダウンロード完了後、このウインドウを閉じてください。</div>
                    <div id="acceptdeny">
                        <input type="button" title="閉じる" class="btnPrimary btn allowBtn"
                            value=" 閉じる " onClick="window.close();"">
                    </div>
                </div>
            </div>
            &nbsp;
        </div>
        <!-- #footer -->
    </div>
    <script type="text/javascript">
        function addLoadEvent(func) {
            var oldonload = window.onload;
            if (typeof window.onload != 'function') {
                window.onload = func;
            } else {
                window.onload = function() {
                    oldonload();
                    func();
                }
            }
        }
        function doDl() {
            location.href = "dl2?state=${key}";
        }

        if ("${key}" != "") {
            //location.href = "dl?state=${key}";
            addLoadEvent(doDl);
        }
    </script>

</body>
</html>

---------------

このソースには、JSP風の変数が使用できます。

使用出来る変数は以下の通り。

{!baseUrl}    サーバーのコンテキストのURL

{!erroe}      エラー名

{!error_description}   エラー記述

{!key}      PDFダウンロード時に指定する

このソースは、一見JSP風にも見えますが、JSPではありません。JSPをカスタマイズに使用する事は、セキュリティー上の理由からできません。

この画面の左上のReportsConnectの文字を変えてみます

        <a id="main-logo"
            href="http://techsupport.kpscorp.jp/reportsconnect.html">ReportsConnect</a>

      ↓

        <a id="main-logo"
            href="http://techsupport.kpscorp.jp/reportsconnect.html">カスタマイズ済み</a>

修正したソースを帳票レコードに添付します。

20121218_13h36_09

これで、印刷してみると...

おー、見事に変わりました。

Rc4dev05

同様に他の2つのhtmlに関しても添付するだけで修正が可能です。

なお、すべての帳票にカスタマイズ画面を適用したい場合は、「管理レコード」のチェックをつけた帳票レコードを1件用意して、そちらに添付することで可能です。

20121218_13h37_22