欢迎光临
我们一直在努力

在WEB环境下打印报表的crystal的解决方案,这里给出crystal的例子

建站超值云服务器,限时71元/月

<%@ language="vbscript" %>
<%
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
从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.mdb系统dsn

建立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"的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: http://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来指向子报表的数据

====================================================================================
重新得到记录和建立"page on demand" engine object
====================================================================================

on error resume next
session("orpt").readrecords

if err.number <> 0 then                                               
  response.write "error occurred reading records: " & err.description
  set session("orpt") = nothing
  set session("oapp") = nothing
  session.abandon
  response.end
else
  if isobject(session("opageengine")) then                              
      set session("opageengine") = nothing
  end if
  set session("opageengine") = session("orpt").pageengine
end if

实例化 crystal reports smart viewer

在asp环境中使用crystal reports automation server, 我们用相同的页来通过crystal web report server调用
"smart viewers"
有四个 crystal reports smart viewers:

1.  activex smart viewer
2.  java smart viewer
3.  html frame smart viewer
4.  html page smart viewer

你使用的smart viewer将与你数用的浏览器兼容的,例如你将不会使用java viewer如果你的浏览器
不支持java applets。为此,在这个demo中,我们已经选择定义一个viewer,你可以通过代码决定
提出要求的浏览器的支持兼容性,无论如何,这个功能继承自crystal reports automation server,
超过了这个示例的范围。

基于简单的理由,我们已经选择通过asp服务端包含的功能来实现这个功能,你可以选择不同的
smartviewer*.asp文件送到不同的浏览器,简单的用你想用的smart viewer asp文件来代替。

这些选择是: smartvieweractivex.asp, smartviewerjave.asp,smartviewerhtmlframe.asp,
and smartviewerhtmlpage.asp.注意,使用这些包含文件时,你必须把相应的.asp文件放在同主
asp文件相同的虚拟路径中。

*注意* 对于 smartviewerhtmlframe and smartviewerhtmlpage,你必须在虚拟路径中有framepage.asp
文件和toolbar.asp 文件

viewer = request.form("viewer")

上面读取被使用的viewer的值,并放入变量"viewer"中

if cstr(viewer) = "activex" then
%>
<!– #include file="smartvieweractivex.asp" –>
<%
elseif cstr(viewer) = "netscape plug-in" then
%>
<!– #include file="activexpluginviewer.asp" –>
<%
elseif cstr(viewer) = "java using browser jvm" then
%>
<!– #include file="smartviewerjava.asp" –>
<%
elseif cstr(viewer) = "java using java plug-in" then
%>
<!– #include file="javapluginviewer.asp" –>
<%
elseif cstr(viewer) = "html frame" then
    response.redirect("htmstart.asp")
else
    response.redirect("rptserver.asp")
end if
上面 if/then/else 被设计测试"viewer" 变量的值,基于这个值,送适当的crystal smart viewer
%>

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 在WEB环境下打印报表的crystal的解决方案,这里给出crystal的例子
分享到: 更多 (0)

相关推荐

  • 暂无文章