logo

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

最近のトラックバック

無料ブログはココログ

Salesforce

Reports Connect for Salesforce / for kintoneグラフの出力

Reports Connect for SalesforceReportsconnect for kintoneで、グラフを出力する方法について解説します。

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

まず、iReportで該当のjrxmlファイルを開きます。今回はSummaryBand部分に、商品コード別に売上個数をグラフ化したものを出力する事にします。

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

1_2

次に、グラフの種類を選びます。今回は縦棒グラフを選択。

2_4

Wizardの最初、Datasetは「Main report dataset」のまま次へ。

Seriesは今回は売上なので「売上金額」 。

4

Categories and Valuesは

最初の項目CategoryexpressionがX軸ですので「商品コード(のAPI参照名)」。

ValueはY軸。数値の項目ですので「new java.math.BigDecimal(金額(のAPI参照名))」としてください。

5

完了ボタンを押下しますとグラフが挿入されますので、お好きなサイズに調整してください。

6

Preview画面で確認しますと下記のようにグラフが表示されました。

7

このままReportsConnectから出力可能です。

値を追加したい場合には、グラフを右クリックしてChartdataを開きDetailsタブのAddを選択します。

8

「単価」と「売上個数」を先程と同じように設定します。

9

10

Previewで表示してみますと下記のようになります(個数は値が小さすぎて見えませんが)

11

※グラフはSummaryBand以外にも、PageFooterで同じように使用することが出来ます。

 

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では、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

Reports Connect for Salesforce:Subreportで複合的な帳票を作成

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

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

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

accounts.jrxml

contacts.jrxml

optunities.jrxml

Reports Connect for Salesforceの使い方シリーズも5回目になりました。
今回は、Subreportの設定方法に関して解説します。
なお、Reports Connect for Salesforceの基本的な使用法に関しては、こちらの記事から順番に読んでみてください。

iReportではSubreportを使用する事により、リポート上に複数のリポートを組み合わせて配置する事ができます。

Rc3dev00
たとえば、Salesforceの標準オブジェクトで言うと、取引先、取引先責任者、商談の関係は以下のようになっています。

Rc3dev01
取引先から見ると、1個の取引先に対してn個の取引先責任者およびn個の商談が関連づけられています。
これを、取引先を中心にして関連する取引先責任者と商談のリストを1枚で表示するレポートをSubreportの機能を使用して作成してみます。

Rc3dev01_2

まず、新規帳票として「取引先商談」を作成しました。

Rc3dev01_1
SOQLとしては、以下のようなサブクエリーを持った構造のものを使用します。

 SELECT Name, Type, Industry, Rating,
    (SELECT Name, Phone, Email, Title FROM Contacts),
    (SELECT Name, StageName, Amount, CloseDate FROM Opportunities)
  FROM Account

SOQLを設定して、データの確認ボタンを押すと、今回は3つのFile CSV Datasourceが出力されます。

Rc3dev02
一つ目が親のReport用、他の二つが子のReport用のDatasourceです。
この3つのDatasourceをそれぞれダウンロードします。

次にiReportを使用して、三つのDatasourceを取り込みます。

File CSV Datasourceの取り込み方法は、こちらの記事を参考にしてください。

次に、まず一つ目の子供のReport用の ContactsからReport作成を始めます。
今回は、Wizardを使用せずに、ファイル→Newと開いてBlank A4 Landscapeのテンプレートを選択して、Open This Templateボタンを押します。

Rc3dev02_1
すると、A4横のブランクの空のReportが開きます。

Rc3dev02_2

次に、先ほど取り込んだContactsのDatasourceを使用してFieldを作成します。
メニューの直下の現在のDatasourceをContactsに設定し、現在作成中のレポートのタブのPreviewの右にあるReport Queryボタンを押し、開いたダイアログの、CSV DatasourceのタブのGet fields from datasourceボタンを押すと、このデータソースからFieldを取り込む事ができます。

Rc3dev02_3

Fieldを取り込むと、画面左のReport InspectorのFieldsの中に取り込んだFieldが表示されます。
これをすべて選択して、ReportのDetail 1のbandへドラッグアンドドロップします。

Rc3dev02_4

この時点ですでにContactsのReportは一応Preview可能な状態まで出来ていますが、この後実用的なデザインにするために、不要なband(Title,Column Footer,Page Footer,Summary)を消して高さを調整し、Page Headerに「取引先責任者」というStatic Textを追加しました。

Rc3dev03_1

なお、この他にいつものように、languageをJavaに設定、漢字用のFontの設定等を行います。そのあたりの方法についてはこちらの記事を参考にしてください。

これで、contactsのReportは出来上がりです。

同様に、OptunitiesのReportも作成します。

Rc3dev03_2

さて、ここで親のReportの作成に取り掛かります。

同様にA4横の空のReportの状態から、親のデータソースからFiledを取り込んで、Page HeaderのbandにName,Type,Industory,RatingのFiledを配置しました。

また、Page Headerとdetail以外のbandを削除し、detailのフィールドを最大限広げておきます。

Rc3dev04_3

残りのField、contactsとoptunitiesはサブクエリーからContactとOptunityのコレクションオブジェクトが返るFieldです。そこで、このFieldのプロパティField Classを、java.lang.Objectに変更します。

Rc3dev04_4_2

同様に、Field OptunitiesのField Classも変更してください。

次に、Detail上をFrameで縦に二つのエリアに分割し、そこにパレットのウィンドウからSubreportをドラッグアンドドロップします。

Rc3dev04_2

すると、Subreport Wizardのダイアログが開きます。

WizardのStep1では、Use an existing reportをチェックして先ほど作成したContactsのjrxmlファイルを指定します。

Rc3dev05

Step2ではUse a JRDatasource Expressionを選択し、横のボタンを押します。

Rc3dev06

Expression Editorが開きますので、ここに以下のような記述を設定してください。

$F{Contacts}!=null&&!$F{Contacts}.equals("null")?new JRBeanCollectionDataSource((Collection)$F{Contacts}):null

Rc3dev07_2
これは、ContactsのFieldに返ってくるContactオブジェクトのコレクションを、このサブリポートがDatasourceとして使用するための指定です。コレクションの中身が空の時はサブリポートに空値を与えます。
Applyを押して保存します。

この先のStep3、Step4は次へを押してとりあえずWizardを終了します。

できたSubreportは大きさを広げてDetailの上部半分を占める大きさに調整します。

次に、先ほど指定した、JRBeanCollectionDataSourceを参照できるように、Importsの指定を行います。

Report accountsのプロパティのImportsの横のボタンを押して設定を追加します。

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

net.sf.jasperreports.engine.data.*

Rc3dev10

次に、Subreportのjrxmlファイルの指定を変更します。SubreportのプロパティのSubreport Expressionの横のボタンを押してExpression Editorを開きます。

開いた状態では、個々の記述は以下のようになっていると思います。

 $P{SUBREPORT_DIR} + "contacts.jasper"

ここの、$P{SUBREPORT_DIR} + の部分を消します。

Rc3dev08

Reports ConnectではSubreportは親のReportと同じフォルダーに保存されるため、上記のような設定にする必要があります。

了解を押して保存します。

同様にして、Subreport OptuinitiesをContactsの下の位置に設定します。

これで、Report accountsができました、この段階で、Previewを押して結果を確認したいところですがPreviewは

  Unable to get value for field 'Contacts' of class 'java.util.Collection'

というエラーになってしまします。

これは、Files CSV Datasourceでは入れ子になったCollectionの構造を表現できないためです。

では、実際に出来上がったjrxmlファイルをReports Connectの帳票オブジェクトに添付して印刷してみましょう。

出来上がった3つのjrxmlファイルを帳票、取引先商談に添付します。

Subreportを使用する場合は、親のjrxmlファイルの名前を「親JRXMLファイル名」に指定してください。

Rc3dev09

出来上がった帳票は、こんな感じ↓

Rc3dev13

今回は、Subreportの作り方を解説するのが目的なので、デザインはパッとしませんが、仕組みは理解できたかと思います。

 

より以前の記事一覧