Chào các Bạn,
Trong MS. Access, khi thiết kế 1 Report ta có thể dùng thuộc tính Running Sum của 1 TexBox để tạo 1 cột đánh số thứ tự liên tục, nhưng với Form thì MS. Access không cung cấp sẵn tiện ích để làm điều đó.
Sau đây là một cách để chúng ta có thể thực hiện việc đánh số thứ tự danh sách trên Form hoặc SubForm.
1. Điều đầu tiên là chúng ta phải tạo 1 Field có kiểu dữ liệu là số học - AutoNumber cho bảng chính tham gia vào nguồn dữ liệu của Form hoặc SubForm (Record Source).
2. Sau đó, ta tạo 1 Query làm Record Source cho Form hoặc SubForm, trong Query đó dùng hàm Dcount để tạo 1 Field linh hoạt đánh số thứ tự danh sách (trong ví dụ dưới đây cột thứ tự đó được đặt tên là "SequentialNum"):
+ Nếu Form là 1 Main Form: ta tạo 1 biểu thức dùng Dcount có dạng tương tự như sau:
Trích dẫn:DCount("OrderID","Orders","OrderID<=" & [OrderID]) AS SequentialNum
Trong đó, OrderID là Field trong bảng Orders có kiểu dữ liệu AutoNumber và phải đặt ORDER BY của Query theo Field này.
+ Nếu Form là 1 SubForm: ta tạo 1 biểu thức dùng Dcount có dạng tương tự như sau:
Trích dẫn:DCount("OrderDetailsId","Order Details","OrderDetailsId<=" & [OrderDetailsId] & " And OrderID=" & [OrderID]) AS SequentialNum
Trong đó, OrderDetailsId là Field trong bảng "Order Details" có kiểu dữ liệu là AutoNumber, và OrderID là khoá chính liên kết giữa bảng Orders với bảng Order Details. Và tương tự như trên, ta phải đặt ORDER BY của Query theo Field này (OrderDetailsID).
3. Cách thức vận hành của biểu thức trên khi ta cho chạy Query làm Record Source của Form hoặc SubForm nêu trên là:
+ Khi ứng dụng duyệt qua từng mẫu tin (record), biểu thức đếm tổng có điều kiện Dcount sẽ đếm số Record theo điều kiện, trong đó chỉ đếm những mẫu tin có OrderID nhỏ hơn hoặc bằng OrderID của mẫu tin hiện hành.
Trích dẫn: "OrderID<=" & [OrderID]
hoặc
Trích dẫn: "OrderDetailsId<=" & [OrderDetailsId] & " And OrderID=" & [OrderID]
Dcount sẽ đếm số Record theo điều kiện, trong đó chỉ đếm những mẫu tin có OrderDetailsID nhỏ hơn hoặc bằng OrderDetailsID của mẫu tin hiện hành và chỉ đếm khi OrderID giống nhau thôi.
4. Như vậy, giả định ta có xoá đi một vài mẫu tin trong bảng Orders hoặc Order Details, làm gián đoạn số đã ghi trong Field AutoNumber đi nữa thì kết quả đánh số thứ tự danh sách vẫn không thay đổi, vì điều kiện "nhỏ hơn hoặc bằng" của Dcount vẫn thoả.
Kết quả đếm này chính là số thứ tự của danh sách.
Để các Bạn dễ hiểu tôi đính kèm theo đây file minh hoạ Northwind lấy từ gốc của Microsoft, tôi chỉ thay đổi một số chi tiết sau đây:
Ví dụ: đánh số thứ tự danh sách phát sinh chi tiết hàng hoá trong SubForm của 1 chứng từ nhập xuất hàng hoá.
1. Thêm vào bảng "Order Details" 1 Field với tên "OrderDetailsID" kiểu số - AutoNumber
2. Thêm vào Form "Orders SubForm" 1 TextBox dùng để ghi kết quả đánh số thứ tự danh sách chi tiết hàng hoá phát sinh
3. Sửa lại Query "Order Details Extended" là Record Source của Form "Orders SubForm" (Form này làm Sub-Form trong Main-Form "Orders"), nếu xem theo dạng câu lệnh SQL thì nội dung như sau:
Xin chú ý dòng được in đậm.
Trích dẫn:SELECT DCount("OrderDetailsId","Order Details","OrderDetailsId<=" & [OrderDetailsId] & " And OrderID=" & [OrderID]) AS SequentialNum, [Order Details].OrderDetailsId, [Order Details].OrderID, [Order Details].ProductID, Products.ProductName, [Order Details].UnitPrice, [Order Details].Quantity, [Order Details].Discount, CCur([Order Details].UnitPrice*[Quantity]*(1-[Discount])/100)*100 AS ExtendedPrice
FROM Products INNER JOIN [Order Details] ON Products.ProductID = [Order Details].ProductID
ORDER BY [Order Details].OrderDetailsId, [Order Details].OrderID;
Chúng ta cần chú ý đoạn được tô đậm trong Query trên:
+ Nếu ta không ban hành điều kiện kép, mà chỉ là:
Trích dẫn: DCount("OrderDetailsId","Order Details","OrderDetailsId<=" & [OrderDetailsId]) AS SequentialNum
Thì danh sách sẽ được đánh thứ tự cho toàn bộ dữ liệu phát sinh trong bảng OrderDetails, mà không đánh thứ tự theo chi tiết của từng số chứng từ phân biệt.
Để đánh thứ tự chi tiết hàng hoá phát sinh theo từng chứng từ phân biệt, ta phải ban hành điều kiện kép:
Trích dẫn: DCount("OrderDetailsId","Order Details","OrderDetailsId<=" & [OrderDetailsId] & " And OrderID=" & [OrderID]) AS SequentialNum
Như vậy Dcount chỉ đếm liên tục khi số chứng từ (OrderID) của các record trùng nhau.
Xin xem ảnh và mở file đính kèm.
Link tải File ứng dụng minh hoạ:
http://www.mediafire.com/download/5rvjgx...ind2k7.zip