James Perry, Richard Newmark
Chương 9
Qui trình mua hàng - chi tiền
Dùng form đơn bán hàng để tạo form đơn mua hàng
Form nhập đơn mua hàng tương tự với form nhập đơn bán hàng. Dữ liệu của nó trích từ các nguồn:
tblPurchaseOrder và
qryVendorInfo cho phần chính của form và dữ liệu trong subform dựa trên
qryPurchaseOrderLineItem. Vì các đối tượng cơ sở dữ liệu này tương tự bảng và các truy vấn dùng để tạo form nhập đơn bán hàng, sẽ dễ hơn nếu sửa frmOrderSale thay vì tạo form nhập đơn mua hàng bằng Form Wizard. Mặc dù việc sửa các truy vấn và nguồn dữ liệu được dùng bởi một form có thể phức tạp, đó là kỹ năng cần thiết vì nó cho phép bạn tìm và sửa lỗi cũng như tạo những thay đổi lớn trên form hiện có.
Bất kỳ khi nào bạn làm việc với tổ hợp form-subform trong Access, bạn cần bắt đầu với subform trong cùng rồi mở rộng ra form chính. Đầu tiên, bạn sẽ sửa
fsubSaleOrder ở các Bài tập 9.15 và 9.16. Sau đó bạn sẽ sửa
frmSaleOrder ở các Bài tập 9.17 và 9.18. Sau khi có được form nhập đơn mua hàng hoạt động tốt, bạn sẽ thêm một số thành phần điều khiển ở các Bài tập 9.19 đến 9.25.
BÀI TẬP 9.15: TẠO FSUBPURCHASEORDER BẰNG CÁCH SỬA FSUBSALEORDER – PHẦN 1
Trong bài tập bạn sẽ sửa Record Source và Control Source của subform cho mọi trường hiện có.
1. Kích
fsubSaleOrder trong Navigation Pane. Nhấn
Ctrl+C rồi
Ctrl+V. Sửa tên thành
fsubPurchaseOrder.
2. Mở
fsubPurchaseOrder ở góc nhìn Design. Kích
Property Sheet trong nhóm Tools. Bạn có thể bù trừ cho việc giảm không gian khả kiến của subform bằng cách che Navigation Pane.
3. Sửa nguồn dữ liệu của subform. Chọn
Form từ combo box ở đỉnh Property Sheet nếu nó chưa được chọn. Kích
Data tab nếu nó chưa được chọn. Kích mũi tên combo box trong thuộc tính Record Source rồi chọn
qryPurchaseOrderLineItem. Để ý rằng bạn phải cuộn lên để tìm
qryPurchaseOrderLineItem và chỉ thấy được một phần tên.
4. Sửa tên xuất hiện trên form tab. Kích
Format tab. Sửa Caption thành
fsubPurchaseOrder.
5. Để ý rằng góc trái trên của SOPrice có một chỉ dấu thành phần điều khiển bất hợp lệ hình tam giác xanh lá cây, các thành phần điều khiển InventoryListPrice và SaleLineItem cũng vậy. Tam giác xanh lá cây xuất hiện trong các thành phần điều khiển này vì chúng không còn liên kết với nguồn dữ liệu của form; bạn đã sửa nguồn dữ liệu từ
qrySaleOrderLineItem thành
qryPurchaseOrderLineItem.
6. Tại sao không có tam giác xanh lá cây trên InventoryID, FullDescription, và QuantityOrdered?
7. Kích thành phần điều khiển
SOPrice. Sửa thuộc tính Control Source trong Data tab từ SOPrice thành POPrice bằng cách gõ
POPrice hay chọn mục đó từ combo box. Kích
Other tab. Sửa Name thành
POPrice.
8. Lặp lại Bước 7 để sửa:
9. InventoryListPrice thành
InventoryStdCost, và
10. SaleOrderLineExtension thành
PurchaseOrderLineExtension.
11. Sửa nhãn List Price thành
Std. Cost.
12. Lưu các thay đổi.
BÀI TẬP 9.16: TẠO FSUBPURCHASEORDER BẰNG CÁCH SỬA FSUBSALEORDER – PHẦN 2
Các mục trên từng dòng của form nhập đơn mua hàng chứa trường lưu mã hàng tồn kho của nhà cung ứng, trường này không có trong các mục trên từng dòng của form nhập đơn bán hàng. Bạn sẽ thêm trường này vào subform ở bài tập sau.
1. Đóng
Property Sheet để mở rộng không gian làm việc. Kích và kéo cạnh phải của phần Detail đến khấc 8-inch vì bạn cần thêm trường
VendorItemID. Chọn tất cả các thành phần điều khiển và nhãn ngoại trừ InventoryItemID bằng cách nhấn và giữ phím
Ctrl rồi kích từng thành phần điều khiển và nhãn. Nhấn và giữ phím mũi tên phải (hay nhấn nó liên tục) để di chuyển các thành phần điều khiển và nhãn sang cạnh phải của form.
2. Thêm một thành phần điều khiển cho VendorItemID. Kích
InventoryID. Nhấn và giữ phím
Shift, rồi kích nhãn tương ứng của nó. Nhấn
Ctrl+C rồi
Control+V để tạo một bản sao của thành phần điều khiển và nhãn. Sửa văn bản trong ô nhãn thành
Vendor Item #. Để ý ô nhãn sẽ mở rộng cho vừa với nhãn mới.
3. Kích thành phần điều khiển
InventoryID mới (thành phần điều khiển bạn vừa tạo). Mở
Property Sheet. Kích
Data tab nếu nó chưa được chọn. Sửa Control Source thành
VendorItemID. Xóa
Input Mask. Kích
Other tab. Sửa Name thành
VendorItemID.
4. Nhấn và giữ phím
Shift, kích
VendorItemID và nhãn
Vendor Item # để chọn cả hai. Kích
Arrange tab. Kích
Size/Space menu trong nhóm Sizing & Ordering rồi chọn
To Widest trong phần Portion của menu (xem Hình 9.8).
5. Với cả hai đối tượng vẫn đang được chọn, dùng phím mũi tên phải để chuyển chúng sang bên trái của FullDescription và nhãn của nó. Kích vùng trống trên form để khử việc chọn VendorItemID và nhãn của nó. Dùng kỹ thuật Shift + kích để chọn
VendorItemID và
FullDescription. Kích Al
ign menu trong nhóm Sizing & Ordering rồi chọn
Top để di chuyển VendorItemID lên trên và ngang hàng với FullDescription. Làm tương tự với các nhãn liên quan.
6. Sửa văn bản trong nhãn Item # thành
Our Item #. Chọn nhãn và thành phần điều khiển
InventoryID. Định cỡ
To Widest như bạn đã làm ở Bước 4. Hãy làm tất cả các nhãn cách đều nhau. Chọn tất cả các nhãn bằng kỹ thuật kích và kéo như được minh họa ở Hình 9.7. Kích
Size/Space menu rồi chọn
Equal Horizontal trong phần Spacing của menu. Lặp lại qui trình này với các thành phần điều khiển trong phần Detail của form.
7. Kích
Tab Order trong nhóm Tools (trên dải lệnh Design). Trong hộp thoại Tab Order, kích nút
Auto Order. Để ý là các Field Names trong danh sách Custom Order được sắp lại từ trái sang phải trên form. Kích
OK.
8. Loại bỏ khoảng trống bên dưới các nhãn và bên dưới các thành phần điều khiển trường bằng cách kích và kéo các thanh
Detail và
Form Footer lên trên.
9. Lưu các thay đổi. Xem form ở góc nhìn Form. Form cần giống Hình 9.16.
Hình 9.16 fsubPurchaseOrder ở góc nhìn Form.
10. Chuyển về góc nhìn
Design. Mở Property Sheet nếu nó chưa được mở. Kích nhãn PurchaseOrderLineExtension. Để ý tên của nó là
SaleOrderLineExtension_Label. Mặc dù cần đặt lại tên nhãn cũng như thành phần điều khiển, ở đây sẽ không làm nhiệm vụ này trong mọi bài tập có sao chép form để tiết kiệm thời gian.
Sau khi hoàn thành Bài tập 9.16, bạn có thể nhận ra rằng việc sửa
frmSaleOrder, sẽ trích dữ liệu từ hai truy vấn và một bảng, cần nhiều công sức hơn việc sửa subform với dữ liệu dẫn xuất từ một truy vấn duy nhất. Một trong những nhiệm vụ lý thú mà bạn sẽ thực hiện trong Bài tập 9.17 là sửa truy vấn bên trong form.
BÀI TẬP 9.17: TẠO FRMPURCHASEORDER BẰNG CÁCH SỬA FRMSALEORDER – PHẦN 1
Trong bài tập này bạn sẽ sao chép và sửa
frmSaleOrder để tạo
frmPurchaseOrder. Quá trình này bao gồm việc sửa các tiêu đề và nhãn để nhận diện đúng
frmPurchaseOrder cũng như sửa Source Object của subform thành
fsubPurchaseOrder rồi liên kết nó với
frmPurchaseOrder.
1. Tạo một bản sao của
frmSaleOrder (trong phần Forms của Navigation Pane) rồi đặt tên bản sao là
frmPurchaseOrder (xem Bài tập 9.15, Bước 1).
2. Mở
frmPurchaseOrder ở góc nhìn Design.
3. Kích tiêu đề
Header hai lần (chậm hơn kích kép) rồi sửa tiêu đề thành
Purchase Order Entry.
4. Sửa tên xuất hiện trên tab của form. Mở
Property Sheet. Che
Navigation Pane để nhìn form thoáng hơn. Chọn
Form từ Property Sheet combo box. Kích
Format tab nếu nó chưa hiển thị. Sửa Caption thành
frmPurchaseOrder.
5. Sửa nguồn dữ liệu của subform. Chọn
fsubSaleOrder (bạn chưa sửa nguồn thành
fsubPurchaseOrder) từ Property Sheet combo box. Kích
Data tab. Kích mũi tên combo box trong thuộc tính Source Object rồi chọn
Form.fsubPurchaseOrder. Để ý rằng
fsubPurchaseOrder lập tức được hiển thị trong khung subform. Gõ
PurchaseOrderID vào các thuộc tính Link Master Fields và Link Child Fields. Các thuộc tính này liên kết subform với form, cho phép form hiển thị đúng các mục trên từng dòng của đơn mua hàng ứng với đơn mua hàng đó. Để ý là bạn không thể dùng công cụ liên kết trường Subform Field Linker như đã làm ở Bài tập 8.43 vì bạn chưa sửa thuộc tính Control Source của
frmPurchaseOrder.
6. Sửa tên subform trong
Other tab (trên Property Sheet) thành
fsubPurchaseOrder.
BÀI TẬP 9.18: TẠO FRMPURCHASEORDER BẰNG CÁCH SỬA FRMSALEORDER – PHẦN 2
Trong bài tập này, bạn sẽ tạo một truy vấn Record Source mới đằng sau form rồi kết hợp các thành phần điều khiển trường với dữ liệu từ Record Source mới của form.
1. Mở
frmPurchaseOrder ở góc nhìn Design nếu nó chưa mở. Hãy sửa nguồn dữ liệu của form. Mở
Property Sheet rồi chọn
Form ở combo box. Kích
Data tab. Kích nút
Builder trong thuộc tính Record Source. Bạn cần thấy một cửa sổ truy vấn mới xuất hiện.
2. Kích
Tables tab trong cửa sổ Show Table.
3. Kích kép
tblPurchaseOrder, rồi kích
Query tab và kích kép
qryVendorInfo. Kích
Close.
4. Di chuyển và định cỡ lại các khung
tblPurchaseOrder và
qryVendorInfo để có thể thấy mọi tên trường, và dành một khoảng không giữa chúng để dễ dàng thấy liên kết mà bạn sẽ tạo.
5. Hãy liên kết
tblPurchaseOrder với
qryVendorInfo trên trường chung của chúng, VendorID. Kích và kéo trường
VendorID từ
qryVendorInfo đến trường
VendorID trong
tblPurchaseOrder. Bạn phải tự tạo liên kết này vì Access không tự động tạo các liên kết đến/từ các truy vấn.
6. Hãy chọn tất cả các thuộc tính trong khung
tblPurchaseOrder. Kích
PurchaseOrderID, nhấn và giữ phím
Shift, nhấn phím mũi tên xuống cho đến khi tất cả các thuộc tính đều được chọn, rồi kích và kéo các thuộc tính vào Criteria Pane.
7. Thêm tất cả các thuộc tính từ khung qryVendorInfo ngoại trừ VendorID vào cột trống đầu tiên trong Criteria Pane. Bạn có thể cần dùng thanh cuộn của Criteria Pane để thấy được cột trống.
8. Sắp xếp form theo PurchaseOrderID bằng cách chọn
Ascending trong ô Sort của PurchaseOrderID.
9. Kích nút
Save As trong nhóm Close thuộc Design tab. Gõ
frmPurchaseOrder rồi kích
OK. Đóng Query Builder. Kích
Yes trong hộp thoại Save Changes. Để ý là tất cả các thành phần điều khiển trường đều chứa tam giác xanh lá cây, cho biết các thành phần điều khiển này không hợp lệ: dữ liệu nguồn mà chúng trỏ đến không còn tồn tại trong truy vấn Record Source của form mà bạn vừa sửa.
10. Sửa các thành phần điều khiển trường và nhãn. Mở
Property Sheet nếu nó chưa mở. Kích thành phần điều khiển
SaleOrderID. Sửa Control Source trên
Data tab thành
PurchaseOrderID. Kích
Other tab rồi sửa Name thành
PurchaseOrderID. Kích nhãn
Sale Order # rồi sửa thành
Purchase Order #. Lặp lại quá trình này cho tất cả các thuộc tính liệt kê ở Hình 9.17.
Hình 9.17 Các nhãn và thành phần điều khiển cần sửa trong frmPurchaseOrder.
11. Sửa Input Mask (trên Data tab của Property Sheet) cho VendorID thành
0000;;_. Xóa
Short Date khỏi thuộc tính Format trên Format tab.
12. Sửa Input Mask cho PurchaseOrderDate thành
99/99/0000;0;_. Đặt Default Value là
Date().
13. Sửa Input Mask cho ExpectedDeliveryDate thành
99/99/0000;0;_.
14. Chuyển sang góc nhìn
Form. Để ý rằng thông tin liên lạc chính Primary Contact quá thấp và một phần subform bị khuất nếu không dùng thanh trượt. Hãy trở về góc nhìn Design rồi di chuyển thành phần điều khiển và nhãn
Primary Contact, đồng thời tăng chiều cao và chiều rộng của khung subform. Bạn sẽ cần tăng chiều rộng form đến khấc
8-3/4 inches. Hình 9.18 thể hiện form hoàn tất ở các góc nhìn Design và Form. Lưu các thay đổi và đóng form.
Hình 9.18 Form nhập liệu đơn mua hàng ở các góc nhìn Design và Form.
Form bạn vừa tạo chưa hoạt động tốt. Record Source cho EmployeeID combo box là
qrySalesperson giới hạn việc lựa chọn nhân viên bán hàng mà thôi. Bạn sẽ sửa
qrySalesperson trong bài tập kế để chọn nhân viên mua hàng cho combo box.
BÀI TẬP 9.19: SỬA EMPLOYEEID COMBO BOX
1. Sao chép
qrySalesperson trong Navigation Pane rồi đặt tên bản sao là
qryPurchasingAgent.
2. Mở
qryPurchasingAgent ở góc nhìn Design.
3. Sửa tiêu chí Criteria cho EmployeeTypeID thành
"60", tức EmployeeTypeID cho nhân viên mua hàng. Xem truy vấn ở góc nhìn
Datasheet để kiểm chứng tất cả nhân viên trong tập động dynaset đều có kiểu Type là 60. Lưu rồi đóng truy vấn.
4. Mở
frmPurchaseOrder ở góc nhìn
Design nếu nó chưa được mở, và mở
Property Sheet. Kích
EmployeeTypeID combo box. Trên
Data tab của Property Sheet, sửa Row Source thành
qryPurchasingAgent. Sửa thuộc tính Name trên
Other tab thành
cboPurchasingAgent.
5. Chuyển sang góc nhìn
Form. Để ý là Purchasing Agent combo box không có đầu đề cột (xem phần trên của Hình 9.19). Để hiển thị chúng, trở về góc nhìn
Design rồi chọn combo box nếu nó chưa được chọn. Kích
Format tab rồi sửa thuộc tính Column Heads thành
Yes. Chuyển lại góc nhìn
Form. Bây giờ đầu đề cột đã xuất hiện như phần dưới của Hình 9.19.
Hình 9.19 Purchasing Agent combo box có và không có đầu đề cột.
6. Lưu rồi đóng form.
BÀI TẬP 9.20: TẠO TRUY VẤN CHO COMBO BOX TRA CỨU TỒN KHO
1. Tạo một bản sao của
qryPurchaseOrderLineItem trong Navigation Pane rồi lưu bản sao là
qryPOInventoryItemLookup.
2. Mở
qryPOInventoryItemLookup ở góc nhìn Design.
3. Kích khung
tblReservation-PurchaseOrderInventory rồi xóa nó bằng cách nhấn phím
Delete. Để ý rằng tất cả các trường tham chiếu đến bảng đó cũng bị xóa. Xóa PurchaseOrderLineExtension bằng cách kích cột rồi nhấn phím
Delete.
4. Xem truy vấn ở góc nhìn
Datasheet. Hàng tồn kho được sắp theo InventoryID. Các phương án khác để sắp tập động dynaset là theo thứ tự từ điển của FullDescription tăng dần hay giảm dần, tức sắp mặt hàng theo kích cỡ, rồi theo thành phần cấu tạo, rồi theo kiểu; hoặc sắp tập động dynaset theo chi phí chuẩn. Nếu sau này nhân viên mua hàng bảo bạn rằng họ cần sắp tồn kho theo cách khác thì bạn sẽ phải tạo lại biểu thức FullDescription để sửa thứ tự sắp. Vì thế, bạn sẽ tăng tính linh hoạt của thiết kế bằng cách tạo một trường riêng cho từng mô tả phân loại/kiểu.
5. Trở về góc nhìn
Design. Xóa trường
FullDescription. Nếu bạn không thể thấy toàn bộ bảng và các trường của chúng, hãy di dời bảng hay kích và kéo đường phân chia.
6. Giả sử Pipefitters muốn tồn kho được sắp theo thành phần cấu tạo Composition / đường kính Diameter / kiểu Type. Kéo
CompositionDescription,
InventoryDiameterDescription, và
InventoryTypeDescription từ các bảng tương ứng của chúng vào các cột đầu tiên, hai, và ba trong Criteria Pane. Chọn
Ascending làm thuộc tính Sort cho cả ba trường.
7. Kích và kéo
InventoryID từ tblInventory vào cột đầu tiên của Criteria Pane. InventoryID phải có trong truy vấn mặc dù bạn sẽ không thấy nó trong combo box vì InventoryID là giá trị phải được lưu vào
tblReservation-PurchaseOrderInventory.
8. Chuyển sang góc nhìn
Datasheet. Để ý là các mặt hàng không còn được sắp theo InventoryID vì bạn đã sửa thứ tự sắp để nhân viên mua hàng Pipefitters dễ tìm hàng tồn kho hơn.
9. Lưu và đóng truy vấn.
BÀI TẬP 9.21: TẠO COMBO BOX TRA CỨU TỒN KHO
1. Mở
fsubPurchaseOrder ở góc nhìn Design. Kích thành phần điều khiển
InventoryID rồi nhấn phím
Delete.
2. Tạo combo box tra cứu tồn kho. Kích
Combo Box trong nhóm Controls rồi kích kép vào phần
Detail của subform nơi ô thành phần điều khiển InventoryID đã từng ở đó.
- Trong hộp thoại tùy chọn đầu tiên, I want the combo box to get the values from another table or query (tôi muốn combo box nhận các giá trị từ một bảng hay truy vấn khác), đã được chọn sẵn. Kích Next.
- Trong hộp thoại thứ hai, kích nút radio Queries, kích kép Query: qryPOInventoryItemLookup để chọn truy vấn rồi kích Next để sang hộp thoại kế.
- Kích >> để chọn tất cả các trường. Kích Next.
- Kích Next vì bạn đã tạo thứ tự sắp trong câu truy vấn.
- Kích Next để chấp nhận kích cỡ cột mặc định.
- Kích Next vì InventoryID đã được chọn là giá trị được lưu vào tblReservation-PurchaseOrderInventory.
- Kích nút radio Store that value in this field: (lưu giá trị đó vào trường sau:), chọn InventoryID từ combo box. Kích Next.
- Đặt tên combo box là cboPOInventoryLookup. Kích nút Finish để tạo combo box.
3. Xóa nhãn combo box bạn vừa tạo. Kích nhãn combo box mới, có thể khó thấy vì nó chồng lên ô văn bản InventoryID. Nhấn phím
Delete.
4. Kích
cboPOInventoryLookup, nhấn phím
Control rồi chọn nhãn
Our Item #. Trên dải lệnh
Arrange, chọn Size/Space menu rồi chọn
To Narrowest. Sắp ngay ngắn combo box với nhãn Our Item # bằng việc dùng các chức năng Align trên Arrange tab. Chọn
cboPOInventoryLookup và
VendorID rồi sắp ngay ngắn chúng.
5. Kích
Design tab và mở
Property Sheet. Trên subform, kích combo box mới. Sửa thuộc tính Name của nó trên
Other tab của Property Sheet thành
cboPOInventoryLookup. Sửa thuộc tính Column Heads trên Format tab thành
Yes.
6. Dùng
Tab Order trong nhóm Tools trên dải lệnh Design để sắp thứ tự tab tự động trong subform.
7. Kiểm tra combo box mới (xem Hình 9.20) và thứ tự tab bằng cách chuyển sang góc nhìn
Form. Khi kiểm tra xong, lưu và đóng subform.
Hình 9.20 Combo box tồn kho ở góc nhìn Form.
Form nhập đơn mua hàng cũng cần có một combo box làm thành phần điều khiển nhằm giúp đảm bảo VendorID đúng được nhập vào. Vì việc tạo VendorID combo box tương tự các combo box khác mà bạn đã tạo, đây sẽ là bài tập cho bạn.
Form nhập đơn mua hàng đã có nhiều kiểm soát được tạo bên trong, bao gồm các kiểm soát được tạo bên trong bảng (chẳng hạn mặt nạ nhập liệu, trường bắt buộc, qui tắc hợp lệ), kiểm soát ở mức cơ sở dữ liệu như áp dụng tính toàn vẹn tham chiếu, và kiểm soát ở mức form như combo box. Trong loạt bài tập kế bạn sẽ tạo một truy vấn tạo bảng, một truy vấn cập nhật, một macro, và một nút lệnh, tất cả đều nhằm cập nhật tổng trị giá đơn mua hàng.
BÀI TẬP 9.22: TẠO TRUY VẤN TẠO BẢNG ĐỂ TÍNH TỔNG TRỊ GIÁ TRÊN TỪNG DÒNG THUỘC ĐƠN MUA HÀNG THEO PURCHASEORDERID.
Truy vấn này tương tự truy vấn tạo bảng mà bạn đã tạo ở Chương 8 để tính tổng trị giá trên từng dòng thuộc đơn bán hàng theo hóa đơn bán hàng. Vì thế, ta sẽ dùng truy vấn đó làm để khởi đầu.
1. Kích
qrySumOfLineExtensionsByInvoice ở phần Queries thuộc Navigation Pane, nhấn
Ctrl+C rồi
Ctrl+V. Gõ
qrySumOfPOLineExtensionsByPO vào ô văn bản ở hộp thoại Paste As, rồi kích
OK.
2. Mở
qrySumOfPOLineExtensionsByPO ở góc nhìn Design.
3. Kích
Show Table trong nhóm Query Setup, kích
Queries tab, rồi kích kép
qryPurchaseOrderLineItem. Đóng hộp thoại. Định cỡ lại khung truy vấn để thấy được tất cả các tên trường.
4. Sửa Table trong cả hai trường thuộc Criteria Pane thành
qryPurchaseOrderLineItem. Sửa tên Field đầu tiên thành
PurchaseOrderID và tên Field thứ hai thành
PurchaseOrderLineExtension.
5. Sửa Criteria cho PurchaseOrderID thành
[PO #]. Khi thi hành truy vấn bạn sẽ được nhắc nhập PurchaseOrderID của trị giá đơn mua hàng mà bạn muốn cập nhật. Không có tham biến này, Access sẽ tính lại tổng các trị giá trên từng dòng cho mọi đơn mua hàng, sẽ mất nhiều thời gian tính toán vì ngày càng nhiều đơn mua hàng được nhập vào hệ thống. Xóa khung
qrySaleLineItem bằng cách chọn nó rồi nhấn phím
Delete.
6. Mở
Property Sheet ở nhóm Show/Hide. Kích vùng trống trong Table Pane để hiển thị Query Properties trong Property Sheet. Sửa Destination Table thành
tblSumOfPOLineExtensionsByPO. Kết quả truy vấn giờ đây sẽ được lưu vào bảng tạm
tblSumOfPOLineExtensionsByPO. Mỗi lần truy vấn này được thi hành, phiên bản cũ của bảng (và dữ liệu của nó) bị xóa và một phiên bản mới của bảng được tạo ra. Đóng Property Sheet và lưu các thay đổi.
7. Trước khi thi hành
qrySumOfPOLineExtensionsByPO là một truy vấn tạo bảng, hãy mở truy vấn ở góc nhìn
Design. Kích
Datasheet View trong nhóm Results để kiểm chứng kết quả truy vấn cần khớp với Hình 9.21.
Hình 9.21 qrySumOfPOLineExtensionsByPO và tblSumOfPOLineExtensionsByPO ở góc nhìn Datasheet với PO # là 100001.
8. Trở về góc nhìn
Design. Kích Run rồi gõ
100001 vào hộp thoại Enter Parameter Value. Để ý hộp thoại khuyến cáo rằng bạn chuẩn bị dán một dòng vào bảng mới mà không thể quay lui. Kích
Yes rồi đóng truy vấn. Hãy kiểm chứng kết quả bằng cách kích kép
tblSumOfPOLineExtensionsByPO, bảng bạn vừa tạo ra, ở Navigation Pane. Đóng bảng. Kích kép
qrySumOfPOLineExtensionsByPO để thi hành một lần nữa. Một hộp thoại khuyến cáo là bạn chuẩn bị thi hành một truy vấn tạo bảng mà sẽ sửa dữ liệu trong bảng của bạn. Kích
Yes và bạn sẽ nhận một khuyến cáo khác cho biết phiên bản hiện thời của bảng sẽ bị xóa trước khi thi hành truy vấn. Kích
Yes rồi gõ
100001, tức mã đơn mua hàng chứa tổng trị giá bạn muốn cập nhật, rồi kích
OK. Bạn sẽ nhận khuyến cáo cho biết bạn chuẩn bị dán một dòng vào bảng mới mà ở trên quay lui. Kích
Yes. Đóng truy vấn rồi mở
tblSumOfPOLineExtensionsByPO để kiểm chứng là kết quả truy vấn đã được chuyển vào bảng (xem Hình 9.21). Đóng bảng.
Bây giờ bạn cần chuyển tổng trị giá đơn mua hàng từ
tblSumOfPOLineExtensionsByPO vào
tblPurchaseOrder. Điều này cần một truy vấn cập nhật.
BÀI TẬP 9.23: TẠO MỘT TRUY VẤN CẬP NHẬT ĐỂ CHUYỂN TỔNG TRỊ GIÁ TRÊN TỪNG DÒNG CỦA ĐƠN MUA HÀNG VÀO TBLPURCHASEORDER
1. Kích
Create tab rồi kích
Query Design trong nhóm Queries.
2. Trong hộp thoại Show Table, kích kép
tblPurchaseOrder và
tblSumOfPOLineExtensionsByPO. Đóng hộp thoại. Định cỡ lại các khung để hiển thị toàn bộ tên bảng và tất cả các tên trường.
3. Kích
Update trong nhóm Query Type. Bạn sẽ thấy dòng Update To xuất hiện trong Criteria Pane. Field và Table ở hai dòng đầu của Criteria Pane sẽ qui định trường được cập nhật. Kích kép
PurchaseOrderAmount trong tblPurchaseOrder.
4. Dòng Update To qui định bảng và thuộc tính nguồn thông tin. Gõ
[tblSumOfPOLineExtensionsByPO].[SumOfPurchaseOrderLineExtensions]. Phải có dấu chấm giữa tên bảng và tên trường.
5. Lưu truy vấn là
qryUpdatePurchaseOrderAmount. Đóng truy vấn.
6. Kiểm thử truy vấn cập nhật này. Mở
tblPurchaseOrder ở góc nhìn Datasheet. Sửa giá trị PurchaseOrderAmount với Purchase Order # 100001 thành
0. Tab sang bản ghi kế vì Access sẽ không cập nhật bản ghi cho đến khi bạn tab sang bản ghi kế hay đóng bảng. Cứ để bảng mở.
7. Kích kép
tblSumOfPOLineExtensionsByPO để thi hành truy vấn tạo bảng. Kích
Yes trong các hộp thoại khuyến cáo. Gõ
100001 cho PO #. Kích kép
qryUpdatePurchaseOrderAmount để thi hành truy vấn. Kích
Yes trong các hộp thoại khuyến cáo. Kích nơi bất kỳ trong
tblPurchaseOrder để tái hiển thị bảng, điều đó sẽ cập nhật PurchaseOrderAmount với Purchase Order # 100001 thành $3,812.75. Đóng bảng.
BÀI TẬP 9.24: TẠO MACRO ĐỂ TỰ ĐỘNG THI HÀNH CÁC TRUY VẤN TẠO BẢNG VÀ CẬP NHẬT
1. Kích
Create tab rồi kích
Macro trong nhóm Macros & Code. Kích
Show All Actions trong nhóm Show/Hide vì hành động Set Warnings không có trong tập hành động mặc định.
2. Trong Add New Action combo box, bắt đầu gõ
SetWarnings. Access sẽ nhận diện hành động sau khi bạn gõ SetW vì không có hành động nào khác bắt đầu với bốn chữ đó (xem Hình 9.22). Nhấn
Enter để hiển thị các tham biến hành động Action Arguments. Hành động SetWarnings qui định việc có hiển thị các thông báo hệ thống hay không. Khi được đặt là No (thiết đặt mặc định) các hộp thoại khuyến cáo bạn đã thấy khi thi hành các truy vấn hành động sẽ không được hiển thị. Hãy để tham biến Warnings On được đặt là
No để không hiển thị các hộp thoại khuyến cáo.
Hình 9.22 Macro mcrUpdate-PurchaseOrderAmount hoàn chỉnh.
3. Một cách thi hành truy vấn và xem nó ở góc nhìn Datasheet là kích kép nó trong Navigation Pane. Hành động OpenQuery cũng thi hành chức năng đó. Hãy chọn
OpenQuery trong Add New Action combo box. Khi bạn biết hành động nào bạn muốn, sẽ nhanh hơn nếu gõ tên hành động thay vì cuộn danh sách. Nếu bạn gõ tên hành động, bạn cần nhấn phím
Enter để hiển thị hộp thoại Action Arguments.
4. Kích
Query Name combo box. Chọn
qrySumOfPOLineExtensionsByPO để thi hành truy vấn hành động đầu tiên trong hai truy vấn mà bạn đã tạo để cập nhật PurchaseOrderAmount. Để tham biến View là
Datasheet, để hành động OpenQuery hoạt động như khi kích kép truy vấn trong Navigation Pane. Để Data Mode được đặt mặc định là
Edit, điều này cho phép sửa các bản ghi hiện hữu hay các bản ghi mới được thêm.
5. Thêm hành động
OpenQuery thứ hai vào ô Add New Action kế tiếp. Chọn
qryUpdatePurchaseOrderAmount trong Query Name combo box. Để View được đặt là
Datasheet và Data Mode được đặt là
Edit.
6. Bước cuối cùng cập nhật PurchaseOrderAmount trong form là tái hiển thị form, tức cập nhật giá trị PurchaseOrderAmount giống như cách bạn đã tái hiển thị
tblPurchaseOrder bằng cách kích nó sau khi thi hành truy vấn cập nhật. Gõ
RepaintObject vào ô Add New Action kế tiếp. Nhấn phím
Enter.
7. Chọn
Form là Object Type và
frmPurchaseOrder từ danh sách Object Names. Macro hoàn chỉnh được thể hiện ở Hình 9.22.
8. Đóng macro. Trong hộp thoại Save As, đặt tên macro là
mcrUpdatePurchaseOrderAmount.
BÀI TẬP 9.25: THÊM NÚT LỆNH VÀO FRMPURCHASEORDER ĐỂ THI HÀNH MACRO
1. Mở
frmPurchaseOrder ở góc nhìn
Design. Tạo khoảng trống cho nút lệnh Macro ở đáy form. Kích và kéo đỉnh của thanh
Form Footer xuống dưới để bạn có ½-inch khoảng trống giữa đáy subform và thanh Form Footer.
2. Kích
Button trong nhóm Controls. Di chuyển con trỏ chuột ngay dưới góc trái dưới của subform rồi kích kép để khởi động Command Button Wizard. Các hộp thoại Command Button Wizard được trình bày ở Hình 9.23 để giúp bạn thực hiện.
Hình 9.23 Các hộp thoại Command Button Wizard.
3. Trong hộp thoại đầu tiên, kích
Miscellaneous trong danh sách Category, rồi kích
Run Macro trong danh sách Actions. Kích
Next.
4. Kích kép
mcrUpdatePurchaseOrderAmount trong hộp thoại kế. Việc kích kép sẽ chọn macro mà bạn muốn cho nút lệnh thi hành rồi đưa bạn đến hộp thoại kế.
5. Để người dùng hiểu mục đích của nút lệnh, hãy dùng một mô tả ngắn và rõ về chức năng của nút trừ phi bạn có một hình ảnh minh họa rõ mục đích. Giả sử bạn không có một ảnh như thế, kích nút radio
Text, gõ
Update PO Amount vào ô Text, rồi kích
Next.
6. Trong hộp thoại cuối cùng, gõ
cmdUpdatePOAmount. Để ý tiền tố
cmd cho nút lệnh. Kích
Finish.
7. Kích thành phần điều khiển
PurchaseOrderAmount, mở
Property Sheet, chọn
Data tab. Để ngăn người dùng nhập sai tổng trị giá đơn mua hàng, hãy sửa giá trị mặc định Default Value về
0, sửa Enabled về
No, và sửa Locked về
Yes. Vì đây là trường bắt buộc, việc thêm Default Value sẽ cho phép bản ghi hiện thời được ghi vào
tblPurchaseOrder trước khi người dùng thi hành UpdatePOAmount macro.
8. Làm rõ với người dùng là không thể sửa PurchaseOrderAmount. Trên
Other tab, sửa thuộc tính Tab Stop thành
No. Kích
Format tab rồi sửa Back Style và Border Style thành
Transparent.
9. Lưu các thay đổi và đóng form.
THỬ NGHIỆM
Hãy kiểm thử form nhập đơn mua hàng. Kích kép
frmPurchaseOrder trong Navigation Pane. Nhập thông tin ở Hình 9.24. Sau khi nhập dữ liệu, nhấn nút lệnh UpdatePOAmount. Gõ
999999 vào hộp thoại rồi kích
OK. Giá trị PurchaseOrderAmount cần thay đổi từ $0.00 thành $552.00.
Hình 9.24 Form nhập đơn mua hàng với dữ liệu kiểm thử.
Hãy dùng các nút chọn bản ghi để xóa dữ liệu bạn vừa nhập. Kích một nút chọn bản ghi Record Selector trong subform rồi nhấn phím
Delete. Lặp lại qui trình này cho các mục còn lại trong subform, rồi dùng nút chọn bản ghi của form để xóa dữ liệu form.