日期:2012-11-17  浏览次数:21036 次

摘 要:本文阐述一种利用ASP实现Web数据统计、报表的基本思路和实现方法,同时提供一种巧妙调用Word打印报表的解决方案。

关键词: ASP,数据统计,报表,打印,Word



1、 引言

随着Internet的飞速发展,基于Web开发的业务应用系统越来越多,如办公自动化、电子商务和管理信息系统(MIS)等。这些Web业务应用系统经常涉及到数据的统计、报表和打印。ASP在实施动态交互和生成动态页面方面具有很大的优势,但在处理复杂数据统计、报表和打印时却遇到不小的麻烦。本文阐述一种利用ASP实现Web数据统计、报表的基本思路和实现方法,同时提供一种巧妙调用Word打印报表的解决方案。



2、 应用实例

假设有一家公司利用网络MIS系统对公司员工进行管理,必然会涉及到各部门的员工统计。为了简单起见,假设最终的统计报表如下:



公司员工统计表

部门
合计
员工姓名

市场部
2
张三



李四

研发部
3
王五



赵六



刘七

员工合计
5





与传统单机MIS系统相比,在网络MIS系统中使用ASP实现以上数据统计、报表和打印会遇到以下问题:

(1) 数据统计时需要按部门进行分类统计,同时要记下各部门员工的具体名单。

(2) 报表生成时需按具体要求动态绘制几行几列表格,同时在适当的地方保持空白。

(3) 表格打印可以简单地按网页打印,但效果不好,而且不容易控制。



3、 实现方法简述

基于Web的业务应用一般采用三层结构,客户端是普通的Web浏览器,中间业务逻辑应用层存放于Web服务器上,由Web服务器上的数据库接口访问后台数据库。利用ASP实现Web数据统计、报表和打印的过程如图所示:


浏览器

HTML

VBScript

统计

报表

Word

对象

Web服务器

业务逻辑实现

数据库

访问接口







Word本地打印












(1) 客户端向Web服务器发送数据统计请求。

(2) Web服务器执行SQL语句,从后台数据库取得统计数据,在页面上动态生成报表。

(3) 在客户端运行脚本,使用VBScript脚本函数CreateObject在本地创建Word的Document对象的实例,也就是在客户端创建Word文档,设定表格属性,然后将页面上的报表数据填入本地Word表格,最后保存文档,执行本地Word打印。



4、 实现过程分析

(1)数据库连接

首先建立数据库(data.mdb),简单的员工资料表(personnel)结构如下:

personnel:department,文本;name,文本;

然后建立一个ODBC数据源(DSN),利用DSN指向ODBC数据库。

(2)程序代码分析(在此只分析统计报表程序tongji.asp)

<%

sql = "Select department,count(department) From personnel group by department" //将记录按部门分类统计

Set Cnn = Server.CreateObject("ADODB.Connection") //连接数据库

Cnn.Open "data"

Set Rs = Server.CreateObject("ADODB.Recordset")

Rs.CursorType = 3

Rs.LockType = 3

Rs.Open sql, Cnn

If Rs.EOF Then //如果没有记录就结束

Response.End

End If

%>

<html>

//以下显示表格标题和输出表头

<p align="center"><b><font size="4">公司员工统计表</font></b></p>

<div align="center">

<table id="data" border="1" width="606" height="53" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111"> //注意:此处标明表格的id为data

<tr>

<td width="93" height="24">

<p align="center"><font size="2">部门</font></td>

<td width="78" height="24">

<p align="center"><font size="2">合计</font></td>

<td width="413" height="24">

<p align="center"><font size="2">员工姓名</font></td>

</tr>



<%

hj=0 //设置变量,总人数合计初始值为0

//以下While循环按部门依次完成统计和报表

while (not rs.eof)

departmenttmp=rs("department") //设置临时变量,保存当前部门名称

sqlstr="select * from personnel where department='"&departmenttmp&"'" //找出当前部门的所有员工

Set conn = Server.CreateObject("ADODB.Connection") //再次连接数据库

conn.Open "data"

Set rss = Server.CreateObject("ADODB.Recordset")

rss.CursorType = 3

rss.LockType = 3

rss.Open sqlstr, conn

number=0 //设置变量,当前部门人数合计初始值为0

//以下While循环计算出当前部门人数合计