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

2018-09-06 10:58

阅读:598

  <%@LANGUAGE=VBSCRIPT%>
<%
’==================================
’该实例直接使用ASP编写报表打印程序
’ 从ADORecordset直接生成报表
’==================================

’概念:

’这个应用被设计成演示怎样从ADORecordset生成报表。我们首先建立ADOConnection和
’Recordset对象,然后用SQL语句从数据库中生成一个记录集。然后我们建立一个Crystal
’Reports对象,并把这个这个对象指向ADOrecordset。最后我们将CrystalReports
’SmartViewer送到客户端显示这个报表。

’第一步:建立ADOConnectionandRecordset

’一个ADO的数据库连接就是通过你已经存在的ODBC数据源(DSN)从象ASP这样的应用中来访问
’数据的连接。为了达到这个例子的目的,我们将使用到用一个叫做XtremeSampleData的
’连到access(小型网站之最爱)数据库Xtreme.mdb系统DSN

’建立ADO数据库连接:


’这里建立叫做oConn的ADOconnection,我们将用这个ADOconnection对象连接到上述的DSN

’用ADOconnection必须先要打开它:

oConn.Open(XtremeSampleDatabase)

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

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

setsession(oRs)=Server.CreateObject(ADODB.Recordset)

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

’定义和生成recordset:

session(oRs).ActiveConnection=oConn
’定义这个recordset将要使用的Connection对象

session(oRs).OpenSELECT[ProductID],[ProductName]FROMProduct

’用SQL语句从Xtreme.mdb库的Product表中取出两个字段

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

reportname=ADORecordset.rpt

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

’建立APPLICATION对象
IfNotIsObject(session(oApp))Then
Setsession(oApp)=Server.CreateObject(CrystalRuntime.Application)
EndIf

’这个if/endif结构用来每个session只建立一次CrystalReportsApplication对象o
’建立application对象-session(oApp),将CrystalReportDesignComponent
’automationserver(craxdrt.dll)载入内存。

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

’建立REPORT对象

’这个REPORT对象被Application的OpenReport方法建立

Path=Request.ServerVariables(PATH_TRANSLATED)
While(Right(Path,1)<>AndLen(Path)<>0)
iLen=Len(Path)-1
Path=Left(Path,iLen)
Wend
response.Writepath
’这个While/Wend循环被用来将当前文件从虚拟路径(eg:转换成Crystal
’Reportfile的物理路径(eg:C:)

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

IfIsObject(session(oRpt))then
Setsession(oRpt)=nothing
Endif

Onerrorresumenext

Setsession(oRpt)=session(oApp).OpenReport(pathreportname,1)
’这里用PATH和reportname变量计算出CrystalReportfile的物理路径,并打开它。

IfErr.Number<>0Then
Response.WriteErrorOccurredcreatingReportObject:Err.Description
SetSession(oRpt)=nothing
SetSession(oApp)=nothing
Session.Abandon
Response.End
EndIf

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

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

session(oRpt).MorePrintEngineErrorMessages=False
session(oRpt).EnableParameterPrompting=False

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

’**重要**即使我们禁止了服务端引擎的错误处理,但是致命错误还是会在WebServer服务端被捕获,并
’显示出错误提示对话框。所以我们建议,你在WorldWideWebPublishingservice(IISservice)设置
’AllowServicetoInteractwithDesktop选项。这样如果你的ASP应用死了,你将能看到错误提示。

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

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

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

’一个CrystalReport完全依赖将要使用的Report的数据结构,因此在运行时你的数据库结构文件(ttxfile)
’或真实反应ADOrecordset包含的数据的DSN是十分重要的

session(oRpt).DiscardSavedData
setDatabase=session(oRpt).Database
’实例化report用到的数据库

setTables=Database.Tables
’实例化数据库对象中的表

setTable1=Tables.Item(1)
’实例化第一张表,在这个实例中这个表对象指向ADORecordset.ttx文件

Table1.SetPrivateData3,session(oRs)

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

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


评论


亲,登录后才可以留言!