Option Explicit
' ประกาศตัวแปรแบบ Object เพื่อรับงานไปพิมพ์
Dim rptPrint As Object
' ตัวแปรที่ใช้ในระบุการค้นหา หรือ กำหนดช่วงการพิมพ์หรือไม่
Dim blnSearch As Boolean
' #####################################################
' ทำการ Query ข้อมูลตามที่ต้องการ ก่อนที่จะส่งข้อมูลไปให้กับ AR Designer
' #####################################################
Private Sub cmdPreview_Click()
' สร้าง Instance ขึ้นมาใหม่ พร้อมกับทำการปิด RecordSet เดิมด้วย (หากลืมปิด RS.Close)
Set RS = New ADODB.Recordset
' หากกรณีต้องการเฉพาะข้อมูลบางอย่าง ต้องมาสร้างเงื่อนไข WHERE ที่นี่
If blnSearch Then
' ว่างเปล่า ... แก้ไขเอาน่ะ
' ให้แสดงผลข้อมูลออกมาทั้งหมด นั่นคือเราทำ Query ที่นี่ ไม่ใช่ไปทำที่ Active Report Designer น่ะครับ
Else
Statement = "SELECT tblCustomer.CustomerPK, tblCustomer.CustomerCode, " & _
" tblCustomer.CustomerName, tblCustomer.Address, tblCustomer.Amphur, " & _
" tblCustomer.ProvinceFK, tblProvince.ProvinceName, tblCustomer.PostCode " & _
" FROM tblCustomer INNER JOIN tblProvince ON " & _
" tblCustomer.ProvinceFK = tblProvince.ProvincePK " & _
" ORDER BY CustomerPK "
End If
' อ่านข้อมูลแบบเดินหน้าอย่างเดียว (adOpenForwardOnly) จะทำให้เข้าถึงข้อมูลได้เร็วขึ้น
' เพราะนำข้อมูลมาแสดงผลเท่านั้น ไม่ได้นำมาทำการบันทึกผลยังไงล่ะครับ
RS.Open Statement, ConnDB, adOpenForwardOnly, adLockReadOnly, adCmdText
' ส่วนสำคัญในการทำรายงานด้วย Active Report คือการตั้งค่า หรือ การผูกรายงานเข้ากับ Object
Set rptPrint = New arPrintEnvelope ' มาจากชื่อไฟล์รายงาน (Designer)
' ARViewPrintEnvelope ตัวนี้คือ Control ที่วางไว้อยู่บนฟอร์ม frmAR2PrintEnvelope
Set Me.ARViewPrintEnvelope.object = rptPrint
' ผูกตารางข้อมูล (Bound Control) แบบ Run Time เข้ากับ Object
' dcRptData (ADO Control) ตัวนี้มันไปอยู่ที่แบบฟอร์มการแสดงผลของ ActiveReport น่ะครับ
Set rptPrint.dcRptData.Recordset = RS
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
' ก่อนจะใช้ Sub Program นี้ได้ ... พี่น้องต้องกำหนดค่าของ Form ให้คุณสมบัติ KeyPreview = True ก่อน
Select Case KeyCode
Case vbKeyF1: MsgBox "No help now."
Case vbKeyF7:
Call cmdPreview_Click
Case vbKeyF10:
cmdExit_Click
End Select
End Sub
Private Sub Form_Load()
On Error GoTo ErrorHandler
' ตั้งตำหน่งกึ่งกลางจอภาพ ... การใช้ \ หรือ การหารตัดเศษ จะทำงานได้เร็วกว่าการหาร /
Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
' เชื่อมต่อฐานข้อมูล
Call OpenDataBase
With ARViewPrintEnvelope
.Zoom = 100 ' ค่า % การแสดงผล Preview
' และอื่นๆอีก ...
End With
' ตั้งค่าเป็นเท็จเพื่อบ่งบอกว่าไม่ใช่การค้นหาข้อมูล
blnSearch = False
' อันที่จริงก่อนทำการ Preview ผมจะทำเป็นฟังค์ชั่นแทนเอา เช่น PreviewReport(False)
' เวลาประกาศในฟังค์ชั่น ก็จะประกาศแบบนี้ ... Function PreviewReport(blnSearch As Boolean)
' เพราะสั่งแบบนี้มันง่าย และ สะดวกกว่าเยอะครับ
ExitProc:
Exit Sub
ErrorHandler:
MsgBox "Error : " & Err.Number & vbCrLf & Err.Description, vbOKOnly + vbExclamation, "รายงานความผิดพลาด"
Resume ExitProc
End Sub
Private Sub Form_Resize()
' จัดระเบียบสังคม เอ๊ย หน้าตาการแสดงผล ...
' เทคนิค:- การคำนวณหาระยะการแสดงผลให้ง่ายนั้น ควรเอา Control ต่างๆ ไปวางไว้ใน Frame ก่อน (fraData)
fraData.Width = Me.ScaleWidth - 30
fraData.Height = Me.ScaleHeight - fraCommand.Height
ARViewPrintEnvelope.Move 15, 120, fraData.Width - 60, fraData.Height - 180
fraCommand.Move 15, fraData.Top + fraData.Height, Me.ScaleWidth - 30
cmdExit.Move fraCommand.Width - cmdExit.Width - 60
cmdPreview.Move fraCommand.Width - cmdExit.Width - cmdPreview.Width - 120
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
' ก่อนจบโปรแกรม ควรลบไฟล์ขยะออกไปให้หมด (Temporary File)
If Dir$(App.Path & "\*.tmp") <> "" Then Kill App.Path & "\*.tmp"
' ปิดฐานข้อมูล
Call CloseDataBase
End
End Sub
Private Sub cmdExit_Click()
Unload Me
End Sub
|