实现报表数据分库存储

报表项目中,常常会出现报表源数据来自不同数据库的情况,也就是同一张报表可能会从多个业务系统读取数据。例如:员工信息从人力资源系统中取出,销售数据从销售系统中取出。当然,还有一种可能,同一应用系统的数据库负载太大,不得已分成多个数据库,例如:销售系统数据分成当前库和历史库。

在数据库类型方面,报表工具可能连接同样类型的数据库,比如都是 oracle 或者 db2;也可能是不同的类型。

报表应用中针对这种数据分库存储的解决办法有两种:1、建设专门的数据仓库;2、利用跨库访问的技术。

专门数据仓库的建设和管理比较复杂,如果数据量很大效率会很低,而且要持续进行 ETL 以便同步各个应用系统的数据。同时,数据仓库利用的实际上也是传统数据库的技术,当遇到负载较大的时候也会面临着进一步分库的问题。数据仓库方式结构示意图如下:

如果使用跨库访问技术,例如 Oracle 的透明网关、DB2 的联合查询等,也会遇到不少局限。比较共性的问题是:1、配置起来比较麻烦,而且往往需要数据库写权限;2、要为跨库的表配置别名;3、不同类型数据库的数据类型不一致时,比较难处理。4、sql 语句受到限制,比较难实现复杂的计算。这种方式的结构示意图如下:

现在,有了第 3 种解决办法,也就是使用润乾报表(结合集算器实现)。其内置的集算引擎可以连接多个数据库,取数之后统一进行数据计算,从而能较好的解决报表数据取自不同数据库的问题。润乾报表解决分库存储问题的结构示意图如下:

下面通过“销售人员销售报表”说明润乾报表解决数据分库存储问题的过程。报表如下图:

报表中的销售订单数据来自于销售系统的 db2 数据库,员工信息来自于人力资源系统的 db2 数据库。使用润乾报表开发这张报表的过程如下:

1、配置数据源

在润乾报表和集算器中分别配置两个数据源,销售系统数据库“db2sales”,人力资源数据库“db2HR”。

2、编写脚本

在集算器中定义网格参数 state,并编写计算脚本:

  A
1 >salesdb=connect(“db2sales”)
2 >hrdb=connect(“db2HR”)
3 =salesdb.query(“select * from sales”)
4 =hrdb.query(“select * from employee”)
5 =A3.run([email protected](EID:A3.SELLERID))
6 =A5.select(SELLERID.STATE==state)
7 =A6.new(ORDERID,CLIENT,SELLERID.NAME:SELLERNAME,AMOUNT,ORDERDATE)
8 >salesdb.close()
9 >hrdb.close()
10 result A7

代码说明:

A1:连接预先配置好的 db2sales 数据源。

A2:连接预先配置好的 db2HR 数据源。

A3、A4:分别从两个数据源中读取 sales 序表和 employee 序表。

A5:使用集算器的对象引用机制,将 sales 序表和 employee 序表通过 sellerid=eid 关联。

A6:按照参数 state="California" 过滤序表。

A7:生成一个新的序表,得到需要的字段。

A8、9:关闭数据库连接。

A10:返回给集算报表。

3、配置数据集

在报表设计器中定义参数 argstate,配置集算数据集:

4、设计报表如下:

输入参数计算后,即可得到前面希望的报表。

报表上部的查询按钮使用了润乾报表提供的“参数模板”功能,具体做法参见教程,这里不再赘述。

原文地址:https://www.cnblogs.com/shiGuangShiYi/p/12116105.html

时间: 2024-11-13 04:14:38

实现报表数据分库存储的相关文章

报表应用结构优化之数据分库存储

报表项目中,可能会出现报表源数据来自于不同数据库的情况. 这是由于同一张报表可能会从多个业务系统取数据.比如:员工信息从人力资源系统中取出,销售数据从销售系统中取出.另一种可能是,同一应用系统的数据库负载太大,不得已分成多个数据库的情况.比如:销售系统数据分成当前库和历史库. 报表工具须要连接的可能是相同类型的数据库.比方都是oracle或者db2:也可能是不同类型的数据库. 报表应用中,数据分库存储的解决的方法有:1.建设专门的数据仓库.2.利用跨库訪问的技术. 专门数据仓库的建设和管理比較复

润乾集算报表优化应用结构之数据分库存储

报表项目中,可能会出现报表源数据来自于不同数据库的情况.这是因为同一张报表可能会从多个业务系统取数据.例如:员工信息从人力资源系统中取出,销售数据从销售系统中取出.还有一种可能是,同一应用系统的数据库负载太大,不得已分成多个数据库的情况.例如:销售系统数据分成当前库和历史库. 报表工具需要连接的可能是同样类型的数据库,比如都是oracle或者db2:也可能是不同类型的数据库. 报表应用中,数据分库存储的解决办法有:1.建设专门的数据仓库:2.利用跨库访问的技术. 专门数据仓库的建设和管理比较复杂

MySQL数据库如何解决大数据量存储问题

利用MySQL数据库如何解决大数据量存储问题? 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存储大数据量的问题,主要是数据库中的两张历史数据表,一张模拟量历史数据和一张开关量历史数据表,这两张表字段设计的很简单(OrderNo,Value,DataTime).基本上每张表每天可以增加几千万条数据,我想问如何存储数据才能不影响检索速度呢?需不需要换oracle数据库呢?因为我是数据库方面的新手,希望可以说的详细一点,万分感谢!!?-0-#暂时可以先考虑用infobri

二进制思惟以及数据的存储

我们平常运用的数字多是由 0~9 共十个数字构成的,例如 1.9.10.297.952 等,一个数字最多能表现九,假如要表现十.十一.二十九.一百等,就需求多个数字组合起来.例如表现 5+8 的后果,一个数字不敷,只能"进位",用 13 来表现:这时"进一位"相当于十,"进两位"相当于二十.由于逢十进一,也由于只要 0~9 共十个数字,所以叫做十进制(Decimalism).进制也就是进位制.在停止加法(减法)运算时,逢X进(借)一就是X进制,这

iOS数据持久化存储

本文中的代码托管在github上:https://github.com/WindyShade/DataSaveMethods 相对复杂的App仅靠内存的数据肯定无法满足,数据写磁盘作持久化存储是几乎每个客户端软件都需要做的.简单如"是否第一次打开"的BOOL值,大到游戏的进度和状态等数据,都需要进行本地持久化存储.这些数据的存储本质上就是写磁盘存文件,原始一点可以用iOS本身支持有NSFileManager这样的API,或者干脆C语言fwrite/fread,Cocoa Touch本身

Android的数据的存储方式

数据的存储方式,总的来说分为三种: ① 文件存储: * SharedPreferences存储 * SD卡存储 ---- Environment * 数据库存储 ---- SQLite .MySQL.sqlserver.Oracle * File  存储 * ContentPrivider存储 ② 内存存储 * 集合 * 变量 ③ 网络存储 * 数据在服务器

为什么MongoDB适合大数据的存储?

NoSQL数据库都被贴上不同用途的标签,如MongoDB和CouchDB都是面向文档的数据库,但这并不意味着它们可以象JSON(JavaScript Object Notation,JavaScript对象标记)那样以结构化数据形式存储文本文档. JSON被认为是XML的代替品,它是一个轻量级的,基于文本交换数据的标准,和XML一样具有人类易读的特性.简单的JSON数据结构叫做对象,可能包括多种数据类型,如整型(int),字符串(string),数组(array),日期(date),对象(obj

Android开发-之数据的存储方式一

在Android中,数据的存储分为两种方式: 1.直接以文件的形式存储在目录中 2.以json格式存储在数据库中 将数据以文件的存储又分为两种方式: 1.生成.txt文件 2.生成xml文件 那么今天就来详细的说一下以文件的形式存储,由于没有讲到数据库,在之后的课程中会讲到json格式存储在数据库中. 一.生成.txt文件 文件的生成无非就是我们Java中学习的输入输出流中的一部分,有Java基础相信都是很容易理解的,因为它真的很简单啦~~ 1.生成目录可以分为两种: 1)本机 2)SD卡 2.

Android笔记——Android中数据的存储方式(三)

Android系统集成了一个轻量级的数据库:SQLite,所以Android对数据库的支持很好,每个应用都可以方便的使用它.SQLite作为一个嵌入式的数据库引擎,专门适用于资源有限的设备上适量数据存取,现在的主流移动设备像Android.iPhone等都使用SQLite作为复杂数据的存储引擎,并且它是以手机内存为储存的. 那么,实际开发项目中有大量数据需要读写,并且需要面临大量用户的并发储存的情况呢.就不应该把数据存放在手机等移动设备的SQLite数据库里,移动设备的储存能力和计算能力都不足以