James Perry, Richard Newmark
Chương 8
Qui trình bán hàng - thu tiền
Bảng tồn kho
Qui trình bán hàng - thu tiền yêu cầu bảng tồn kho chứa ít nhất hai trường. Trường thứ nhất là khóa chính – số hay mã nhận diện duy nhất sản phẩm hoặc dịch vụ. Với sản phẩm, trường này có thể là mã mặt hàng (item number), mã danh mục (catalog number), UPC (universal product code, mã sản phẩm phổ biến), hay SKU (stock-keeping unit, mã tồn kho). Với dịch vụ, trường này có thể là mã dịch vụ (labor/service code) hay mã tác vụ (task code). Trường thứ hai cần chứa mô tả sản phẩm hay dịch vụ đó.
Đôi khi công ty phân loại dịch vụ theo nhóm hay kiểu. Nhóm hay kiểu tồn kho thường được biểu diễn trong cơ sở dữ liệu là một bảng kiểu tồn kho riêng biệt. Bảng kiểu tồn kho chứa tối thiểu khóa chính và mô tả. Còn bảng tồn kho sẽ chứa khóa ngoại trỏ đến kiểu tồn kho. Một số công ty dùng thêm một cột để lưu giá bán trong bảng tồn kho. Nếu công ty có giá bán cố định cho từng hàng tồn kho, công ty có thể lưu giá bán đó trong bảng tồn kho. Công ty nào bán cùng sản phẩm hay dịch vụ với giá khác nhau cho khách hàng khác nhau thì phải lưu giá bán vào bảng-quan-hệ sale-inventory. Công ty nào giảm giá cho một số khách hàng hay nhóm khách hàng nào đó thì có thể lưu giá niêm yết vào bảng tồn kho và lưu phần trăm giảm giá vào bảng khách hàng.
Với những công ty lưu giá bán vào bảng tồn kho, vấn đề sẽ phát sinh khi họ đổi giá bán. Chẳng hạn, nếu công ty tính toán lại và in hóa đơn từ năm ngoái dùng giá bán năm nay thì hóa đơn sẽ không chính xác. Giải pháp dùng trong chương này là lưu giá bán vào bảng-quan-hệ sale-inventory. Giải pháp này còn cho phép công ty thay đổi giá bán để phản ánh các điều chỉnh giá chẳng hạn giảm giá một lần cho những hàng hóa bị hư hỏng nhẹ hay cho hàng hóa trưng bày. Hơn nữa, nếu giá niêm yết lưu trong bảng tồn kho thường là giá bán thật sự, thì có thể được dùng làm giá trị mặc định cho bảng sale-inventory.
Pipefitters Supply Company là doanh nghiệp bán đường ống và khớp nối. Mỗi mặt hàng (ống và khớp nối) có 3 đặc trưng: thành phần cấu tạo (composition), kiểu (type), và đường kính. Hình 8.11 cho thấy giá trị và mã Pipefitters dùng cho tồn kho. Mỗi đặc trưng là một trường riêng biệt trong bảng tồn kho. Hơn nữa, bảng tồn kho còn có khóa chính và giá niêm yết trình bày trong Hình 8.12.
Hình 8.11 Hàng tồn kho.
Hình 8.12 Bảng dữ liệu tồn kho ở góc nhìn Datasheet.
Việc dùng trường riêng biệt cho từng phần mô tả tồn kho, thay vì lưu toàn bộ mô tả trong một trường, giúp dễ dàng tạo các kiểm tra hợp lệ dữ liệu nhập một cách hiệu quả. Việc dùng trường riêng biệt còn cho phép người dùng tìm kiếm, truy vấn, và phát sinh báo cáo từ bảng dễ dàng hơn. Trong các bài tập sau, bạn sẽ học cách tạo bảng tồn kho và các bảng kiểu tồn kho liên quan cho dữ liệu của Pipefitters và dùng một phương pháp khác nhằm giúp đảm bảo chỉ dữ liệu hợp lệ được nhập vào hệ thống.
BÀI TẬP 8.12: TẠO BẢNG TỒN KHO
1. Kích CREATE tab, kích Table từ nhóm Tables, rồi kích Design View trong nhóm Views. Khi Access yêu cầu đặt tên bảng, gõ
tblMyInventory. Access sẽ hiển thị bảng trống ở góc nhìn Design.
2. Để tạo khóa chính, gõ
InventoryID vào cột Field Name ở dòng đầu. Để ý ký hiệu
chìa khóa ở dòng đầu, cho biết Access biến trường đầu tiên thành khóa chính mặc định. Đặt Data Type là
Short Text.
3. Nhấn
F6 để chuyển con trỏ đến Field Properties pane, đặt Field Size là
4, rồi
Tab hai lần để chuyển con trỏ đến thuộc tính Input Mask.
4. Gõ
0000;;_ vào ô thuộc tính Input Mask. Mặt nạ nhập liệu yêu cầu 4 chữ số, và gạch dưới là ký tự giữ chỗ.
5.
Tab một lần rồi đặt thuộc tính Caption là
Inventory #.
6.
Tab sang ô thuộc tính Required và đặt là
Yes.
7.
Tab một lần rồi đặt Allow Zero Length là
No.
8.
Tab một lần rồi đảm bảo Indexed được đặt là
Yes (No Duplicates).
9. Lặp lại các bước trên cho 4 trường còn lại bằng việc dùng thông tin ở Hình 8.13.
Hình 8.13 Tên và thuộc tính trường cho tblMyInventory.
10. Nhập ít nhất hai bản ghi tồn kho. Lưu rồi đóng bảng.
Giả sử rằng bản ghi đầu tiên trong bảng có giá trị khóa chính là 1001, bao nhiêu hàng tồn kho khác nhau có thể được lưu trong bảng tồn kho?
Trong
tblMyCustomer, bạn đã dùng qui tắc kiểm tra hợp lệ để lọc dữ liệu. Bạn có thể làm điều tương tự trong
tblMyInventory. Chẳng hạn, bạn có thể tạo qui tắc kiểm tra hợp lệ sau cho InventoryComposition: = “B” or “C”. Điều gì xảy ra nếu Pipefitters bắt đầu bán đường ống và khớp nối bằng nhựa PVC? Chỉ nhân viên được quyền thay đổi cấu trúc cơ sở dữ liệu mới được phép thay đổi qui tắc kiểm tra hợp lệ. Vì thế, trong 2 bài tập tới bạn sẽ kiểm tra hợp lệ dữ liệu bằng cách tạo một bảng để lưu mọi loại thành phần cấu tạo InventoryComposition rồi liên kết
tblMyInventory với
tblMyInventoryComposition. Bạn cũng sẽ tạo các bảng phân loại (category/type/typification table) cho InventoryType và InventoryDiameter rồi liên kết chúng với
tblMyInventory.
BÀI TẬP 8.13: TẠO BẢNG PHÂN LOẠI
1. Kích
CREATE tab, kích
Table trong nhóm Tables, kích
Design View, rồi đặt tên bảng là
tblMyInventoryComposition.
2. Gõ
InventoryComposition vào cột Field Name ở dòng đầu để tạo khóa chính. Đặt Data Type là
Short Text.
3. Nhấn
F6 để chuyển con trỏ sang khung Field Properties. Nhập các thuộc tính tương tự cho InventoryComposition như Hình 8.13, ngoại trừ bạn cần đặt Indexed là
Yes (No Duplicates) vì khóa chính phải duy nhất.
4. Sau khi nhập các thuộc tính trường cho InventoryComposition, trở về khung Field Name.
5. Nhập
CompositionDescription ở dòng thứ hai của cột Field Name. Để Data Type là Short Text.
6. Nhấn
F6 để sang khung Field Properties. Đặt các thuộc tính trường sau: Field Size –
25; Caption –
Description; Required –
Yes; Allow Zero Length –
No; Indexed –
No.
7. Kích Datasheet trong nhóm Views để chuyển sang góc nhìn Datasheet để bạn có thể nhập liệu. Kích
Yes trong hộp thoại Save Table để lưu.
8. Nhập dữ liệu ở Hình 8.11 cho InventoryComposition (cột Code) và CompositionDescription (cột Composition).
9. Tạo
tblMyInventoryType và
tblMyInventoryDiameter bằng cách lặp lại các bước 1 đến 8. Nhớ đổi tên trường và kích cỡ theo hướng dẫn về giá trị thích hợp cho từng bảng. Hơn nữa, điều chỉnh kích cỡ trường mô tả đủ lớn để phù hợp với mô tả dài nhất theo ý của bạn (xem Hình 8.11 về mô tả của các giá trị hiện thời).
THỬ NGHIỆM
Hãy nhập một bản ghi mới vào
tblMyInventory. Thử nhập các giá trị InventoryComposition, InventoryType, và InventoryDiameter mà
chưa được liệt kê trong các bảng phân loại. Nhập thêm InventoryListPrice. Để ý rằng bạn có thể nhập giá trị bất kỳ miễn thỏa yêu cầu của mặt nạ nhập liệu. Điều này xảy ra vì các bảng phân loại chưa được liên kết với bảng tồn kho. Ta sẽ thực hành việc này trong Bài tập 8.14.
BÀI TẬP 8.14: LIÊN KẾT CÁC BẢNG PHÂN LOẠI VỚI TBLINVENTORY
1. Đóng mọi đối tượng Access. Kích
DATABASE TOOLS tab, kích
Relationships trong nhóm Relationships. Cửa sổ Relationships phải trống.
2. Kích
Show Table trong nhóm Relationships (trên DESIGN tab), kích kép các bảng sau để thêm chúng vào cửa sổ Relationships:
tblInventory,
tblInventoryComposition,
tblInventoryDiameter, và
tblInventoryType. Kích
Close khi làm xong.
3. Liên kết
tblInventoryComposition với
tblInventory bằng cách kéo khóa chính InventoryComposition chồng lên InventoryComposition (khóa ngoại) trong
tblInventory. Bây giờ bạn sẽ thấy hộp thoại Edit Relationships tương tự với Hình 7.19. Bên dưới Table/Query bạn thấy
tblInventoryComposition (tên bảng bạn đã kéo “từ”) và
tblInventory (tên bảng bạn đã kéo “đến”). Các thuộc tính trên đó bạn liên kết 2 bảng (InventoryComposition trong cả 2 bảng) xuất hiện bên dưới tên bảng. Để tạo liên kết đúng, luôn kéo từ bảng chứa khóa chính (phía một của quan hệ) đến bảng liên quan chứa khóa ngoại (phía nhiều của quan hệ). Để ý rằng kiểu quan hệ ở đáy hộp thoại là One-To-Many. Access biết điều này nhờ cách bạn đặt thuộc tính Indexed cho các thuộc tính liên kết.
4. Trong hộp thoại Edit Relationships, đánh dấu
Enforce Referential Integrity. Việc áp đặt tính toàn vẹn tham chiếu sẽ hạn chế người dùng chỉ được nhập giá trị vào khóa ngoại của bảng liên quan (InventoryComposition trong
tblInventory) mà đã hiện diện trong trường khóa chính của bảng chính (InventoryComposition trong
tblInventoryComposition).
5. Trong hộp thoại Edit Relationships, cũng đánh dấu
Cascade Update Related Fields. Khi ô này được đánh dấu, thay đổi ở trường khóa chính sẽ tự động cập nhật trường khóa ngoại liên quan.
6. Kích
Create trong hộp thoại. Hộp thoại đóng lại và bạn thấy quan hệ một-nhiều giữa
tblInventoryComposition và
tblInventory.
7. Lặp lại các Bước 1 đến 7 với
tblInventoryType và
tblInventoryDiameter. Cửa sổ Relationships giờ đây cần giống Hình 8.14. Lưu và đóng bảng khi hoàn tất.
Hình 8.14. Relationships tab sau khi hoàn tất Bài tập 8.14.
THỬ NGHIỆM
Hãy nhập một bản ghi mới vào
tblInventory. Thử nhập một giá trị InventoryComposition mà
chưa được liệt kê trong
tblInventoryComposition. Khi chuyển sang trường kế thì tính toàn vẹn tham chiếu
chưa bị áp đặt. Tuy nhiên, khi thử ghi vào cơ sở dữ liệu bằng cách hoặc chuyển sang bản ghi khác hoặc đóng bảng, tính toàn vẹn tham chiếu sẽ được áp đặt và bạn nhận thông báo sau, “You cannot add or change a record because a related record is required in table ‘tblInventoryComposition’” (Bạn không thể thêm hay sửa bản ghi vì bắt buộc phải có bản ghi liên quan trong ‘tblInventoryComposition’’).
Liên kết giữa
tblInventoryComposition và
tblInventory sẽ tạo một số kiểm soát. Thứ nhất, việc áp đặt tính toàn vẹn tham chiếu sẽ hoạt động như một kiểm soát bằng cách hạn chế dữ liệu nhập vào trường InventoryComposition của
tblInventory là “B” và “C”, tức các giá trị bạn đã nhập vào bảng phân loại
tblInventoryComposition. Thứ hai, Access sẽ tự động cập nhật mã InventoryComposition trong
tblInventory mỗi khi giá trị khóa chính trong
tblInventoryComposition thay đổi.
THỬ NGHIỆM
Hãy nhập một bản ghi mới vào
tblInventory. Nhập
B vào trường InventoryComposition. Nhớ rằng bạn phải nhập tất cả các trường vì bạn đã đặt thuộc tính trường Required là Yes cho mọi trường trong bảng. Để tblInventory mở. Bây giờ mở
tblInventoryComposition rồi đổi B trong trường InventoryComposition thành
R. Rồi
Tab hai lần để chuyển sang bản ghi kế. Bây giờ kích
tblInventory tab. Giá trị B trong bản ghi mới bây giờ là R. Hủy thay đổi này bằng cách trở lại
tblInventoryComposition rồi thay R ngược lại là B. Đóng cả hai bảng.
Kiểm soát thứ ba do áp đặt tính toàn vẹn tham chiếu là bạn không thể xóa bản ghi khỏi
tblInventoryComposition nếu có một bản ghi liên quan trong
tblInventory. Nghĩa là, bạn không thể xóa bản ghi
Brass trong
tblInventoryComposition nếu Pipefitters có một hay nhiều hàng tồn kho
Brass. Kiểm soát thứ tư bạn đã áp đặt bằng việc không đánh dấu Cascade Delete Related Records. Nếu ô này được đánh dấu, việc xóa bản ghi
Brass khỏi
tblInventoryComposition sẽ tự động xóa
mọi hàng tồn kho Brass khỏi
tblInventory! Hơn nữa, thao tác này không thể đảo ngược; bạn không thể dùng nút
undo để phục hồi các bản ghi đã bị xóa.