2009年3月12日 星期四

Visual Basic 6 + Crystal Report XI

筆者這幾天接了一個工作, 要用上 VB6 + CRXI. 回想當初筆者還要用 CR 做開發是什麼時候 >_<, 屈指一算可是 5,6 年前的事情. 筆者的那個年代還是用 CR7 或 CR8.5 做開發的, 新一點的 CR9 都有試過~ 可世界實在變得太快了, 最新的 CR 已經出到 CR2008 版本, 比筆者這次用的 CRXI 還新上一個版本. 就這而言原來筆者已經同時見證了 CR 數次的改朝換代, 先是由 SEAGATE 推出 CR 的版本, 改為 CRYSTAL DECISIONS 公司, 再被 BUSINESS OBJECT 收購, 現在更納入 SAP 的版圖之內.

好多人會想一次又一次被併購, 版圖的擴張, 理應好使 CR 有更多的資源做好其本身的產品, 可為什麼筆者卻覺得比以前差了很多呢!? 想當初 CR8.5/CR9 年代, 筆者還會見到有 RDC 的 API 文件檔可供開發員參考, 現在新的版本想找都找不到, 更要在 SAP 的網站內轉圈轉得有點想暈都找不出自己想要的東西, 雖說是已經 .NET 年代了好久, 但 CR 一天在支持 RDC 的使用都得需要有文件檔提供...是吧!?

更諷刺的是, CRXI 支援 RDC 開發, 但是需要自行到 SAP 網站內 DOWNLOAD 有關的 RDC 開發用 MSM, 而且需要自行封包 MSI 再自行安裝才能在 VB6 上開發~ 天呀!!! 什麼世道...不可以在 CR 安裝時供用戶自行選擇的嗎? 為的只是減少 50 來MB 的空間!? 還是要用戶花錢買 DEVELOPER 版本才會有 RDC !? \ _ /

最後經過多翻嘗試, 解決了 RDC 問題, VB6 連接問題, 以下提供一段 CODE 給各位跟筆者有同樣煩惱的朋友參考~

Dim crxApp As New CRAXDRT.Application
Dim crxRpt As CRAXDRT.Report
Dim crxTables As CRAXDRT.DatabaseTables
Dim crxTable As CRAXDRT.DatabaseTable
Dim crxSubreportObject As CRAXDRT.SubreportObject
Dim crxSubReport As CRAXDRT.Report
Dim crxSections As CRAXDRT.Sections
Dim crxSection As CRAXDRT.Section

'請更改為你的報表路徑
Set crxRpt = crxApp.OpenReport(App.Path & "\Report\XXX.rpt")

'如為舊年代數據庫, 以 Varchar 保存 DoubleByte 文字, 記得要加這句
crxRpt.Database.Tables(1).ConnectionProperties("Auto Translate") = False
crxRpt.Database.Tables(1).SetLogOnInfo LoginServer, LoginDatabase, LoginUser, LoginPassword


Set crxTables = crxRpt.Database.Tables
For Each crxTable In crxTables
With crxTable
.Location = .Name
End With
Next

crxRpt.DiscardSavedData

'請更改為需要帶入報表的數據
crxRpt.ParameterFields(1).AddCurrentValue XXXX
crxRpt.ParameterFields(2).AddCurrentValue XXXX

Set crxSections = crxRpt.Sections

For i = 1 To crxSections.Count
Set crxSection = crxSections(i)

For j = 1 To crxSection.ReportObjects.Count

If crxSection.ReportObjects(j).Kind = crSubreportObject Then
Set crxSubreportObject = crxSection.ReportObjects(j)

Set crxSubReport = crxSubreportObject.OpenSubreport
Set crxTables = crxSubReport.Database.Tables

For Each crxTable In crxTables
With crxTable
.SetLogOnInfo LoginServer, LoginDatabase, LoginUser, LoginPassword

'如為舊年代數據庫, 以 Varchar 保存 DoubleByte 交字, 記得要加這句
.ConnectionProperties("Auto Translate") = False
.Location = .Name
End With
Next

End If

Next j

Next i

CRViewer.ReportSource = crxRpt
CRViewer.ViewReport



2 則留言:

匿名 提到...

你好.请教下博主,我第一次用Crystal Reports,在VB6.0已经取得SAP的数据,内表为ITAB.这时候我如何把ITAB赋给Crystal Reports?

wen0660@hotmail.com

匿名 提到...

用 subreport 能否取代?

張貼留言