zoukankan      html  css  js  c++  java
  • SFDC Trigger里before和after的区别

    最近项目开始用Trigger来进行Validation Check.也知道可以通过配置Object里的Validation Rule来进行Check,但是项目想如果有Trigger里就都在Trigger里做Check算了,

    分散开写反而也不好维护,一旦出问题了就得看两个地方,Apex里也比较自由,可以写共通类,有一些共通方法可以提一下,重用。

    回到主题,目前有个Object比较特殊,它会参照另一个Object。并且每个父Object只能有两个子Object。

    要用Trigger来进行Check,如果一个父Object下已经有两个子Object了,就addError(),报一个错。

    这里我研究了下Before Trigger 和After Trigger。对保存的执行顺序有了更深的理解。


    就比如现在这个Object,一共有三条数据。

    我编写了一个before insert Trigger,在里面直接查询表并打log看看当时一共有几个数据。

    1 trigger RSRecordTrigger on RSRecord__c (before insert) {
    2     For(RSRecord__c record : Trigger.new){
    3         List<RSRecord__c> exists = [Select Id,Name From RSRecord__c];
    4         System.debug('exists:'+exists);
    5         record.addError('Test');
    6     }
    7 }

    添加画面

     看一眼log

    17:40:21:005 USER_DEBUG [4]|DEBUG|
    exists:(
    RSRecord__c:{Id=a074x000002djNJAAY, Name=1234567890-1}, 
    RSRecord__c:{Id=a074x000002dw6dAAA, Name=Test 1}, 
    RSRecord__c:{Id=a074x000002dw6YAAQ, Name=Test}
    ) 

     很明显,只有三条。也就是说 before Trigger里画面上输入的记录查询不到。

    接下来测测After Trigger

    trigger RSRecordTrigger on RSRecord__c (after insert) {
        For(RSRecord__c record : Trigger.new){
            List<RSRecord__c> exists = [Select Id,Name From RSRecord__c];
            System.debug('exists:'+exists);
            record.addError('Test after');
        }
    }
    

     画面不用动,直接点保存 

     

     Error Message变了,看看Log

    17:43:44:006 USER_DEBUG [4]|DEBUG|exists:(
    RSRecord__c:{Id=a074x000002djNJAAY, Name=1234567890-1}, 
    RSRecord__c:{Id=a074x000002dwLvAAI, Name=999}, 
    RSRecord__c:{Id=a074x000002dw6dAAA, Name=Test 1}, 
    RSRecord__c:{Id=a074x000002dw6YAAQ, Name=Test})
    

     明显After Trigger会显示刚才画面上输入的记录

    原因是,After Trigger执行时,记录已经在数据库中保存但还未提交,这个状态下是可以检索到的,但是不能改。

    附上完整的保存执行顺序图

     

  • 相关阅读:
    VMWare的Cloud Foundry实践(二):和MongoDB对接成功~
    MongoDB实践
    MongoDB 可读性比较差的语句
    C#异步编程之:(一)Task对象和lamda表达式探究
    创建自己的awaitable类型
    C#异步编程之(三):深入 Async 和 Await 的实现及其成本
    Node.js实践
    MVC+EasyUI+三层新闻网站建立(六 tabs的完成)
    MVC+EasyUI+三层新闻网站建立(七:分页查询出数据)
    MVC+EasyUI+三层新闻网站建立(八,详情页面完成)
  • 原文地址:https://www.cnblogs.com/paynev/p/14598005.html
Copyright © 2011-2022 走看看