當前位置:編程學習大全網 - 源碼下載 - IFIX中如何引用CryStal Report

IFIX中如何引用CryStal Report

在這裏我主要想和大家討論壹下Crystal Report的總體框架模式方面的問題,重點是如何使用VB有效的融合報表和數據,快速的進行報表開發工作。希望拋磚引玉,找到幾種最好最快的開發模式。

本文暫不涉及技術細節,所以您可能覺得太過簡單。但這樣的問題的確是我們開發中的第壹號大問題。在以後的討論中,我們可以針對具體的問題討論具體的技術細節。

我準備了壹份源代碼,已經發給了部分網友,但是沒有做詳細的測試。我準備在明後天做完測試,如果各位有需要的話,應該在星期壹左右可以發給妳們(唉,星期六星期天還要加班!)。

註意:有需要的朋友請跟帖說明,不要只給我發短消息。

縮寫語說明

RPT Crystal Report Template File. 使用Crystal Report設計器生成的報表樣式和模板文件,後綴名為RPT

RDC Crystal Report Designer Component. Crystal Report的對象模型,用於在VB中操作Crystal Report.

CRV Crystal Report Viewer. OCX 控件,用於在VB中提供報表預覽界面。

CRC Crystal Report Control. OCX 控件,在Crystal Report 8.0以前用於在VB中提供報表預覽界面,現已被CRV取代。

CDO Crystal Data Source Object. Crystal Report 提供的數據源對象,用於創建與數據庫無關的動態數據源。

壹,如何動態獲取數據,生成報表?

報表的壹個主要特征就是根據事先設計好的模板樣式和運行時的動態數據生成壹份可查看與打印的文檔。

壹般來說,VB的程序中整個報表流程中的主線,由它來對Crystal Report及其它工具發號施令,實現用戶需求。

VB是通過RDC模型來操作CrystalReport的。通常有如下兩種模式生成報表:

1,VB-RPT-DB

VB調用RPT文件,RPT文件查詢數據庫得到數據,生成報表。此方法的詳細流程如下:

1)在Crystal Report 中設計好RPT文件,設計時可在CrystalReport中連接到數據庫,得到查詢數據,即時預覽報表。

2) 在VB中,通過RDC模型打開RPT文件,並將運行時和數據庫連接所需的信息,如數據庫名,用戶,密碼等傳給RPT文件,如果RPT文件中有參數,還要傳入參數。

3)RPT文件連接到數據庫,執行查詢得到數據,生成報表。

4) 在VB中,通過CRV控件打開報表進行預覽或通過RDC模型進行打印,導出等操作。

2,VB-DB-RPT

VB先查詢數據庫得到結果集,再打開RPT文件並傳入結果集,生成報表。此方法詳細流程如下:

1)在Crystal Report 中設計好RPT文件。由於此時結果集還未生成,只能使用TTX文件做為虛擬數據源,以便讀取字段信息。所以在設計RPT文件之前,還要根據最終的結果集結構生成壹個TTX文件。

2)在VB中,連接到數據庫,執行查詢,得到結果集。

3)在VB中,通過RDC模型打開RPT文件,傳入結果集和參數,生成報表。

4)在VB中,通過CRV控件打開報表進行預覽或通過RDC模型進行打印,導出等操作。

顯然,VB-RPT-DB模式遠優於VB-DB-RPT模式,這體現在如下幾個方面:

1,設計時,VB-DB-RPT模式壹般要求生成壹個和最終結果集字段結構完全壹致的TTX文件做為虛擬數據源,增大的開發和維護的工作量,而且還不能即時預覽生成的報表。VB-RPT-DB模式則是直接和數據庫相連,無需TTX文件,還能看到最終數據。

2,運行時,VB-DB-RPT模式在得到結果集後,需要在VB中建立相應的結果集對象,並將其傳入RPT文件,與VB-RPT-DB模式相比多了壹個很大的對象--結果集對象。

3,運行時,VB-DB-RPT模式的結果集從DB傳到VB,再傳到RPT, 而VB-RPT-DB模式的結果集直接從DB傳到RPT,少了壹次大的數據傳遞。

4, 開發時,VB-DB-RPT模式壹般每加壹個報表,就要加兩段代碼:查詢結果集和生成報表。而VB-RPT-DB模式可以很方便的實現壹個接口應對所有的報表,新加報表幾乎無需增加VB代碼。二者的代碼量不可同日而語。

二、如何生成報表模板文件?

設計報表格式是所有報表工作的第壹步。在CrystalReport中,有兩個地方可以設計報表,Crystal Report集成設計器和內嵌在VB中的報表設計器。我個人覺得,內嵌報表設計器的做法弊遠大於利,不推薦使用。

三,如何查詢DB,得到運行時數據。

通過VB查詢DB得到結果集的方式有很多種,大家都很熟悉。通過RPT查詢DB的方式主要有:存儲過程,視圖,表, Crystal Query, 直接SQL查詢。

其中最簡單的莫過於直接連接到表,進行表查詢。可是壹般的報表都不會只涉及到壹個表。在RPT文件中進行多表查詢並設置查詢條件的方法雖然簡單,但是分散了整體的查詢邏輯,而且操作煩瑣,不是壹個好辦法。視圖和存儲過程是最好的選擇,不過視圖在性能上不及存儲過程,所以我推薦使用存儲過程。

存儲過程和視圖是放在數據庫中的。如果不允許或不能在數據庫中建立視圖和存儲過程等,還可以利用Crystal Report自已的SQL查詢功能,將完整的SQL查詢語句寫在RPT文件中。

從Crystal Report自己的說明來看,Crystal Query文件就像是Crystal Report自己的存儲過程。不過這個工具不包含在Crystal Report 9中。Crystal Report 官方網站提供了單獨的免費下載。這個工具有兩個限制:在Crystal Queryk中的每個字段,字段值長度不能超過20個字符, 總字段數據也不能超過20個。我是從Crystal Report的幫助文件中看到這些信息的。如是真的話,Crystal Query就沒有什麽競爭力了。Crystal Report 也支持在設計RPT文件時直接寫SQL,還可以帶參數。這是個不錯的功能。不知道是不是也有上述兩個限制。

我沒有仔細測試Crystal Report內嵌SQL查詢的功能,在此不宜多加評論。但我強烈推薦使用數據庫的存儲過程和視圖。它有效的分離的報表工作中的邏輯和設計工作,利於分工合作,也利於編護和升級。

使用Oracle的存儲過程有如下限制,SQL Server 類似。

> 要使用本地連接或ODBC連接到Oracle,不能使用OLE DB連接。建議使用本地連接。

> 存儲過程必須放到壹個包內。結果集遊標必須在包頭聲明。

> 存儲過程只能有輸入參數。

> 存儲過程只能返回壹個結果集,以輸入輸出型(IN OUT)的遊標參數形式返回。

> 結果集中的字段名稱和類型通過打開遊標的SQL語句直接確定。所以不能使用動態SQL,也不能通過嵌套調用存儲過程的方式來將數據裝入遊標。

四,如何傳遞多個數據源和參數。

如果所有的數據源都是VB-RPT-DB模式,那麽VB要做的連接工作就很簡單,將壹個動態建立的連接傳給RDC就可以了。RDC再將連接傳給每壹個RPT中存在的數據源。即便在報表包含子報表時也是如此的簡單。

如果數據源是VB-DB-RPT模式,或都是好幾種類型混合的。最好在設計報表的時候給每個數據源設定壹個唯壹名字(包括子報表的數據源),RDC就跟據名字來給每個數據源傳遞連接信息或結果集。

事實上,在壹個報表中即便存在多個數據源,由於Crystal Report要求互相之間要有主鍵的對應關系,而不能壹個數據源處理完後再處理另壹個數據源,所以這些多個的數據源在本質上仍然是壹個數據源。我做過很多復雜的報表,很少碰到要用到多個數據源的。使用子報表的情況倒是占了壹半左右。

報表中的所參數都可以從VB中傳入,建議也為所有的參數(包括子報表的參數)設定壹個唯壹的名字,由RDC跟據名字來傳值,這樣就不用理會報表中有哪些子報表了。

在處理大量的報表時,將報表的RPT文件路徑及其參數信息存入數據庫,就可以實現新增報表無須修改VB程序。壹般而言,壹個系統中的絕大部分報表,其參數都差不多,很容易控制。

2.1 準備壹個通用模板。

壹個項目中的所有報表,通常有壹個統壹的格式和標準。準備壹個帶有最基本格式和標準的RPT文件作為模板是個聰明的做法。不過Crystal Report中的模板向導功能並不是很強,不如直接創建壹個RPT文件,然後復制來得快。

2.2 在Crystal Report 編輯環境中設定字段和數據的缺省模式。

在Crystal Report的選項菜單(文件->選項)中設定要不同字段,不同數據類型的顯示格式和字體,這壹點非常重要。它可以最大程度的保證的模板設計完全符合標準。減少重復勞動。

在文件->報表選項中也有三項很重要的設置:

1) 將數據庫的NULL值轉為默認值, 選中。

2) 將其它NULL值轉為默認值, 選中。

3) 若無記錄則取消打印, 不選。

2.3 選擇壹個可以同時支持中英文的字體。

字體的選擇直接影響版面效果。有的字體不支持中文,顯示中文時就會出現亂碼。有的中文字體在純英文下不能使用。有的字體在Windows 2000/XP的中英文環境中大小不同。有的字體不是Windows 自帶字體。

最好在各種環境下試過後再決定采用哪種字體。

2.4 使用公式字段,匯總字段,運行時總計字段,以及變量實現數據的頁面邏輯。

Crystal Report中的公式其實就是壹個表達式,它通過使用Crystal Report中的函數和操作符來操作數據源中的數據以得到最終想要顯示的字段。在公式中還可以使用變量。

在Crystal Report中有兩種比較特別的公式:匯總公式和運行時總計公式。這兩種公式都可以在公式編輯器(CR稱之為公式工作室)中編輯,但比較復雜。CR提供了更簡單的方法:在報表中選中要統計的字段,點出右鍵菜單,選中"插入…"項,就會彈出兩個子菜單項:匯總,運行總計。

匯總字段用於對特定的字段進行按組或全局的匯總統計。

運行時總計字段在匯總字段的基礎上加入條伯控制,使得在報表中跟據壹個字段的不同取值分別得到另壹個字段的總計數據成為可能。

在公式編輯器中可以使用變量。按作用域分,有局部變量,全局變量和***享變量。局部變量只在壹個公式或函數中有效。全局變量在整個報表(但不包含子報表)中有效,***享變量在壹個報表文件,包括子報表中都有效。

2.5 使用子報表。

跟據以往的項目經驗,有壹半左右的報表要用到子報表。在Crystal Report中,壹個報表事實上只能處理壹個結果集。存在多個結果集,要求互相之間有主鍵的對應關系,在本質上仍然是壹個。如果報表要顯示多個部分,就必須使用子報表。除沒有單獨的頁眉和頁腳外,子報表具有完整報表的所有特性。

頁面顯示的時候,子報表的寬度會受到其在主報表中的寬度限制,所以在把子報表放入主報表的時候,壹定要給予足夠的寬度。

主報表和子報表之間可以通過字段-參數的關系進行鏈接。即將主報表中的字段作為子報表的參數。

2.6 使用交叉表。

設有A,B兩個字段,要求在報表中將A的全部值顯示在第壹列的列頭,將B的全部值顯示在每壹行的行首,在行和列的主體部分顯示出跟據相應的A值和B值計算出來的結果,如下圖所示。這就是壹個交叉表。

交叉表中Crystal Report 中的壹個對象,可以很簡單的創建,註意交叉表應放到報表的報表頁腳部分(Report Footer),不能放在細節部分或頁眉。否則會導致重復顯示和數據不全。

Crystal Report對交叉表的分頁功能支持不佳,所以要盡可能的不讓數據超過壹頁。

2.7 使用分欄表。

所謂分欄表,就是把頁面分成幾欄來顯示結果。這樣就可以在同壹行顯示多條記錄。

在節專家中選中詳細資料節,註意只能選詳細資料節的總節,不能選子節,就可以發出多欄格式化的選項,選中後界面上會多出壹個布局的選項卡。在這個選項卡中就可以設置分欄。

2.8 最好不要在每頁顯示總頁數。

顯示總頁數會導致報表多壹次全程運算,嚴重降低性能,最好不要在每頁都顯示總頁數。

2.9 把報表打印出來檢查格式與數據。

這是個要訣,不打印出來檢查,妳的格式與數據很難保證沒有錯誤。

2.10 設置字段或小節的條件顯示條件

Crystal Report中的所有對象,大到壹個小節,小到壹個字段,都可限定顯示的格式。在這些對象的格式化編輯器中,有個抑制顯示的選項,其右有壹個公式編輯按鈕,點擊這個按鈕就可以進入公式編輯器,編輯壹個邏輯表達式來控制抑制顯示的條件。註意,只有勾上抑制顯示的選項,條件公式才會起作用。

2.11 對字段進行有條件的格式化

如果碰到類似這樣要求,就要對字段進行有條件的格式化:將所有值大於1000的A字段加下劃線顯示。

對字段的有條件格式化只能在公式編輯器(公式工作室)中實現。

2.12 在導出為RTF是要註意字段對齊。

如果報表的字段是隨意放置的,在導出RTF文件是將會出現位置的嚴重錯亂。

  • 上一篇:山西青年職業學院的專業介紹
  • 下一篇:股票選擇源代碼編輯器
  • copyright 2024編程學習大全網