Итак, чего я пытаюсь достичь: в тот момент, когда контакт, назначенный заказу, создает или меняет свой адрес, задача отправляется владельцу этого заказа.

Проблема в том, что я ссылаюсь на Usr.Id = Placement.OwnerId. Это владелец заказа. Но я хочу проверить, является ли address.CreatedbyId или address.LastModifiedById самим контактом, а НЕ кем-то другим (одним из наших сотрудников, в том числе и владельцем заказа). CreatedbyId, а также LastModifiedById относятся к USR, который теперь относится к владельцу заказа, а НЕ к контакту.

Итак, как я могу проверить, является ли Usr моим контактом?

Адрес.CreatedbyId = ??? адрес.LastModifiedById = ???

select distinct
contact.Id as Id
, contact.FirstName as FirstName
, contact.LastName as LastName
, contact.email as email
, contact.status__c as AtlasRelation
, usr.email as OwnerEmail
, usr.name as OwnerName
, usr.Id as OwnerId
, address.createddate as AddressCreateDate
, address.LastModifiedDate as AddressModifiedDate
, contact.Id as CandidateId
, contact.Last_Project__c as LastOrder

from Contact_Salesforce contact

left join Address__c_Salesforce address
on contact.Residence_Address__c = address.Id

left join Placement__c_Salesforce placement
on contact.Last_Project__c = placement.Id

left join User_Salesforce usr
on usr.Id = placement.OwnerId

where 
contact.status__c = 'Assigned'
and DATEPART("year", address.CreatedDate) = DATEPART("year", GetDate())
and DATEPART("month", address.CreatedDate) = DATEPART("month", GetDate())
and DATEPART("day", address.CreatedDate) = DATEPART("day", GetDate())
and address.CreatedbyId = ???
or
contact.status__c = 'Assigned'
and DATEPART("year", address.LastModifiedDate) = DATEPART("year", GetDate())
and DATEPART("month", address.LastModifiedDate) = DATEPART("month", GetDate())
and DATEPART("day", address.LastModifiedDate) = DATEPART("day", GetDate())
and address.LastModifiedById = ???
0
wfrankhuizen 15 Окт 2018 в 15:33

3 ответа

Лучший ответ

Есть много способов, как это можно сделать/написать. Не имея вашей схемы данных для тестирования, я собрал это, но вам нужно будет протестировать и, вероятно, настроить в соответствии с вашими потребностями:

(ОТРЕДАКТИРОВАНО: обновлен с рабочим кодом)

select distinct
contact.Id as Id
, contact.FirstName as FirstName
, contact.LastName as LastName
, contact.email as email
, contact.status__c as AtlasRelation
, usr.email as OwnerEmail
, usr.name as OwnerName
, usr.Id as OwnerId
, address.createddate as AddressCreateDate
, address.LastModifiedDate as AddressModifiedDate
, address.Id as AddressId
, contact.Last_Project__c as LastOrder


from Contact_Salesforce contact

left join Address__c_Salesforce address
on contact.Residence_Address__c = address.Id

left join Placement__c_Salesforce placement
on contact.Last_Project__c = placement.Id

left join User_Salesforce usr
on usr.Id = placement.OwnerId

where 
contact.status__c = 'Assigned'
and datediff(d,address.LastModifiedDate,GetUTCDate()) between 0 and 1
and ((SELECT COUNT(a.CreatedbyId) FROM Address__c_Salesforce a 
                    Inner Join  User_Salesforce CbS on a.CreatedbyId = CbS.CreatedbyId) = 0 or 
    (SELECT COUNT(b.LastModifiedById) FROM Address__c_Salesforce b 
                    Inner Join  User_Salesforce Cb on b.LastModifiedById = Cb.LastModifiedById) = 0)

Я просто выполняю подсчет для CreatedByStaff и ModifiedByStaff, и если они возвращают> = 1, вы знаете, что он был изменен персоналом.

Я также упростил выбор даты до datediff(d,address.LastModifiedDate,GetUTCDate()) between 0 and 1, и это даст вам все записи, которые были изменены между 0 и 1 днями назад. Вы можете поиграть с числом или изменить часы, изменив: datediff(h,address.LastModifiedDate,GetUTCDate()).

Кроме того, это даст вам результаты, когда сотрудник редактировал адрес, но если вам нужны записи, в которых это не был сотрудник, используйте:

and (CreatedByStaff = 0 AND ModifiedByStaff = 0)

1
Gravitai 16 Окт 2018 в 19:46
Привет, iManage, это очень полезно, спасибо! Я получаю сообщение об ошибке: «Ошибки: недопустимое имя столбца« CreadedByStaff »». Этого столбца нет ни в одном из моих синхронизированных DE.
 – 
wfrankhuizen
16 Окт 2018 в 09:49
Я заметил орфографическую ошибку в поле CreadedByStaff, а не в поле CreatedByStaff. Если он по-прежнему не работает, нам нужно будет переместить внутренние операторы выбора в предложение Where.
 – 
Gravitai
16 Окт 2018 в 10:37
Да, я заметил орфографическую ошибку, я изменил код, но все равно возвращает: Ошибки: недопустимое имя столбца «CreatedByStaff». Я очень ценю вашу помощь!
 – 
wfrankhuizen
16 Окт 2018 в 10:42

Я думаю, что может помочь сделать шаг назад, чтобы посмотреть на желаемый результат, а не сразу переходить к SQL.

Насколько я понимаю, основная цель — создать задачу в Salesforce «Core» (я имею в виду force.com/Sales Cloud/Service Cloud, т.е. НЕ SFMC). Так:

  1. Используйте Process Builder в SF Core. Конструктор процессов — это инструменты перетаскивания для создания той автоматизации, о которой вы говорите. Я предполагаю, что в настоящее время вы используете Journey Builder (в SFMC) для создания задач на основе данных, возвращаемых вашим запросом. Это хороший обходной путь, но если предположить, что все ваши данные в любом случае поступают из SF Core, почему бы просто не построить автоматизацию там? Кроме того, я не знаю, как часто вы запускаете свой запрос в данный момент с помощью автоматизации, но если данные меняются между моментом, когда контакт изменил свой адрес, и фактическим выполнением запроса, возможно, задача не создается. .
  2. Рассматривали ли вы использование стороннего приложения, чтобы вообще не писать SQL? Раньше мы экономили время, используя DESelect, чтобы просто перетаскивать бросьте и просмотрите наши запросы. Таким образом, вам не нужно изучать SQL... :)
  3. Возможно, я что-то упускаю, и вы абсолютно точно хотите построить этот запрос для этого конкретного варианта использования. Теперь другие ответы, представленные здесь, предлагают несколько способов фильтрации правок на основе LastModifiedTime. Однако вы описываете, что контакты могут обновлять свои собственные адресные данные. Возможно ли, что вы используете сообщества Salesforce? В этом случае вы можете проверить наличие поля Community Member ID в контакте и сравнить его с полем LastModifiedBy в адресе. Это должно дать вам более точные результаты, чем основанные на времени (например, что, если кто-то еще редактировал тем временем?).

Позвольте мне знать, если это помогает!

1
alamo 31 Май 2019 в 12:19

Мне удалось заставить его работать, используя большую часть кода iManage. Спасибо за это!

select distinct
contact.Id as Id
, contact.FirstName as FirstName
, contact.LastName as LastName
, contact.email as email
, contact.status__c as AtlasRelation
, usr.email as OwnerEmail
, usr.name as OwnerName
, usr.Id as OwnerId
, address.createddate as AddressCreateDate
, address.LastModifiedDate as AddressModifiedDate
, address.Id as AddressId
, contact.Last_Project__c as LastOrder


from Contact_Salesforce contact

left join Address__c_Salesforce address
on contact.Residence_Address__c = address.Id

left join Placement__c_Salesforce placement
on contact.Last_Project__c = placement.Id

left join User_Salesforce usr
on usr.Id = placement.OwnerId

where 
contact.status__c = 'Assigned'
and datediff(d,address.LastModifiedDate,GetUTCDate()) between 0 and 1
and ((SELECT COUNT(a.CreatedbyId) FROM Address__c_Salesforce a 
                    Inner Join  User_Salesforce CbS on a.CreatedbyId = CbS.CreatedbyId) = 0 or 
    (SELECT COUNT(b.LastModifiedById) FROM Address__c_Salesforce b 
                    Inner Join  User_Salesforce Cb on b.LastModifiedById = Cb.LastModifiedById) = 0)
0
wfrankhuizen 16 Окт 2018 в 14:06
Приветствую упоминание - извиняюсь за то, что не вернулся раньше с обновленным кодом, но вы, кажется, поняли, что я сказал. Чтобы помочь другим в будущем и избежать путаницы, я обновлю свой ответ/код вашим
 – 
Gravitai
16 Окт 2018 в 19:45
Нет проблем Вы мне очень помогли и направили меня на правильный путь. Еще раз спасибо за вашу помощь!
 – 
wfrankhuizen
18 Окт 2018 в 10:01