Thứ Ba, 4 tháng 10, 2016

Phát triển HTTT kế toán bằng MS Access - Chương 9 - Dùng form đơn bán hàng để tạo form đơn mua hàng

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 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 FullDescription. Kích Align 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 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 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 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 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 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.

Không có nhận xét nào:

Đăng nhận xét