logo

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

最近のトラックバック

無料ブログはココログ

« 2013年11月 | トップページ | 2014年3月 »

2014年1月

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

« 2013年11月 | トップページ | 2014年3月 »