Trả lời bài viết ...về crosstab report

Ngày đăng: 09:47:13 01-09-2015

http://thuthuataccess.com/forum/post-27700.html#pid27700

thunga25 Đã viết:

....

Bạn nào biết thì chỉ mình với, vì mình đang cần gấp, nhưng tìm mãi vẫn chưa biết cách.

Bài của bạn có mấy vấn đề sau:

1. CSLD của bạn thiết kế chưa chuẩn mực

+ bạn cần để chế độ Compact khi đóng csdl để nó đỡ phình to (nhấn Tool/Options/General - chọn Compact on Close)

+ Bảng Test của bạn chưa đáp ứng chuẩn Nomalize vì bạn để 2 trường Mã NCC và Tên dạng text lưu kèm số liệu. Cái này làm cho csdl to lên và khó quản lý.

+ Query crosstab của bạn thiết kế không đúng, chỉ cần Column Heading là Mã Nhà cung cấp hoặc tên còn phần rowheading với mã nhà cung cấp thì bỏ đi

+ Trường đơn giá phải có kiểu số liệu là Number/Double hoặc single nhé, không để kiểu text được.

2. Cách sửa chữa như sau

+ Sửa lại thiết kế bảng, tạo một bảng tblNCC trong đó như file đính kèm.

Người ta quản lý danh mục ncc dựa vào ID

+ Bảng test sửa lại, liên kết với bảng nhà cung cấp bằng 1 trường ID_NCC là xong, kiểu số.

3. Về vấn đề crosstab.

Do số lượng nhà cung cấp là bất định vì thế nó có thể lên đến hàng ngàn. Như vậy bạn phải giới hạn số nhà cung cấp hiển thị trong báo cáo. Muốn như vậy thì cần đưa ra tiêu chí lựa chọn số nhà cung cấp cần hiển thị, ví dụ tối đa là bao nhiêu (chẳng hạn 10) vì khổ giấy A4 chỉ cho in đến thế.

Sau đó sẽ tiếp tục in tiếp với các nhà cung cấp khác.

Giải pháp đưa vào báo cáo.

1. Thiết kế 1 báo cáo chuẩn với các trường chuẩn hiển thị tên hàng, còn lại là khoảng 10 textbox/label rỗng có tên theo chuẩn chẳng hạn

lb1, lb2 ...lb10, txt1, txt2 ...txt10.

2. Thiết kế thủ tục nạp thông tin cho các txt và lbl dựa vào các trường hiển thị trong crosstab query.

Thủ tục này phải đặt trong mục Report_Open.

các thứ như sau:

Truy vấn crosstab qry_price_compare (đã được sửa lại) làm nguồn cho báo cáo

... bạn có thể xem thêm đoạn code

Mã:

Private Sub Report_Open(Cancel As Integer)

' Thu tuc de dua so lieu vao bao cao va dieu chinh ten cot

Dim SqlStr As String

Dim rs As Recordset

Dim iCol As Long, i As Long

SqlStr = "Select * from " & Me.RecordSource & ";"

Set rs = CurrentDb.OpenRecordset(SqlStr)

' Cot 1 luon la ten hang, bat dau tu cot 2 se la ma nha cung cap

With Me

For i = 1 To rs.Fields.Count - 1

.Controls("lbl_cr_" & i).Visible = True

.Controls("lbl_cr_" & i).Caption = GetColumnName(Val(rs.Fields(i).Name)) ' doi voi textbox thi dat ten vung so lieu luon ' vi ten textbox la so nen phai co them ham chuyen gia tri sang chu .Controls(CStr(i)).Visible = True .Controls(CStr(i)).ControlSource = rs.Fields(i).Name ' dinh dang so lieu .Controls(CStr(i)).Format = "Standard" .Controls(CStr(i)).DecimalPlaces = 0 Next ' Cac doi tuong khac thi giau di While i <= 9 .Controls("lbl_cr_" & i).Visible = False ' doi voi textbox thi dat ten vung so lieu luon .Controls(CStr(i)).Visible = False i = i + 1 Wend End With rs.Close DoCmd.MaximizeEnd Sub

Tôi cũng bổ sung công cụ vẽ đường kẻ trong báo cáo. bạn chỉ cần gọi thủ tục như trong báo cáo. Khi thiết kế cần có một nhãn là lb1 nằm ở ngoài cùng bên trái làm điểm chuẩn canh lề.

Các nhãn dùng làm chuẩn để kẻ dòng đều phải được đặt tag là 1