tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:VisualforcePDFとgetContentについての注意

Summer'15でgetContentの処理はコールアウトとして扱われるように変更されました。

f:id:tyoshikawa1106:20150717120816p:plain

コールアウトとして動作する PageReference getContent() および getContentAsPDF() メソッド


この変更により影響を受ける例としてVisualforcePDFを添付ファイルに保存するようなケースが考えれます。Developer環境で試してみたところ次のエラーが発生しました。

f:id:tyoshikawa1106:20150717120951p:plain


「You have uncommitted work pending. Please commit or rollback before calling out」というエラーです。ヘルプによると同じトランザクション内で DML (Insert / Update / Upsert / Delete) 発行後にコールアウトを行なう事で発生するエラーと説明があります。

「You have uncommitted work pending. Please commit or rollback before calling out」エラーについて


今回、Developer環境で試した処理ではコールアウト処理(getContent)を実行する前にINSERTやUPDATEなどは行っていなかったため、何が原因のエラーなのかと考えていたのですが、いろいろ試しながら調べてみた結果、原因はロールバックでした。

f:id:tyoshikawa1106:20150717121556p:plain


普段あまり気にする必要が無かったので忘れていましたが、ロールバックもDML処理としてカウントされています。ロールバック処理を無くすことで上記のエラーは発生しなくなりました。


ただ・・同様の処理でもエラーが発生しなかったケースがありました。(ロールバック処理を入れていてもエラーが発生しませんでした。)


似ているだけで、細かい処理は違うのでロールバック以外に何かエラーの原因になることがあるのかと思ったのですが、原因は重要な更新のgetContentに関する変更が有効化されていなかったことでした。

f:id:tyoshikawa1106:20150717122027p:plain


Summer'15になったら自動で有効化されてる気分になっていましたが、9月頃までは自動で反映されません。DML処理の後にgetContentをつかってもエラーにならない場合は、重要な更新を確認してみるといいと思います。


ということでVisualforce PDFをgetContentで添付ファイルなどに登録するような処理を実装する場合は、ロールバックや他オブジェクトのDML処理とは一緒にしないようにしましょう。