报表无疑是ERP系统中用到的最频繁的单据之一。比如每天采购要打印采购明细帐;仓库每天要导出收货或者出货明细;销售每天要打印订单明细等。故报表的设计在ERP系统开发中占据大半江山。

不过笔者在实际工作中也发现,有些开发人员在设计ERP报表时,太过于复杂。

有一次,一家企业向我提出了如下需求,他们希望能够出一份报表,报表的内容包括四个部分:
一是成品零件的用量、零件的最小采购量等信息;
二是当月零件的采购量信息(详细的采购订单等资料);
三是当月零件的出库信息(详细的出货记录);
四是零件的安全库存信息。
然后,根据这些信息计算出当月需要补下的满足安全库存的数量。

从这个需求中可以看出,其主要设计到产品基本资料、采购、仓库等三个模块的内容。这么复杂的报表,从技术上来说,实现的难度并不是很大。但是从实用性角度考虑,或者从准确性来看,又会有什么结果呢?

一、报表越复杂,准确性越难以把握

一般来说,报表越复杂,其准确性余越难以把握。其实抛开ERP系统,从统计学的角度,我们也可以得出这个结论。如下图所示,现在有三个抽屉。每个抽屉中都有0-9十个数字。如果现在从每个抽屉中随意抽出两个数字,最后组成一个三位数。那么最后有几种结构呢?这是一个排列组合的问题。

再回过头来看一下这个表单的内容。现在这个表单有三个模块的数据构成。就好像这三个抽屉。当然其抽屉中的数据远比10个数字要负载的多。我们设想一下,从单个模块来看。可能企业允许的误差率是5%。即100条记录中,允许有5条记录与实际有偏差。现在三部分信息共同组成的一张报表,而且最后需要根据三部分信息的内容计算出一个值,那么这个出现错误的记录会有多少呢?这又是一个排列组合的问题。如假设每部分信息中,都有5条件有偏差,那么最后理论上的错误记录是125条。显然这个错误率比较大。同时也可以看出,当涉及到的基础表数量越多,涉及到的模块越多,其最后结果的准确性就越难以保障。而当数据的准确性不高时,其实用性也就相应的降低。

二、报表关联越多,其性能也会直线下降

报表越复杂,其涉及到的后台数据库基础表也就越多。虽然多表之间的关联查询是允许的,但是关联的关键字越多,其查询的效率也就越低。特别是在关联条件中,有时候采用的并不是关键字之间的关联。如有可能日期(字符数据类型的关联)之间的关联,此时查询的效率会更低。再加上比较复杂的Where逻辑判断语句,复杂报表的查询时间会很长。

如笔者测试过,按照上面这个用户的需求,设计出的报表其查询的时间需要近三分钟,而且是已经优化过的查询。

另外,这个报表的查询由于涉及到众多的基础表,数据库基本上需要访问硬盘上的数据文件,而不能够使用缓存。这就有可能会导致比较严重的硬盘I/O冲突。从而影响到其它数据的查询效率。

故从数据库与应用软件的整体性能考虑,也不建议采用比较复杂的报表视图。毕竟性能降低、查询的时间比较长时,报表的实用性也在降低。

三、设计复杂报表的注意事项

为此,从原则上是禁止设计超过两个模块的数据报表,最好是将报表的范围限制在单个模块下。如此的话,无论从性能还是从数据的准确性上都会有所保障。但是,如果用户确实有需要实现比较复杂的报表,在这种情况下,该如何处理呢?为此笔者根据自己的项目经验,提出了以下几个建议。

使用固化视图来改善数据库的性能

复杂报表所导致的不利影响,其首当其冲的是报表查询时速度会很慢,性能很低。为此在涉及到复杂报表时,开发人员可以考虑采用固化视图来改善数据库的性能。

如在Oracle数据库中,固化视图又叫做物化视图。通固化视图,可以用于预先计算并保存表连接或者聚集等耗时比较多的操作结果。简单的说,就将某个报表的查询结果存储在一张单独的表中。

如此的话,在执行查询时,就可以避免使用这些耗时的操作,同时减少磁盘的I/O冲突,从而以最短的时间得到用户想要的结果。一般来说,固化视图对于复杂的报表来说,能够提供三方面的作用。如可以提高查询的性能。如固化视图对于应用来说是透明的,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性。如当基表发生变化时,物化视图也会同时更新。

不过需要注意的是,物化视图也会带来一些负面影响。如物化视图的数据会保存在硬盘中,为此就会占用额外的存储空间等。总之,在设计比较复杂的报表时,开发人员可以与数据库工程师商量,能够采用固化视图。如果可以的话,需要尽量采用固化视图。

复杂的报表当设计到多表时,最好采用模块化的设计。

如某视图,其涉及到的基表有近20张。那么在设计视图时,要避免将其放在一个SQL语句中。而应该借鉴应用程序的模块化设计,将其设计成不同层次的视图,然后再进行连接查询。

如上面这个案例,至少可以将其分为四层。最基层是基本数据表,第二层是零件出库信息、当月采购信息等数据,第三层是根据第二层的数据进行计算分析;第三层视图再将这些视图进行连接。这么操作的话,方便后续的维护与查询。同时也可以提高查询的速度。

为什么这么说呢?如在第二层视图设计中,可以对基础表的数据进行过滤。此时由于基础数据少,那么后续的报表查询速度也会加快。为此对于比较复杂报表的设计,要考虑分层设计的思路。以提高报表的查询性能与灵活性。

要考虑数据核对的需要。

比较复杂的报表,其可能会涉及到多个不同的部门。如上面个报表,其涉及到仓库、采购、销售、开发等多个部门。而且最后的计算结果需要根据这些部门的信息得出。为此为了提高数据的准确性,就需要多个部分进行积极的配合。

那么该如何来做到这一点呢?笔者认为,可以将这些视图分模块化设计。如将涉及到不同的部门的信息先设计成不同的报表。在某个特定的时刻,如月末,先让各个部门的人员核对相关的数据。核对完成没有错误之后,再对相关的数据进行运算。而不是一开始就将所有数据在一张报表上显示。这会导致各个部门数据核对的麻烦,即各个部门不利于核对与自己相关的数据。

其实这一点跟上面提到的视图分层化设计类似。在ERP上,报表的内容也要分不同的模块进行体现。这有利于用户对数据进行核对与确认。然后再将它们整合起来。这种各个击破的方式,就有利于提高数据的准确性。

结语

可见,对于比较复杂的报表视图,原则上还是少见为妙,因为其在性能或者数据的准确性上都很难控制。

如果真的要建立复杂视图的时候,那么在设计与开发时,顾问需要听取数据库工程师的意见,或者直接使用葡萄城企业报表,这样将使你在创建这样的复杂报表时更加得心应手。

简单三招,设计复杂ERP报表相关推荐

  1. 华为 java sd卡_无需使用Micro SD卡!只需简单三招,轻松给华为手机扩展容量

    原标题:无需使用Micro SD卡!只需简单三招,轻松给华为手机扩展容量 这些年,智能手机不仅在摄像头像素上屡创新高,而且高端机型也普遍标配128GB存储,甚至出现512GB版本这样的巨无霸.总有一天 ...

  2. 简单三招让你的火狐狸启动更快

    简单三招让你的火狐狸启动更快[@more@]火狐狸是一款非常优秀的开源浏览器,但是有的用户说它的启动速度有点忙,下面就告诉你三招,让你的火狐狸快速启动. 第一招:修改about:config参数:打开 ...

  3. 简单三招看准K线走势

    "第一招.看阴阳",阴阳代表趋势方向,阳线表示将继续上涨,阴线表示将继续下跌.以阳线为例,在经过一段时间的多空拼搏,收盘高于开盘表明多头占据上风,根据牛顿力学定理,在没有外力作用下 ...

  4. 删除autorun.inf病毒的批处理 简单三招预防

    选择"显示隐藏文件"这一选项后,发现U盘有个文件闪出来一下就马上又消失了,而再打开文件夹选项时,发现仍就是"不显示隐藏文件"这一选项.而且刚发现点击C.D等盘符 ...

  5. 怎么把图片批量旋转?简单三招就可以实现

    不知道小伙伴们有没有遇到过这种情况,出去旅游的时候,拍了很多照片,回来之后,想要挑选几张好看的照片分享到朋友圈,但是一看发现全都拍歪了.这时候,我们就需要对这些图片进行旋转来校正它的角度,那么要怎么把 ...

  6. 简单三招,就能将ppt翻译成英文,快来学习

    大家在工作中汇报工作或是制作方案时,应该都会选择用ppt文档格式来演示吧?因为这样能让他人直观的了解你想表达的意思.而偶尔也会出现客户是外国人的情况,这时候为了让他们更快速的理解,最好的方式就是将pp ...

  7. [VSTO系列]三、简单的UI设计/QQ联系人导出(下)

    接上一篇:http://www.cnblogs.com/longqi293/archive/2010/12/22/vstoforexcel2.html,我们通过VSTO,简单的使用了Ribbon控件, ...

  8. 2016版excel_Excel怎么转换成pdf?教你三招超简单方法

    在工作中,为了更好地阅读传输,也为了文档数据不被更改,我们经常需要将Excel转换为PDF的格式,很多人都觉得文件格式转换很麻烦,其实学会这三招后,你会觉得一切格式转换都很简单. 第一种方法:offi ...

  9. 三招助你轻松搞定超Diao氛围

    自1960年代美国校园刮起一片游戏飓风之后,各类游戏席卷世界,在那个手游还没有今天这般成熟的时代,游戏界可谓是被各种重度游戏霸占,近年,一款WAR3地图编辑器的产物DOTA,红的发紫,大街小巷无人不玩 ...

最新文章

  1. 正定小主人机器人_石家庄正定县2015中小学生机器人运动大赛隆重开幕
  2. 3.5.5 CSMA/CA 协议
  3. 使用nginx负载均衡的webservice wsdl访问不到_面试官:关于负载均衡你了解多少
  4. 实战 SSH 端口转发
  5. 皮尔洛和c罗讲什么语言,皮尔洛:如果我跟C罗是队友 我可能能成历史助攻王
  6. 启动访问kibana
  7. js简单判断身份证合法性以及身份证生日合法性
  8. eureka注册中心之服务提供者
  9. java项目实战之404错误原因总结
  10. 中职计算机专业英语说课稿,中职英语说课稿模板.doc
  11. JAVA 实现《推箱子》游戏
  12. 数据库 case wen条件语句的运用
  13. 我国历史上各个朝代的都城
  14. 简信CRM:CRM科学服务体系,促进企业销售增长
  15. 如何在图片上添加边框和文字
  16. 【转载】Web2.0创业时代将终结
  17. 黑屏出现An operating system wasn't found.解决方案
  18. Traffic Light
  19. 据说是新浪乐居的面试题及我的答案
  20. 关闭Linux哔哔声

热门文章

  1. Iphone开发(7) 太你妈辛苦了
  2. 个人自建数据库和云数据库有什么区别?
  3. 移动端应该如何动态设置字体大小?
  4. android 打开和关闭输入法
  5. 仿真软件测试基尔霍夫定律,实验三 基尔霍夫定律的验证(仿真实验)
  6. 边策划边制作的游戏开发日志(一) 用Untiy制作类似《莱莎的炼金工坊》移动和视角系统(第三人称控制系统)
  7. 《大国大城》读书笔记
  8. 高速公路ETC卡签之我见2-卡片消费
  9. 基础会计学习笔记8-过账和试算平衡
  10. 2015年读的10本英文书小结