插件获取物料收发类报表数据案例原创
金蝶云社区-邱育华
邱育华
15人赞赏了该文章 1,746次浏览 未经作者许可,禁止转载编辑于2022年09月06日 15:26:35

一、【业务需求】

1、想要二开简单账表参考物料收发汇总或者物料收发明细,需要知道报表数据抓取的范例或者逻辑?

2、后台找不到物料收发明细表的表名,我要取得上面的单价字段,应该怎么取呢?

3、读取物料的收发明细表里的物料数据,然后自己用这些数据在盘点作业上做一个对比,这个物料收发明细的数据如何取?


类似的需求大同小异,总结起来可以简单理解为:需要理解库存物料收发报表的取数逻辑,以及如何直接从数据库表中获取的报表数据,进行二次开发。


二、【功能分析】

对于库存物料收发类的报表,需要理解其运算的逻辑:统计涉及到几十张库存单据表的取数,单据彼此间并没有什么关联,意味着无法通过SQL将所有数据进行汇总,标准产品是通过插件对各个库存单据根据过滤条件分别取数,再通过临时表进行数据汇总排序,结合期初计算结存, 逻辑比较复杂而且耗时比较长,每一次的查询都是实时计算,所以并不存在后台实体表进行存储。


如果有二开需求需要获得物料收发报表数据,可以参考如下方案进行:

1、【在插件中获取分页账表数据

2、【二开案例.执行计划.获取并保存账表数据

3、SQL的取数逻辑可参考:【物料收发明细报表sql


以参考文章1为例:说明几个常见问题

1、分页账表,获取数据不完整

由于分页的特性,报表展示数据会根据库存组织,货主进行分页(注意区别于报表每页显示分页)数据统计,比如查询当期A、B两个组织的收发数据,且勾选了按组织分页,按货主分页,那么当期的数据如果一个组织有涉及两个货主,可以理解为数据分为 2 * 2 = 4(页)

image.png

image.png


SysReportServiceHelper.GetListAndReportData返回一个IMoveReport类型

  • ListCount属性,该参数返回当前方案下分页账表的页数

  • rptParam.CurrentPosition = currentPosition 分页账表当前位置,currentPosition从0(第一页)到ListCount - 1,多次调用即可获取完整的数据


image.png


2、这个过滤方案只能是固定的?如何用代码改日期之类的过滤字段?

var filter = model.GetFilterParameter();
IRptParams rptParam = new RptParams();   
rptParam.FormId = reportFilterMetadata.BusinessInfo.GetForm().Id;    
rptParam.CurrentPosition = currentPosition; //分页账表当前位置
rptParam.StartRow = 1;    
rptParam.EndRow = int.MaxValue; //StartRow和EndRow是报表数据分页的起始行数和截至行数,一般取所有数据,所以EndRow取int最大值。
rptParam.FilterParameter = filter;

从取数代码分析,根据查询方案SchemaId得到的filter对象,赋值给本次查询的IRptParams对象,这里可以对其条件做自定义修改,比如:

  • filter.CustomFilter["StockOrgId"] = "100003" 

  • filter.CustomFilter["SplitPageByOrg"] = false

只取100003组织(组织内码), 不按组织分页。这种方式使得在查询方案固定的情况下,动态修改filter查询参数,达到自定义的过滤。

image.png


注意点:修改了组织和分页方式,可能导致分页报表页数改变(之前3页,修改后只有1页),要特别注意

rptParam.CurrentPosition = currentPosition; //分页账表当前位置

以免出现参数取数溢出的问题。



说明

1、简单账单的数据获取: 【小技巧 - 如何在服务层获取简单账表数据结果

2、【物料收发明细、收发汇总报表统计二开库存单据方法


赞 15