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 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 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 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.










0 nhận xét