基本上,我需要一个使用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秒。我能够将数据检索推送到异步线程,这减少了检索时间,但性能可能仍然不能令人满意。我将继续努力提高性能,但现在我已经开始工作了。
答案 0 :(得分:5)
这里似乎有两个问题......
我认为你唯一的选择就是做四个查询。但是,如果您循环遍历多个帐户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'];
好处:您可以将所有笔记关联到一个对象
希望对大家有所帮助。