給個例子看看

<  %@  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服务端包含的功能来实现这个功能,你可以选择不同的
  'SmartVie
posted on 2005-10-05 16:02  James Wong   阅读(651)  评论(1)    收藏  举报