Salesforce SOQL查询站点的“Notes和附件”

时间:2011-02-10 01:04:20

标签: .net web-services salesforce soql

基本上,我需要一个使用Web服务API执行的SOQL查询,它将返回所有通常显示在Salesforce Web UI中“帐户”页面的“注释和附件”部分中的NoteAndAttachment项目。这不仅包括附加到帐户本身的N& A,还包括附加到与帐户相关的任何案例,机会或联系人的N& A. Salesforce本身似乎没有问题获取该信息,但在SOQL限制和数据模型限制之间,我还没有找到一个令人满意的解决方案。

这是我到目前为止所拥有的:

SELECT Id,
(select Id, Title, IsNote from NotesAndAttachments),
(select Id, Title, IsNote from Contacts.NotesAndAttachments),
(select Id, Title, IsNote from Cases.NotesAndAttachments),
(select Id, Title, IsNote from Opportunities.NotesAndAttachments)
FROM Account a WHERE Id = '{0}'

{0}用于.NET String.Format;这将是我正在提取记录的帐户ID。此特定查询失败,但出现以下异常:

System.Web.Services.Protocols.SoapException : INVALID_FIELD: 
(select Id, Title, IsNote from Contacts.NotesAndAttachments),
                               ^
ERROR at Row:3:Column:48
Didn't understand relationship 'Contacts' in field path. If you are attempting to use a custom relationship, be sure to append the '__r' after the custom relationship name. Please reference your WSDL or the describe call for the appropriate names.

这些都是基本的,系统定义的关系,它也不承认单一的“联系”,所以我不知所措。

其他解决方案涉及半连接子选择(限制为2,你不能将它们与“OR”组合,所以没有骰子),嵌套子查询(不能)等等我真的在我的智慧结束时,这种查询语言的局限性;不能直接查询UNION,有限的子查询,有限的子查询深度和NoteAndAttachment实体。只需要有一种方法可以像在网站上看到的那样记录这些记录,但我在任何时候都会感到沮丧。

编辑:我现在的答案是查询每个包含对象类型(帐户,联系人,机会)的NotesAndAttachments属性,并从Case中提取附件并将​​它们作为NotesAndAttachments投影以获取我需要的信息。此过程需要四次往返,并且对于5条记录的摘要信息(没有记录正文或文件二进制文件)平均需要大约15秒。我能够将数据检索推送到异步线程,这减少了检索时间,但性能可能仍然不能令人满意。我将继续努力提高性能,但现在我已经开始工作了。

5 个答案:

答案 0 :(得分:5)

这里似乎有两个问题......

  1. 您无法直接查询NotesAndAttachments对象 - 这是Notes和Attachments对象的组合。
  2. 您只能在父母与子女之间的关系中查询1级。您可以对“联系人”进行子查询,但不能对联系人的备注或附件进行子查询。
  3. 我认为你唯一的选择就是做四个查询。但是,如果您循环遍历多个帐户ID,这可能会花费大量API调用。

    SELECT Id,
    (SELECT Id, Title FROM Notes),
    (SELECT Id, Name FROM Attachments)
    FROM Account WHERE Id = '{0}'
    
    SELECT Id,
    (SELECT Id, Title FROM Notes),
    (SELECT Id, Name FROM Attachments)
    FROM Contact WHERE AccountId = '{0}'
    
    SELECT Id,
    (SELECT Id, Title FROM Notes),
    (SELECT Id, Name FROM Attachments)
    FROM Case WHERE AccountId = '{0}'
    
    SELECT Id,
    (SELECT Id, Title FROM Notes),
    (SELECT Id, Name FROM Attachments)
    FROM Opportunity WHERE AccountId = '{0}'
    

答案 1 :(得分:0)

Attachment对象开始,你可能会有更好的运气。

您可能不得不在多个查询中执行此操作。关系查询存在限制,具体取决于关系的方向。见relationship queries

答案 2 :(得分:0)

我想知道对所有附件进行查询是否更好,而对于所有Notes都是如此,无论他们拥有哪种父对象,都是这样:

SELECT Id, Name, parent.Id, parent.Name, parent.Type FROM Attachment
SELECT Id, Title, parent.Id, parent.Name, parent.Type FROM Note

通过这种方式,您可以使用父类型对附件进行分组,您将获得所有可用的附件,并且应该更快。

如果您确实需要限制此类对象,那么您可以执行以下操作:

SELECT Id, Name, parent.Id, parent.Name, parent.Type FROM Attachment where parent.type like '%Account%' OR parent.type like '%Contact%' OR parent.type like '%Case%' OR parent.type like '%Opportunity%' 

希望它有所帮助。

答案 3 :(得分:0)

我从salesforce那边找到了。

子查询当前不支持以下对象:

ActivityHistory

附件

事件

EventAttendee

请注意

OpenActivity

标签(AccountTag,ContactTag和所有其他标签对象)

任务

参阅: http://www.salesforce.com/us/developer/docs/officetoolkit/Content/sforce_api_calls_soql_select.htm

答案 4 :(得分:0)

第 1 点:独立于父对象的注释。

在最近的 2021 年春季,我看到我们想要从 Notes and Attachment 中捕捉的细节已全部移至不同的对象。

现在为了获取这些注释的文本和其他信息,我们可以查询 ContentVersion 对象,这是一个标准对象,您可以简单地进行 SOQL 查询来检索数据,在我的情况下,我必须检索Notes的信息所以这里是下面的查询。

SELECT Id, Title, Description, TextPreview FROM ContentVersion

点 2:基于像 Opportunity 这样的父对象的注释

如果您希望根据机会或帐户等父对象检索备注。您可以使用以下 SOQL,它将在单独的对象上创建。

Opportunity opp = [SELECT Id,
(SELECT ID, Title FROM AttachedContentNotes)
FROM Opportunity where id = 'xxxxx'];

好处:您可以将所有笔记关联到一个对象

希望对大家有所帮助。