salesforce 零基础学习(四十八)自定义列表分页之Pagination基类封装 ※※※
我们知道,salesforce中系统标准列表页面提供了相应的分页功能,如果要使用其分页功能,可以访问http://www.cnblogs.com/zero-zyq/p/5343287.html查看相关实现。
现在很多的sfdc项目都是重构页面进行开发,所以很多系统分装的功能用不上,但是很多确实很常见的功能,比如分页,这时候就有必要自己封装一套翻页基类,子类继承父类并实现相关方法以后,前台通过封装的翻页类实现翻页功能。
根据系统的分页功能可以想象到我们设计的分页类应该满足以下简单的功能:
1.相关sObject的数据列表,用于显示数据;
2.首页,尾页;
3.上一页,下一页;
4.总页数,当前页数;
5.是否还有上一页,下一页;
6.每页显示条数(可动态显示)。
MyPagination类封装如下:
- public virtual without sharing class MyPagination {
- //默认值,如果不设置每页显示的数量,则默认数量为20
- public static final Integer DEFAULT_PAGE_SIZE=20;
- public MyPagination() {
- }
- public MyPagination(ApexPages.StandardController controller) {
- }
- public MyPagination(ApexPages.StandardSetController controller) {
- }
- //结果集
- private List<sObject> sObjectList;
- //查询条数的SQL
- private String countStr;
- //查询结果集的SQL
- private String queryStr;
- //查询结果集的条件 where 部分
- private String queryCondition;
- //查询结果集的group by部分
- private String groupBy;
- //查询结果集的order by 部分
- private String orderBy;
- //查询结果集的offset部分,offset最大值为2000,salesforce的限制
- private Integer offset=0;
- public List<sObject> resultList{
- get {
- if(sObjectList == null){
- return new List<sObject>();
- }
- return sObjectList;
- }
- set;
- }
- public virtual void setQueryCondition(String countStr,String queryStr){
- setQueryCondition(countStr,queryStr,null,null,null);
- }
- public virtual void setQueryCondition(String countStr,String queryStr,String queryCondition){
- setQueryCondition(countStr,queryStr,queryCondition,null,null);
- }
- public virtual void setQueryCondition(String countStr,String queryStr,String queryCondition,String groupBy,String orderBy){
- this.countStr=countStr;
- this.queryStr=queryStr;
- this.queryCondition=queryCondition;
- this.groupBy=groupBy;
- this.orderBy=orderBy;
- buildQuery();
- }
- private void buildQuery(){
- List<String> queryArgs = new List<String>();
- List<String> countArgs= new List<String>();
- if(String.isNotBlank(countStr)){
- countArgs.add(countStr);
- }
- if(String.isNotBlank(queryStr)){
- queryArgs.add(queryStr);
- }
- if(String.isNotBlank(queryCondition)){
- queryArgs.add(queryCondition);
- countArgs.add(queryCondition);
- }
- if(String.isNotBlank(groupBy)){
- queryArgs.add(groupBy);
- countArgs.add(groupBy);
- }
- if(String.isNotBlank(orderBy)){
- queryArgs.add(orderBy);
- }
- initTotalNum(countArgs);
- queryStr=String.join(queryArgs,' ');
- offset=0;
- }
- private void initTotalNum(List<String> countArgs){
- String countqueryStr=String.join(countArgs,' ');
- if(String.isNotBlank(countqueryStr)){
- totalNumber=Database.countquery(countqueryStr);
- } else {
- totalNumber=0;
- }
- if(totalNumber != null) {
- pageNumber=1;
- }
- }
- public virtual List<sObject> getQueryResult(){
- if(String.isBlank(queryStr)){
- sObjectList = new List<sObject>();
- }else{
- String querySql=queryStr+' limit '+pageSize+' offset '+offset;
- sObjectList = Database.query(querySql);
- }
- return sObjectList;
- }
- public virtual Integer getCountResult(){
- return totalNumber;
- }
- //改变每页显示的数量
- public virtual void changePageSize(Integer pageSize) {
- if (pageSize!=null){
- this.pageSize=pageSize;
- }
- }
- //是否有下一页
- public Boolean hasNext {
- get {
- return pageSize*pageNumber<totalNumber;
- }
- set;
- }
- //是否有前一页
- public Boolean hasPrevious {
- get {
- return pageSize*(pageNumber-1)>0;
- }
- set;
- }
- public Integer pageNumber {
- get {
- if(pageNumber==null){
- pageNumber=0;
- }
- return pageNumber;
- }
- set;
- }
- //每页显示页数
- public Integer pageSize{
- get{
- if(pageSize==null){
- pageSize=DEFAULT_PAGE_SIZE;
- }
- return pageSize;
- }
- set;
- }
- //结果集总数
- public Integer totalNumber{
- get{
- if(totalNumber==null){
- totalNumber=0;
- }
- return totalNumber;
- }
- set;
- }
- //总页数
- public Integer totalPage{
- get{
- if(totalNumber==0 || math.mod(totalNumber,pageSize)!=0){
- return totalNumber/pageSize+1;
- }else{
- return totalNumber/pageSize;
- }
- }
- set;
- }
- //是否有记录集
- public Boolean hasRecord{
- get {
- if(totalNumber!=0){
- return true;
- }else{
- return false;
- }
- }
- set;
- }
- //首页
- public virtual void first() {
- offset=0;
- pageNumber=1;
- }
- //尾页
- public virtual void last() {
- offset=(totalPage-1)*pageSize;
- pageNumber=totalPage;
- }
- //上一页
- public virtual void previous() {
- pageNumber--;
- if(pageNumber<0){
- pageNumber=0;
- offset=0;
- }else{
- offset=(pageNumber-1)*pageSize;
- }
- }
- //下一页
- public virtual void next() {
- pageNumber++;
- if(pageNumber>totalPage){
- pageNumber=totalPage;
- }
- offset=(pageNumber-1)*pageSize;
- }
- //指定页
- public virtual void specifiedPage(Integer pageNumber) {
- this.pageNumber = pageNumber;
- if(pageNumber < 0) {
- pageNumber = 0;
- offset = 0;
- } else {
- offset = (pageNumber - 1) * pageSize;
- }
- }
- //获取偏移量
- public virtual Integer getOffset(){
- return offset;
- }
- //获取每页显示条数
- public virtual Integer getSize(){
- return pageSize;
- }
- }
MyPaginationEnhance类:
- public without sharing class MyPaginationEnhancement{
- public static final Integer DEFAULT_PAGE_SIZE=20;
- public MyPaginationEnhancement() {
- }
- public MyPaginationEnhancement(ApexPages.StandardSetController controller) {
- }
- public MyPaginationEnhancement(ApexPages.StandardController controller) {
- }
- private List<sObject> sObjectList;
- private String countStr;
- private String queryStr;
- private String queryCondition;
- private String groupBy;
- private String orderBy;
- private Integer offset=0;
- public List<sObject> resultList{
- get {
- if(sObjectList == null){
- return new List<sObject>();
- }
- return sObjectList;
- }
- set;
- }
- public List<sObject> getQueryResult(String countStr,String queryStr,String queryCondition){
- setQueryCondition(countStr,queryStr,queryCondition,null,null);
- buildAndQuery();
- return sObjectList;
- }
- public List<sObject> getQueryResult(String countStr,String queryStr,String queryCondition,String groupBy,String orderBy){
- setQueryCondition(countStr,queryStr,queryCondition,groupBy,orderBy);
- buildAndQuery();
- return sObjectList;
- }
- public List<sObject> updateQueryResult(String queryStr,String queryCondition,String groupBy,String orderBy){
- String querySql = queryStr;
- if(queryCondition!=null){
- querySql += queryCondition;
- }
- if(groupBy!=null){
- querySql +=groupBy;
- }
- if(orderBy!=null){
- querySql +=orderBy;
- }
- sObjectList = Database.query(querySql);
- return sObjectList;
- }
- private void setQueryCondition(String countStr,String queryStr,String queryCondition,String groupBy,String orderBy){
- this.countStr=countStr;
- this.queryStr=queryStr;
- this.queryCondition=queryCondition;
- this.groupBy=groupBy;
- this.orderBy=orderBy;
- }
- private void buildAndQuery(){
- List<String> queryArgs = new List<String>();
- List<String> countArgs= new List<String>();
- if(String.isNotBlank(countStr)){
- countArgs.add(countStr);
- }
- if(String.isNotBlank(queryStr)){
- queryArgs.add(queryStr);
- }
- if(String.isNotBlank(queryCondition)){
- queryArgs.add(queryCondition);
- countArgs.add(queryCondition);
- }
- if(String.isNotBlank(groupBy)){
- queryArgs.add(groupBy);
- countArgs.add(groupBy);
- }
- if(String.isNotBlank(orderBy)){
- queryArgs.add(orderBy);
- }
- initTotalNum(countArgs);
- queryResult(queryArgs);
- }
- private void initTotalNum(List<String> countArgs){
- String countqueryStr=String.join(countArgs,' ');
- if(String.isNotBlank(countqueryStr)){
- totalNumber=Database.countquery(countqueryStr);
- } else {
- totalNumber=0;
- }
- if(totalNumber !=0 && pageNumber==0){
- pageNumber = 1;
- }
- }
- private List<sObject> queryResult(List<String> queryArgs){
- queryStr=String.join(queryArgs,' ');
- if(String.isBlank(queryStr)){
- sObjectList = new List<sObject>();
- }else{
- String querySql=queryStr+' limit '+pageSize+' offset '+offset;
- sObjectList = Database.query(querySql);
- }
- return sObjectList;
- }
- public void changePageSize(Integer pageSize) {
- if (pageSize!=null){
- this.pageSize=pageSize;
- }
- }
- public Boolean hasNext {
- get {
- return pageSize*pageNumber<totalNumber;
- }
- set;
- }
- public Boolean hasPrevious {
- get {
- return pageSize*(pageNumber-1)>0;
- }
- set;
- }
- public Integer pageNumber {
- get {
- if(pageNumber==null){
- pageNumber=0;
- }
- return pageNumber;
- }
- set;
- }
- public Integer pageSize{
- get{
- if(pageSize==null){
- pageSize=DEFAULT_PAGE_SIZE;
- }
- return pageSize;
- }
- set;
- }
- public Integer totalNumber{
- get{
- if(totalNumber==null){
- totalNumber=0;
- }
- return totalNumber;
- }
- set;
- }
- public Integer totalPage{
- get{
- if(totalNumber==0 || math.mod(totalNumber,pageSize)!=0){
- return totalNumber/pageSize+1;
- }else{
- return totalNumber/pageSize;
- }
- }
- set;
- }
- public Boolean hasRecord{
- get {
- if(totalNumber!=0){
- return true;
- }else{
- return false;
- }
- }
- set;
- }
- public void first() {
- offset=0;
- pageNumber=1;
- }
- public void last() {
- offset=(totalPage-1)*pageSize;
- pageNumber=totalPage;
- }
- public void previous() {
- pageNumber--;
- if(pageNumber<0){
- pageNumber=0;
- offset=0;
- }else{
- offset=(pageNumber-1)*pageSize;
- }
- }
- public void next() {
- pageNumber++;
- if(pageNumber>totalPage){
- pageNumber=totalPage;
- }
- offset=(pageNumber-1)*pageSize;
- }
- //指定页
- public virtual void specifiedPage(Integer pageNumber) {
- this.pageNumber = pageNumber;
- if(pageNumber < 0) {
- pageNumber = 0;
- offset = 0;
- } else {
- offset = (pageNumber - 1) * pageSize;
- }
- }
- public Integer getOffset(){
- return offset;
- }
- public Integer getSize(){
- return pageSize;
- }
- }
MyPaginationEnhancement
部分变量解释:
1.sObjectList:封装SOQL查询出来的sObject的结果集;
2.countStr:SOQL查询条数的SQL语句;
3.queryStr:SOQL查询结果集的SQL语句;
4.queryCondition:SOQL中查询结果集条件部分语句(where xxx);
5.groupBy:如果SOQL需要用到分组或者聚合函数等,则设置此变量group by语句;
6.orderBy:如果SOQL需要按照某个或者某些字段进行升序或者降序排列,则设置此变量order by语句;
7.offset:偏移量,SOQL中对于偏移量最大设置的值为2000,超过2000则抛出异常;
8.hasNext:数据当前页是否还有下一页;
9.hasPrevious :数据当前页是否还有上一页;
10.pageNumber:当前页数;
11.pageSize:每页显示条数;
12.totalNumber:结果集总数;
13.totalPage:总页数;
14.hasRecord:结果集是否为空。
部分方法解释:
1.setQueryCondition:设置查询条件,通过子类的SQL查询条件拼装成需要执行的SQL,此方法有三种重构函数,涵盖了主要的SQL查询条件的用法,如果有其他需求,可以继续重构;
2.initTotalNum:获取结果集总数;
3.buildQuery:通过基础SQL以及query condition将其拼装成一个完整的SQL语句;
4.getQueryResult:通过拼装成完整的SQL语句进行查询,返回查询出来的结果列表;
5.changePageSize:改变每页显示的数据条数;
6.first:跳转到首页;
7.last:跳转到尾页;
8.previous:跳转到上一页;
9.next:跳转到下一页;
10.specifiedPage:跳转到指定页数。
总结:对于一般的分页功能,此基类基本封装,故项目要求没有特别高情况下可以直接使用此基类,有的人会说offset最大限制是2000,如果超过2000基类中没有处理会不会不好。这个觉得因设计而异,controller层使用pagination后,执行sql查询列表前应先查一下offset是否已经超过了2000,如果超过2000可以给前台抛出自定义友好的异常或者设置offset为2000,这样做法会比在基类中强制写死比较好。篇中如果有错误地方欢迎指正,如果有不懂地方欢迎留言。
salesforce 零基础学习(四十八)自定义列表分页之Pagination基类封装 ※※※的更多相关文章
- salesforce 零基础学习(十八)WorkFlow介绍及用法
说起workflow大家肯定都不陌生,这里简单介绍一下salesforce中什么情况下使用workflow. 当你分配许多任务,定期发送电子邮件,记录修改时,可以通过自动配置workflow来完成以上 ...
- salesforce零基础学习(九十八)Type浅谈
在Salesforce的世界,凡事皆Metadata. 先通过一句经常使用的代码带入一下: Account accountItem = (Account)JSON.deserialize(accoun ...
- salesforce零基础学习(九十八)Salesforce Connect & External Object
本篇参考: https://trailhead.salesforce.com/en/content/learn/modules/lightning_connect https://help.sales ...
- salesforce 零基础学习(十九)Permission sets 讲解及设置
Permission sets以及Profile是常见的设置访问权限的方式. Profile规则为'who see what'.通过Profile可以将一类的用户设置相同的访问权限.对于有着相同Pro ...
- salesforce 零基础学习(十六)Validation Rules & Date/time
上一篇介绍的内容为Formula,其中的Date/time部分未指出,此篇主要介绍Date/time部分以及Validation rules. 本篇参考PDF: Date/time:https://r ...
- salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件
在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...
- salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现
项目中,我们有时候会需要实现自动联想功能,比如我们想输入用户或者联系人名称,去联想出系统中有的相关的用户和联系人,当点击以后获取相关的邮箱或者其他信息等等.这种情况下可以使用jquery ui中的au ...
- salesforce 零基础学习(六十八)http callout test class写法
此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...
- salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见
项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...
随机推荐
- cocoapods导入shareSDK分享实现
这个在官方文档没有说这两个库是必须导入的,但是不导入是会有错误的 pod 'ShareSDK3/ShareSDKConfigurationFile' pod 'ShareSDK3/ShareSDKEx ...
- 安卓手持智能POS端上能扫描开单的软件-店面销售开单系统
安卓移动POS终端上能扫描开单的软件: 一.登录验证,以业务员.密码登录: 二.订单列表,显示相关信息,包括日期.单据号.客户名.金额.单据状态.有新增订单及按特定条件查询订单的功能(日期.客户等). ...
- Python中的生成器与yield
对于python中的yield有些疑惑,然后在StackOverflow上看到了一篇回答,所以搬运过来了,英文好的直接看原文吧. 可迭代对象 当你创建一个列表的时候,你可以一个接一个地读取其中的项.一 ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
- Spring MVC --->>>No mapping found for HTTP request with URI
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> < ...
- java 随机获取国内IP
/* * 随机生成国内IP地址 */ public static String getRandomIp(){ //ip范围 int[][] range = {{607649792,608174079} ...
- OpenCV(三) 之 基本数据结构 CvMat和 IplImage
OpenCV(三) 之 基本数据结构 CvMat和 IplImage CvMat IplImage OpenCv中基本的数据类型 类型 参数 表示 CvPoint int x,y 像素点 CvPoin ...
- CentOS6.5的vsftp搭建流程(一)
前几次搭建FTP都失败了,不是登陆不了,就是目录没有权限.现在终于摸索出了靠谱的操作流程,分享之~ 1. 查看是否安装了vsftpd,未安装则安装 [root@iZ283tian2dZ /]# rpm ...
- bfrd collector性能排查
1.2.09上昨天timeout在18点23分-22点10分 2.检测2.17网卡流量,sar -f /var/log/sa/sa06 -n DEV,发现这段时间刚好是rxpck/s超过6400. ...
- 使用js-xlsx库,前端读取Excel报表文件
在实际开发中,经常会遇到导入Excel文件的需求,有的产品人想法更多,想要在前端直接判断文件内容格式是否正确,必填项是否已填写 依据HTML5的FileReader,可以使用新的API打开本地文件(参 ...