こんにちは、アンダーソンです。
先日、ApexでAttachmentを扱う機会があったのでその時の注意点などをまとめておきたいと思います。
添付ファイルは主従関係
意外にも忘れがちなのですが、各オブジェクトに対してつけることができる添付ファイルは主従関係にあります。
今回の用件では新しいレコードに対しての添付ファイルの付け替えでした。
しかしながら主従関係にあるレコードの親レコードを付け替えることはできません。
まずそこが注意点その1です。
例えばAというレコードに添付されているファイルをBというレコードにコピーしAについているのは削除という用件の際に親を付け替えるだけでいいんじゃね?という考えに至ってやってみたところ怒られます。
Apexでいうと下記のような感じです。
public void copyAttachment( Id ids ){
Account acc = [SELECT Id,Name FROM Account WHERE Id = :ids];
Account copyAcc = acc.clone(false,true,false,true);
insert copyAcc;
List<Attachment> Attachments = [SELECT
Id,Body,Name,ContentType,Description FROM Attachment WHERE ParentId = :ids];
List<Attachment> updateAttachs = new List<Attachment>();
for ( Attachment attach : Attachments ) {
attach.ParentId = copyAcc;
updateAttachs.add();
}
update updateAttachs;
}
こんなエラーがでます!
System.SObjectException: Field is not writeable: Attachment.ParentId
この項目は書き込みできません例外になりますね。
ですので単純に書き換え作戦ではなく新しい添付ファイルを作成する必要があります。
public void copyAttachment( Id ids ){
Account acc = [SELECT Id,Name FROM Account WHERE Id = :ids];
Account copyAcc = acc.clone(false,true,false,true);
insert copyAcc;
List<Attachment> Attachments = [SELECT Id,Body,Name,ContentType,Description FROM Attachment WHERE ParentId = :ids];
List<Attachment> insertAttachs = new List<Attachment>();
for ( Attachment attach : Attachments ) {
Attachment insertAttach = attach.clone(false,true,false,true);
insertAttach.ParentId = copyAcc.Id;
insertAttachs.add(insertAttach);
}
insert insertAttachs;
}
こんな感じで変えてあげればOKです。
標準で用意されている少し特殊なオブジェクトにはちょっとした癖があるので気をつけましょう。
添付ファイルはBodyやContentTypeといった他ではない項目もあるのでその辺りもどのような値になっているか
確認しながらやってみてください。
コメント