首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SFDC中创建新的自定义对象时如何填充查找字段

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

Stack Overflow用户
提问于 2012-08-29 17:41:35
回答 2查看 14.1K关注 0票数 0

我在为这种情况而挣扎..。我在SFDC (机遇)中有一个标准对象,它有一个指向用户对象的自定义查找字段,我要做的是用创建在机会布局中可用的自定义对象的用户名填充这个字段.

也就是说,新的GOP检查列表--然后选择检查表的类型--然后填写所有需要的字段,然后单击save,这是指向机会视图的。首先,这件事可行吗?我知道查找字段是很棘手的。我的第二个问题是,通过编程(触发器)或使用工作流和字段更新功能的最佳方法是什么?

谢谢!!

代码语言:javascript
复制
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.-当创建新的GOP检查列表时,如果用户在名为COSOperations_c的GOP对象中填充新的自定义查找字段,则保留该名称,2。-如果用户没有填充COSOperations_c字段,但是填充了Opp级别CARE_Operations__c中的字段,则使用该名称。3.-如果没有填充CARE_Operations_c或COSOperations_c (用户输入),那么COSOperations__c将是只创建GOP对象的人。

这就是我目前所拥有的..。

代码语言:javascript
复制
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声明中。另外两种情况都正常工作。好了!有什么想法吗?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-30 04:08:41

我的(第二)着手修复您发布的触发代码:

代码语言:javascript
复制
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作为查找(用户),My_Object__c.Opportunity__c作为查找(机会),那么这个触发器是一个很好的开始:

代码语言:javascript
复制
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(User)实际上只是一个Id字段,请尝试下面的练习。在机会对象"My“上创建一个新的Lookup(User)字段。

  • 数据类型:查找关系
  • 涉及:用户
  • 字段标签:我的用户
  • 字段名: My_User (转化为My_User__c,也可通过My_User__r获得)

从Salesforce网页中,选择一个现有的机会记录,并将My User字段设置为一些随机用户并保存该记录。现在,从开发人员控制台执行这个匿名APEX:

代码语言:javascript
复制
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);
}

关闭花哨的日志视图并单击"Open Raw Log“,您将看到如下一行:

代码语言:javascript
复制
16:42:37.077 (77645000)|USER_DEBUG|[7]|DEBUG|##### Opportunity.My_User__c = 00530000000grcbAAA, o.My_User__r.Name = John Doe

参见,Salesforce将__c查找字段视为Id字段。在本例中,它是与用户对象的Id的外键关系。Salesforce使您认为Name字段是主键,但实际上是Id字段(好的,我还没有真正看到Salesforce的ERD,但我非常肯定这是正确的)。注意,您可以通过__r构造获得查找对象的字段。

更新字段只是更改My_User__c id的问题:

代码语言:javascript
复制
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:

代码语言:javascript
复制
// 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;

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

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
UserInfo.getUserId()
票数 0
EN

Stack Overflow用户

发布于 2012-08-29 19:37:55

我在这里有点搞不懂要求。我们是说在创建自定义对象的记录时,需要创建一个新的机会记录吗?

如果是的话,这是可能的。您可以在类型为“后插入”的customer对象上写入APEX触发器,并创建一个新的机会记录,并根据需要填充其字段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12183564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档