tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:特定のオブジェクトに紐付く添付ファイルの取得について

「取引先に紐付く添付ファイル」や「取引先責任者に紐付く添付ファイル」といった特定のオブジェクトに紐付く添付ファイルの取得方法についてです。


添付ファイルの親オブジェクト情報はParentId項目に保持されているのですが、どのオブジェクトか判定する場合は "Parent.Type" で指定することができます。


こんな感じのSOQLで取引先に紐付く添付ファイルを全件取得することができます。

SELECT Id FROM Attachment WHERE Parent.Type IN ('Account')

検証

取引先に3件、取引先責任者に1件添付ファイルを紐付けて検証します。

取引先

f:id:tyoshikawa1106:20130924221853p:plain

取引先責任者

f:id:tyoshikawa1106:20130924221906p:plain


これで取引先を対象にする次のSOQLでエクスポートを実行します。
f:id:tyoshikawa1106:20130924222003p:plain

この条件で3件取得できます。
f:id:tyoshikawa1106:20130924222029p:plain


続いて取引先責任者を対象にする条件でエクスポートを実行します。
f:id:tyoshikawa1106:20130924222107p:plain

この条件で1件取得できます。
f:id:tyoshikawa1106:20130924222129p:plain


Parent.Typeで指定する方法以外にも、WHERE句でサブクエリを実行して特定の添付ファイルを取得する方法があります。

SELECT Id FROM Attachment WHERE Parent.Id IN (SELECT Id FROM Account)

この方法だとサブクエリの取得結果が多い場合に次のエラーが発生してしまいます。

exceeded 100000 distinct ids

IN句で指定しているIDが多すぎるというエラーだと思います。Sandbox環境で検証して問題なくてもレコード件数が多い本番環境ではエラーが発生してしまうという危険もあるのでこの方法はやめたほうがいいと思います。

ただし、サブクエリ内にWHERE句による条件判定があれば対象件数を絞ることができるのでエラーの危険を回避できると思います。特定条件で分割して取得したいときにはこちらの方法が便利だと思います。


今回添付ファイルを対象に記載していますが活動(行動 or ToDo)でも同様の判定処理が可能です。例えば行動の場合はこんな感じです。

SELECT Id FROM Event WHERE What.Type IN ('Account')