logo

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

最近のトラックバック

無料ブログはココログ

« これでSalesforceでの帳票開発も楽々しかも無料 Reports Connect for Salseforce その2 | トップページ | Reports Connect for Salesforce ユーザー外字、IPAmjフォントの使用法 »

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

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

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

前回までの記事で、Reports Connect for Salesforceでの帳票開発方法に関して解説しました。

今回は、出来上がった帳票を、実際のアプリケーションに組込むテクニックに関して解説します。

方法1:RPConnectコンポーネントを使用する

ReportsConnectのパッケージにはRPConnectというコンポーネントが含まれています。
これは、印刷ボタンを提供するコンポーネントになっていますので、まずはこれを使用してみます。

パッケージにはReportsTestという、サンプルページがあるので、このソースをもとにページを作ります。

---ReportsTest---

        <apex:page >
            <apex:form >
                <apex:pageBlock >
                    <apex:pageBlockButtons location="top">
                        <c:RPConnect reportId="ユーザーリスト" />
                    </apex:pageBlockButtons>
                    <label>DataCheck</label>
                    <input type="text" name="ksp_datacheck" value="" />
                </apex:pageBlock>
            </apex:form>
        </apex:page>

---

このソースをコピーして新たにページを作成します。新たなページにはUserlistPrintという名前で作りました。

作成したページの5行目

 <c:RPConnect reportId="ユーザーリスト" />

 <kpsr:RPConnect reportId="ユーザーリスト" />

に修正します。

なお、reportIdは出力する帳票に対応する帳票レコードの名前またはIDを指定してください。

Rcdev1

出来たページ(https://c.na11.visual.force.com/apex/UserlistPrint)を開くと印刷ページが表示されるのがわかります。

Rcdev2 印刷ボタンを押せば、前回作成した帳票を出力することができます。

このように、kpsr:RPConnectのタグだけで印刷ボタンを実装できました。

ちなみに、下に表示されているDataCheckのテキストボックスにtrueと入れて印刷ボタンを押すと、データの確認画面を表示することが可能ですので、デバッグの際にはこのボックスを表示して、必要に応じてtrueを入れてデバッグして、完成後に取り除くようにすれば便利です。

*SOQLの動的変更

しかし、実用的なアプリケーションを考えた場合、常に同じデータを印刷するとは考えにくい訳で、ユーザーの指定により、動的にSOQLの条件を変えられるようにしたいですね。

ReportsConnectでは帳票レコードに設定するSOQLに動的に変更可能な変数を組み込む事ができます。

前回作成したユーザーリストの帳票レコードのSOQLを以下のように変更します。

  SELECT Id, Username, Name, Email, Profile.Name, Profile.UserType, CreatedBy.Name

   FROM User :condition order by  Profile.UserType, Profile.Name

Rcdev3途中に追加した「:condition」が変数です。JDBCのprepared statementのような感じで、:(コロン)の後に指定した文字列が変数となります。

この変数の部分は変数名のリクエストパラメータと置き換えられます。

例えば、

   condition=where Profile.UserType='Standard'

といった感じでwhere文を送ってやれば、SOQLの条件を変更することができるはずです。

さっそくやってみましょう。

先ほどのページのDataCheckのテキストボックスに以下のような細工を施します

<apex:page >
    <apex:form >
        <apex:pageBlock >
            <apex:pageBlockButtons location="top">
                <kpsr:RPConnect reportId="ユーザーリスト" />
            </apex:pageBlockButtons>
            <label>Condition</label>
            <input type="text" name="condition" value="" /> ←nameをconditionに変更
        </apex:pageBlock>
    </apex:form>
</apex:page>

それで、このテキストボックスにwhere文を入れてみましょう。

    where Profile.UserType='Standard'

Rcdev4

これで、印刷ボタンを押すと、ユーザータイプがStandardのユーザーのみが出力されればひとまず成功。

ちなみに、帳票レコードのパラメーターの欄に、key=valueの形式でパラメーターを設定して、データの確認ボタンや、印刷テストの際にパラメーターを送ることができます。

Rcdev3_2

この欄には、複数行にわたって書けば複数のパラメータを送ることもできます。

ただし、これは開発用の機能で、データの確認ボタン、印刷テストボタンの押下時に反映されるだけで、実際のアプリケーションに組み込まれた後はなんの影響も与えません。

*パラメータを帳票へ表示

今回はさらに、このパラメーターを帳票上に表示できるようにします。

iReportで、前回作成した、report1.jrxmlを再度開いて、レイアウトを修正します。

まずは、画面左のReport Inspectorから、Titleの下にあるCherry TitleとCherry Subtitleを選択して、右クリックして削除します。

Rcdev5
次に、上がって来たパラメーターを表示できるように、Parameterを追加します。
Report InspectorからParametersを右クリックして追加します。

Rcdev6

追加したパラメータのName属性をパラメーター名「condition」に変更するのを忘れないように。

次に、先ほど削除したTitleの場所に表示エリアを設けます。
まずは、ラベルとしてパレットのウインドウからStatic TextをTitleの位置にドラッグアンドドロップします。

Rcdev7
初期状態ではStatic Textの文字の色が黒で、バックの色と重なって文字が見えないので、Static TextのプロパティからForecolorを白に変更しましょう。

Rcdev72
Static TextのTextプロパティを「Condition:」としておきます。

次に、先ほど追加したパラメーターを「Condition:」の横に設置します。

Rcdev8
こちらのForecolorも白に変更しておきます。

Rcdev9

これで修正完了。jrxmlファイルを保存して、帳票レコードに添付してあるjrxmlファイルを新しいものに入れ替えます。

これで、印刷ボタンを押すと。

Rcdev11_3  

タイトルのところに、conditionに渡した文字列が表示されて、ユーザータイプStandardのユーザーのみ表示されるようになりました。

このように、リクエストパラメーターに文字列を乗せれば、帳票の任意の場所にそれを表示することができます。

*selectリストで条件選択

しかし、エンドユーザーがwhere文を自分で入れるという運用は現実には考えられないので、とりあえず、selectリストから選択できるようにしてみます。

Visualforceページを以下のように修正して、selectリストで選択すると、対応したcondintionが送られるようにします。

<apex:page >
    <apex:form >
        <apex:pageBlock >
            <apex:pageBlockButtons location="top">
                <select name="condition">
                    <option value="where Profile.UserType='Standard'">Standard</option>
                    <option value="">全件</option>
                </select>
              <kpsr:RPConnect reportId="ユーザーリスト" buttonvalue="ユーザーリスト出力"/>
            </apex:pageBlockButtons>
        </apex:pageBlock>
        <label>Data Check:</label>
        <input type="text" name="ksp_datacheck"/>
    </apex:form>
</apex:page>

なお、kpsr:RPConnectタグの、buttonvalue属性にボタンの文字列を指定することができます。
画面の表示はこんな風になります。

Rcdev12
方法2:自前のコントローラーでApexから呼び出す

コンポーネントを使用せずに自前のコントローラー内でReportsConnectControllerを使用する事もできます。

これにより、より柔軟な呼び出しが可能になります。

---サンプルVisualforceページ

<apex:page controller="Userlist">
    <apex:pageMessages id="msg"></apex:pageMessages>
    <apex:form >
    <apex:pageBlock >
        <apex:pageBlockButtons location="top">
                <apex:selectList size="1" value="{!ptype}">
                <apex:selectOption itemValue="Standard" itemLabel="Standard"/>
                <apex:selectOption itemValue="all" itemLabel="全件"/>
            </apex:selectList>
            <apex:commandButton action="{!goPrint}" value="印刷"  reRender="theBlock,msg" status="status"  />
            <apex:actionStatus startText="Requesting..." id="status"/>
        </apex:pageBlockButtons>
    </apex:pageBlock>
    </apex:form>
<apex:outputPanel id="theBlock">
<script type="text/javascript">
    if ("{!goUrl}" != ""){
       window.open("{!goUrl}",null,"scrollbars=no,width=1000,height=400");
    }
</script>
</apex:outputPanel>
</apex:page>

---

---コントローラー側のApexコード

public with sharing class Userlist {

    public String ptype { get; set; }

    private kpsr.ReportsConnectController rc;
   
    public Userlist(){
        rc = new kpsr.ReportsConnectController();
        rc.setReportId('ユーザーリスト');
    }

    public String goUrl { get; set; }

    public PageReference goPrint() {
   
        String ql = 'SELECT Id, Username, Name, Email, Profile.Name, Profile.UserType, CreatedBy.Name FROM User ';
        if(ptype == 'Standard'){
            ql = ql + 'where Profile.UserType=\'Standard\' order by Profile.UserType, Profile.Name';
        } else {
            ql = ql + 'order by Profile.UserType, Profile.Name';
        }
        rc.setSoql(ql);
        rc.getParms().put('condition',ptype);
        Pagereference ref = rc.goPrint();
        this.goUrl = rc.goUrl;
        return ref;
    }

}

---

Visualforce側では、印刷ボタンをコントローラーのgoPrintメソッドにバインディングしています。

ボタンにはreRenderを設定して、サンプルにあるjavascriptを再描画するようにしてください。これにより、goUrlに設定されたURLをサブウインドで開き、ReportsConnctサーバーにその後の処理を依頼することができます。

このソースは、パッケージに含まれる、ReportDevページのソースが参考になります。

---ReportDevのソース

<apex:page standardController="kpsr__Report__c" extensions="kpsr.ReportDev">
    <apex:pageMessages id="msg"></apex:pageMessages>
    <apex:form >
    <apex:pageBlock >
        <apex:pageBlockButtons location="top">
            <apex:commandButton action="{!doCheck}" value="データの確認"  reRender="theBlock,msg" status="status"  />
            <apex:commandButton action="{!doTestPrint}" value="印刷テスト"  reRender="theBlock,msg" status="status"  />
            <apex:actionStatus startText="Requesting..." id="status"/>
        </apex:pageBlockButtons>
            <apex:pageBlockSection columns="1" >
                <apex:pageblockSectionItem >
                    <apex:outputLabel >SOQL</apex:outputLabel>
                    <apex:inputTextarea value="{!soql}" cols="100"/>
                </apex:pageblockSectionItem>
                <apex:pageblockSectionItem >
                    <apex:outputLabel >パラメーター</apex:outputLabel>
                    <apex:inputTextarea value="{!parms}" cols="100"/>
                </apex:pageblockSectionItem>
            </apex:pageBlockSection>
    <apex:detail />
    </apex:pageBlock>
    </apex:form>
<apex:outputPanel id="theBlock">
<script type="text/javascript">
    if ("{!goUrl}" != ""){
       window.open("{!goUrl}",null,"scrollbars=yes,width=1000,height=400");
    }
</script>
</apex:outputPanel>


</apex:page>
---

コントローラーでは、コンストラクターでReportsConnectControllerのインスタンスを作成して、帳票レコード名をsetReportIdメソッドで設定します。

goPrintメソッド内では、ReportsConnectControllerに画面で選択された条件をもとにSOQLを作成してseSoqlメソッドで設定します。

また、getParmsメソッドで入手できるMapに自由にパラメーターを設定して、iReportのParametersに渡すことができます。

印刷要求はgoPrintメソッドを呼び出すことによって、処理され、goUrlに以降の処理用のURLが返ります。これをVisualforceページのJavascriptに引き渡します。

出力された帳票はこんな感じ

Rcdev13

今度は、ApexコードでparmsのMapに設定した文字列がTitleに出力されました。

このように、Apexコード内からSOQL文を自由に組み立てたり、Parametersでデータを引き渡すことができるので、自由度がかなり広がります。

« これでSalesforceでの帳票開発も楽々しかも無料 Reports Connect for Salseforce その2 | トップページ | Reports Connect for Salesforce ユーザー外字、IPAmjフォントの使用法 »

Force.com」カテゴリの記事

Reports Connect」カテゴリの記事

Salesforce」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1482716/47676985

この記事へのトラックバック一覧です: Reports Connect for Salesforce アプリケーションへの組込み方法:

« これでSalesforceでの帳票開発も楽々しかも無料 Reports Connect for Salseforce その2 | トップページ | Reports Connect for Salesforce ユーザー外字、IPAmjフォントの使用法 »