6

SOQLを使用してタスクオブジェクトから連絡先/リードの電子メールを取得しようとしています(特定の件名のメッセージをバックアップするためのインターフェイスをPHPで作成しています)。これが今の私の質問です:

SELECT Subject,Who.FirstName,Who.LastName,Who.Email,Who.Phone,Description FROM Task

これは機能する/エラーをスローせず、結果を表示しますが、Who.Email常に空です(そして、偶然Who.Phoneにも同様ですが、これにはそれほど重要ではありません)。使用しようとするEmailと、フィールドが存在しないというエラーが表示されます。これはEmail、標準フィールドとして[タスクフィールド]の下にあるため、奇妙です。

私はまた、何の援助も見つからずにいくつかのグーグル検索を試みました。

4

4 に答える 4

2

TaskのWhoIdフィールドとWhatIdフィールドはポリモーフィックであるため(つまり、さまざまな種類のオブジェクトを指すことができる)、通常の関連オブジェクトの場合のように、それらを介して関係を照会することはできません。代わりに、2つのSOQLクエリを実行する必要があります。1つ目はタスク情報を取得し、2つ目はWhoが指している連絡先またはリードから情報を取得します。

于 2013-02-04T22:20:57.933 に答える
2

組織で「PolymorphicSOQL」を有効にするようSalesforceサポートに依頼すると、リードか連絡先かを判断できます。現時点ではDeveloperPreviewにありますが、かなりきれいです。使用例は次のとおりです。

http://blogs.developerforce.com/tech-pubs/2012/09/soql-polymorphism-or-how-i-learned-to-love-the-polymorphic-relationship.html

または、少なくとも「TODO:これを書き直してください」というコメントをコードに残してください;)

于 2013-02-05T08:05:13.153 に答える
2

前述のように、タスクのWhoIdフィールドとWhatIdフィールドはポリモーフィックです(つまり、複数のターゲットオブジェクトを指すことができます。@ eyescreamで説明されているように、SOQLポリモーフィズム機能を有効にしていない限り、クエリできる「関連」フィールドは次のとおりです。 'Name' APIオブジェクトにあるものですが、このドキュメントに記載されている例外があります。

例1:select Who.FirstName, Who.LastName, Who.Email from Task

Contact / Leadにこれらのフィールドが入力されている場合、これはFirstNameとLastNameのデータを返しますが、上記のドキュメントにあるように、Whoフィールドの2つの可能なターゲットオブジェクト(Contact、リード)がUserオブジェクトです。

例2:select Owner.Name, Owner.Email from Case

Caseオブジェクトでキューを使用している場合、Caseの所有者はユーザーまたはグループ(キューはタイプ)レコードのいずれかです。NameEmailは両方ともNameオブジェクト上にあるため、上記のクエリは常にNameのデータを返し、ターゲットオブジェクトがUserの場合は、Owner.Emailのデータを返します。

例3:select What.Name, WhatId from Task where What.Type in ('Case','Account','Solution')

これは非常に興味深い例です。Caseオブジェクトの「Name」フィールドは実際CaseNumberにはNameではなく、「non-standard」(ironic)Nameフィールドを持つ他の標準オブジェクトがいくつかあります(SolutionTitleなど)。のような名前フィールドすらありませんCampaignMember。ただし、ポリモーフィックフィールドが技術的にNameオブジェクトを指しているSalesforceの優れた点の1つは、上記のクエリがCasesの結果を返すことです。ケースのCaseNumberが00001234の場合、上記のクエリのWhat.Nameは00001234を返しますが、アカウントの場合はアカウントの名前を返し、ソリューションの場合はSolutionTitleを返します。

ここで、オブジェクトの特別なフィールドである「タイプ」フィールドでフィルタリングすることにより、返されるターゲットオブジェクトを制限できることにも注意してくださいName

于 2013-08-01T15:47:30.643 に答える
0

タスク/イベントの値を取得するには、コンソールでこれを試してください

リストe1=new List(); e1 = [select Id、whoId from event WHERE id = '00U9xxxxxxxxxxx']; System.debug('@@@@@' + e1);

whoId = new Set();を設定します。for(event e2:e1){whoId.add(e2.whoId); } list c = [select name、phone、email from contact where Id IN:whoId]; System.debug('@@@@@' + c);

- - - - - - - - 終わり - - - - - - -

ありがとう

于 2014-09-03T13:08:47.280 に答える