Thủ Thuật Access

Thế Giới Thủ Thuật với Access

Archive for the ‘Report’ Category

Tùy Biến Các Cột thay đổi trong Report

Posted by Noname on 14.01.2010

Bài này được Copy của tác giả paulsteigel bên Giải Pháp Excel. Thấy hay nên Copy về đây cho mọi người tham khảo.
Đó là 1 report có format tương đối giống nhau, nhưng có các cột thay đổi tùy ý. Xin copy lại nguyên gốc tác giả. Và thắc mắc có thể vào link gốc để hỏi trực tiếp tác giả!
Link Gốc

Trích:
Lâu lắm rồi không làm việc với Access, hôm nay có việc phải quay lại làm mấy việc với công cụ báo cáo Report của Access, tiện thể tôi xin chia sẻ một kỹ năng nho nhỏ với các bạn đã và đang, có thể sẽ sử dụng nhiều Access trong công việc.
Đã bao giờ các bạn nghĩ đến việc sử dụng một báo cáo cho nhiều mục đích, hiển thị nhiều báo cáo có bố cục tương đối giống nhau không?
Nếu bạn phải trình bày bảng dữ liệu có quá nhiều cột, bạn muốn báo cáo tự động chia số cột cho đều theo khổ giấy A4, phần còn thừa sẽ chuyển sang báo cáo mới và căn chỉnh độ rộng cột cho phù hợp?
…vv
Thường thì mọi người sẽ xác định giải pháp là: thôi thì tạo ra hàng loạt mẫu báo cáo để có thể dự phòng được trường hợp số cột là nhiều nhất, các báo cáo này giống nhau căn bản và chỉ khác nhau mỗi cái tên.
Với yêu cầu này, tôi xin giới thiệu một cách sử dụng tính năng thừa kế lớp của đối tượng Report (chắc các cao thủ thì đều đã làm rồi, mạo muội xin giới thiệu lại và hy vọng sẽ giúp ích được các bạn).
Đầu bài là:
Tôi có bảng danh sách có 15 cột dữ liệu và cần in ra trên 2 hoặc nhiều hơn báo cáo trên khổ A4 trong đó 4 cột đầu thì giữ nguyên trong khi các cột khác thay đổi và tự điều chỉnh kích thước để phù hợp với khổ giấy. (Chẳng hạn mỗi báo cáo sẽ hiển thị 6 cột thì sẽ có 2 báo cáo là đủ 6 cột còn báo cáo thứ 3 chỉ có 3 cột. Vì thế với báo cáo thứ 3, ta sẽ cần hiệu chỉnh kích thước cột để tràn ra toàn khổ giấy).
Vậy tôi cần làm gì?
1.Thiết kế mẫu báo cáo có số cột lớn nhất có thể thể hiện trên khổ giấy A4 (đảm bảo kích thước vừa đẹp).
2.Viết Code để sử dụng tính năng thừa kế lớp của các đối tượng báo cáo.
3.Viết code để gọi và hiển thị báo cáo.
Với mẫu báo cáo, chúng ta cần có các thủ tục giúp vẽ đường lưới ngang dọc, ở đây tôi dùng lệnh draw trong Access và các bạn có thể quan sát cách gọi thủ tục DrawGrid tại phần format section của báo cáo.
If PrintCount = 1 Then DrawGrid Me, RptCol + 4
Sử dụng biến PrintCount để bỏ qua việc vẽ lại, tham số RptCol + 4 thể hiện yêu cầu sẽ chỉ bắt đầu vẽ kể từ cột thứ tư.
Các bạn cần chú ý cách đặt tên các textbox và label để tiện tham chiếu (“txt” & i và “lbl” & i) trong đó txt và lbl là tiền tố đầu của textbox và nhãn.
Tiếp theo tôi xử lý phần điều chỉnh độ rộng cột bằng cách tính toán số cột tối đa và tính ra độ rộng phù hợp của báo cáo trong sự kiện Report_open.
Có khá nhiều code nhưng nói chung phần này giúp giải quyết việc xác định kích thước các cột và đặt tên nhãn cũng như xử lý về chuỗi cung cấp dữ liệu cho báo cáo.
Các bạn có thể xem qua ví dụ tôi gửi kèm để tiện tham khảo.
Nếu có điều kiện tôi sẽ viết dài dòng hơn để mọi người đều có thể chia sẻ.
Các bạn mở frmReport và nhấn nút, chúng ta sẽ thấy kết quả là có 3 báo cáo được mở cùng lúc trong khi tôi chỉ sử dụng 1 báo cáo mẫu duy nhất.
Thành thật xin lỗi các bạn về việc hơi ẩu khi lạm dụng comment bằng tiếng Anh. – Nếu có điều kiện tôi sẽ viết lại bằng tiếng Việt
Chúc các bạn một buổi tối vui vẻ! 

DownLoad Demo

Posted in Report | 1 Comment »

Trình tự các sự kiện khi mở-đóng 1 form/report

Posted by Noname on 12.01.2010

Khi ta mở/ đóng form thì có 1 chuỗi các sự kiện diễn ra, Nếu biết điều đó ta có thể chặn các sự kiện để cài mã vào cho thích hợp.
Theo đó, khi bạn mở form/report thì trình tự  các sự kiện như sau:
Open → Load → Resize → Activate → Current

Khi đóng form, trình tự các sự kiện  như sau:

Unload → Deactivate → Close

 ——————
Từ điều này cho thấy, nếu ta muốn chỉnh kích thước các đối tượng thì phải gọi trước sự kiện resize. Tức là Load hoặc open, nếu ta gọi sau (active) thì không có tác dụng.
Tương tự, ta muốn gọi 1 form, điền vào 1 tham số và nhảy setforcut 1 form khác, lấy giá trị từ form này thì phải gọi nó ở sự kiện Current. Vì chưa Active thì nó chưa được điền giá trị vào đó.
….
Tương tự, khi đóng form/report. Ta cũng có thể bẫy chặn các sự kiện nhằm lưu hệ thống . Cụ thể khi form không còn hiện nữa (unload), ta vẫn có thể lưu dữ liệu vì nó chưa hoàn toàn close…

Posted in Events, Form, Report | Leave a Comment »

Thiết kế textbox, command …sao cho đẹp

Posted by Noname on 15.12.2009

Hỏi: Một số form mình thiết kế các textbox, command, combobox theo hình thức thủ công, mặc dù mình đã O kỹ rồi nhưng thấy cũng chưa hài lòng lắm.
Các bạn làm ơn chỉ mình cách làm sao để: canh đều trái phải; kích thước dài, rộng bằng nhau để xem cho đẹp mắt hơn.
Đáp:
Access cung cấp cho ta công cụ Align và Size ( Click chuột phải vào tập các đối tượng đã chọn hoặc vào menu Format)

Đối với Align, ta có: (dùng chỉnh vị trí của đối tượng : Lable, Combobox, Textbox, button…)
Left: Canh theo đối tượng ngoài cùng phía bên trái
Right:Canh theo đối tượng ngoài cùng phía bên phải
Top:Canh theo đối tượng trên cùng
Bottom: Canh theo đối tượng thấp nhất

Đối với size của đối tượng ta có:
To Tallest : Format Chiều Cao của các đối tượng theo đối tượng có chiều cao lớn nhất
To Shortest Makes :Format Chiều cao của các đối tượng theo đối tượng có chiều cao nhỏ nhất
To Widest Makes:Format chiều rộng của các đối tượng theo đối tượng có chiều rộng lớn nhất
To Narrowest :Format chiều rộng của các đối tượng theo đối tượng có chiều rộng nhỏ nhất

To Fit: Format size đối tượng phù hợp với nội dung (chữ hoặc hình) của nó
To Grid: Format size đối tượng vừa với lưới định sẵn của Access

Posted in Form, Report, Thủ Thuật | Leave a Comment »

Tùy biến Tiêu Đề Report

Posted by Noname on 09.12.2009

Queston: Tôi có 1 report chia làm nhiều group. Mỗi cuối group tôi dùng page break để sang trang. Tôi muốn vài thông tin Page header chỉ hiển thị khi sang group mới.


Reply : Bạn có thể lợi dụng ô Số thứ tự trong report khi set giá trị Control Soure=1 và thuộc tính Running Sum: Over Group . Đặc điểm ô này khi nhảy qua Group mới nó sẽ reset lại giá trị là 1 và tăng dần sau mỗi record thuộc group đó.
rong sự kiện format của page. Bạn có thể set cho tiêu đề visible true/ false. Cụ thể trong ví dụ của bạn, bạn viết thế này:

Private Sub PageHeaderSection_Format(Cancel As Integer, FormatCount As Integer)
If SOKU.Value = 1 Then
Label590.Visible = True
Label586.Visible = True
Else
Label590.Visible = False
Label586.Visible = False
End If
End Sub

Demo: Dowload

Posted in Report | Leave a Comment »

Report Footer luôn nằm ở cuối của trang cuối cùng

Posted by Noname on 07.12.2009

Giả sử bạn muốn đặt Textbox Txt01 luôn nằm ở cuối của trang cuối cùng. Đừng đặt nó ở Report Footer mà đặt ở Page Footer và thêm đoạn code sau :
Private Sub PageFooter_Format(Cancel As Integer, FormatCount As Integer)
if Me.Page = Me.Pages then
Me.Txt01.Visible = True
else
Me.Txt01.Visible = False
End Sub

Posted in Report | Leave a Comment »

View report ở chế độ cố định

Posted by Noname on 07.12.2009

Hỏi: Làm thế nào để View report ở chế độ cố định


Trả lời :

Dim stDocName As String
stDocName = “R01_Du An Moi”
DoCmd.OpenReport stDocName, acPreview
DoCmd.Maximize
DoCmd.RunCommand acCmdZoom75

‘ Các chế độ zoom khác :

‘ DoCmd.RunCommand acCmdFitToWindow
‘ DoCmd.RunCommand acCmdZoom10
‘ DoCmd.RunCommand acCmdZoom25
‘ DoCmd.RunCommand acCmdZoom50
‘ DoCmd.RunCommand acCmdZoom75
‘ DoCmd.RunCommand acCmdZoom100
‘ DoCmd.RunCommand acCmdZoom150
‘ DoCmd.RunCommand acCmdZoom200

Nguồn: http://my.opera.com/bvlbp/blog/thu-thuat-acc

Posted in Report | Leave a Comment »

In hình ảnh khi có đường dẫn hình

Posted by Noname on 14.11.2009

Hỏi: Tôi đã lưu hình ảnh vào ổ đĩa G: ( G: là ổ đĩa mạng). Và có 1 cơ sở dữ liệu lưu đường dẫn theo dạng : tvhinh(mahang,txtpic). Bây giờ trong Report làm sao tôi có thể vẽ lại các hình tôi đã lưu!
Đáp:
Trong Report, bạn vẽ 1 textbox đặt tên là txtpic, đặt thuộc tính visible của nó là False.
Vẽ 1 đối tượng image đặt tên nó là image1
Sau đó cho đoạn code sau vào

Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)
On Error GoTo err_Pic
If IsNull(Me.txtPic) Then
    Me.Image1.Picture = “”
    Me.Image1.Visible = False
Else
    Me.Image1.Picture = txtPic.Value
    Me.Image1.Visible = True
End If
Exit Sub
err_Pic:
    MsgBox Err.Description, vbOKOnly
    Exit Sub
End Sub

Posted in Report, VBA | Leave a Comment »

Tạo một đường viền cho report

Posted by Noname on 14.11.2009

Tôi muốn tạo một đường viền cho report giống như boder style của word khi in mà kô phải mất công kẻ bằng tay được ko?

Đáp:
Cho đoạn code sau vào report!

Private Sub Report_Page()
       On Error Resume Next
         Me.DrawWidth = 6   ‘ do rong duong line
         Me.DrawStyle = 0   ‘ 0 den 6 => kieu duong mat dan
         ‘ Sử dụng công thức object.Line (x1, y1) – (x2,y2), color, [Box=B]
         Me.Line (0, 0)-(Me.ScaleWidth, Me.ScaleHeight), vbred, B
       End Sub

Posted in Report, VBA | Leave a Comment »

Hiện thông báo không có dữ liệu khi in report

Posted by Noname on 11.11.2009

Cho mình hỏi: Mình tạo 1 form in từ ngày đến ngày,
nếu trong điều kiện đó mà reprt kô có dữ liệu thì hiện ra 1 câu thông báo tại form luôn và kô hiện ra report.

Đáp:
Bất cứ report nào cũng có record source đúng không, thường là 1 query/table.

Như vậy vấn đề ở đây là bạn kiểm tra query/table xem có record nào không, nếu không có=> gởi thông báo.
Nếu có thì cho in report. Đơn giản vậy thôi

Private Sub In_Click()
dim rec as Recordset
dim db as Database
set db = CurrentDB()
set rec = db.Openrecordset(“tên bảng”)
If rec.recordcount> o then
[in report]

else

[thong bao]

end if
End Sub

Posted in Report | 2 Comments »

Không in số 0 trong report

Posted by Noname on 11.11.2009

Khi in 1 trường bằng số thì format #,### sẽ không in nếu dữ liệu bằng 0.
- format : #,###.## : 0 không in ra nhưng 300.00 thì in ra 300. (có 2 khoản trắng phía sau)
- format #,###.00 : 0 thì in ra 0.00; 300.15 in ra 300.15 (đúng)

Mình muốn format trường số với 2 số lẻ (ví dụ trường Ngoại tệ USD) khi dữ liệu bằng 0 sẽ không in ra nếu có dữ liệu thì sẽ in ra với 2 số lẻ:

Trong phần Detail_Format của report, bạn nhập code như sau:

Code:
If Soluongtxt.Value = 0 Then
Soluongtxt.DecimalPlaces = 0
Else
Soluongtxt.DecimalPlaces = 2
End If

soluongtxt là field bạn cần format!

Posted in Report | 2 Comments »

 
Theo dõi

Get every new post delivered to your Inbox.