WEB环境下打印报表的crystal的解决方案

1@ LANGUAGE="VBSCRIPT" 
  1   
  2' = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =   
  3' 从ADO Recordset直接生成报表   
  4' = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =   
  5'   
  6' 概念:   
  7'   
  8' 这个应用被设计成演示怎样从ADO Recordset生成报表。我们首先建立ADO Connection和   
  9' Recordset对象,然后用SQL语句从数据库中生成一个记录集。然后我们建立一个Crystal   
 10' Reports对象,并把这个这个对象指向ADO recordset。最后我们将Crystal Reports   
 11' Smart Viewer送到客户端显示这个报表。   
 12  
 13' 第一步:建立ADO Connection and Recordset   
 14  
 15' 一个ADO的数据库连接就是通过你已经存在的ODBC数据源(DSN)从象ASP这样的应用中来访问   
 16' 数据的连接。为了达到这个例子的目的,我们将使用到用一个叫做"Xtreme Sample Data"的   
 17' 连到Access数据库Xtreme.mdb系统DSN   
 18  
 19' 建立ADO数据库连接:   
 20  
 21Set oConn = Server.CreateObject("ADODB.Connection")   
 22  
 23'这里建立叫做"oConn"的ADO connection,我们将用这个ADO connection对象连接到上述的DSN   
 24  
 25'用 ADO connection 必须先要打开它:   
 26  
 27oConn.Open("Xtreme Sample Database")   
 28  
 29'这里打开我们的ODBC的数据源,这个数据源指向Access数据库Xtreme.mdb   
 30  
 31'现在我们必须建立一个RecordSet对象:   
 32  
 33set session("oRs") = Server.CreateObject("ADODB.Recordset")   
 34  
 35'在上面我们建立了一个session("oRs"). 这个session中存放一个RecordSet对象   
 36'将要包含用SQL语句返回的数据   
 37  
 38'定义和生成 recordset:   
 39  
 40session("oRs").ActiveConnection = oConn   
 41'定义这个recordset将要使用的Connection 对象   
 42  
 43session("oRs").Open "SELECT [Product ID], [Product Name] FROM Product"   
 44  
 45'用SQL语句从Xtreme.mdb库的"Product"表中取出两个字段   
 46  
 47'===================================================================================   
 48'建立Crystal Reports 对象   
 49'===================================================================================   
 50'你可能注意到,Crystal Reports对象被设为session,这是因为已经需求就会被一个叫做   
 51'"rptserver.asp"的ASP处理,为了让rptserver.asp能非常容易地访问Crystal Report对象,   
 52'我们把这些对象都设为session。这样任何ASP页都运行在这个session中,都能够直接访问这些对象   
 53  
 54reportname = "ADORecordset.rpt"   
 55  
 56'这里建立一个字符串变量,指向Crystal Report文件(.rpt file),再用这段代码的时候   
 57'换成你的Crystal Report文件名。   
 58  
 59'建立APPLICATION 对象   
 60If Not IsObject (session("oApp")) Then   
 61Set session("oApp") = Server.CreateObject("CrystalRuntime.Application")   
 62End If   
 63  
 64'这个"if/end if" 结构用来每个session只建立一次 Crystal Reports Application对象o   
 65'建立application对象 - session("oApp"),将Crystal Report Design Component   
 66'automation server (craxdrt.dll)载入内存。   
 67'   
 68'我们建立session变量是为了再asp session过程中都使用它们.这样可以减少将craxdrt.dll   
 69'载入和卸载的系统开销。在一个session中一旦建立了一个application对象我们就可以不必   
 70'重建对象运行更多的报表 。   
 71  
 72' 建立REPORT 对象   
 73'   
 74'这个REPORT 对象被Application的OpenReport方法建立   
 75  
 76Path = Request.ServerVariables("PATH_TRANSLATED")   
 77While (Right(Path, 1) <> "\" And Len(Path) <> 0)   
 78iLen = Len(Path) - 1   
 79Path = Left(Path, iLen)   
 80Wend   
 81response.Write path   
 82'这个"While/Wend" 循环被用来将当前文件从虚拟路径(eg: http://Domain/Dir)转换成Crystal   
 83' Report file的物理路径(eg: C:\\)   
 84  
 85'打开REPORT (先清除以前的任何对象)   
 86  
 87If IsObject(session("oRpt")) then   
 88Set session("oRpt") = nothing   
 89End if   
 90  
 91On error resume next   
 92  
 93Set session("oRpt") = session("oApp").OpenReport(path & reportname, 1)   
 94'这里用"PATH" 和 "reportname"变量计算出Crystal Report file的物理路径, 并打开它。   
 95  
 96If Err.Number <> 0 Then   
 97Response.Write "Error Occurred creating Report Object: " & Err.Description   
 98Set Session("oRpt") = nothing   
 99Set Session("oApp") = nothing   
100Session.Abandon   
101Response.End   
102End If   
103  
104'这个 On erro resume next 块检查在建立report对象时出现的任何错误,我们正明确的捕获任何   
105'错误如果视图超过许可协议规定的最大并发用户数。   
106  
107'注意,我们并不只建立一次report对象。这是因为有了ASP session 你可以处理更多的超过一个报表   
108' rptserver.asp将仅仅处理一个叫session("oRpt")的report对象。因此,你如果希望处理多个报表   
109'的话,就要建立一个新的session("oRpt")对象。   
110  
111session("oRpt").MorePrintEngineErrorMessages = False   
112session("oRpt").EnableParameterPrompting = False   
113  
114'这里不允许错误报告机制,包括Crystal Report Design Component automation server (craxdrt.dll)   
115'内建的错误报告,这是因为两个原因:   
116'1. 打印引擎是在Web Server上执行的, 所以任何错误信息都将被显示在服务端,如果在服务端报告出错了,   
117' 打印引擎将停止运作,你的应用将被“挂起”   
118'2. rptserver.asp 已经有一些错误处理逻辑在里面了,可以捕获任何非致命错误,并显示在客户端。   
119'   
120'**重要** 即使我们禁止了服务端引擎的错误处理,但是致命错误还是会在Web Server服务端被捕获,并   
121'显示出错误提示对话框。所以我们建议,你在"World Wide Web Publishing" service (IIS service)设置   
122'"Allow Service to Interact with Desktop"选项。这样如果你的ASP应用死了,你将能看到错误提示。   
123  
124'======================================================================================   
125'======================================================================================   
126  
127'现在我们必须告诉report在ADO recordset中的数据   
128  
129'report建立在动态的ADO recordset的基础,我们必须基于我们建立的recordset来建立report   
130'然后在运行时我们告诉report数据在ADO Record set中。report通常依靠数据库结构文件   
131'(ADORecordset.ttx)建立,这个.ttx文件包含recordset的结构,不包含实际数据。   
132  
133'一个Crystal Report完全依赖将要使用的Report的数据结构,因此在运行时你的数据库结构文件(ttx file)   
134'或真实反应ADO recordset包含的数据的DSN是十分重要的   
135  
136session("oRpt").DiscardSavedData   
137set Database = session("oRpt").Database   
138'实例化report用到的数据库   
139  
140set Tables = Database.Tables   
141'实例化数据库对象中的表   
142  
143set Table1 = Tables.Item(1)   
144'实例化第一张表,在这个实例中这个表对象指向ADORecordset.ttx文件   
145  
146Table1.SetPrivateData 3, session("oRs")   
147  
148'"SetPrivateData"告诉report现在数据源是 recordset,现在report将要显示的数据包含在session("oRs")中   
149'如果你的report中包含子报表将提供不同的recordset来指向子报表的数据   
150'   
151'====================================================================================   
152'重新得到记录和建立"Page on Demand" Engine Object   
153'====================================================================================   
154  
155On Error Resume Next   
156session("oRpt").ReadRecords   
157  
158If Err.Number <> 0 Then   
159Response.Write "Error Occurred Reading Records: " & Err.Description   
160Set Session("oRpt") = nothing   
161Set Session("oApp") = nothing   
162Session.Abandon   
163Response.End   
164Else   
165If IsObject(session("oPageEngine")) Then   
166set session("oPageEngine") = nothing   
167End If   
168set session("oPageEngine") = session("oRpt").PageEngine   
169End If   
170  
171' 实例化 CRYSTAL REPORTS SMART VIEWER   
172'   
173'在ASP环境中使用Crystal Reports automation server, 我们用相同的页来通过Crystal Web Report Server调用   
174'"Smart Viewers"   
175'有四个 Crystal Reports Smart Viewers:   
176'   
177'1. ActiveX Smart Viewer   
178'2. Java Smart Viewer   
179'3. HTML Frame Smart Viewer   
180'4. HTML Page Smart Viewer   
181'   
182'你使用的Smart Viewer将与你数用的浏览器兼容的,例如你将不会使用Java viewer如果你的浏览器   
183'不支持Java applets。为此,在这个DEMO中,我们已经选择定义一个viewer,你可以通过代码决定   
184'提出要求的浏览器的支持兼容性,无论如何,这个功能继承自Crystal Reports automation server,   
185'超过了这个示例的范围。   
186  
187'基于简单的理由,我们已经选择通过ASP服务端包含的功能来实现这个功能,你可以选择不同的   
188'SmartViewer*.asp文件送到不同的浏览器,简单的用你想用的Smart Viewer asp文件来代替。   
189  
190'这些选择是: SmartViewerActiveX.asp, SmartViewerJave.asp,SmartViewerHTMLFrame.asp,   
191'and SmartViewerHTMLPAge.asp.注意,使用这些包含文件时,你必须把相应的.ASP文件放在同主   
192'ASP文件相同的虚拟路径中。   
193'   
194'*注意* 对于 SmartViewerHTMLFrame and SmartViewerHTMLPage,你必须在虚拟路径中有framepage.asp   
195'文件和toolbar.asp 文件   
196  
197viewer = Request.Form("Viewer")   
198  
199'上面读取被使用的viewer的值,并放入变量"viewer"中   
200  
201If cstr(viewer) = "ActiveX" then   
1   
2ElseIf cstr(viewer) = "Netscape Plug-in" then   
1   
2ElseIf cstr(viewer) = "Java using Browser JVM" then   
1   
2ElseIf cstr(viewer) = "Java using Java Plug-in" then   
1   
2ElseIf cstr(viewer) = "HTML Frame" then   
3Response.Redirect("htmstart.asp")   
4Else   
5Response.Redirect("rptserver.asp")   
6End If   
7'上面 If/Then/Else 被设计测试"viewer" 变量的值,基于这个值,送适当的Crystal Smart Viewer   
Published At
Categories with Web编程
Tagged with
comments powered by Disqus