+ Start a Discussion
ms-hase-q23eems-hase-q23ee 

親オブジェクトIDを指定したINSERTが必ず失敗する

お世話になっております。
掲題の通り、親オブジェクトIDを指定したAttachmentへのINSERTが必ず失敗します。
次のコードのどこが悪いか、わかる方はいらっしゃいますか?

***コード
@HttpPost
global static String handlePostRequest ( String call, String type, String Body, String Description, String Name, String ParentId )
{

    Id convId = Id.valueOf(ParentId);

    try {
        Attachment a = new Attachment(
            Body =  Blob.valueOf(Body),
            Name = Name,
            Description = Description,
            ParentId = convId
        );
        insert a ;
    } catch (Exception e)  {
        system.debug(e.getMessage()+convId);
    }

*** 実行結果
Insert failed. First exception on row 0; first error: INVALID_CROSS_REFERENCE_KEY, invalid cross reference id: []a1G10000001TxNREA0


※a1G10000001TxNREA0が関数に渡したParentIDです。
SELECT count() FROM AcTestData__c
where id = 'a1G10000001TxNREA0'

の実行結果にて、親となるテーブルにレコードが存在することは確認できています。
何故INVALID_CROSS_REFERENCE_KEYとなるのか、謎です。
また、reference id: []部分は、SOQLを実行したときのパラメータを表示しているのではないか?と思うのですが、
何故、配列?([ ])を表示するのか、これもわかりません。

ご存知の方は教えてください。
よろしくお願いいたします。
Best Answer chosen by ms-hase-q23ee
ms-hase-q23eems-hase-q23ee
これはこのコードに問題があったというより、呼び出し側に問題があったようです。(というか、TESTコードから@HttpPostをまともに呼び出すことは出来ないようで、結局、テストコードからの確認をあきらめ、RESTExplorerから確認することにしました。

All Answers

Taiki YoshikawaTaiki Yoshikawa
INVALID_CROSS_REFERENCE_KEYは以下の意味のエラーメッセージです。
-----------------------------------------------------------------------------------------------------------------------------------------------
An invalid foreign key can't be set on a field. For example, if an object share such as AccountShare can't be deleted because the share row is a result of a sharing rule.
-----------------------------------------------------------------------------------------------------------------------------------------------

無効な外部キーをフィールドに設定することはできませんというような意味らしいのですが、ID自体は存在しているみたいなので、権限周りの可能性が考えられます。

一番簡単な確認方法として画面から添付ファイルの保存を実行してみる方法があります。
https://xxx.salesforce.com/ + レコードID で詳細ページを表示できるのでそこから添付ファイルが保存できるか確認してみるのがいいと思います。標準画面から保存出来る場合はApexの処理部分に間違いがあると判断できると思います。

また、INSERT時のエラーメッセージの確認方法としてDmlExceptionが用意されています。
こちらの方がより詳細なエラーメッセージを確認できるかもしれません。

例)
Account[] accts = new Account[]{new Account(billingcity = 'San Jose')};
try {
    insert accts;
} catch (System.DmlException e) {
    for (Integer i = 0; i < e.getNumDml(); i++) {
        // Process exception here
        System.debug(e.getDmlMessage(i)); 
    }
}


 
ms-hase-q23eems-hase-q23ee
これはこのコードに問題があったというより、呼び出し側に問題があったようです。(というか、TESTコードから@HttpPostをまともに呼び出すことは出来ないようで、結局、テストコードからの確認をあきらめ、RESTExplorerから確認することにしました。
This was selected as the best answer