对于审批流中,通过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. C# 在iis windows authentication身份验证下,如何实现域用户自动登录

    前言: 该博文产生的背景是有个项目在客户那部署方式为iis windows身份验证,而客户不想每次登录系统都要输入帐号和密码来登录. 因此需要得到域用户,然后进行判断该用户是否可以进入系统. 解决方法 ...

  2. 关于for循环的几种经典案例

    由于for循环可以通过控制循环变量的初始值和循环结束条件来改变遍历的区间,所以在排序或者遍历的时候,利用for循环就比较简单,以下是本人学习后得到的一些总结案例. 1.排序的应用 1)交换排序:通过取 ...

  3. 基于Kubernetes的WAF集群介绍

    Kubernetes是Google开源的容器集群管理系统.它构建Docker技术之上,为容器化的应用提供资源调度.部署运行.服务发现.扩容缩容等整一套功能,可看作是基于容器技术的PaaS平台. 本文旨 ...

  4. Java泛型的应用——T extends Comparable<? super T>

    在观察Java源码的时候,发现了这么一个写法T extends Comparable<? super T>.不禁纳闷为什么要这么写呢?有什么好处吗,extends和super在这里的作用着 ...

  5. conda 使用清华大学开源软件镜像

    conda 使用清华大学开源软件镜像 Anaconda的安装步骤不在本文的讨论中,我们主要是学习一下如何配置conda的镜像,以及一些问题的解决过程 配置镜像 在conda安装好之后,默认的镜像是官方 ...

  6. Hibernate createQuery调用joincolumn

    1. Beans a. Version Bean package locationService.beans; import java.sql.Timestamp; import java.util. ...

  7. data.table包简介

    data.table包主要特色是:设置keys.快速分组和滚得时序的快速合并.data.table主要通过二元检索法大大提高数据操作的效率,同时它也兼容适用于data.frame的向量检索法. req ...

  8. R语言进行文件夹操作示例(转)

    rm(list=ls())path = 'J:/lab/EX29 --在R语言中进行文件(夹)操作'setwd(path)cat("file A\n", file="A& ...

  9. js实现省市区三级联动

    电商平台或者一些网站的个人信息部分,通常会有填写地址的功能.该功能一般分为二级联动(省.市)和三级联动(省.市.区),只需要JavaScript就可以实现. 这里介绍一种很简洁易用的方法.参考地址:h ...

  10. 一个想法照进现实-《IT连》创业项目:直觉型面试招聘的漏洞

    前言: 创业转眼又过去了一个月,是时候抽时间写写文向大伙继续汇报进度了. 还记得上一篇创业文章,我还在说:创业时该不该用新手程序员. 嗯,然后,然后,报应就来了:所以这篇要写写自己在新人招聘上出现的问 ...