SOQL-запрос Salesforce для «Заметок и вложений» сайта - PullRequest
3 голосов
/ 10 февраля 2011

В основном мне нужен один запрос SOQL, исполняемый с использованием API веб-службы, который будет возвращать все элементы NoteAndAttachment, которые обычно отображаются в разделе «Примечания и вложения» на странице «Учетная запись» в веб-интерфейсе Salesforce. Это включает в себя не только 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; это будет идентификатор аккаунта, для которого я собираю записи. Этот конкретный запрос не выполняется со следующим исключением:

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.

Это все базовые, определяемые системой отношения, и он также не распознал единственное «контакт», поэтому я в растерянности.

Другие решения включают в себя подвыборы с полусоединением (существует ограничение в два, и вы не можете комбинировать их с «ИЛИ», поэтому не нужно бросать кубики), вложенные подзапросы (не могу) и т. Д. Я действительно в моем уме заканчиваются ограничения языка этого запроса; нет UNION, ограниченные подзапросы, ограниченная глубина подзапроса и сущность NoteAndAttachment не могут быть запрошены напрямую. Просто должен быть способ получить эти записи так же, как они показаны на веб-сайте, но я разочарован на каждом шагу.

РЕДАКТИРОВАТЬ: Мой ответ на данный момент заключается в том, чтобы запросить свойство NotesAndAttachments каждого из содержащихся типов объектов (Account, Contact, Opportunity), а также извлечь Attachments from Case и спроецировать их как NotesAndAttachments, чтобы получить нужную мне информацию. Этот процесс требует четырех циклов обработки и занимает в среднем около 15 секунд для сводной информации 5 записей (без тел примечаний или двоичных файлов). Мне удалось перенести извлечение данных в асинхронный поток, что сокращает время извлечения, но производительность, вероятно, все еще будет неудовлетворительной. Я продолжу работать над чем-то более производительным, но пока у меня это работает.

Ответы [ 4 ]

5 голосов
/ 11 февраля 2011

Здесь, похоже, есть две проблемы ...

  1. Вы не можете напрямую запросить объект NotesAndAttachments - это комбинация Notes и объекта Attachments.
  2. Вы можете запрашивать только до 1 уровня отношения родитель-ребенок. У вас может быть подзапрос к контактам, но вы не можете иметь подзапрос к заметкам или вложениям в контактах.

Я думаю, что ваш единственный вариант - сделать четыре запроса. Однако это может стоить вам много вызовов 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}'
0 голосов
/ 14 ноября 2013

Я нашел со стороны Salesforce.

Следующие объекты в настоящее время не поддерживаются в подзапросах:

ActivityHistory

Вложения

Событие

EventAttendee

Примечание

OpenActivity

Теги (AccountTag, ContactTag и все другие объекты тегов)

Задача

см: http://www.salesforce.com/us/developer/docs/officetoolkit/Content/sforce_api_calls_soql_select.htm

0 голосов
/ 22 мая 2013

Мне было интересно, не будет ли еще лучше сделать запрос для всех Приложений и еще один для всех Заметок, независимо от того, какой у них объект отца, например:

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%' 

Надеюсь, это поможет.

0 голосов
/ 11 февраля 2011

Возможно, вам повезет больше, начиная с вложенного объекта .

Возможно, вам придется сделать это в нескольких запросах.Существуют ограничения на запросы отношений в зависимости от направления отношений.См. запросов на отношения

...