[How to] Set a database logon to a crystal report and its subreports on VB 2005.

27 ก.ค.

ตอนเรียนมาไม่เคยได้ใช้ ไม่เคยได้ลองเล่น Crystal Report เลย พอมาเจอตอนทำงานเลยเหวอๆนิดหน่อยเมื่อต้องใช้ คิดว่าหลายคนที่เคยใช้คงเคยเจอปัญหาต่างๆมากมาย ผมใช้ Crystal Report และพบกับปัญหาสำคัญเรื่องหนึ่ง คือ Database Fields ของ Report จะจำ Server, Database Name ตอนที่เราสร้างตัว Report ซึ่งจะทำให้เกิดปัญหาเมื่อมีการเปลี่ยนชื่อ Server หรือตอนที่นำไปใช้กับเครื่องอื่น จะทำให้ Crystal Reports ไม่สามารถดึงข้อมูลได้ หรือไม่ก็ Error ไปเลย ซึ่งจากการค้นคว้าและศึกษาพบว่าแก้ได้หลายวิธี (หลายวิธีก็ไม่ได้ผลสำหรับงานของผม) แต่เมื่อนำหลายๆวิธีมาประยุกต์รวมกันก็เลยได้ Code หน้าตาแบบนี้ออกมา (กว่าจะได้ก็นานเหมือนกัน) ใครเจอปัญหาเดียวกันก็ลองเอาไปประยุกต์ใช้ดูนะครับ

 

Public Sub SetLogon()
Dim CrSections As Sections
Dim CrReport As New ReportDocument()
Dim CrSubReport As ReportDocument
Dim CrSubreportObj As SubreportObject
Dim CrReportObj As ReportObjects
Dim ConnInfo As New ConnectionInfo()
Dim CrDatabase As Database
Dim CrTables As Tables
Dim CrTableLogOnInfo As TableLogOnInfo

CrReport.Load(“C:\report.rpt”)
CrDatabase = CrReport.Database
CrTables = CrDatabase.Tables

ConnInfo.ServerName = “Server Name”
ConnInfo.DatabaseName = “DataBase Name”
ConnInfo.UserID = “myUserID”
ConnInfo.Password = “myPassword”

‘ Set Database Logon to main report
For Each aTable As CrystalDecisions.CrystalReports.Engine.Table In CrTables
CrTableLogOnInfo = aTable.LogOnInfo
CrTableLogOnInfo.ConnectionInfo = ConnInfo
aTable.ApplyLogOnInfo(CrTableLogOnInfo)
aTable.Location = ConnInfo.DatabaseName & “.dbo.” & aTable.Name
Next

‘ Set Database Logon to subreport
‘ set the sections object to the current report’s section

CrSections = CrReport.ReportDefinition.Sections
‘ loop through all the sections to find all the report objects
For Each crSection As Section In CrSections
CrReportObj = crSection.ReportObjects
‘loop through all the report objects in there to find all subreports
For Each crReportObject As ReportObject In CrReportObj
If crReportObject.Kind = ReportObjectKind.SubreportObject Then
CrSubreportObj = DirectCast(crReportObject, SubreportObject)
‘open the subreport object and logon as for the general report
CrSubReport = CrSubreportObj.OpenSubreport(CrSubreportObj.SubreportName)
CrDatabase = CrSubReport.Database
CrTables = CrDatabase.Tables
For Each aTable As CrystalDecisions.CrystalReports.Engine.Table In CrTables
CrTableLogOnInfo = aTable.LogOnInfo
CrTableLogOnInfo.ConnectionInfo = ConnInfo
aTable.ApplyLogOnInfo(CrTableLogOnInfo)
aTable.Location = ConnInfo.DatabaseName & “.dbo.” & aTable.Name
Next
End If
Next
Next
End Sub

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

%d bloggers like this: