0

我有一个 SOQL 构建如下:

SELECT Subject, IsChild, StartDateTime, Owner.UserName, Owner.Email, Notes_Universal_ID__c, Location, IsPrivate, IsDeleted, Id, EndDateTime, Description, ShowAs, (SELECT Id, Status, Response, EventId, RelationId, Relation.Email FROM EventRelations) FROM Event where Subject = 'Test Meeting 3' and IsChild = false

在同一个查询中,我正在寻找Sync_contacts_and_cal_with_Notes__c = true从用户对象对所有者和参与者执行额外检查。

有没有可能,有人可以帮我查询吗?

谢谢!

4

1 回答 1

1

这会变得有点棘手。

基本思路很简单,只需添加 2 个 WHERE 子句。(我跳过了您的大部分字段,因此更改更加明显):

SELECT Subject, Owner.UserName, Owner.Email,
    (SELECT Status, Response, RelationId, Relation.Email 
    FROM EventRelations
    WHERE Relation.Sync_contacts_and_cal_with_Notes__c = true)
FROM Event 
WHERE Subject = 'Test Meeting 3' AND IsChild = false
    AND Owner.Sync_contacts_and_cal_with_Notes__c = true

但是,这将过滤两个表。

2 个用户:“Alice”没有选中复选框,“Bob”有。

如果您有一个由“Alice”拥有的活动 - 即使“Bob”是其中一些活动的参与者之一并且他希望看到它们,她的所有活动也不会同步!


一种方法是简单地将标志包含在 SELECT 中,然后手动过滤代码中的记录。

另一种选择是反转关系,从 EventAttendee 开始查找并使用 OR 过滤器:

SELECT Status, RelationId, RelationEmail, 
    Event.OwnerId, Event.Owner.Email
FROM EventAttendee
WHERE Owner.Sync_contacts_and_cal_with_Notes__c = true
    OR Event.Owner.Sync_contacts_and_cal_with_Notes__c = true
ORDER BY Event

这更好但并不理想,因为现在我们永远不会看到没有任何参与者的活动......


编辑回答评论:

  1. 根据您使用的 API 版本,您会看到 EventAttendees 或 EventRelations,我想我们已经在上一个问题中介绍过?只需相应地替换表名和字段名。

  2. 关于错误 - 真的很奇怪!它似乎很乐意接受标准用户字段,但当您开始使用自定义字段时会变得愚蠢。解决它的一种方法是联系 SF 支持并选择加入“多态 SOQL”(如何使用 SOQL 从任务对象记录中获取电子邮件)。

另一种方式 - 您必须将其拆分为 2 个查询,首先获取选中复选框的用户 ID,然后在WHERE OwnerId IN :(set of these id's here).

那,或者:

SELECT Subject, Owner.UserName, Owner.Email,
    (SELECT Status, Response, RelationId, Relation.Email 
    FROM EventRelations
    WHERE RelationId IN (SELECT Id FROM User WHERE Checkbox__c = true))
FROM Event 
WHERE IsChild = false
    AND OwnerId IN (SELECT Id FROM User WHERE Checkbox__c = true)
  1. 如果我没记错的话,子事件ReccurenceActivityId设置。
于 2013-06-14T08:28:34.717 回答