如何在SFDC中创建新的自定义对象时填充查找字段

时间:2012-08-29 17:41:36

标签: triggers salesforce apex-code lookup

我正在努力应对这种情况。我在SFDC(机会)中有一个标准对象,它有一个指向User对象的自定义查找字段,我正在尝试做的是填充此字段的名称用户创建机会布局中可用的自定义对象...

即。新的GOP清单---然后选择清单类型---然后填写所有必填字段并单击保存,这将指向机会视图。首先,这是可行的吗?我知道查找字段可能很棘手。 我的第二个问题是以编程方式(触发器)或使用工作流程和字段更新功能执行此操作的最佳方法是什么?

谢谢!!

trigger TR_OrderChecklist on Order_Checklist__c (before insert) {

//----------------------------------------------------------------------------------
// Function 1: Update COS Operations Attribute in Opportunity
//----------------------------------------------------------------------------------

for(Order_Checklist__c o : trigger.new){
  if(o.Opportunity__r.CARE_Operations__c == null) {
    o.Opportunity__r.CARE_Operations__c = UserInfo.getUserId();
  }
}

}

这就是他们想出来的。在标准机会对象中,我们有一个与用户绑定的查找字段.. CARE_Operations__c ..现在触发器应该做的是以下内容..

1.-如果用户在名为COSOperations_ c的GOP对象中填充新的自定义查找字段,则创建新的GOP清单时,请保留该名称, 2.-如果用户未填充COSOperations _c字段,但填充了Opp级别CARE_Operations__c中的字段,请使用该名称。 3.-如果既未填充CARE_Operations_ c或COSOperations _c(用户输入),则COSOperations__c将成为仅创建GOP对象的人。

这是我到目前为止所拥有的......

trigger TR_OrderChecklist on Order_Checklist__c (before insert) {
List<Opportunity> COS_Op = new List<Opportunity>();
COS_Op = [select CARE_Operations__c from Opportunity where id in (select   Opportunity__c from Order_Checklist__c where COSOperations__c != null)];
for(Order_Checklist__c OC : trigger.new) {
    if(OC.COSOperations__c != null) {
       break;}
    if(COS_Op != null){
       OC.COSOperations__c = OC.Opportunity__r.CARE_Operations__c;} 
    if(OC.COSOperations__c == null){
       OC.COSOperations__c = UserInfo.getUserId();}
}       
} 

我的问题是在第二个if语句中..其他2个条件正常工作..!有任何想法吗 ?谢谢!!!

2 个答案:

答案 0 :(得分:0)

我对这些要求感到有些困惑。 我们是说在创建自定义对象的记录时需要创建新的商机记录吗?

如果是,那是可能的。您可以在“插入后”类型的客户对象上编写APEX触发器,并创建新的商机记录并根据需要填充其字段。

答案 1 :(得分:0)

我的(第二个)接受修复您发布的触发器代码:

trigger TR_OrderChecklist on Order_Checklist__c (after update) {
    List<Opportunity> opptsToUpdate = new List<Opportunity>();
    for(Order_Checklist__c o : trigger.new) {
        if(o.Opportunity__r.CARE_Operations__c == null) {
            o.Opportunity__r.CARE_Operations__c = UserInfo.getUserId();
            // Queue it up for one update statement later
            opptsToUpdate.add(o.Opportunity__r);
        }
    }
    // Commit any changes we've accumulated for the opportunity records
    if (opptsToUpdate.size() > 0)
        update opptsToUpdate;
}

假设您将Opportunity.My_User__c作为查找(User)并将My_Object__c.Opportunity__c作为查找(机会),则此触发器是一个良好的开端:

trigger HandleMyObjectInsert on My_Object__c (before insert) {
    User actingUser = [SELECT id FROM User WHERE Id = :UserInfo.getUserId()];
    List<Opportunity> oppts = new List<Opportunity>();
    for (My_Object__c myobj : trigger.new) {
        Opportunity o = new Opportunity();
        o.Id = myobj.Opportunity__c;
        o.My_User__c = actingUser.Id;
        oppts.add(o);
    }
    update oppts;
}

为了证明Lookup(用户)实际上只是一个Id字段,请尝试这个练习。在名为“我的用户”的商机对象上创建一个新的查找(用户)字段。

  • 数据类型:查找关系
  • 相关:用户
  • 字段标签:我的用户
  • 字段名称:My_User(变为My_User__c,也可通过My_User__r获取)

在Salesforce网页中,选择现有的商机记录,并将“我的用户”字段设置为某个随机用户并保存记录。现在从Developer Console中,执行此匿名APEX:

Opportunity[] oppts = [
    SELECT id, My_User__c, My_User__r.Name
    FROM Opportunity
    WHERE My_User__c != null
];
for (Opportunity o : oppts) {
    system.debug('##### Opportunity.My_User__c = ' 
        + o.My_User__c 
        + ', o.My_User__r.Name = ' 
        + o.My_User__r.Name);
}

关闭花式日志视图,然后单击“打开原始日志”,您将看到如下所示的行:

16:42:37.077 (77645000)|USER_DEBUG|[7]|DEBUG|##### Opportunity.My_User__c = 00530000000grcbAAA, o.My_User__r.Name = John Doe

请参阅,Salesforce将__c查找字段视为Id字段。在这种情况下,它是与User对象的Id的外键关系。 Salesforce让你认为Name字段是主键,但实际上它是Id字段(好吧我没有真正看到Salesforce的ERD,但我很确定这是正确的)。请注意,您可以通过__r结构访问查找对象的字段。

更新字段只需更改My_User__c id:

Opportunity[] oppts = [
    SELECT id, My_User__c
    FROM Opportunity
    WHERE My_User__c != null
    LIMIT 1
];
for (Opportunity o : oppts) {
    o.My_User__c = :UserInfo.getUserId();
}
update oppts;

或者,您可以从这样的soql查询中获取用户ID:

// Let's query all users and use the 3rd one in the list (zero-index 2)
User[] users = [select id from user];
Opportunity o = new Opportunity(My_User__c = users[2].id, Name='Testing', StageName = 'Prospecting', CloseDate = System.today());
insert o;

或者,按用户的电子邮件地址查找用户:

User[] users = [select id from user where email = 'first.last@company.com' and IsActive = true];
if (users.size() > 0) {
    Opportunity o = new Opportunity(My_User__c = users[0].id, Name='Testing', StageName = 'Prospecting', CloseDate = System.today());
    insert o;
}

这只是获取当前用户身份的一种非常好的方法:

UserInfo.getUserId()