基于B/S模式的统计图形生成系统设计与实现
来源:岁月联盟
时间:2010-08-30
1 系统关键问题及解决方法
随着机技术、技术、信息技术的迅猛和普及,计算机在全球范围内得到了广泛应用。计算机已经成为人们日常生活和工作以及追求效率和效益不可缺少的工具。信息、网络和计算机技术作为先进的生产力,充分运用可以大大促进和加快企业的发展,为企业带来巨大的效益和社会效益。 目前,许多企业在发展业务过程中可能大量的数据,同时需要通过这些数据来绘制和统计一些图形用于分析企业的现状、预测企业的发展趋势,从而对企业的决策起到辅助作用。我们研制此系统的目的也正是针对目前企业对这类软件的需求。2 读取不同类型数据库数据表和字段名称
基于设计的灵活性,图形系统需要建立数据字典,因此图形系统要从不同类型的数据库(本系统主要涉及到的数据库有:SQL Server和Oracle)的数据服务器获取待访问数据库的表和字段的名称,对于SQL Server2000而言,获取当前访问的数据库的表和视图名相对来说较为简单,可用语句:select name,case xtype when 'u' then '表' end as xtype from sysobjects where xtype='u' and name<>'dtproperties' union select name,case xtype when 'v' then '视图'end as xtype from sysobjects where xtype='v' and status>0。即可获得当前登录的用户能访问的表和视图名。 语句select a.name,b.name, a.colorder from syscolumns a join systypes b on a.xtype=b.xtype where a.id=object_id(“表名称”)and b.name<>'sysname' order by a.colorder 就可以得到具体表的字段名称。 但对oracle 9i而言则比较复杂,因为登录用户的表空间下可能已经存在部分表的访问权限,而一些权限比较大的用户又授权给这个用户另一个表空间下部门表的访问权限。所以如果访问Oracle数据库,获取当前登录用户所能够访问的表存在一些问题,通过认真分析,我们采取了以下方法来获取: select distinct owner, table_name, '表' as LX" from user_all_privs where owner = ‘用户名’ Union select‘用户名’as owner, table_name,'表' as LX from user_all_tables Union select‘用户名’as owner, view_name as table_name, '视图' as LX From user_views order by table_name",其中的“用户名”指当前登录oracle数据库的帐号。如果上述语句未找到记录,则再用select distinct owner, table_name, '表' as LX" from user_all_privs 获取所有的用户表记录。获取表名之后,获取每个表的字段就较为容易了,SQL语句为:select owner, column_name,data_type,column_id from all_tab_columns where table_name =“表名称”and owner = “用户名”order by column_id。2.1 解决建立数据字典时的效率问题
根据系统的设计原则,系统需要连接远程数据库,并从远程数据库获取所访问数据库的表和字段写入到本地数据库服务器,从而在本地数据库建立远程数据库的数据字典。而这一过程主要的问题就是访问、读取、写入数据库的效率问题。试想,如果远程连接数据库的表和字段数量成千上万的话,那在本地数据库服务器建立数据字典时,如果不处理好语句的效率问题,在本地数据库服务器访问量较大的情况下极有可能造成数据库服务器的瘫痪,造成较大的损失。为此我们进行了多次实验,找到了比较有效地解决方法,就是利用存储过程实现:关键代码: @iSJYID int, -- 数据源ID @sBDM varchar(30), -- 表/视图代码 @sBLX varchar(10), -- 表/视图类型 @sZDStr varchar(8000), -- 字段串 @iRtn int OUTPUT -- 返回值 -- 判断表是否存在 set @i = (select count(*) from tblSJBZD where SJYID = @iSJYID and BDM = @sBDM) if @i > 0 goto Error_1 -- 写入数据表字典insert into tblSJBZD (SJYID, BDM, LX) values (@iSJYID, @sBDM, @sBLX)if @@error <> 0 goto Error_2 -- 写入数据字典set @iPos = PATINDEX('%/%', @sZDStr) WHILE @iPos > 0 begin-- 取字段set @sZD = left(@sZDStr, @iPos-1)set @sZDStr = right(@sZDStr, len(@sZDStr)-@iPos) -- 取类型set @iPos = PATINDEX('%/%', @sZDStr)if @iPos = 0 set @sLX = @sZDStrelsebegin set @sLX = left(@sZDStr, @iPos-1) set @sZDStr = right(@sZDStr, len(@sZDStr)-@iPos)set @iPos = PATINDEX('%/%', @sZDStr)end --insert into tblSJZD (SJYID, BDM, ZDDM, SJLX) values (@iSJYID, @sBDM, @sZD, @sLX) if @@error <> 0 goto Error_2 end -- WHILE @i > 0 commit tran SJZD set @iRtn=0 return @iRtnError_1: rollback tran SJZD set @iRtn=1 return @iRtnError_2: rollback tran SJZD set @iRtn=-1 return @iRtn2.2 用Ajax技术实现图形的局部放大
要想更方便、更好地展示图形系统生成的图形,实现图形的即时缩放,用传统的技术是很难实现的。Ajax技术是使用客户端脚本与Web服务器交换数据的Web应用开发方法。这样,Web页面不用打断交互流程进行重新加裁,就可以动态地更新。使用Ajax,用户可以创建接近本地桌面应用的直接、高可用、更丰富、更动态的Web用户界面。为了实现图形系统的即时放大功能,我们在系统实现时使用了Ajax技术,可以随意地对图形进行缩放,增加了操作的方便性。缩放的关键代码如下:function smallit(){ var height1=PhotoViewer.images1.height; var width1=PhotoViewer.images1.width; PhotoViewer.images1.height=height1/1.2; PhotoViewer.images1.width=width1/1.2; }function bigit(){ var height1=PhotoViewer.images1.height; var width1=PhotoViewer.images1.width;PhotoViewer.images1.height=height1*1.2; PhotoViewer.images1.width=width1*1.2; }2.3 系统功能分析
通过分析,该统计图形系统主要包括以下几个方面的功能: 1)数据源管理 对存放数据的数据库进行管理,主要是配置访问数据库的参数,系统支持SQL Server,Oracle等常见数据库。 2)数据字典管理 管理数据库中各数据表及字段,实现数据表和字段的中对照功能。 3)图表样式设置 完成统计图形中图表样式的设置,包括图形标题样式、背景样式、边框样式等。 4)区域样式设置 完成统计图形中各区域样式的设置,包括区域的背景样式、网格样式等。 5)系列数据及样式设置 完成统计图形中各系列的数据项配置、系列类型以及系列的样式设置,系列样式包括标题样式、边框样式、网格样式等。 6)统计图形分类管理 一条统计图形必须属于一个分类,“图形分类管理”集中对分类进行管理,其包含的操作有添加同级、添加下级、修改、删除等操作。 7)统计图形浏览 根据已经设置好的统计图形属性和数据过滤条件,提取数据,生成相应的统计图形。在浏览统计图形的同时还可以对其属性进行设置,并支持图形导出。3 系统关键流程
经过分析,统计图形系统需要做成灵活的工具性软件,在其每个环节都需要提供可自定义的设置功能。定制统计图形可按照下图的流程进行就可完成定义。系统关键流程如图2所示。

4 系统实现
通过详细设计,系统实现了上述所有功能,功能结构如图4所示。
