logo

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

最近のトラックバック

無料ブログはココログ

Reports Connect

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 Kintone 複数ボタンの実装方法

Reports Connect for Kintone アプリへの組込み方法およびReports Connect for Kintone テーブルのデータの読込の記事で、Javascriptで印刷処理を起動する方法について解説しました。
今回は、1画面で複数のボタンを配置して、それぞれ異なる帳票を作成する場合の方法について解説します。

例として、Reports Connect for Kintone テーブルのデータの読込の記事で紹介したJavascriptを取り上げます。

ソースコードは以下のようになっていました。

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

/*
* 商談 見積もり/請求印刷
*/
(function() {

    //①ReportsConnectのライブラリーをロードする
    load("https://kps-reportsconnectk.herokuapp.com/js/kpsrck.js");
    //②ロード完了後kpsrc.setupReportを呼び出す
    waitLoaded(function(){
        kpsrc.setupReport(17, "商談見積もり");
    });
    //③詳細表示時に、印刷ボタンを追加する(bt1はボタン配置スペースの要素ID)
    kintone.events.on('app.record.detail.show', function(event) {
            var bt = document.createElement('input');
            bt.type = "button";
            bt.value = "見積印刷";
            bt.onclick = goPrint;
            var btsp = kintone.app.record.getSpaceElement("bt1");
            btsp.appendChild(bt);
        });
    //④印刷ボタン押下時の処理。kpsrc.rcparms.kps_recidに現在のレコードIDを動的に設定し
    //kpsrc.gorcprint呼び出す
    function goPrint() {
        kpsrc.rcparms.kps_recid = kintone.app.record.getId();
        kpsrc.gorcprint();
    }
    //以下の関数はそのままコピペしてください。
    // http ヘッダに要素を追加します
    function load(src) {
        var head = document.getElementsByTagName('head')[0];
        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = src;
        head.appendChild(script);
    }
    // ReportsConnect がロードされるまで待ちます
    var timeout = 10 * 1000; // ms
    var interval = 100; // ms
    function waitLoaded(callback,parm) {
        setTimeout(function() {
            timeout -= interval;
            if (typeof kpsrc !== 'undefined') {
                callback(parm);
            } else if (timeout > 0) {
                waitLoaded(callback,parm);
            } else {
                // abort
            }
        }, interval);
    }
})();

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

このJavascriptを修正して、見積印刷ボタンに加えて、請求印刷ボタンを追加して、請求書も作成できるようにしたいと思います。

まずは、前提として、「商談見積もり」と同様に、「商談請求」という帳票のデザインがされ、その帳票レコードがすでに作成されている事とします。

(帳票のデザイン方法に関してはこちらの記事等を参考にしてください)

画面のイメージはこのようにボタンが2つ並ぶ感じです。

20140307_14h28_44

 

変更後のJavascriptは、以下のようになります。

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

/*
* 商談 見積もり印刷
*/
(function() {

    //①ReportsConnectのライブラリーをロードする
    load("https://kps-reportsconnectk.herokuapp.com/js/kpsrck.js");
    //②ロード完了後kpsrc.setupReportを呼び出す
    waitLoaded(function(){
        kpsrc.setupReport(17, "商談見積もり");
        kpsrc.setupReport(17, "商談請求");
    });
    //③詳細表示時に、印刷ボタンを追加する(bt1はボタン配置スペースの要素ID)
    kintone.events.on('app.record.detail.show', function(event) {
            var bt = document.createElement('input');
            bt.type = "button";
            bt.value = "見積印刷";
            bt.onclick = goPrint;
            var btsp = kintone.app.record.getSpaceElement("bt1");
            btsp.appendChild(bt);
            var bt2 = document.createElement('input');
            bt2.type = "button";
            bt2.value = "請求印刷";
            bt2.onclick = goPrint2;
            btsp.appendChild(bt2);
        });
    //④印刷ボタン押下時の処理。kpsrc.rcparms.kps_recidに現在のレコードIDを動的に設定し
    //kpsrc.gorcprint呼び出す
    function goPrint() {
        kpsrc.rcparms = kpsrc.parmsmap["商談見積もり"];
        kpsrc.rcparms.kps_recid = kintone.app.record.getId();
        kpsrc.gorcprint();
    }
    function goPrint2() {
        kpsrc.rcparms = kpsrc.parmsmap["商談請求"];
        kpsrc.rcparms.kps_recid = kintone.app.record.getId();
        kpsrc.gorcprint();
    }
    //以下の関数はそのままコピペしてください。
    // http ヘッダに要素を追加します
    function load(src) {
        var head = document.getElementsByTagName('head')[0];
        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = src;
        head.appendChild(script);
    }
    // ReportsConnect がロードされるまで待ちます
    var timeout = 10 * 1000; // ms
    var interval = 100; // ms
    function waitLoaded(callback,parm) {
        setTimeout(function() {
            timeout -= interval;
            if (typeof kpsrc !== 'undefined') {
                callback(parm);
            } else if (timeout > 0) {
                waitLoaded(callback,parm);
            } else {
                // abort
            }
        }, interval);
    }
})();

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

[kpsrc.setupReportの呼び出しを追加]

②の箇所に帳票「商談請求」」を初期設定するkpsrc.setupReportを追加します

[ボタンの追加]

③の箇所で、請求印刷ボタンを作成し追加します。その際、onclickイベントで、関数goPrint2が呼び出されるようにします。

[関数goPrint2の追加]

④の箇所で関数「goPrnt2」を追加します。goPrint、goPrnt2それぞれの処理の最初で変数kpsrc.rcparmsに kpsrc.parmsmap[印刷する帳票レコード名]の値を設定します。

(kpsrc.parmsmap[印刷する帳票レコード名]には、kpsrc.setupReportで該当の帳票を初期設定した際のkpsrc.rcparmsの値が入っています。kpsrc.setupReportを複数呼び出した場合はkpsrc.rcparmsが上書きされてしまうので、kpsrc.parmsmapから正しい値を設定し直します)

修正箇所は以上の3箇所です。

今回のような単票イメージのパターン以外でも同様の方法で、1画面複数ボタンが実現できるはずです。

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のこちらを参照してください。

Reports Connect for Kintone ユーザー外字、IPAmjフォントの使用法

Reports Connect for Kintoneでは、ユーザー外字や、IPAで提供されているIPAmjフォントの一部を使用する事ができます。

まずは、ユーザー外字を使用してみましょう。

Windowsの外字エディターを使用して外字を作成します。
とりあえず、こんな感じのちょっと下手なスマイルマークの文字を作成しました↓。

Rc2dev1
作成した、外字はc:\Windows\fonts\EUDC.TTEに保存されます。
このファイルを、EUDC.ttfというファイル名に名前を変更してコピーします。
コピーの仕方は、コマンドプロンプトから以下のようなコマンドを入れて、任意のホルダーにコピーします。

   cp c:\Windows\Fonts\EUDC.TTE c:\work\EUDC.ttf

使い方は簡単。コピーしたファイルを帳票レコードに添付するだけで、この外字が使用できます。

20131115_15h15_23

前回までに作成した、見積もり書のレコードに添付しました。

さて、これで外字が本当に出力されるか試してみます。
商談のレコードに先ほど作った外字を入れてみましょう。

「説明」のフィールドの最後にIMEパッドを開いて、シフトJISの外字を選択すると、先ほど作った外字が出てきたので、これを選択。

20131115_15h44_18

外字が入力されました。

20131115_15h07_59

(外字は、ブラウザーで見る場合IEを使用しないと正しく見られないようです)

保存して、見積書を出力すると、

20131115_15h17_40 外字を表示できました。

次にIPAmjフォントを使用してみましょう。

IPAmjフォントは、人名などの表示用に作成された約6万字の漢字を収録したOpenTypeフォントで、IPAのダウンロードページから無料でダウンロードできます。

ReportsConnect for Salesforceでは、サーバー側にこのフォントを搭載しているためFont名を指定することで、これを使用する事ができます。

ただし、現段階では、約6万字すべてをサポートしている訳では無く、下記図の①②の範囲(サロゲートペアを含む)、約5万1千文字分が使用可能となっています。

20121220_17h23_13

まずは、IPAmjフォントをiReportで使用できるようにするために、あらかじめこちらのページからIPAmjフォントををダウンロードして自分のPCへインストールしておいてください。

今度は、ユーザー名にIPAmjフォントで出力可能なCJK互換漢字の文字を追加してみます。

IMEパッドを使用して、Unicode(基本多言語面)にある、「しんにゅう」の文字をいれてみました。

20131115_15h49_47

IPAmjフォントを使用するためにはiReportでのフォントの設定が必要です。

ReportInspectorでユーザーの該当ののフィールドを選択し、プロパティでFont関連の属性を変更します。IPAmjフォントを使用するには以下の4か所の属性を設定する必要があります。

Font name:  IPAmj明朝

PDF Font name:  Times-Roman

PDF Embeted:   true

PDF Encording:   Identity-H

以上の設定を行った上で、保存したjrxmlファイルを帳票レコードに添付して出力すると...

20131115_15h29_42 文字が出力されました。

このように、通常jasperreportsで使用されるiTextAsian.jarで使用可能な漢字以外にも、IPAmjフォントを使用する事で使える漢字の範囲を広げる事ができます。

なお、IPAmjフォントおよび外字は、サーバーからPDFファイルに組み込まれるため、PDFを見る側のユーザーの環境にIPAmjフォント、該当の外字が導入されている必要はありません。

追記:2013/12/25 同様の方法で、IPAexゴシック フォントが使用可能になりました。

Reports Connect for Kintone PDFファイルをレコードに添付する

Reports Connect for Kintone で、作成した帳票を、ダウンロードするのではなく、作成されたPDFファイルをレコードに添付する方法について解説します。

まず、添付先のフィールドをアプリに用意します。

20131115_14h05_42
次に、Reports Connectの帳票レコードの添付先フィールドに先ほど用意した添付先のフィールドコードを設定します。

20131115_14h03_17
この状態で、印刷を行うと、印刷のダウンロードと同時に、読み込んだレコードの添付先のフィールドにPDFファイルが添付されるようになります。

20131115_14h15_22_2
しかし、印刷処理は別画面で行われるので、もとの画面はリロードしないと添付されたファイルを確認できません。
そもそも、ファイルを添付するのが目的ならば、別画面を開いてPDFファイルをダウンロードする動きは必要ない場合が多いと思います。

その場合は、javascript上でkpsrc.gorcprint関数を呼び出す前に、以下のコードを入れてください。

   kpsrc.rcparms.kps_newwindow = false;

前回までのソースコードで言うと、goPrint関数を以下のようにします。

-------------------------------
    //④印刷ボタン押下時の処理。kpsrc.rcparms.kps_recidに現在のレコードIDを動的に設定し
    //kpsrc.gorcprint呼び出す
    function goPrint() {
        kpsrc.rcparms.kps_recid = kintone.app.record.getId();
        kpsrc.rcparms.kps_newwindow = false;  //別画面を開かない
        kpsrc.gorcprint();
    }
--------------------------------
この設定により、印刷ボタンを押すと別画面が開かなくなり、現画面の中で処理が行われ、自動的に添付したレコードの画面に遷移します。

なお、読み込んだ対象レコード以外に添付したい場合や、そもそもクエリーで複数レコードを読んでいる場合などは、添付先のレコードが特定できない場合などは、添付先のレコードを明示的に指定することができます。

その場合は、Reports Connectの帳票レコードの添付先フィールドを以下のように指定してください。

 アプリID;レコードID;フィールドコード

例:アプリID 19 のレコード番号 2のレコードの「添付ファイル」フィールドに添付したい場合は、先ほど「添付ファイル」とだけ指定した添付先フィールドを以下のように指定します。

  19;2;添付ファイル

なお、この値は、javascriptで、

  kpsrc.rcparms.kps_parentid

の値を設定すれば上書きされますので、javascriptのコードから動的に設定することができます。(特定の添付先レコードを固定する場合以外は普通そうすると思いますが)

また、アプリIDを省略して

  ;2;添付ファイル

の様に設定すると、現在のアプリIDが使用されます。

------追記---------

2015/10/01 認証をAPIトークンで行うことが可能になりました。

APIトークンによる認証を行う場合でレコードを添付するアプリが現在のアプリと異なる場合は、添付先フィールドの指定にさらに;添付するアプリのAPIトークンを連結してください。

 アプリID;レコードID;フィールドコード;添付するアプリのAPIトークン

の形式で入力します。
(APIトークンに「レコード編集」のアクセス権が必要)

Reports Connect for Kintone 画像の動的な設定

以前の記事で、Reports Connect for Kintoneで作成する帳票に必要な画像ファイルは、Reports Connectアプリの帳票レコードに添付して使用する、という説明をしました。
この方法は、会社のロゴ等、常に同じ画像を帳票上に表示するケースでは良いのですが、読み込むデータ上に帳票を持って、読んだデータによって帳票を変えたいケースでは、別の方法が使用できます。

前回使用した、見積書に表示しているロゴを、読み込む商談レコード上に添付してレコードに応じてそれが表示されるようにしてみます。

20131114_18h28_30
商談レコードに添付ファイルフィールドを追加して画像を添付出来るようにしました。

20131115_13h22_43
一方、Reports Connectの対応する帳票レコードには、「イメージファイルフィールド名」というフィールドがあります。
ここに、読み込むデータ上にあるイメージファイルを添付するフィールドのフィールドコードを指定します。

20131115_13h29_11
この指定により、Reports Connectは、データを読む際に、ここに指定したフィールドに添付されたファイルをサーバーに自動的にアップロードします。
kintoneではアップロードしたファイルには一意のfilekeyという、キー値が割り振られます。
自動的にアップロードされたファイルは、サーバー上のfilekey/ファイル名に保管されます。

次に、iReportを使ってjrxmlファイル側でこの画像ファイルを表示する設定を行います。

Reports Connectではファイルが添付されたレコードを読むと、ファイル添付のフィールドにはfilekey/ファイル名の文字列が返ります。
したがって、設定は簡単で、imageエレメントのプロパティ image Expressionに「$F{添付ファイル}」と設定するだけです。

20131115_13h39_32
ただし、このままだと、画像が添付されていないレコードを読んだ場合、エラーが出てしまうため、print when Expressionを以下のように設定してください。

 !$F{添付ファイル}.equals( "null" ) && !$F{添付ファイル}.equals( "" )

20131115_13h44_34
print when Expressionはこのエレメントを表示する条件を指定する項目で、この式により、フィールド添付ファイルの値が"null"か空文字の場合は表示しない設定になりますので、エラーが回避されます。

以上で、レコードに添付された画像を該当箇所に表示するようになりました。

20131115_13h52_32

なお、今回作成したjrxmlファイルはこちらからダウンロードできます。

estimatesd2.jrxml

-------追記 2015/10/07--------

データ側のアプリに複数のイメージファイルをアップロードすることで、複数のイメージを帳票に表示することが可能になりました。

複数のイメージファイルをアップロードすると、Reportsconnectには、ファイル添付のフィールドに filekey/ファイル名 の文字列が ; 区切りで返ります。

一方、サーバーにはそれぞれのファイルが filekey/ファイル名 に保管されますので、iReportでimageエレメントのプロパティ image Expression で $F{添付ファイル}の値を ; 区切りで区切って、欲しい画像のファイル名を取り出せば、選択的にイメージを表示出来ます。

例として、

 $F{添付ファイル}.split(";")[0]

と指定すれば、添付した最初のイメージが表示されます。

同様に、配列のインデックスを1とすれば( $F{添付ファイル}.split(";")[1] )2つ目に添付したイメージを表示できます。

なお、従来通り

 $F{添付ファイル}

とした場合は、最後に添付したイメージが表示されます。

 

Reports Connect for Kintone テーブルのデータの読込その2

前回Reports Connect for Kintone テーブルのデータの読込で、テーブルを含むデータの取り扱いについて解説しましたが、今回はテーブルのデータをサブリポートを使用して読み込む方法について解説します。

前回の方法よりも少々複雑ですが、この方法を用いれば、一つの帳票に複数のテーブルを含む帳票も作成可能になります。

今回のReports Connectの帳票レコードの設定は以下のとおりです。

20131114_17h35_34
前回と異なるのは、「テーブル」への設定が無い事と、親JRXMLファイル名に指定がある事です。
親JRXMLファイル名に関してはのちほど、解説しますので、とりあえずは、データのアプリIDと対象レコード番号、ログイン、パスワードを設定した状態でデータの確認のボタンを押します。

すると、今回は2つのFile CSV Datasourceが出力されます。

20131114_17h45_21

上のDatasourceがヘッダー部分、下がテーブル部分だという事がわかります。

これらを使用して、親と子の2つの帳票を作成し、親の帳票の一部に子の帳票をsubreportとして組み込む形で1枚の帳票デザインを組み立てます。

それでははじめに、下のテーブル部分のCSVDatasourceを使用して明細部分の帳票をiReportで作成する事にしましょう。

これは、前回の帳票の明細部分のみを抜き出した(PageHeaderやPageFotter等のバンドが無い)帳票として作ります。

20131114_17h52_23

次に、親の帳票を作成します。

こちらは、逆に、前回の帳票の明細部分を取り除いたものを作ります。

CSVから作成されたFieldのうち「明細」はサブクエリーからのコレクションオブジェクトが返るFieldです。そこで、このFieldのプロパティField Classを、java.lang.Objectに変更します。

20131114_16h52_20

次に、明細の入るスペースを作ります。明細部分のColumn headerとColumn footerを削除してdetailのバンドを最大限縦に広げます。

20131114_18h04_13

できたdetailのスペースにパレットのウィンドウからSubreportをドラッグアンドドロップします。

20131114_18h08_47

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

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

20131114_16h53_49

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

Rc3dev06

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

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

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

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

できたSubreportは大きさを広げてDetailのいっぱいを占める大きさに調整します。

20131114_17h24_39

サブリポート側のデザインが横幅全体を前提としているので、サブリポートの横幅はページいっぱいまで広げておきます。

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

リポートのプロパティのImportsの横のボタンを押して設定を追加します。

20131114_17h13_32

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

net.sf.jasperreports.engine.data.*

 

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

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

 $P{SUBREPORT_DIR} + "estimatesdms.jasper"

estimatesdmsの部分はサブリポートに付けた名前です。

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

20131114_18h24_06

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

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

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

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

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

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

では、実際に出来上がったjrxmlファイルをReports Connectの帳票レコードに添付して印刷してみましょう。

出来上がった2つのjrxmlファイルを帳票に添付します。

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

印刷テストボタンを押すと帳票が出力されました。

20131114_18h28_30

今回はテーブルの数はひとつでしたが、この方法を使えば、1枚の帳票に複数のテーブルを表示するような複合的な帳票を作成することができます。

なお、今回作成したjrxmlファイルはこちらからダウンロードできます。

estimatesdms.jrxml

oyaestimate.jrxml

より以前の記事一覧