Thứ Năm, 25 tháng 2, 2016

Phát triển HTTT kế toán bằng MS Access - Chương 8 - Bảng đơn bán hàng

James Perry, Richard Newmark


Chương 8
Qui trình bán hàng - thu tiền


Bảng đơn bán hàng


Vì mỗi đơn bán hàng chỉ gồm một khách hàng và mọi đơn bán hàng yêu cầu phải có một khách hàng, bạn có thể tạo liên kết khách hàng – đơn bán hàng trong bảng đơn bán hàng. CustomerID, khóa chính trong tblCustomer, sẽ trở thành khóa ngoại trong tblSaleOrder. Tương tự, liên kết nhân viên – đơn bán hàng sẽ được thực hiện bằng cách áp đặt khóa chính của tblEmployee, EmployeeID, làm khóa ngoại trong tblSaleOrder. Dĩ nhiên, bảng đơn bán hàng sẽ cần khóa chính cho chính nó và một trường lưu thời điểm bán hàng.

Vì khách hàng thường gửi đến đơn mua hàng để ghi rõ những mặt hàng mà họ muốn mua, bạn sẽ thêm một trường để lưu mã đơn mua hàng của khách hàng. Việc lưu mã đơn mua hàng cùng với dữ liệu đơn bán hàng sẽ cung cấp tư liệu cần thiết cho kiểm toán viên và người khác dễ dàng kiểm chứng tính xác thực và độ chính xác của các đơn bán hàng.

Pipefitters còn lưu tổng trị giá các mặt hàng trên đơn bán hàng. Mặc dù tổng trị giá có thể được tính bằng cách lấy tổng theo dòng, tức số lượng nhân đơn giá, của từng mặt hàng đã đặt, Pipefitters lưu tổng trị giá để kiểm soát. Nếu giá hay số lượng mặt hàng đã đặt bị thay đổi hoặc tình cờ hoặc có mục đích sau khi đã đặt hàng, thì tổng theo dòng sẽ không bằng tổng trị giá đơn bán hàng. Một truy vấn định kỳ so sánh 2 giá trị này trên toàn bộ đơn bán hàng sẽ phô bày những sai sót hay/và bất thường khả dĩ. Vì thế, tblSaleOrder sẽ có 6 trường: khóa chính, thời điểm, khóa ngoại liên kết với tblCustomer, khóa ngoại liên kết với tblEmployee, tổng trị giá đơn bán hàng, và mã đơn mua hàng của khách hàng. Bài tập 8.19 sẽ chỉ cách tạo tblSaleOrder.

BÀI TẬP 8.19: TẠO BẢNG ĐƠN BÁN HÀNG

1. Tạo bảng mới. Kích CREATE tab, rồi kích Table Design trong nhóm Tables.

2. Tạo khóa chính. Gõ SaleOrderID vào ô Field Name rồi Tab sang cột kế. Kích Primary Key trong nhóm Tools. Để Data Type là Short Text. Để ý rằng Access tự động chuyển sang dải lệnh DESIGN vì bạn đang làm việc ở góc nhìn Design.

3. Nhấn F6 để chuyển sang phần Field Properties và thay Field Size bằng 6. Thiết đặt này cho phép Pipefitters nhập 899.999 đơn bán hàng nếu họ bắt đầu với 100001.

4. Đặt thuộc tính Input Mask của trường SaleOrderID 000000;;_ và thuộc tính Caption là Sale Order #. Đặt thuộc tính Required là Yes và thuộc tính Allow Zero Length là No. Để ý rằng Access tự động đặt thuộc tính Indexed là Yes (No Duplicates) khi bạn đặt SaleOrderID làm khóa chính.

5. Gõ EmployeeID vào ô Field Name kế và để Data Type là Short Text. Đặt Field Size là 3, Input Mask là 000;;_, và thuộc tính Caption là Employee #. Trường này là khóa ngoại liên kết với tblEmployee. Đặt thuộc tính Required là Yes, thuộc tính Allow Zero Length là No, và thuộc tính Indexed là Yes (Duplicates OK).

6. Kế đến, tạo trường thời điểm bán hàng bằng cách nhập SaleOrderDate vào Field Name và Data Type là Date/Time. Đặt thuộc tính Format là Short Date và thuộc tính Input Mask là 99/99/0000. Đặt Caption là Date.

7. Pipefitters sẽ nhập đơn bán hàng vào hệ thống ngay khi họ nhận được vì vậy giá trị mặc định cho SaleOrderDate phải là thời điểm hiện thời. Kiểm soát này sẽ hạn chế tối đa lỗi nhập thời điểm. Nhập Date() cho thuộc tính Default Value. Cũng đặt thuộc tính Required là Yes.

8. Gõ CustomerID vào ô Field Name kế và để Data Type là Short Text. Đặt Field Size là 5, Input Mask là 00000;;_, và thuộc tính Caption là Customer #. Trường này là khóa ngoại liên kết với tblCustomer. Mặc dù tên trường trong bảng này không cần trùng với tên trong tblCustomer, nhưng dùng trùng tên là một thực hành tốt. Ta sẽ luôn theo qui ước này. Quan trọng hơn, Data Type của 2 trường này phải tương thích. Cách dễ nhất để đảm bảo tính tương thích Data Type là làm cho kiểu dữ liệu và kích cỡ trường trùng nhau – tức khóa chính trong tblCustomer là CustomerID, trường Short Text với Field Size là 5. Hãy đặt các thuộc tính còn lại cho CustomerID trong tblSaleOrder. Đặt thuộc tính Required là Yes, Allow Zero Length là No, và Indexed là Yes (Duplicates OK).

9. Gõ CustomerPO vào ô Field Name kế và để Data Type là Short Text. Đặt Field Size là 15, và thuộc tính Caption là Customer PO #. Trường này phải cho phép tổ hợp bất kỳ gồm số, chữ, và ký hiệu mà khách hàng có thể quyết định dùng để nhận diện đơn mua hàng của họ. Vì không thể lường trước các đặc trưng của trường này, các kiểm soát nội bộ trên dữ liệu nhập có thể đưa vào bảng cho trường này rất hạn chế. Tuy nhiên, việc làm trường này trở nên bắt buộc (đặt thuộc tính Required là Yes và thuộc tính Allow Zero Length là No), sẽ buộc nhân viên bán hàng phải nhập “None” đối với đơn bán hàng nào không có đơn mua hàng của khách hàng để thể hiện rằng không có liên hệ nào với đơn mua hàng của khách hàng.

10. Tên trường cuối cùng nhập vào là SaleOrderAmount. Đặt Data Type là Currency. Đặt thuộc tính Decimal Places (số vị trí thập phân) là 2. Điều này đảm bảo mọi trị giá đơn bán hàng đều được hiển thị theo dollars và cents. Đặt Caption là Amount.

11. Vì trị giá âm cho đơn bán hàng là vô nghĩa, bạn sẽ thêm qui tắc kiểm tra hợp lệ để ngăn những trị giá âm. Đặt thuộc tính Validation Rule là >=0. Qui tắc này cho phép tổng trị giá là $0.00 vì trong trường hợp hiếm hoi, Pipefitters có thể gửi miễn phí một mặt hàng cho khách hàng để giải quyết trường hợp bị khách hàng phàn nàn. Với Validation Text liên quan, nhập thông báo đại loại như Sale order amount cannot be negative (trị giá đơn bán hàng không thể âm). Cuối cùng, đặt thuộc tính Required là Yes.

12. Đóng và lưu bảng với tên tblMySaleOrder.

THỬ NGHIỆM

Hãy tạo liên kết giữa tblSaleOrder tblCustomer cũng như liên kết giữa tblSaleOrder tblEmployee. Dùng Bài tập 8.14 làm hướng dẫn. Nhớ đánh dấu ô Enforce Referential Integrity và Cascade Update Related Fields.

Đến đây thiết kế cơ bản của tblSaleOrder đã hoàn tất. Hình 8.22 trình bày tblSaleOrder ở góc nhìn Datasheet.

Hình 8.22. tblSaleOrder ở Datasheet View.

Bảng Sale Order nhận diện thời điểm tiếp nhận đơn hàng; ghi nhận khách hàng nào đã đặt; nhân viên nào ghi nhận đơn hàng, tổng trị giá đơn hàng; và gán cho đơn bán hàng một mã nhận diện duy nhất làm khóa chính. Bạn có thể chỉ nhập một phần thông tin đơn bán hàng vào bảng này vì tblSaleOrder không lưu thông tin hàng tồn kho mà khách hàng đã đặt. Điều này sẽ làm tblSaleOrder có trường trùng lặp – tức vi phạm qui tắc chuẩn hóa bạn đã học ở Chương 2. Để lưu thêm thông tin, mô hình dữ liệu bán hàng - thu tiền ở Hình 8.5 có bảng-quan-hệ tblReservation-SaleOrderInventory để liên kết tblSaleOrdertblInventory.

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

Đăng nhận xét