Dear All
Hôm trước có giới thiệu với các bạn một CSDL Sổ quỹ tiền mặt bao gồm các bước thiết kế và file CSDL. Trong file có trình bày cách lập các query để lấy dữ liệu nguồn cho các báo cáo. Việc thiết kế các query sẽ rất dễ dàng thông qua lưới query. Nhưng việc bảo mật các query và các table trong Ac là rất khó. Người ngoài có thể mở bất kỳ một table hoặc một query nào của bạn cho dù bạn đã chuyển sang MDE. Có một cach khắc phục đó là sử dụng các table tạm làm nguồn cho các report. Các table tạm này được cập nhật dữ liệu thông qua các Function được viết trong cácModules. Hôm nay chúng ta cùng xem xét vấn đề này.
Ở đây tôi vẫn sử dụng file Sổ quỹ tiền mặt đã nói ở trên và tập trung vào việc lập các Function để lấy dữ liệu cho việc tính tồn quỹ.
Để làm được việc này, chúng ta cùng bổ sung thêm hai table nữa
1/ Bảng ghi dữ liệu tồn đầu kỳ : tblTonDauKy. Bảng này chỉ có 1 trường duy nhất
TonDauKy – Number – Double – Standar – 0 – 0
2/ Bảng ghi dữ liệu phát sinh trong kỳ : tblPhatSinh. Bảng này gồm các trường sau
NgayCT – Date/Time
LoaiCT – Text – 1
SoCT – Text – 4
TenKhach – Text – 50
DiaChi – Text – 100
LyDo – Text – 100
SoCTGoc – Number – Integer
TKDU – Text – 10
SoTienThu – Number – Standar – 0 – 0
SoTienChi – Number – Standar – 0 – 0

---------- Post added at 01:57 PM ---------- Previous post was at 01:50 PM ----------

Các bạn chọn Modules, kích New để mở một modules mới, lưu lại với tên modSoQuy. Trong màn hình soạn thảo, các bạn lập các Function sau
1/ Hàm xóa bảng : hàm này có tác dụng xóa các dữ liệu ở bảng tạm để cập nhật dữ liệu mới khi người dung thay đổi thời gian báo cáo. Nội dung của hàm này như sau :



Mã nguồn PHP:
[COLOR=#000000]
[/COLOR][COLOR=#007700]Function [/COLOR][COLOR=#0000BB]XoaTable[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]TabName [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]String[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]Dim Rs [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Recordset Set Rs [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]CurrentDb[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]OpenRecordset[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]TabName[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]dbOpenTable[/COLOR][COLOR=#007700]) If [/COLOR][COLOR=#0000BB]Rs[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]RecordCount [/COLOR][COLOR=#007700]> [/COLOR][COLOR=#0000BB]0 Then Rs[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]MoveFirst [/COLOR][COLOR=#007700]Do [/COLOR][COLOR=#0000BB]Until Rs[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]EOF Rs[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Delete Rs[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]MoveNext Loop End [/COLOR][COLOR=#007700]If [/COLOR][COLOR=#0000BB]Rs[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Close End [/COLOR][COLOR=#007700]Function[/COLOR] 
Diễn giải nội dung của hảm này như sau :
Tên hàm : XoaTable với một TabName được chỉ định cụ thể.
Đinh nghĩa một biến Rs kiểu Recordset(dữ liệu của bảng đang xét)
Chỉ định biến Rs là TabName của Database đang xét
Nếu TabName có dữ liệu ( Số record > 0 ) thì
Chuyển dữ liệu trong TabName về record đầu tiên
Xét vòng lặp trong TabName từ record đầu tiên cho đến record cuối cùng(TabName bị EOF)
Xóa record hiện hành
Chuyển xuống record tiếp theo
Khi TabName hết record thi ngưng vòng lặp và đóng TabName
Kết thúc hàm


Có thể hiểu nôm na thế này : Xét Table cần xóa, duyệt qua từng dòng của nó và tiến hành xóa lần lượt từng dòng một. Hoặc các bạn cũng có thể dùng câu lệnh SQL để xóa một lần. Các bạn thử theo cách này xem nhé (Cứ coi như đây là bài tập). Bạn nào làm xong thì post lên cho mọi người tham khảo

---------- Post added at 02:27 PM ---------- Previous post was at 01:57 PM ----------

2/ Hàm Tính Tồn Quỹ Đầu Kỳ : Hàm này có tác dụng tính toán ra số tồn quỹ tiền mặt trước ngày đang xét. Nội dung hàm này như sau :



Mã nguồn PHP:
[COLOR=#000000]
[/COLOR][COLOR=#007700]Function [/COLOR][COLOR=#0000BB]TonDau[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]TuNgay[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]Dim RTD [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Recordset Dim RCT [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Recordset Dim Tong [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Double Dim Khoa [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]String Khoa [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Year[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]TuNgay[/COLOR][COLOR=#007700]) & [/COLOR][COLOR=#0000BB]Right[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"0" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]Month[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]TuNgay[/COLOR][COLOR=#007700]), [/COLOR][COLOR=#0000BB]2[/COLOR][COLOR=#007700]) & [/COLOR][COLOR=#0000BB]Right[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"0" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]Day[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]TuNgay[/COLOR][COLOR=#007700]), [/COLOR][COLOR=#0000BB]2[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]Tong [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]0 Set RTD [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]CurrentDb[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]OpenRecordset[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"tblTonDauKy"[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]dbOpenTable[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]Set RCT [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]CurrentDb[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]OpenRecordset[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"tblPhieuChiTiet"[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]dbOpenTable[/COLOR][COLOR=#007700]) If [/COLOR][COLOR=#0000BB]RTD[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]RecordCount [/COLOR][COLOR=#007700]> [/COLOR][COLOR=#0000BB]0 Then Call XoaTable[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"tblTonDauKy"[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]MoveFirst [/COLOR][COLOR=#007700]Do [/COLOR][COLOR=#0000BB]Until RCT[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]EOF [/COLOR][COLOR=#007700]If [/COLOR][COLOR=#0000BB]Val[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]Left[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]RecKey[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]8[/COLOR][COLOR=#007700])) < [/COLOR][COLOR=#0000BB]Val[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]Khoa[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]Then [/COLOR][COLOR=#007700]If [/COLOR][COLOR=#0000BB]Right[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]RecKey[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700]) = [/COLOR][COLOR=#DD0000]"T" [/COLOR][COLOR=#0000BB]Then Tong [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Tong [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]SoTien [/COLOR][COLOR=#007700]Else [/COLOR][COLOR=#0000BB]Tong [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Tong [/COLOR][COLOR=#007700]- [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]SoTien End [/COLOR][COLOR=#007700]If [/COLOR][COLOR=#0000BB]End [/COLOR][COLOR=#007700]If [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]MoveNext Loop RTD[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]AddNew RTD[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]TonDauKy [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Tong RTD[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Update RTD[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Close[/COLOR][COLOR=#007700]: [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Close End [/COLOR][COLOR=#007700]Function[/COLOR] 
Diễn giải nội dung của hàm này như sau :
Tên hàm : TonDau theo ngày TuNgay được chỉ đinh trước
Đinh nghĩa các biến kiểu Recordset gồm RTD và RCT
Đinh nghĩa một biếnTong kiểu số ( Double )
Định nghĩa một biến Khoa kiểu chuỗi ( String )
Gán giá trị của biến Khoa bằng cách lấy NamThangNgay của giá trị TuNgay va được diễn giải theo dạng yyyymmdd.
Gán giá trị cho biến Tong = 0 (trước khi xét vòng lặp ở đoạn sau)
Gán biến RTD là bảng tblTonDauKy của database đang xét
Gán biến RCT là bảng tblPhieuChiTiet của database đang xét
Nếu bảng tblTonDauKy có số record > 0 thì gọi hàm để xóa dữ liệu của bảng này bằng lệnh Call ( Call XoaTable(“tblTonDauKy”))
Chuyển về dòng dữ liệu đầu tiên của bảng tblPhieuChiTiet
Xét vòng lặp từ dòng dữ liệu đầu tiên đến hết dòng cuối cùng của bảng này
Xét trường RecKey của dòng dữ liệu hiện hành. Lấy giá trị số của 8 vị trí tính từ bên trái của trường này (dùng hàm Val để chuyển đổi từ text sang số) so sanh với giá trị số của biến Khoa đã được định nghĩa ở trên. Nếu là nhỏ hơn ( tức chỉ xét những ngày nhỏ hơn ngày chỉ định TuNgay ) thì
Nếu Chữ số cuối cùng của trường RecKey là T thì lấy giá trị của trường SoTien cộng vào giá trị Tong đã gán ở trên, sau đó lưu giá trị đã tính vào lại biến Tong
Ngược lại thì lấy giá trị của biến Tong đã được lưu trù đi giá trị của trường SoTien sau đó lại lưu vào biến Tong
Chuyển xuống xét record tiếp theo
Khi Val(Left(RCT!RecKey, 8-)) >= Val(Khoa) hoặc đã hết dữ liệu trong bảng tblPhieuChiTiet thi ngưng vòng lặp
Add thêm một record mới cho bảng tblTonDauKy
Gán giá trị của biến Tong đã được tính toán ở trên vào trường TonDauKy của bảng tblTonDauKy và update số liệu
Đóng các bảng đã mở
Kết thúc hàm

Ở đây lưu ý các bạn mấy điểm sau :
1/ Muốn xét một bảng nào đó thì phải định nghĩa nó ở một biến recordset và mở nó


Mã nguồn PHP:
[COLOR=#000000]
Dim RCT [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Recordset [/COLOR][COLOR=#007700]. [/COLOR][COLOR=#0000BB]Set RCT [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]CurrentDb[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]OpenRecordset[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"tblPhieuChiTiet"[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]dbOpenTable[/COLOR][COLOR=#007700])[/COLOR] 
2/ Khi đã Add Record mới vào một bảng nào đó thì nhớ phải Update, nếu không Update thì kết quả bằng không, giá trị không được lưu


Mã nguồn PHP:
[COLOR=#000000]
RTD[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]AddNew … RTD[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Update[/COLOR] 
3/ Đã mở Recordset thì phải đóng nó lại để giải phóng bộ nhớ


Mã nguồn PHP:
[COLOR=#000000]
Dim RCT [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Recordset [/COLOR][COLOR=#007700]. [/COLOR][COLOR=#0000BB]Set RCT [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]CurrentDb[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]OpenRecordset[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"tblPhieuChiTiet"[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]dbOpenTable[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]…[/COLOR][COLOR=#007700]. [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Close[/COLOR] 


---------- Post added at 03:38 PM ---------- Previous post was at 02:27 PM ----------

3/ Hàm ghi các phát sinh của sổ quỹ trong kỳ báo cáo : Hàm này co nhiệm vụ nhặt các chưng từ phát sinh có trong CSDL để update vào bảng tblPhatSinh.
Để phục vụ cho việc tinh toán, ta lập thêm một query qryChiTiet với câu SQL của nó như sau :


Mã nguồn PHP:
[COLOR=#000000]
SELECT tblPhieuThuChi[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]RecKey[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]tblPhieuThuChi[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]NgayCT[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]tblPhieuThuChi[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]SoCT[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]tblPhieuThuChi[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]LoaiCT[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]tblPhieuThuChi[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]MaKhach[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]tblPhieuThuChi[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]LyDo[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]tblPhieuThuChi[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]SoCTGoc[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]tblPhieuChiTiet[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]TKDU[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]IIf[/COLOR][COLOR=#007700]([[/COLOR][COLOR=#0000BB]LoaiCT[/COLOR][COLOR=#007700]]=[/COLOR][COLOR=#DD0000]"T"[/COLOR][COLOR=#007700],[[/COLOR][COLOR=#0000BB]SoTien[/COLOR][COLOR=#007700]],[/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700]) AS [/COLOR][COLOR=#0000BB]SoTienThu[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]IIf[/COLOR][COLOR=#007700]([[/COLOR][COLOR=#0000BB]LoaiCT[/COLOR][COLOR=#007700]]=[/COLOR][COLOR=#DD0000]"C"[/COLOR][COLOR=#007700],[[/COLOR][COLOR=#0000BB]SoTien[/COLOR][COLOR=#007700]],[/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700]) AS [/COLOR][COLOR=#0000BB]SoTienChi FROM tblPhieuThuChi INNER JOIN tblPhieuChiTiet ON tblPhieuThuChi[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]RecKey [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]tblPhieuChiTiet[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]RecKey[/COLOR][COLOR=#007700];[/COLOR] 
Query này nhằm mục đích tách trường SoTien ra thanh hai trường SoTienThu va SoTienChi

Nội dung cụ thể của hàm này như sau :



Mã nguồn PHP:
[COLOR=#000000]
[/COLOR][COLOR=#007700]Function [/COLOR][COLOR=#0000BB]PhatSinh[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]TuNgay[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]Denngay[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]Dim RCT [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Recordset Dim RPS [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Recordset Dim Khach [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Recordset Dim QCT [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]QueryDef Set QCT [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]CurrentDb[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]QueryDefs[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"qryChiTiet"[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]Set RCT [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]QCT[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]OpenRecordset[/COLOR][COLOR=#007700]() [/COLOR][COLOR=#0000BB]Set RPS [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]CurrentDb[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]OpenRecordset[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"tblPhatSinh"[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]dbOpenTable[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]Set Khach [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]CurrentDb[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]OpenRecordset[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"tblKhach"[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]dbOpenTable[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]Khach[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Index [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#DD0000]"PrimaryKey" [/COLOR][COLOR=#007700]If [/COLOR][COLOR=#0000BB]RPS[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]RecordCount [/COLOR][COLOR=#007700]> [/COLOR][COLOR=#0000BB]0 Then Call XoaTable[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"tblPhatSinh"[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]MoveFirst [/COLOR][COLOR=#007700]Do [/COLOR][COLOR=#0000BB]Until RCT[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]EOF [/COLOR][COLOR=#007700]If [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]NgayCT [/COLOR][COLOR=#007700]> [/COLOR][COLOR=#0000BB]Denngay Then [/COLOR][COLOR=#007700]Exit Do If [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]NgayCT [/COLOR][COLOR=#007700]>= [/COLOR][COLOR=#0000BB]TuNgay Then RPS[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]AddNew RPS[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]NgayCT [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]NgayCT RPS[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]SoCT [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]SoCT RPS[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]LoaiCT [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]LoaiCT Khach[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Seek [/COLOR][COLOR=#DD0000]"="[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]MaKhach [/COLOR][COLOR=#007700]If [/COLOR][COLOR=#0000BB]Not Khach[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]NoMatch Then RPS[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]TenKhach [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Khach[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Fields[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]RPS[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]DiaChi [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Khach[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Fields[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]2[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]End [/COLOR][COLOR=#007700]If [/COLOR][COLOR=#0000BB]RPS[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]LyDo [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]LyDo RPS[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]SoCTGoc [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]SoCTGoc RPS[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]TKDU [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]TKDU RPS[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]SoTienThu [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]SoTienThu RPS[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]SoTienChi [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]SoTienChi RPS[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Update End [/COLOR][COLOR=#007700]If [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]MoveNext Loop RCT[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Close[/COLOR][COLOR=#007700]: [/COLOR][COLOR=#0000BB]Khach[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Close[/COLOR][COLOR=#007700]: [/COLOR][COLOR=#0000BB]RPS[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Close End [/COLOR][COLOR=#007700]Function[/COLOR] 
Các bạn tự diễn giải nhé. Ở đây lưu ý hai điểm : cách dùng Seek và dung biến kiểu QueryDef.
1/ Cách dùng biến kiểu queryDef
Chúng ta theo dõi đoạn hàm sau :


Mã nguồn PHP:
[COLOR=#000000]
Dim RCT [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Recordset ‘Định nghĩa biến Recordset Dim QCT [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]QueryDef ‘Định nghĩa biến kiểu QueryDef Set QCT [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]CurrentDb[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]QueryDefs[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"qryChiTiet"[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]‘Gán biến QueryDef là qryChiTiet Set RCT [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]QCT[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]OpenRecordset[/COLOR][COLOR=#007700]() [/COLOR][COLOR=#0000BB]‘ Gán các dữ liệu của biến QueryDef vào Recordset[/COLOR] 
2/ Seek là chỉ đích danh, vì thế muốn dùng Seek, yêu cầu Recordset nhất thiết phải có Index (chỉ mục). Các bạn xem đoạn này sẽ rõ



Mã nguồn PHP:
[COLOR=#000000]
Dim Khach [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Recordset [/COLOR][COLOR=#007700]. [/COLOR][COLOR=#0000BB]Set Khach [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]CurrentDb[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]OpenRecordset[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"tblKhach"[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]dbOpenTable[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]Khach[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Index [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#DD0000]"PrimaryKey" [/COLOR][COLOR=#0000BB]…[/COLOR][COLOR=#007700].. [/COLOR][COLOR=#0000BB]Khach[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Seek [/COLOR][COLOR=#DD0000]"="[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]RCT[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]MaKhach [/COLOR][COLOR=#007700]If [/COLOR][COLOR=#0000BB]Not Khach[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]NoMatch Then RPS[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]TenKhach [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Khach[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Fields[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]RPS[/COLOR][COLOR=#007700]![/COLOR][COLOR=#0000BB]DiaChi [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Khach[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Fields[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]2[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]End [/COLOR][COLOR=#007700]If ----[/COLOR
Trong đoạn hàm trên, chúng ta dùng Seek để lấy Recordset của bảng tblKhach có trường MaKhach trùng với trường MaKhach của bảng tblPhatSinh nhằm lấy trường TenKhach và DiaChi tương ứng trong bảng tblKhach gán vào hai trường tương ứng trong bảng tblPhatSinh