对于审批流中,通过apex代码进行审批操作一般都需要获取当前记录对应的ProcessInstanceWorkitem或者ProcessInstanceStep然后执行Approval.process操作。曾几何时,一直很狭隘的以为ProcessInstanceWorkItem和ProcessInstanceStep差距很小,差距仅在于ProcessInstanceWorkItem存储的是审批流的最新的一条,ProcessInstanceStep存储的是所有的审批步骤。其实这个理解是有一些偏差的。

一. ProcessInstanceWorkItem

文档上ProcessInstanceWorkItem的解释为 代表一个用户的Pending的审批请求。我们知道,审批的情况除了Pending以外还有很多的状态,比如Approved, Fault, Held, NoResponse, Pending, Reassigned, Rejected,Removed,Started.这些状态中,只有Pending的状态下才会在ProcessInstanceWorkItem保留记录,其他情况下记录会删除。因为ProcessInstanceWorkItem只存在Pending状态,所以ProcessInstanceWorkItem表没有Status字段,有的情况下就比较多余了。

ProcessInstanceWorkItem相关的查询:

1.直接查询 : SELECT CreatedById, CreatedDate, OriginalActorId, IsDeleted, ActorId, SystemModstamp, ProcessInstanceId, Id FROM ProcessInstanceWorkitem

2.通过ProcessInstance进行子查询: SELECT Id, (SELECT Id, ActorId, ProcessInstanceId FROM Workitems) FROM ProcessInstance

二.ProcessInstanceStep

ProcessInstnceStep为当审批流进行下一步动作的时候便会生成记录,不像ProcessInstanceWorkitem,它记录着所有经历过的步骤以及每个步骤的意见,所以其拥有Status字段用来记录审批的各个状态和comments记录审批意见。

1.直接查询:SELECT ActorId, Comments, CreatedById, CreatedDate, OriginalActorId, ProcessInstanceId, Id, StepStatus, SystemModstamp FROM ProcessInstanceStep

2.通过ProcessInstance进行子查询:SELECT Id, (SELECT Id, StepStatus, Comments FROM Steps) FROM ProcessInstance

三.ProcessInstanceHistory

有时候我们需要获取审批的历史信息,用来进行相关审批节点的展示。这个时候我们就可以使用ProcessInstanceHistory。ProcessInstanceHistory是salesforce提供的一个只读的,将ProcessInstanceWorkItem和ProcessInstanceStep结果结合在一起的审批历史表,通常情况下搜索时建议使用子查询方式查询。

通过ProcessInstance进行子查询:SELECT Id, (SELECT Id, StepStatus, Comments FROM StepsAndWorkitems) FROM ProcessInstance

四.关于审批流

我们在配置审批流的时候,会配置当节点审批通过或者失败时的操作,比如更新字段或者发邮件等等操作。如果执行了更新的字段操作,触发了此对象的trigger的时候。在trigger里面如果要是获取审批状态有可能获取不到,因为ProcessInstanceStep或者ProcessInstanceWorkItem是异步生成的。在执行trigger的时候,有可能没有生成,所以在trigger里面不要写关于此条记录的审批状态等操作。

总结:如果针对正常的审批操作,可以使用ProcessInstanceWorkItem或者ProcessInstanceStep进行操作。针对查询历史,使用ProcessInstanceHistory。篇中有错误的地方欢迎指出,有问题欢迎留言。

salesforce零基础学习(七十三)ProcessInstanceWorkItem/ProcessInstanceStep/ProcessInstanceHistory浅谈的更多相关文章

  1. salesforce零基础学习(九十八)Type浅谈

    在Salesforce的世界,凡事皆Metadata. 先通过一句经常使用的代码带入一下: Account accountItem = (Account)JSON.deserialize(accoun ...

  2. salesforce零基础学习(一百一十三)Trigger中获取IP地址的过程

    本篇参考: https://developer.salesforce.com/docs/atlas.en-us.228.0.apexcode.meta/apexcode/apex_class_Auth ...

  3. salesforce 零基础学习(六十八)http callout test class写法

    此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...

  4. salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现

    项目中,我们有时候会需要实现自动联想功能,比如我们想输入用户或者联系人名称,去联想出系统中有的相关的用户和联系人,当点击以后获取相关的邮箱或者其他信息等等.这种情况下可以使用jquery ui中的au ...

  5. salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见

    项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...

  6. salesforce 零基础学习(五十二)Trigger使用篇(二)

    第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...

  7. salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值

    注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...

  8. salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件

    在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...

  9. 【转】【Salesforce】salesforce 零基础学习(十七)Trigger用法

    看本篇之前可以相应阅读以下Trigger相关文章: 1.https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigge ...

随机推荐

  1. Kafka配置及简单命令使用

    一. Kafka中的相关概念的介绍 Kafka是一个scala实现的分布式消息中间件,其中涉及到的相关概念如下: Kafka中传递的内容称为message(消息),message 是通过topic(话 ...

  2. 使用JavaEE的ServerAuthModule模块和web.xml进行相应配置,实现对用户的权限控制

    ServerAuthModule这里不细说,可以自行百度. 重点在注释: <!-- 声明用于安全约束的角色 --> <security-role> <role-name& ...

  3. ListView在异步加载动态图片时,往往最后一项或几项被遮盖(IM场景居多)

    如果ListView中得默认图片比较小,新图片加载后,撑大ListView中的对应项,导致最后一项或几项被覆盖. 解决思路: 1.默认图片设定和新图大小一样,换句话说,新图加载后转成和默认图片一样的大 ...

  4. Android 窗口全屏

    全屏getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 取消全屏 getWindow().clearFlags(Wind ...

  5. iOS之RunLoop

    RunLoop是iOS线程相关的比较重要的一个概念,无论是主线程还是子线程,都对应一个RunLoop,如果没有RunLoop,线程会马上被系统回收. 本文主要CFRunLoop的源码解析,并简单阐述一 ...

  6. MFC教程

    MFC教程 还有VS2015的视频教程 试看教程地址:http://dwz.cn/4PcfPk免费下载地址:http://dwz.cn/mfc888 一.VS2010/MFC编程入门教程之目录 第一部 ...

  7. 从JVM角度看Java多态

    首先,明确一下,Java多态的三个必要条件: 1. 继承 2. 子类重写父类方法 3. 父类引用指向子类对象 然后看一个例子 package test.xing; class Father{ prot ...

  8. set集合(一)

    set 叫做集合  作用:  去重(去除重复) 举例-- >>> name_list = ['alben','nichole','lucy','andy','tom','alben' ...

  9. 用php+ajax新建流程(请假、进货、出货等)

    对管理者来说,电脑操作的请假流程要比人工请假流程的效率高出很多,那么如何新建这个流程呢? 首先:需要明确需要操作哪些流程? 其次:每一个流程需要那些人员来执行? 最后:执行该流程人员的顺序是什么?   ...

  10. 浅谈JAVA验证码~

    这两天在帮同学做个项目,项目中需要做个验证码,说实话那么多年竟然没注意过这东西,原理很简单,贴出来给大家做个参考. 1.简单介绍 一般稍微有些经验的程序员都不会再自己写原生验证码生成了,因为各种强大的 ...