2011-01-03 15 views
1

Salesforceの標準のCaseオブジェクトを使用しています(いくつかのカスタムフィールドがありますが、問題はないようです)。ケースには、そのコメントに対するリンクされたサブクエリがあり、SOAP APIでCaseCommentsとして複製されています。Salesforce upsertがINVALID_FIELDエラーで失敗しました

レコードを更新するためのテストケース(NUnitテスト)は、ケース番号ごとに1つずつクエリ()し、ケース自体を変更して、そのレコードをもう一度アップセットします。私は新しいコメントや何も追加していません。 upsert呼び出しが消えると、クラウドのCaseテーブルにCaseCommentsが存在しないことを示すINVALID_FIELDエラーが発生します。もちろん、存在しないし、APIがよりよく知っている必要があります。または、私は何かを言っていないかもしれません。助けて?

関連するコード:

[Test] 
public void TestUpsertOfExistingRecord() 
{ 
    var existingCase = sfRepository.GetCaseByNumber("00235452"); 

    var siteState = existingCase.Site_State__c; 

    existingCase.Site_State__c = "Arkansas"; 

    //Tried the below line; the API didn't even recognize my Case as a valid object 
    //existingCase.CaseComments = null; 

    sfRepository.Save(existingCase); 

    ... 
} 

//In the repository 
public void Save<T>(T unboundInfo) where T : sObject 
{ 
    service.Upsert(new sObject[]{unboundInfo}); 
} 

//in a wrapper for the websevice 
public void Upsert(sObject[] unboundInfo) 
{ 
    //webService is the actual SOAP service client created by VS 
    webService.upsert(unboundInfo.First().Id, unboundInfo); 
} 

UPDATE:いくつかの提案を1として、代わりにクエリによって生成ケースインスタンスを使用しての、私は新しいケースを作成しています。それは許可エラーで失敗しています。私が修正しようとしていたフィールドは、別の関連オブジェクト(アカウントのアドレス)からの投影でした。それは分かりました。私はそれを離れて打ち明けるつもりです。その間に、検索されたケースの関連するすべてのクエリを消去するときに、なぜ同じ情報で新しいケースを作成するのか教えてもらえますか?

答えて

1

アップサートコールの最初のパラメータは、IDフィールドのなく、その値名前でなければなりませんので、あなたがあなたのアップサート方​​法を変更した場合、私はそれが動作するはずだと思う

//in a wrapper for the websevice 
public void Upsert(sObject[] unboundInfo) 
{ 
    //webService is the actual SOAP service client created by VS 
    webService.upsert("Id", unboundInfo); 
} 

します。あなたのケース番号が外部ID(そしてsalesforceでそのようにマークされている)の場合は、 "Id"の代わりにそのIDを使用できるはずです。

詳細については、the salesforce.com upsert docsを参照してください。

+1

もうひとつ注意すべきことは、更新(および更新となるupsert)が部分的な更新をサポートしていることです。既存の行を最初に読み取る理由はありません。必要なフィールドだけを更新する呼び出しを作成できます更新。 – superfell

+1

最後に、読んだデータが関連するデータを読み込んでいるためにエラーが発生し、後続の書込みがそのデータを送信しているため、サポートされていません。 – superfell

+0

@superfell:実際は、実際のアプリケーションにはあります。これらのレコードを更新するウィンドウは、新しいレコードが作成されている場合を除いて、最初に取得されたものであることが保証されています(これはまだわかりません)。 2番目のメッセージまで、取得したオブジェクトの返送はサポートされていません。すばらしいです。どのように答えで起こらなければならないかを教えてください。 – KeithS

1

メタアディーズの答えは正しいですが、問題のレコードを作成するのか、それとも更新するのかをsalesforceが判断する必要がある場合にのみ、upsertメソッドを実際に使用する必要があることを指摘すると便利です。この場合、レコードのIDを知っているので、レコードのIDを知っているので、更新するだけです。

このようにして、レコードが存在するかどうかを調べる必要がなくなり、salesforceが節約されるため、操作が少し速くなります。また、リソースを無駄にすることなく、優れた開発者市民になることができます。 :)

+0

私はここで尋ねる前にまっすぐな更新を試みました。 ID列を指定する必要はありませんが、同じエラーが発生しました。 – KeithS

+0

メタデータ(あなたがアップしているフィールド)とデータ(あなたがアップしているID /外部IDフィールドの値)を区別することが重要です。しかし、あなたはメタダディの答えのコメントからすべてが設定されているように思えます。 –

関連する問題