Design Report là một nghệ thuật. Tạo report trên access giúp chúng ta thuận lợi hơn rất nhiều so với tạo report trên excel. Chúng ta có thể xử lý tạo tổng nhóm, tự động đánh số thứ tự, lọc record… dễ dàng hơn so với excel nhiều. Ngược lại chúng ta rất khó xử lý trong các trường hợp report có số lượng cột quá lớn vượt độ rộng tối đa chiều ngang trong trang design report (
Báo cáo hàng ngang) nhưng nếu báo cáo có các nội dung cột nhiều ít không đồng điều (
hiển thị dữ liệu theo hàng ngang) mà ta tăng số lượng trang thì lại không hợp lý – vì chiều ngang cột rộng mà đôi khi nôi dung chỉ có hay ba từ, vừa tốn giấy lại vừa không đẹp. Nhưng nếu chúng ta co hẹp chiều ngang lại để cho nội dung dãn ra theo chiều cao, lúc này, chúng ta cân chỉnh độ cao chúng bằng chiểu cao nội dung có dữ liệu lớn nhất để khi in repor không bị mất dữ liệu. Lại xảy ra chuyện có những cột thừa chiều cao.
Điều này là do dùng công cụ Text Box, Label hoặc Line chúng ta luôn tạo các đối tượng này có cùng chiều cao cố định.
Để xử lý đều này, chúng ta dùng phương thức Me.Line để vẽ đường thẳng đứng ngay trong Event On Print
Phương thức này có cú pháp:
Mã PHP:
Me.Line (Left, Top)-Step(Width, Height), , BF
Left, Top là vị trí góc trên bên trái của đường muốn vẽ, Width là độ dầy và Height là chiều cao
Ngoài ra để hỗ trợ cho phương thức vẽ này chúng ta còn có các giá trị hằng số Me.ScaleMode (thuộc tính đơn vị đo), Me.DrawStyle (xác lập định dạng)
Giả sử chúng ta có các Text Box của report là Text1, Text2, Text3,…, Textn.
Trước tiên chúng ta thiết kế các Text Box Border Color = transparent, Can Grow và Can Shrink = Yes.
Để xác định côt nào có chiểu dài lớn nhất trong record chúng ta phải xử dụng 1 function để tìm Text Box cao nhất trong mảng các Text Box: Text1, Text2, Text3,…, Textn
Mã PHP:
Function MaxCol(ParamArray varValues()) As Variant
Dim i As Integer
Dim varMax As Variant
varMax = Null
For i = LBound(varValues) To UBound(varValues)
If IsNumeric(varValues(i)) Or IsDate(varValues(i)) Then
If varMax >= varValues(i) Then
Else
varMax = varValues(i)
End If
End If
Next
MaxCol = varMax
End Function
Sau đó chỉ cần xác định giá trị cao nhất của Text Box trong record trong Event On Print rồi Me.Line theo giá trị chiều cao của Text Box đó.
Mã PHP:
Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
Me.ScaleMode = 0
Me.DrawStyle = 0
Dim OCAONHAT As Double
OCAONHAT = MaxCol(Text1.Height, Text2.Height, …Textn.Height)
Me.Line (Me![Text1].Left, Me![Text1].Top)-Step(50, OCAONHAT), , BF
Me.Line (Me![Text2].Left, Me![Text2].Top)-Step(10, OCAONHAT), , BF
…
Me.Line (Me![Textn].Left, Me![Text2].Top)-Step(10, OCAONHAT), , BF
End Sub
Vậy là chúng ta sẽ có một báo cáo tương đối đẹp, dễ nhìn và không tốn giấy
Các xác lập ScaleMode
0 -> Mặc định (Twip)
1 -> Twip
2 -> Point
3 -> Pixcel
4 -> Ký tự
5 -> Inch
6 -> Milimet
7 -> Centimet
Các xác lập DrawStyle
0 -> Vạch liền
1 -> Gạch – gạch
2 -> Chấm – chấm
3 -> Chấm – gạch
4 -> Chấm – chấm – gạch
5 -> Transparent
6 -> Vạch liền đậm nét vào trong
Demo