Salesforce父ID触发器

时间:2015-03-06 14:39:29

标签: triggers salesforce

我有一个问题,我希望我能清楚地告诉你我的问题。

关于帐户的父功能,我将两个字段添加到帐户 ParentID(15) ParentIDLong(18)。 ParentID字段是一个公式字段,代码如下。

IF(LEN(Parent.Id) < 1, Id, 
IF(LEN(Parent.Parent.Id) < 1, (Parent.Id), 
IF(LEN(Parent.Parent.Parent.Id) < 1, (Parent.Parent.Id), 
IF(LEN(Parent.Parent.Parent.Parent.Id) < 1, (Parent.Parent.Parent.Id), 
IF(LEN(Parent.Parent.Parent.Parent.Parent.Id) < 1,    (Parent.Parent.Parent.Parent.Id), 
IF(LEN(Parent.Parent.Parent.Parent.Parent.Parent.Id) < 1, (Parent.Parent.Parent.Parent.Parent.Id), 
IF(LEN(Parent.Parent.Parent.Parent.Parent.Parent.Parent.Id) < 1, (Parent.Parent.Parent.Parent.Parent.Parent.Id), 
IF(LEN(Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent.Id) < 1,(Parent.Parent.Parent.Parent.Parent.Parent.Parent.Id),">7"))))))))

现在我需要ParentLongID,遗憾的是它不可能改变公式,因为我会得到一个错误,即&#34;公式太大&#34;。

我写了一个触发器,它将长ID发布到字段ParentLongID(下面的代码)。

Trigger SetParentIDLong on Account (before update) {

FOR (Account Acc : Trigger.new) {

   Account oldAcc = Trigger.oldMap.get(Acc.Id);

String idStr = Acc.ParentID__c;
Id idVal = idStr;
idStr = idVal;

If (oldAcc.ParentId__c != Acc.ParentID__c) {
    Acc.ParentIdLong__c = idStr;
}

到目前为止,如果我从上到下创建层次结构,它就有用。

实施例

MotherCompany ParentIDLong:空白

Daughter1 ParentIDLong:001b000000XUTQAAA5

Daughter2 ParnetIDLong:001b000000XUTQAAA5

但如果我添加MotherMotherCompany

实施例

MotherMotherCompany ParentIDLong:空白

MotherCompany ParentIDLong:001m000000Ft35yAAB

Daughter1 ParentIDLong:001b000000XUTQAAA5

Daughter2 ParnetIDLong:001b000000XUTQAAA5

触发器不起作用,因为触发器仅更改了Mothercompany的ParentIDLong。

它可能会随着触发所有其他公司而改变吗?

谢谢, 的Sascha

2 个答案:

答案 0 :(得分:0)

为了创建所有其他帐户的关系,您需要在此触发器上拥有更新帐户,以便递归调用您的触发器。

像这样:

Trigger SetParentIDLong on Account (before update) {

FOR (Account Acc : Trigger.new) {
 Account oldAcc = Trigger.oldMap.get(Acc.Id);

 String idStr = Acc.ParentID__c;
 Id idVal = idStr;
 idStr = idVal;

 If (oldAcc.ParentId__c != Acc.ParentID__c) {
  Acc.ParentIdLong__c = idStr;
  update Acc; //this line would call again your trigger
              //recursively until the last Account
 }

试着让我们知道它是怎么回事

答案 1 :(得分:0)

行 我们试试这个:

Trigger SetParentIDLong on Account (before update) {
    List<Id> accids = new List<Id>();

    for(Account a : Trigger.New){
        accids.add(a.Id);
    }

    List<Account> accounts = [SELECT Id,ParentId__c FROM Account WHERE Id IN :accids];

    for(Account child : accounts){
        Account oldAcc = Trigger.oldMap.get(child.Id);

        String idStr = child.ParentID__c;
        Id idVal = idStr;
        idStr = idVal;

        if(oldAcc.ParentId__c != child.ParentID__c) {
        child.ParentIdLong__c = idStr;
        update child; //this line would call again your trigger
                    //recursively until the last Account
        }

    }
}

我刚刚更改了一些名称,并根据trigger.new创建了一个新的帐户列表,因为我们无法更新trigger.new,

让我们看看这是否有效。

让我发布