欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[代码]在WEB环境下打印报表的crystal的解决方案

程序员文章站 2022-08-04 16:54:51
<%@ language="vbscript" %> <% ’ = = = = = = =...

<%@ language="vbscript" %>
<%
’ = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
’ 该实例直接使用asp编写报表打印程序
’ 从ado recordset直接生成报表
’ = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 

’ 概念:
’ 
’ 这个应用被设计成演示怎样从ado recordset生成报表。我们首先建立ado connection和
’ recordset对象,然后用sql语句从中生成一个记录集。然后我们建立一个crystal 
’ reports对象,并把这个这个对象指向ado recordset。最后我们将crystal reports
’ smart viewer送到客户端显示这个报表。

’ 第一步:建立ado connection and recordset

’ 一个ado的数据库连接就是通过你已经存在的odbc数据源(dsn)从象asp这样的应用中来访问
’ 数据的连接。为了达到这个例子的目的,我们将使用到用一个叫做"xtreme sample data"的
’ 连到access(小型网站之最爱)数据库xtreme.mdbdsn

’ 建立ado数据库连接:

set oconn = server.createobject("adodb.connection")

’这里建立叫做"oconn"的ado connection,我们将用这个ado connection对象连接到上述的dsn 

’用 ado connection 必须先要打开它:

oconn.open("xtreme sample database")

’这里打开我们的odbc的数据源,这个数据源指向access(小型网站之最爱)数据库xtreme.mdb

’现在我们必须建立一个recordset对象:

set session("ors") = server.createobject("adodb.recordset")

’在上面我们建立了一个session("ors"). 这个session中存放一个recordset对象
’将要包含用sql语句返回的数据

’定义和生成 recordset:

session("ors").activeconnection = oconn
’定义这个recordset将要使用的connection 对象

session("ors").open "select [product id], [product name] from product"

’用sql语句从xtreme.mdb库的"product"表中取出两个字段

’===================================================================================
’建立crystal reports 对象
’===================================================================================
’你可能注意到,crystal reports对象被设为session,这是因为已经需求就会被一个叫做
’"rptserver."的asp处理,为了让rptserver.asp能非常容易地访问crystal report对象,
’我们把这些对象都设为session。这样任何asp页都运行在这个session中,都能够直接访问这些对象

reportname = "adorecordset.rpt"

’这里建立一个字符串变量,指向crystal report文件(.rpt file),再用这段代码的时候
’换成你的crystal report文件名。

’建立application 对象 
if not isobject (session("oapp")) then 
set session("oapp") = server.createobject("crystalruntime.application")
end if 

’这个"if/end if" 结构用来每个session只建立一次 crystal reports application对象o
’建立application对象 - session("oapp"),将crystal report design component 
’automation server (craxdrt.dll)载入内存。

’我们建立session变量是为了再asp session过程中都使用它们.这样可以减少将craxdrt.dll 
’载入和卸载的系统开销。在一个session中一旦建立了一个application对象我们就可以不必
’重建对象运行更多的报表 。

’ 建立report 对象
’ 
’这个report 对象被application的openreport方法建立

path = request.servervariables("path_translated") 
while (right(path, 1) <> "" and len(path) <> 0) 
ilen = len(path) - 1 
path = left(path, ilen) 
wend 
response.write path 
’这个"while/wend" 循环被用来将当前文件从虚拟路径(eg: https://domain/dir)转换成crystal
’ report file的物理路径(eg: c:)

’打开report (先清除以前的任何对象) 

if isobject(session("orpt")) then
set session("orpt") = nothing
end if

on error resume next

set session("orpt") = session("oapp").openreport(path & reportname, 1)
’这里用"path" 和 "reportname"变量计算出crystal report file的物理路径, 并打开它。

if err.number <> 0 then
response.write "error occurred creating report object: " & err.description
set session("orpt") = nothing
set session("oapp") = nothing
session.abandon
response.end
end if

’这个 on erro resume next 块检查在建立report对象时出现的任何错误,我们正明确的捕获任何
’错误如果视图超过许可协议规定的最大并发用户数。

’注意,我们并不只建立一次report对象。这是因为有了asp session 你可以处理更多的超过一个报表
’ rptserver.asp将仅仅处理一个叫session("orpt")的report对象。因此,你如果希望处理多个报表
’的话,就要建立一个新的session("orpt")对象。

session("orpt").moreprintengineerrormessages = false
session("orpt").enableparameterprompting = false

’这里不允许错误报告机制,包括crystal report design component automation server (craxdrt.dll)
’内建的错误报告,这是因为两个原因:
’1. 打印引擎是在web server上执行的, 所以任何错误信息都将被显示在服务端,如果在服务端报告出错了,
’ 打印引擎将停止运作,你的应用将被“挂起”
’2. rptserver.asp 已经有一些错误处理逻辑在里面了,可以捕获任何非致命错误,并显示在客户端。

’**重要** 即使我们禁止了服务端引擎的错误处理,但是致命错误还是会在web server服务端被捕获,并
’显示出错误提示对话框。所以我们建议,你在"world wide web publishing" service (iis service)设置
’"allow service to interact with desktop"选项。这样如果你的asp应用死了,你将能看到错误提示。

’======================================================================================
’======================================================================================

’现在我们必须告诉report在ado recordset中的数据

’report建立在动态的ado recordset的基础,我们必须基于我们建立的recordset来建立report
’然后在运行时我们告诉report数据在ado record set中。report通常依靠数据库结构文件
’(adorecordset.ttx)建立,这个.ttx文件包含recordset的结构,不包含实际数据。

’一个crystal report完全依赖将要使用的report的数据结构,因此在运行时你的数据库结构文件(ttx file)
’或真实反应ado recordset包含的数据的dsn是十分重要的

session("orpt").discardsaveddata
set database = session("orpt").database
’实例化report用到的数据库

set tables = database.tables
’实例化数据库对象中的表

set table1 = tables.item(1)
’实例化第一张表,在这个实例中这个表对象指向adorecordset.ttx文件

table1.setprivatedata 3, session("ors") 

’"setprivatedata"告诉report现在数据源是 recordset,现在report将要显示的数据包含在session("ors")中
’如果你的report中包含子报表将提供不同的recordset来指向子报表的数据

’================================================================