http://xieyanhua.iteye.com/blog/1407358
应用中,需要有一个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的自动跟踪,入下图
![点击查看原始大小图片](http://dl.iteye.com/upload/attachment/0063/2439/a262eddc-adb3-309d-9f3a-11aacf424d3f.png)
3.2、跟踪car 对象,注意不要勾选属性,否则勾选了那个属性后,在操作数据的时候,所有的变更操作动作都会显示在chatter页面上。
![点击查看原始大小图片](http://dl.iteye.com/upload/attachment/0063/2441/63cb4af5-1b49-3536-bbe3-3c45fa7af8cc.png)
经过上面设置后,就可以看到效果(0008 和 0009就是具体的车了, Kevin和kevin.xie就是司机了):
![点击查看原始大小图片](http://dl.iteye.com/upload/attachment/0063/2455/a65d7e59-f10e-3ffa-a899-b81b27d9b06c.png)