Push模式下水晶報表的若干問題


 
最近在使用水晶報表來製作報表,在製作的過程中使用Push模式來完成,遇到了一些問題,和大家共享一下。

簡介:首先介紹一下水晶報表的基本概念。

Crystal Reports是世界領先的桌面及 Web 報表工具,可用於處理數據庫,幫助用戶分析和解釋重要信息。使用 Crystal Reports 可以方便地創建簡單報表,同時它也提供了創建複雜或專用的報表所需的整套工具。

Crystal Reports 幾乎可以從任何數據源生成您需要的報表。內置報表專家在您生成報表和完成一般的報表任務過程中,會一步一步地指導您進行操作。報表專家通過公式、交叉表、子報表和設置條件格式幫助表現數據的實際意義,揭示可能被隱藏掉的重要關係。如果文字和數字確實不夠充分,則用地理地圖和圖形進行形象的信息交流。

Crystal Reports 的靈活性並未停留在創建報表這一功能上,您可以用各種各樣的格式發佈報表,包括用 Microsoft 的 Word 和 Excel 發佈、通過電子郵件甚至 Web 發佈。高級的 Web 報表功能允許工作組中的其他成員在他們自己的 Web 瀏覽器中查看或更新共享報表。

通過將 Crystal Reports 的報表處理功能整合到自己的數據庫應用程序中,應用程序和 Web 開發人員可以節省開發時間並滿足用戶的需求。Crystal Reports 支持大多數流行的開發語言,可以方便地在任何應用程序中添加報表。

模式

拉模式(PULL):在拉模型中,驅動程序將連接到數據庫並根據需要將數據“拉”進來。使用這種模型時,與數據庫的連接和爲了獲取數據而執行的 SQL 命令都同時由 Crystal Reports 本身處理,不需要開發人員編寫代碼。如果在運行時無須編寫任何特殊代碼,則使用拉模型。

推模式(PUSH):推模型需要開發人員編寫代碼以連接到數據庫,執行 SQL 命令以創建與報表中的字段匹配的記錄集或數據集,並且將該對象傳遞給報表。該方法使您可以將連接共享置入應用程序中,並在 Crystal Reports 收到數據之前先將數據篩選出來。在些這種情況下,通過使用連接共享以及限制記錄集合的大小,可以使用報表性能最大化。

本人制作水晶報表的步驟如下:

1.  製作與報表相符合的xsd文件;

2.       新建一個水晶報表文件,在該報表中通過以下步驟來添加數據集的定義:數據庫專家->創建新連接->數據庫文件->選擇第一步製作的xsd文件->添加xsd文件中的數據庫名稱;

3.       定義參數字段和計算字段,對報表的內容進行排版;

4.       新建一個WebForm,在WebForm中放置一個CrystalReportViewer控件,並設置該控件的屬性,例如本人的設置如下:

<CR:CrystalReportViewer ID="repView" runat="server" AutoDataBind="true"

            DisplayGroupTree="False" EnableDatabaseLogonPrompt="False"

            EnableParameterPrompt="False" HasCrystalLogo="False"

            HasDrillUpButton="False" HasGotoPageButton="False" HasRefreshButton="True"

            HasSearchButton="False" HasToggleGroupTreeButton="False" HasViewList="False"

            HasZoomFactorList="False" onreportrefresh="repView_ReportRefresh"

            ReuseParameterValuesOnRefresh="True" />

5.       在其它的頁面中設置報表的條件,通過Cookies將這些條件傳遞到報表預覽頁面,並打開報表預覽頁面;

6.       在報表預覽界面中獲取Cookies中的參數值,根據參數值生成相應的數據集(DataTable),並對數據集中的數據進行處理;

7.       加載相應的報表文件,將數據集與報表綁定,傳遞參數信息,預覽報表文件,代碼如下所示:

//設置報表信息並預覽

        documentInfor.Load(strReportPath);

        documentInfor.SetDataSource(searchResult);

        documentInfor.SetParameterValue("StartDate", beginDate.ToString("yyyy-MM-dd"));

        documentInfor.SetParameterValue("EndDate", endDate.ToString("yyyy-MM-dd"));

        documentInfor.SetParameterValue("StartReserID", beginReserID);

        documentInfor.SetParameterValue("EndReserID", endReserID);

        repView.ReportSource = documentInfor;

在頁面加載部分的代碼如下:

if (!IsPostBack)

        {

            if (!CreateReport()) Response.Write("報表預覽失敗!");

}

在執行時,第一次顯示的報表內容是正確的,但是進行任何工具欄上的操作之後,總是顯示輸入參數值的窗口,爲了將該窗口去除,設置EnableParameterPrompt="False"和ReuseParameterValuesOnRefresh="True",此時要求輸入參數信息的窗口不出現了,但是頁面直接顯示缺少參數值,對程序進行分析和跟蹤後發現,原來在點擊水晶報表的工具欄時,頁面要進行刷新,刷新時報表中原有的信息都將丟失,包括參數信息和數據集信息,而代碼中的頁面加載代碼中沒有對這部份內容進行處理,所以需要對頁面加載部分的內容進行修改,修改後的代碼如下:

if (!IsPostBack)

        {

            if (!CreateReport()) Response.Write("報表預覽失敗!");

        }

        else

        {

            SetReportInfor();//設置報表信息並預覽

    }

由於刷新時不需要重新查詢數據庫,所以將相關的數據集變量和參數變量定義爲全局私有變量,在第一次生成報表時對這些變量進行賦值,在刷新時直接使用即可。

在剛開始定義時直接定位爲普通私有變量,結果發現在刷新時,這些變量的值都已經丟失,必須使用Sessions或者Viewstate進行緩存纔可以,不但影響傳輸量還會增加代碼量,如果將這些變量定義爲static變量,則不會存在這個問題,原來設置的信息會存在,不會丟失。

CrystalReportViewer控件提供的事件中包括工具欄上的一些按鈕點擊後觸發的事件,包括Navigate,Refresh,Search,Zoom等,我們可以在這些事件中對工具欄上的按鈕功能進行定義,例如可以重新定義刷新按鈕的功能,但是相應地,這些按鈕點擊後還是會執行頁面的刷新操作。

水晶報表的打印操作是將報表的信息輸出到PDF文件中或者Activex中進行打印的,而輸出時可以選擇多種文件格式,例如pdf,doc,excel,rpt,rtf等。

本人所使用的開發工具爲vs2008,水晶報表爲系統自帶的版本。

 

發佈了43 篇原創文章 · 獲贊 0 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章