在WEB環境下列印報表的crystal的解決方案

來源:互聯網
上載者:User
http://www.sqlsky.com/asp/070730/10271/

http://www.dmtzj.com/shownews.asp?newsid=240

  <%@ 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
%>

<%
ElseIf cstr(viewer) = "Netscape Plug-in" then
%>

<%
ElseIf cstr(viewer) = "Java using Browser JVM" then
%>

<%
ElseIf cstr(viewer) = "Java using Java Plug-in" then
%>

<%
ElseIf cstr(viewer) = "HTML Frame" then
Response.Redirect("htmstart.asp")
Else
Response.Redirect("rptserver.asp")
End If
‘上面 If/Then/Else 被設計測試"viewer" 變數的值,基於這個值,送適當的Crystal Smart Viewer
%>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.