salesforce里,以自定义对象发出消息的方法

应用中,需要有一个object(车)来发送一条消息通知大家,而不是通过账户来发出,比如在SF中,希望使用它的chatter功能,一个驾驶员在SF上有个chatter账户,驾驶员有台车,同时还有其他朋友之类的账户,大家系统车有故障时,大家都能看到。有两种方式可以实现:

1、以车的名义发送出去,而不是以驾驶员的方式发送出去
2、以驾驶员的名义发送出去,而不是以车的名义发送出去

我们当然不希望是采用第二种方式,因为那样不是很好,也不准确,比如一个驾驶员可以有几部车,如果以驾驶员的名义发出,别人可以能不知道是那不车有问题了,但是可以提供车的信息,但是如果是以车的名义发出,那就更加清晰明确了。所以我们希望是第一种方式。

如果以第一种方式,在SF中,也有两种方式实现
1、给车也注册一个chatter账户,然后有故障时,用车的chatter发送出去
2、不用注册chatter账户,而是通过自定义object,即将车定义为object,然后通过该车对应的object对象将消息发送出去

具体实现实录是,首先自定一个Car的对象,来保存车的相关信息,然后在车有故障时,找到对用的车后,就发送一条消息出去,这样就可以了。
我的方式是写一个触发器,然后监控该Car对象,如果有故障的车有信息更新,比如某个代表车有故障的字段信息有变更,我们就认为有故障了,此时就自动发送消息出去。

Car车的一些属性:



具体代码如下:
1、外部平台负责更新车的状态,比如java客户端作为主动更新的系统:比如当为VID1的车有故障时,我们会主动更新SF里car Object的数据信息
   /**
     * 
     * <pre><b>功能描述:</b>更新
     * 
     * @author :****(Kevin.xie)
     * <b>创建日期 :</b>2012-2-15 下午03:18:52
     *
     * @throws ConnectionException
     *
     * <b>修改历史:</b>(修改人,修改时间,修改原因/内容)
     *
     * </pre>
     */
    private static void update() throws ConnectionException {

        QueryResult queryResults = connection.query("SELECT Id FROM Car__c where VID__c = 'VID1' LIMIT 50");
        System.out.println(queryResults == null ? "null" : queryResults.getSize() + "");
        if (queryResults.getSize() > 0) {
            
            // 不能直接更新这个从数据库查处的对象,回报错误
            SObject sObject = queryResults.getRecords()[0];
            Car__c car = new Car__c();
            car.setId(sObject.getId());
            car.setCurrently_DTC__c("p2000--Test DTCs");
            
            SaveResult[] results = connection.update(new SObject[] {car });
            
            if (!results[0].isSuccess()) {
                
                System.out.println("Error updating user status: " + results[0].getErrors()[0].getMessage());
            } else {
                
                System.out.println("User status successfully updated.");
            }
            System.out.println();
        }
    }


2、在car object对象上创建一个触发器,让它自动发送消息到chatter组上
trigger CarTrigger on Car__c (after update) {
    List<FeedItem> feedItems = new List<FeedItem>();
    Car__c oldCar = Trigger.old[0];
    Car__c newCar = Trigger.new[0];
    
    if(oldCar.Currently_DTC__c != newCar.Currently_DTC__c) {
        FeedItem fitem = new FeedItem();
        fitem.type = 'LinkPost';
        fitem.ParentId = newCar.id;
         //This is the url to take the user to the activity
       fitem.LinkUrl = '/' + newCar.id;
         //This is the title that displays for the LinkUrl
        fitem.Title = 'View'; 
        fitem.Body = 'Currently DTCs: \n'+newCar.Currently_DTC__c;
        feedItems.add(fitem);
     }
     
     //Save the FeedItems all at once.    
     if (feedItems.size() > 0) {
     
             //notice the false value. This will allow some to fail if Chatter isn't available on that object 
             Database.insert(feedItems,false);
      }
 }


3、配置chatter跟踪该对象
3.1、开始chatter的自动跟踪,入下图



3.2、跟踪car 对象,注意不要勾选属性,否则勾选了那个属性后,在操作数据的时候,所有的变更操作动作都会显示在chatter页面上。



经过上面设置后,就可以看到效果(0008 和 0009就是具体的车了, Kevin和kevin.xie就是司机了):



猜你喜欢

转载自xieyanhua.iteye.com/blog/1407358
今日推荐