我正在尝试根据某些标准创建一组记录,我需要找出最佳方法。
我想为每个具有特定Account对象的对象A和B创建一条记录。对象A需要具有“完成”状态,并且B状态为“就绪”以便创建记录(将是具有“活动”状态的对象A)新对象A上的字段将从一些对象A和B字段。
这是一个不是从用户操作触发的进程,而是我需要在数据库中转储的一组记录。我确实有一个沙盒开始工作和测试然后推出。
请让我知道最简单的方法。
我很感激帮助!
答案 0 :(得分:1)
您没有提供足够的信息,我们不知道这些关系是怎样的。账户下的A和B相关清单是?它们是独立的还是从一个链接到另一个链接?
我会写一些我将作为脚本做的事情(如果需要,你可以用它来完成一个批处理工作,或者你可能会更熟悉Data Loader,使用交叉过滤器,MS Excel和VLOOKUPs狂欢的报告。 ..)
要识别所有“候选”帐户,您可以尝试使用此查询框架
AND Id > '001....'
现在,有关数据量的问题。它会返回10K(这是您可以在单个事务中插入/更新/修改的记录的限制),如果更多 - 您可能必须以某种方式对其进行分块...也许ORDER BY Id,记录上次处理的帐户的ID以及下一次迭代添加SELECT Id, Name,
(SELECT Id FROM As__r WHERE Status__c = 'Active' LIMIT 1),
(SELECT SomeField__c, SomeOtherField__c FROM Bs__r WHERE Status__c = 'Ready' LIMIT 1)
FROM Account
WHERE Id IN (SELECT Account__c FROM A__c WHERE Status__c = 'Done')
AND Id IN (SELECT Account__c FROM B__c WHERE Status__c = 'Ready')
LIMIT 10000
无论如何,我们得到了一个“候选人”,好吧,也许他已经有一个活跃的A记录,我们不想复制。此外,我们需要从B中提取一些字段,以便将它们复制到一起。所以让我们稍微修改一下查询,添加“子查询”(如果有帮助,可以将它们视为相关列表或LEFT INNER JOIN)
List<A__c> toInsert = new List<A__c>();
for(Account a : [SELECT...]){
if(a.As__r.isEmpty() && !a.Bs__r.isEmpty()){
toInsert.add(new A__c(
Account__c = a.Id,
Status__c = 'Active',
Foo__c = a.Bs__r[0].SomeField__c,
Bar__c = a.Bs__r[0].SomeOtherField__c + 7
));
}
}
insert toInsert;
尼斯。因此,现在您需要遍历帐户,看看它们是否包含至少1个活动记录(如果他们这样做 - 跳过)。如果他们不这样做 - 创建新的。
{{1}}