1

ある組織から別の組織に複雑なデータ構造を複製する必要があります。これには、親と子を含む一連のカスタム SObject が含まれます。

以下の流れになります。元の組織では、送信する SObject のリストを JSON.serialize するだけです。次に、ターゲット組織で、そのオブジェクトのリストを JSON.deserialize できます。ここまでは順調ですね。

問題は、これらの SObject を直接挿入できないことです。これらの SObject には元の組織の ID が含まれており、Salesforce では既に ID を持つオブジェクトを挿入できないためです。

私たちが見つけた解決策は、オブジェクト階層を手動で挿入し、originId > targetId のマップを維持し、関係を手動で修正することです。ただし、Salesforce がそのようなことを行うためのより簡単な方法を提供しているのか、それともより良い方法を誰かが知っているのかは疑問です。

これを行うための方法が Salesforce に埋め込まれていますか? それとも、面倒な手動プロセスに行き詰まっていますか?

4

1 に答える 1

1

List.deepClone()preserveIds = false を指定して呼び出すと、次の 1 つの問題に対処できます。

アップサート操作を使用して関係を構築することを検討してください。Upsert は、重複を防ぐだけでなく、階層を維持することもできます。ただし、子ではなく、親に外部 Id フィールドが必要です。

/* Prerequisites to run this example succesfully:
    - having a field Account_Number__c that will be marked as ext. id (you can't mark the standard one sadly)
    - having an account in the DB with such value (but the point of the example is to NOT query for it's Id)
*/
Account parent = new Account(Account_Number__c = 'A364325'); 
Contact c = new Contact(LastName = 'Test', Account = parent);
upsert c;

System.debug(c);
System.debug([SELECT AccountId, Account.Account_Number__c FROM Contact WHERE Id = :c.Id]);

それがうまくいくかどうかわからない場合は、データローダの upsert 関数を試してみると、理解するのに役立つかもしれません。

同じ sObject タイプに 2 つ以上のレベルの階層がある場合でも、それらを正しい順序でアップサートする必要があると思います (またはDatabase.upsertバージョンを使用して、失敗したものを再実行し続けます)。

于 2012-10-27T09:21:45.420 に答える