Developer

Apexで扱うAttachment(添付ファイル)【セールスフォース】

Developer
この記事は約4分で読めます。

こんにちは、アンダーソンです。
先日、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といった他ではない項目もあるのでその辺りもどのような値になっているか
確認しながらやってみてください。

その他の開発に関する記事はこちらです。

Developerも含めた試験問題にチャレンジしてみましょう。

コメント