当前位置: 移动技术网 > IT编程>开发语言>.net > [代码]在WEB环境下打印报表的crystal的解决方案

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

2018年10月07日  | 移动技术网IT编程  | 我要评论

台州现冒牌募捐箱,疾速特攻2,酷蓟州生活网

<%@ 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来指向子报表的数据

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网