Thứ Hai, 29 tháng 2, 2016

Phát triển HTTT kế toán bằng MS Access - Chương 8 - Tạo câu truy vấn cho các mục trên dòng trong đơn bán hàng

James Perry, Richard Newmark


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


Tạo câu truy vấn cho các mục trên dòng trong đơn bán hàng


Các mục trên từng dòng trong đơn bán hàng bao gồm mã mặt hàng, mô tả mặt hàng, số lượng, đơn giá, và trị giá trên dòng (đơn giá x số lượng). Vì thế, các mục trên từng dòng trong đơn bán hàng sẽ dùng thông tin từ những bảng sau: tblReservation-SaleOrderInventory, tblInventory, tblInventoryComposition, tblInventoryType, và tblInventoryDiameter. Ngoài ra, bạn sẽ thêm 2 trường mới. Một trường, SaleOrderLineExtension, sẽ chứa biểu thức (đơn giá x số lượng). Trường kia, FullDescription, sẽ nối các mô tả về thành phần cấu tạo, kiểu, và đường kính của từng mặt hàng.

BÀI TẬP 8.23: TẠO QRYSALEORDERLINEITEM CHO FORM NHẬP ĐƠN BÁN HÀNG

1. Tạo một câu truy vấn mới ở Design View. Kích CREATE tab rồi kích Query Design trong nhóm Queries.

2. Chọn các bảng sau trong hộp thoại Show Table bằng cách kích kép chúng: tblReservation-SaleOrderInventory, tblInventory, tblInventoryComposition, tblInventoryType, và tblInventoryDiameter. Kích nút Close (xem Hình 8.28).

Hình 8.28. Table Pane của qrySaleOrderLineItem.

3. Kéo các mục sau từ Table Pane vào Criteria Pane:
InventoryID từ tblReservation-SaleOrderInventory.
InventoryDiameterDescription từ tblInventoryDiameter.
CompositionDescription từ tblInventoryComposition.
InventoryTypeDescription từ tblInventoryType.
QuantityOrdered SOPrice từ tblReservation-SaleOrderInventory.
InventoryListPrice từ tblInventory.
SaleOrderID từ tblReservation-SaleOrderInventory. Mặc dù thuộc tính này không xuất hiện trong form đơn bán hàng nhưng nó cần để liên kết các mục trên từng dòng trong đơn bán hàng với đơn bán hàng liên quan.

4. Lưu câu truy vấn với tên qrySaleOrderLineItem trước khi tạo SaleOrderLineExtension.

5. Tạo biểu thức SaleOrderLineExtension. Cuộn Criteria Pane sang phải, chọn cột Field trống đầu tiên rồi kích Builder trong nhóm Query Setup để mở hộp thoại Expression Builder.

6. Nhập biểu thức sau bằng cách gõ và chọn các trường từ danh sách Expression Categories: SaleOrderLineExtension: [QuantityOrdered] * [SOPrice].

7. Trên Criteria Pane, di chuyển SaleOrderLineExtension sang bên phải của InventoryListPrice.

8. Kích PropertySheet trong nhóm Show/Hide. Gõ Extension vào trường thuộc tính Caption. Đóng Property Sheet.

9. Tạo biểu thức sau bằng cách dùng Expression Builder theo cùng cách mà bạn đã tạo CityStateZip ở Bước 6 trong Bài tập 8.22: FullDescription: [InventoryDiameterDescription] & “ ” & [CompositionDescription] & “ ” & [InventoryTypeDescription].

10. Xóa các cột sau khỏi Criteria Pane vì bây giờ chúng là một phần của biểu thức mà bạn vừa tạo: InventoryDiameterDescription, CompositionDescription, và InventoryTypeDescription.

11. Di chuyển FullDescription sang bên phải của InventoryID.

12. Mở Property Sheet và gõ Description vào trường Caption. Đóng Property Sheet.

13. Lưu câu truy vấn. Xem tập kết quả động bằng cách kích View hoặc Run trong nhóm Results. Hình 8.29 thể hiện tập hợp động với dữ liệu từ Ch08.accdb. Đóng qrySaleOrderLineItem.

Hình 8.29. Tập hợp động qrySaleOrderLineItem.

Chủ Nhật, 28 tháng 2, 2016

Phát triển HTTT kế toán bằng MS Access - Chương 8 - Tạo câu truy vấn dữ liệu khách hàng để dùng trong form đơn bán hàng

James Perry, Richard Newmark


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


Tạo câu truy vấn dữ liệu khách hàng để dùng trong form đơn bán hàng


Form đơn bán hàng cần thông tin địa chỉ khách hàng. Mặc dù thông tin này có trong tblCustomer, thông tin thành phố, bang, và zip code được lưu riêng rẽ. Để form đơn bán hàng trông giống form giấy, cần kết hợp CustomerCity, CustomerState, và CustomerZip thành địa chỉ thông thường, chẳng hạn “Greeley, Colorado 80639-0131”. Trong bài tập 8.22 bạn sẽ tạo câu truy vấn chứa thông tin khách hàng đồng thời nối 3 trường thành một trường mới, CityStateZip.

BÀI TẬP 8.22: TẠO QRYCUSTOMERINFO CHO FORM NHẬP ĐƠN BÁN HÀNG

1. Tạo một truy vấn mới ở Design View, kích CREATE tab rồi kích Query Design trong nhóm Queries.

2. Bảng duy nhất cần cho câu truy vấn này là tblCustomer. Kích kép tblCustomer từ danh sách trong hộp thoại Show Table, rồi kích nút Close. Việc kích kép vào bảng sẽ chọn bảng đó rồi thêm nó vào Table Pane nên bạn không cần kích nút Add.

3. Chọn tất cả các trường trong tblCustomer bằng cách kích CustomerID để làm nổi bật nó. Bây giờ nhấn và giữ Shift + mũi tên xuống cho đến khi tất cả các trường được làm nổi bật. Rồi kéo tất cả các trường đó vào ô Field đầu tiên ở phần dưới cửa sổ (Criteria Pane).

4. Lưu câu truy vấn với tên qryCustomerInfo (bằng cách hoặc kích phải Query Tab hoặc kích Save trên thanh công cụ truy xuất nhanh) trước khi tạo địa chỉ.

5. Kích ô Field trống đầu tiên trên Criteria Pane rồi kích Builder trong nhóm Query Setup. Bạn cần thấy hộp thoại Expression Builder (công cụ tạo biểu thức).

6. Tạo biểu thức sau: CityStateZip: [CustomerCity] & “, ” & [CustomerState] & “ ” & [CustomerZipCode]. Thay vì gõ các thuộc tính với cặp móc vuông (chẳng hạn [CustomerCity]), bạn có thể kích kép chúng trong Expression Categories panel của Expression Builder. Để ý rằng khi thêm [CustomerCity] sau khi gõ CityStateZip: Expression Builder sẽ thêm <<Exp>> vào biểu thức. Bạn cần xóa đi bằng cách làm nổi bật nó rồi nhấn phím Delete. Kích OK sau khi nhập xong biểu thức (xem Hình 8.26).

Hình 8.26. Công cụ tạo biểu thức (Expression Builder).

7. Xóa CustomerCity, CustomerState, và CustomerZipCode bằng cách làm nổi bật 3 cột đó trong Criteria Pane rồi nhấn phím Delete. Làm nổi bật cột bằng cách di chuyển con trỏ ngay trên dòng Field của CustomerCity để con trỏ chuyển thành mũi tên xuống rồi kích vào cột; nhấn và giữ Shift + mũi tên phải cho đến khi 3 trường được làm nổi bật.

8. Làm nổi bật cột CityStateZip rồi chuyển nó sang phải cột CustomerAddress2 bằng cách kích và kéo cột.

9. Lưu câu truy vấn. Xem tập kết quả động (dynaset) bằng cách kích View (bạn cần thấy biểu tượng Datasheet) hoặc Run trong nhóm Results. Hình 8.27 cho thấy tập hợp động từ Ch08.accdb. Đóng qryCustomerInfo.

Hình 8.27. Tập hợp động (dynaset) CustomerInfo.

Thứ Bảy, 27 tháng 2, 2016

Phát triển HTTT kế toán bằng MS Access - Chương 8 - Tạo các quan hệ với bảng đơn bán hàng

James Perry, Richard Newmark


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


Tạo các quan hệ với bảng đơn bán hàng


Form nhập đơn bán hàng phải đọc tblCustomer, tblEmployee, tblInventory, tblInventoryComposition, tblInventoryDiameter, tblInventoryType và ghi vào tblSaleOrder, tblReservation-SaleOrderInventory. Vì form đọc dữ liệu từ tblCustomer tblInventory, bạn phải có sẵn dữ liệu trong các bảng này. Cơ sở dữ liệu Ch08.accdb có sẵn các bảng cùng dữ liệu chứa trong đó.

BÀI TẬP 8.21: TẠO QUAN HỆ CHO MỌI BẢNG LIÊN QUAN ĐẾN BIẾN CỐ ĐƠN BÁN HÀNG

1. Đóng tất cả các bảng và form.

2. Kích DATABASE TOOLS tab rồi kích Relationships trong nhóm Relationships. Cửa sổ Relationships sẽ giống cửa sổ ở cuối Bài tập 8.14 (xem Hình 8.14).

3. Thu gọn Navigation Pane bằng cách kích « ở góc phải trên của pane. Điều này tạo nhiều không gian hơn cho mô hình cơ sở dữ liệu, từ đó dễ đọc hơn.

4. Định cỡ lại các bảng để hiển thị đầy đủ tên bảng và mọi thuộc tính. Di chuyển con trỏ đến góc phải dưới của tblInventory sao cho con trỏ chuyển thành mũi tên chéo. Kích để nắm lấy góc rồi kéo lên trên và sang phải cho đến khi bảng đủ nhỏ để có thể thấy hết tên bảng và mọi thuộc tính. Lặp lại quá trình này cho 3 bảng kia.

5. Di chuyển bảng để nhất quán với định dạng mô hình REA (resources – tài nguyên, events – biến cố, và agents – tác nhân): bảng tài nguyên bên trái, bảng biến cố ở giữa, và bảng tác nhân bên phải. Vì tất cả 4 bảng đều liên quan đến tồn kho, tức tài nguyên, hãy di chuyển chúng về cạnh trái của cửa sổ Relationships. Di chuyển từng bảng một bằng cách nắm lấy thanh tiêu đề rồi kéo đi. Sản phẩm cuối cùng sẽ như Hình 8.24.

Hình 8.24. Cửa sổ Relationships sau khi đã định cỡ và di chuyển các bảng liên quan đến tồn kho.

6. Kích Show Table trong nhóm Relationships (trên DESIGN tab). Kích tblCustomer, rồi kích Ctrl và kích các bảng sau: tblEmployee, tblEmployeeType, tblReservation-SaleOrderInventory, và tblSaleOrder. Kích Add rồi kích Close.

7. Định cỡ và di chuyển các bảng vừa thêm cho giống cửa sổ Relationships ở Hình 8.25. Để ý rằng bảng-quan-hệ được đặt giữa cột tài nguyên và cột biến cố.

Hình 8.25. Cửa sổ Relationships với tất cả các bảng liên quan đến đơn bán hàng.

8. Tạo các liên kết như cách đã làm trong Bài tập 8.14. Kéo khóa chính đến khóa ngoại tương ứng hay từ khóa chính đến phần khóa chính phức hợp tương ứng.

9. Khi hộp thoại Edit Relationships xuất hiện, hãy đảm bảo rằng các thuộc tính đúng xuất hiện trong những bảng bạn kéo từ và kéo đến. Kiểu quan hệ ở đáy hộp thoại phải luôn là One-To-Many. Đánh dấu Enforce Referential IntegrityCascade Update Related Fields. Cuối cùng, kích Create trong hộp thoại. Khi hoàn thành, cửa sổ Relationships cần giống Hình 8.25.

10. Kích nút X trong nhóm Relationships để đóng cửa sổ Relationships, kích Yes trong hộp thoại để lưu những thay đổi, rồi kích » trên Navigation Pane để phục hồi.

Giờ đây bạn đã thiết lập các liên kết khóa ngoại và bảng-quan-hệ cần thiết, bạn có thể tạo form nhập đơn bán hàng. Đầu tiên, bạn tạo 2 câu truy vấn trước khi tạo form thay vì thay đổi các truy vấn “đằng sau” form mà Access sẽ tạo để làm nguồn dữ liệu cho form. Việc tạo trước câu truy vấn giúp dễ dàng hiệu chỉnh sai sót trong câu truy vấn. Hơn nữa, nếu có nhiều form dùng cùng câu truy vấn, bạn chỉ cần tạo câu truy vấn một lần.

Phát triển HTTT kế toán bằng MS Access - Chương 8 - Form nhập đơn bán hàng

James Perry, Richard Newmark


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


Form nhập đơn bán hàng


Nhiệm vụ nhập đơn bán hàng đòi hỏi một form phức tạp hơn nhiệm vụ nhập thông tin khách hàng hay thông tin tồn kho. Để nhập mọi thông tin trong đơn bán hàng, cơ sở dữ liệu cần các liên kết sau:


  • tblSaleOrder với tblCustomer – để nhận thông tin chẳng hạn tên và địa chỉ khách hàng.
  • tblSaleOrder với tblEmployee – để nhận tên nhân viên xử lý đơn bán hàng.
  • tblSaleOrder với tblReservation-SaleOrderInventory – để nhận danh sách mã hàng tồn kho, số lượng, và đơn giá trên từng đơn bán hàng.
  • tblReservation-SaleOrderInventory với tblInventory,  và từ tblInventory đến các bảng phân loại tồn kho – để nhận mô tả cho từng mặt hàng trên từng đơn bán hàng.


Bạn đã tạo các liên kết từ tblInventory đến các bảng phân loại tồn kho trong Bài tập 8.14.

Thứ Sáu, 26 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 - tồn kho

James Perry, Richard Newmark


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


Bảng đơn bán hàng - tồn kho


Bảng đơn bán hàng – tồn kho sẽ ghi nhận quan hệ dành riêng nhiều-nhiều giữa tblSaleOrder tblInventory. Bảng sẽ lưu 4 trường:

1. Khóa chính của tblSaleOrder.
2. Khóa chính của tblInventory.
3. Số lượng từng hàng tồn kho xuất hiện trên từng đơn bán hàng.
4. Đơn giá từng hàng tồn kho xuất hiện trên từng đơn bán hàng.

Các khóa chính từ tblSaleOrder tblInventory hợp thành khóa chính phức hợp trong tblReservation-SaleOrderInventory. Trong Microsoft Access, bạn tạo khóa chính phức hợp bằng cách tạo 2 trường tách rời – mỗi trường cho khóa chính của từng bảng thực thể rồi chỉ định cả 2 trường làm khóa chính. Nếu dùng màn hình hỗ trợ của Microsoft Access, bạn có thể để ý rằng Microsoft dùng thuật ngữ bảng nối (juction table) thay cho bảng-quan-hệ, trong tài liệu hỗ trợ trực tuyến và các tài liệu khác. Trước khi bắt đầu bài tập kế, hãy đóng mọi bảng và form đang mở.

BÀI TẬP 8.20: TẠO BẢNG-QUAN-HỆ TBLRESERVATION-SALEORDERINVENTORY

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

2. Nhập SaleOrderID vào Field Name và để Data Type là Short Text.

3. Nhấn F6. Đặt Field Size là 6, đặt Input Mask là 000000;;_, đặt Caption là Sale Order #, và thuộc tính Required là Yes.

4. Đặt thuộc tính Indexed là Yes (Duplicates OK). Thuộc tính Indexed phải được phép trùng lặp vì trường thuộc khóa chính phức hợp rất có thể chứa giá trị trùng lặp, mặc dù tổ hợp cả hai khóa chính sẽ duy nhất. Nhớ rằng khóa chính phức hợp, giống khóa ngoại, phải khớp kiểu và kích cỡ với các khóa chính ở bảng gốc. Các trường trùng khớp này cho phép cơ sở dữ liệu lưu giá trị SaleOrderID đồng thời vào bảng này và tblSaleOrder. Nửa kia của khóa chính phức hợp là InventoryID, khóa chính của tblInventory.

5. Gõ InventoryID vào dòng Field Name thứ hai và để Data Type là Short Text. Nhấn F6. Đặt Field Size là 4, đặt Input Mask là 0000;;_, Caption là Item #, thuộc tính Required là Yes, và  thuộc tính Indexed là Yes (Duplicates OK).

6. Trong lúc nhấn phím Ctrl, kích nút chọn bản ghi (record selector) cho SaleOrderID InventoryID.

7. Với cả hai trường được chọn, kích Primary Key trong nhóm Tools. Biểu tượng khóa chính cần xuất hiện ở nút chọn bản ghi của cả hai trường, như thể hiện ở Hình 8.23.

Hình 8.23. Tạo khóa chính phức hợp cho tblReservation-SaleOrderInventory.

8. Trường kế trong tblReservation-SaleOrderInventory sẽ lưu số lượng của từng hàng tồn kho mà khách hàng đặt mua trên một đơn bán hàng cụ thể. Gõ QuantityOrdered vào Field Name rồi đặt Data Type là Number. Đặt Field Size là Long Integer, Decimal Places là 0, Caption là Quantity, và thuộc tính Required là Yes. Việc thiết đặt thuộc tính số nguyên giả sử rằng Pipefitters Supply Company không tiếp nhận các đơn hàng có đơn vị thập phân. Thiết đặt thuộc tính long integer cho phép công ty ghi nhận số lượng lên đến 2 tỉ đơn vị cho mọi hàng tồn kho trên đơn bán hàng bất kỳ.

9. Trường cuối cùng trong tblReservation-SaleOrderInventory sẽ lưu đơn giá mà khách hàng đồng ý thanh toán cho từng hàng tồn kho trên từng đơn bán hàng. Để tạo trường này, nhập SOPrice vào Field Name, đặt Data Type là Currency, để Format là Currency, đặt Decimal Places là 2, đặt thuộc tính Caption là Price, và đặt thuộc tính Required là Yes.

10. Đóng và lưu bảng với tên tblMyReservation-SaleOrderInventory.

Đến đây thiết kế cơ bản của tblReservation-SaleOrderInventory đã hoàn tất. Một phiên bản kèm theo dữ liệu cho Pipefitters Supply Company đã được cung cấp trong cơ sở dữ liệu Ch08.accdb.

Bạn đã học cách tạo tblCustomer, tblInventory (và các bảng phân loại tồn kho liên quan), tblSaleOrder, và tblReservation-SaleOrderInventory. Trước đây bạn đã thiết lập quan hệ giữa tblInventory và các bảng phân loại tồn kho. Bây giờ bạn đã sẵn sàng hoàn thành việc tạo mọi quan hệ giữa các bảng này như đã đặc tả trong Hình 8.5. Bài tập 8.21 sẽ chỉ bạn cách định cỡ và di chuyển bảng trong cửa sổ quan hệ để làm mô hình cơ sở dữ liệu dễ đọc hơn.

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.

Phát triển HTTT kế toán bằng MS Access - Chương 8 - Thêm nhân viên vào cơ sở dữ liệu

James Perry, Richard Newmark


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


Thêm nhân viên vào cơ sở dữ liệu


Mô hình ở Hình 8.5 cho thấy Pipefitters Supply Company ghi nhận nhân viên bán hàng chịu trách nhiệm với từng đơn bán hàng. Việc theo dõi đơn bán hàng theo nhân viên bán hàng có thể dùng cho mục đích kiểm soát hay đánh giá. Một kiểm soát hiển nhiên là xác định nhân viên bán hàng nào đã sai sót khi làm đơn bán hàng. Một kiểm soát ít hiển nhiên hơn nhờ vào dữ liệu này là tìm ra những đơn mua hàng gian lận bằng cách truy vấn cơ sở dữ liệu để xác định xem liệu có địa chỉ gửi hàng nào trùng với địa chỉ của bất kỳ nhân viên bán hàng nào không. Hơn nữa, Pipefitters có thể dùng thông tin này để đánh giá nhân viên bán hàng bằng cách truy vấn cơ sở dữ liệu để xác định số lượng đơn bán hàng và tổng doanh số theo nhân viên bán hàng.

Mô hình qui trình bán hàng - thu tiền ở Hình 8.5 cho thấy nhân viên bán hàng được thể hiện trong bảng đơn bán hàng bằng mã nhân viên (EmployeeID). Khóa ngoại này liên kết bảng đơn bán hàng với bảng nhân viên vì EmployeeID là khóa chính của bảng nhân viên. Bạn sẽ dùng tblEmployee tblEmployeeType trong cơ sở dữ liệu Chương 8 để thêm các kiểm soát liên quan đến nhân viên vào bảng đơn bán hàng lẫn form bán hàng. Bạn sẽ tạo bảng nhân viên và các form liên quan ở Chương 10, qui trình nhân sự.

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

James Perry, Richard Newmark


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


Đơn bán hàng


Khi khách hàng quyết định mua sản phẩm hay dịch vụ, họ truyền đạt mong muốn này bằng cách gửi đơn mua hàng, gửi thư, gọi điện thoại, nói với nhân viên bán hàng, hay điền vào đơn đặt hàng trực tuyến. Mỗi một hành động thế này là một kiểu đơn mua hàng (purchase order). Công ty nhận đơn mua hàng thường ghi vào các ghi chép của mình và gọi là đơn bán hàng (sale order).

Cho dù đến bằng đường bưu điện, trao đổi qua điện thoại, hay qua Web, mọi đơn bán hàng đều có các thành phần chung để nhận diện khi nào phát sinh đơn đặt hàng, khách hàng nào đã đặt hàng, và những hàng tồn kho nào khách hàng muốn mua.

Hãy xem lại mô hình dữ liệu ở Hình 8.5 để xác định các bảng, gồm bảng-quan-hệ và khóa ngoại mà Pipefitters Supply Company cần để ghi nhận từng đơn bán hàng. Tại thời điểm này, đừng lo lắng về quan-hệ-hoàn-thành giữa đơn bán hàng và bán hàng. Bạn sẽ tạo quan-hệ-hoàn-thành khi xây bảng bán hàng bằng cách thêm SaleOrderID làm khóa ngoại trong bảng bán hàng và liên kết 2 bảng trong cửa sổ Relationship.

Thứ Tư, 24 tháng 2, 2016

Phát triển HTTT kế toán bằng MS Access - Chương 8 - Form tồn kho

James Perry, Richard Newmark


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


Form tồn kho


Mặc dù có thể nhập liệu trực tiếp vào tblInventory dễ hơn nhập dữ liệu vào tblCustomer, việc tạo form nhập liệu tồn kho sẽ giúp nhiệm vụ nhập liệu và cập nhật trở nên dễ dàng hơn và ít sai sót hơn. Trong ví dụ Pipefitters Supply Company, ta đã giới hạn miền giá trị của thành phần cấu tạo, kiểu, và đường kính. Mặc dù điều này hơi phi thực tế với một doanh nghiệp có thật, nó cho phép ta minh họa một số kỹ thuật thiết kế form hữu ích mà bạn có thể áp dụng trong nhiều ứng dụng kế toán khác nhau.

Ở Bài tập 8.15 bạn sẽ tạo form nhập liệu tồn kho. Nhân viên Pipefitters có thể dùng form này để nhập hàng tồn kho mới vào hệ thống kế toán của họ. Vì bản ghi tblInventory không nhiều – chỉ có 5 trường nhỏ - bạn có thể hiển thị toàn bộ bản ghi tồn kho trên một dòng bằng cách dùng bài trí form dạng bảng (tabular form layout). Bài trí này cho phép hiển thị một lúc nhiều bản ghi, trong khi bài trí form dạng cột (như frmCustomer) chỉ hiển thị một bản ghi tại một thời điểm.

BÀI TẬP 8.15: TẠO FORM NHẬP LIỆU TỒN KHO

1. Kích tblInventory trong nhóm Tables ở Navigation Pane để làm nổi bật tên bảng.

2. Kích CREATE tab rồi kích Form Wizard trong nhóm Forms.

3. Các trường trong tblInventory sẽ xuất hiện ở Available Fields panel. Kích nút » để chuyển tất cả các trường sang Selected Fields panel.

4. Kích nút Next để chuyển sang hộp thoại Layout. Kích Tabular để tạo form có khả năng hiển thị một lúc nhiều bản ghi, mỗi bản ghi được hiển thị trên một dòng.

5. Kích nút Next rồi gõ frmInventory vào ô tiêu đề. Kích nút Finish để đóng hộp thoại và mở frmInventory ở góc nhìn Form. Kết quả sẽ như Hình 8.15. Đóng form.

Hình 8.15. Form nhập liệu tồn kho được tạo bằng Form Wizard.

Không như công cụ Form, Form Wizard cho bạn xác định trường nào sẽ xuất hiện trong form, thậm chí khi chúng từ nhiều bảng và câu truy vấn. Điều này đặc biệt hữu ích khi tạo form chứa form con (subform) như ta sẽ làm trong chương này. Hai bài tập kế giúp bạn làm quen với các đặc trưng trong Layout View và Design View. Bài tập 8.16 tập trung vào giao diện còn Bài tập 8.17 xử lý chức năng qua việc dùng combo box. Với Bài tập 8.16, hãy dùng Hình 8.16 làm hướng dẫn khi thực hiện các bước trong bài tập này.

Hình 8.16. Form nhập liệu tồn kho đã được cải tiến.

BÀI TẬP 8.16: CẢI THIỆN GIAO DIỆN CỦA FORM NHẬP LIỆU TỒN KHO

1. Mở form ở góc nhìn Layout. Kích phải frmInventory trong Navigation Pane rồi kích Layout View.

2. Điều chỉnh ô điều khiển (control box) ListPrice cho hẹp hơn. Kích ô điều khiển ListPrice. Đặt con trỏ vào cạnh phải của ô. Kéo cạnh phải của ô sang trái cho đến khi chiều rộng vừa với dữ liệu hơn. Bạn có cần dự trù giá niêm yết có số chữ số nhiều hơn giá hiện thời trong hệ thống không?

3. Đổi tiêu đề và định lại cỡ của ô tiêu đề. Kích kép tiêu đề form. Đổi thành Inventory Data Entry (nhập liệu tồn kho). Kích và kéo góc phải dưới (con trỏ sẽ trở thành mũi tên chéo) lên trên và sang phải cho đến khi tiêu đề khít với ô.

4. Đặt thuộc tính in đậm cho 5 nhãn. Nhấn và giữ nút Shift rồi kích lần lượt 5 nhãn. Kích nút Bold. Nút Bold xuất hiện trong nhóm FONT trên dải Format hay trong nhóm Text Formatting trên dải HOME.

5. Tăng khoảng cách nằm ngang giữa các trường. Chuyển sang góc nhìn Design bằng cách kích phải frmInventory trong Navigation Pane rồi kích Design View. Chọn 5 ô văn bản; kích ARRANGE tab. Kích Space/Size trong nhóm Sizing & Ordering rồi chọn Increase Horizontal. Quan sát thay đổi trên form bằng cách trở về góc nhìn Form.

6. Trở về góc nhìn Design để canh cho nhãn và ô điều khiển tương ứng được thẳng hàng. Kích nhãn List Price, nhấn và giữ Ctrl rồi kích ô điều khiển InventoryListPrice. Kích ARRANGE tab, kích Align trong nhóm Sizing & Ordering rồi chọn Align Left. Lặp lại qui trình này cho InventoryDiameter, InventoryType, và InventoryComposition. Tuy nhiên, để duy trì khoảng cách nằm ngang của các ô điều khiển, đầu tiên bạn cần kích Align Right trước khi Align Left. Tại sao?

7. Kiểm tra form ở góc nhìn Form bằng cách kích phải frmInventory tab rồi chọn Form View. Lưu rồi đóng form.

BÀI TẬP 8.17: THÊM COMBO BOX THÀNH PHẦN CẤU TẠO VÀO FORM NHẬP LIỆU TỒN KHO

1. Mở frmInventory ở góc nhìn Design. Loại bỏ 3 ô văn bản cho 3 trường để bạn thay combo box vào đó. Trong khi giữ phím Shift, kích các ô văn bản InventoryComposition, InventoryType, và InventoryDiameter. Rồi nhấn Delete. Bây giờ bạn có thể dùng Combo Box Wizard để tạo các điều khiển mới.

2. Trên dải DESIGN, kích Mũi tên xuống ở Hình 8.17 để đảm bảo Use Control Wizards được làm nổi bật. Rồi kích Combo Box trong nhóm Controls. Nếu cửa sổ Access không đủ rộng để hiển thị nút Combo Box, hãy dùng thanh cuộn (scroll bar) ở bên phải nhóm Controls để tìm biểu tượng Combo Box (xem Hình 8.17). Di chuyển con trỏ vào phần Detail và định vị góc trái trên của combo box; rồi kích để khởi động Combo Box Wizard. Hãy dùng Hình 8.18 làm hướng dẫn để đi qua các bước trong Combo Box Wizard.

Hình 8.17. Nhóm Controls trên dải DESIGN.

Hình 8.18. Combo Box Wizard.

3. Ở hộp thoại đầu tiên kích nút radio đầu tiên  với phụ đề 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ừ bảng hay câu truy vấn khác.). Kích Next.

4. Bước thứ hai là chọn nguồn dữ liệu cho combo box. Chọn tblInventoryComposition rồi kích Next.

5. Ở hộp thoại này, kích trường CompositionDescription rồi kích > để chọn nó. Giá trị CompositionDescription là giá trị bạn thấy khi người dùng kích mũi tên xuống của combo box. Kích Next.

6. Bây giờ chọn thứ tự sắp xếp. Thứ tự tăng dần là chọn lựa mặc định. Vì bạn tạo combo box để chọn thành phần cấu tạo dựa trên mô tả nhằm tránh việc phải nhớ tất cả các mã, chọn CompositionDescription là trường mà Access sẽ dùng để sắp xếp các giá trị trong combo box. Kích Next.

7. Hộp thoại này cho phép bạn điều chỉnh kích cỡ cột hiển thị, tuy nhiên không cần làm gì cả trong trường hợp này. Ngoài ra, hãy để check box Hide key column (recommended) [Che cột khóa (được khuyên như vậy)] được đánh dấu vì việc hiển thị mã thành phần cấu tạo sẽ không giúp người dùng chọn đúng thành phần cấu tạo. Kích Next.

8. Kích nút radio thứ hai với phụ đề Store that value in this field (Lưu giá trị đó vào trường sau); rồi kích nút mũi tên của combo box và chọn trường InventoryComposition. Bước này sẽ lưu thành phần cấu tạo vào trường InventoryComposition thuộc tblInventory. Kích Next để mở hộp thoại cuối cùng rồi kích Finish. Wizard sẽ tạo combo box theo những đặc tả của bạn và đặt nó vào Inventory form.

9. Đổi tên combo box bằng cách kích nút Property Sheet trong nhóm Tools. Kích Other tab và gõ cboInventoryComposition làm giá trị cho thuộc tính Name (xem Hình 8.19), rồi nhấn Enter.

Hình 8.19. Bảng thuộc tính (Property Sheet).

10. Xóa nhãn của combo box vừa tạo. Kích nhãn đó (hơi khó thấy vì nó chồng lên ô văn bản InventoryID). Nhấn phím Delete.

11. Để kiểm tra combo box vừa tạo, kích nút View trong nhóm Views để trở về góc nhìn Form. Rồi kích mũi tên xuống của InventoryComposition combo box để hiển thị 2 chọn lựa – Brass và Copper. Quay về góc nhìn Design bằng cách kích mũi tên xuống ở View rồi kích Design View. Bạn có thể điều chỉnh vị trí combo box bằng cách kích và kéo combo về vị trí mong muốn.

12. Điều chỉnh kích cỡ của combo box cho giống với nhãn Composition. Nhấn và giữ phím Shift trong lúc kích combo box và nhãn Composition. Bây giờ  kích ARRANGE tab. Canh chiều rộng của combo box cho bằng chiều rộng của nhãn. Vì combo box hơi rộng hơn nhãn, kích Size to Narrowest (định cỡ theo phần hẹp nhất) trên Size/Space menu trong nhóm Sizing & Ordering. Nếu cần sắp combo box thẳng hàng với các thành phần khác trong phần Detail của form, hãy dùng Align menu trong nhóm Sizing & Ordering (xem Hình 8.20).

Hình 8.20. Size/Space và Align menus.

BÀI TẬP 8.18: THÊM CÁC COMBO BOX KHÁC VÀ HOÀN TẤT FORM NHẬP LIỆU TỒN KHO

1. Lặp lại các Bước 2 đến 12 từ Bài tập 8.17 cho InventoryType và Inventory Diameter.

2. Làm cho nhãn InventoryType trong Form Header rộng bằng combo box InventoryType bằng cách kích ARRANGE tab (nếu chưa được chọn) và chọn to Widest (theo phần rộng nhất) trong Size submenu trên Size/Space menu. Làm tương tự cho các combo box và nhãn khác.

3. Di chuyển nhãn trong Form Header để có khoảng cách hợp lý giữa chúng. Kích ARRANGE tab. Nhấn và giữ phím Shift trong khi kích lần lượt 5 nhãn. Rồi chọn Equal Horizontal trong Spacing submenu trên Size/Space menu.

4. Sắp từng control thẳng hàng với nhãn của nó. Dùng Hình 8.21 làm hướng dẫn. Bắt đầu với ListPrice. Nhấn và giữ phím Shift trong khi kích control và nhãn. Chọn Right trong Align menu. Lặp lại qui trình này cho 4 controls và nhãn khác.

Hình 8.21. Form nhập liệu tồn kho hoàn chỉnh ở Design View.

5. Sắp tất cả các controls thẳng đứng trong phần Detail. Nhấn và giữ phím Shift trong khi kích từng ô. Rồi kích Top trên Align menu. Kích và kéo Form Footer đến phần đáy của các controls để hoàn tất việc định dạng.

6. Kích DESIGN tab rồi kích View menu (có thể thấy biểu tượng Form) để kiểm tra form. Tab để tới lui trong bản ghi hiện thời. Để ý rằng con trỏ nhảy lung tung thay vì di chuyển qua từng trường một.

7. Kích View menu (có thể thấy biểu tượng Layout) để sửa thứ tự tab ở Layout View. Kích InventoryComposition combo box rồi kích Property Sheet trong nhóm Tools. Kích Tab Index trên Other tab trong Property Sheet rồi kích nút xuất hiện để mở cửa sổ Tab Order. Kích nút Auto Order để chỉnh sửa thứ tự tab. Rồi kích OK. Bạn cũng có thể thay đổi thứ tự bằng cách kích và kéo các mục trong danh sách Custom Order. Trở về góc nhìn Form để kiểm tra thứ tự tab.

8. Lưu và đóng form.

Thứ Ba, 23 tháng 2, 2016

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

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

7. Lặp lại các Bước 1 đến 7 với tblInventoryType 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 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.

Phát triển HTTT kế toán bằng MS Access - Chương 8 - Thông tin tồn kho

James Perry, Richard Newmark


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


Thông tin tồn kho


Thông tin khách hàng hết sức quan trọng với mọi doanh nghiệp, nhưng khách hàng tiềm năng chỉ trở thành khách hàng thật sự nếu công ty có hàng để bán cho họ. Tồn kho (inventory), viết tắt của hàng tồn kho (merchandise inventory) là thuật ngữ chung để chỉ hàng hóa công ty bán cho khách hàng. Nói chung, tồn kho có thể gồm sản phẩm, dịch vụ, hay cả hai. Chẳng hạn, cửa hàng phần cứng bán sản phẩm, công ty kế toán bán dịch vụ, và cửa hàng sửa xe bán cả sản phẩm lẫn dịch vụ.

Trong thảo luận tồn kho ở qui trình bán hàng - thu tiền, ta chỉ quan tâm đến hàng hóa hay dịch vụ có sẵn để bán cho khách hàng. Bạn sẽ học cách theo dõi việc nhập kho ở Chương 9. Công ty cần thông tin tồn kho trong qui trình bán hàng - thu tiền vì phải theo dõi hàng tồn kho nào có thể bán, bán với giá bao nhiêu, và bán cho ai.

Để đảm bảo thông tin tồn kho nhất quán cho toàn doanh nghiệp, công ty lưu mọi thông tin tồn kho trong một bảng cơ sở dữ liệu. Bất kỳ tài liệu, báo cáo, hay giao dịch nào cần thông tin tồn kho thì sẽ truy cập bảng tồn kho đó.

Thứ Hai, 22 tháng 2, 2016

Phát triển HTTT kế toán bằng MS Access - Chương 8 - Form thông tin khách hàng

James Perry, Richard Newmark


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


Form thông tin khách hàng


Bạn có thể nhập thông tin khách hàng vào tblCustomer khi mở ở góc nhìn Datasheet. Tuy nhiên, số lượng và kích cỡ trường sẽ gây khó. Tùy thuộc độ phân giải màn hình, chỉ 6 hay 7 trong tổng số 10 trường có thể được hiển thị trong cửa sổ Datasheet View. Việc nhập thông tin khách hàng vào góc nhìn Datasheet đòi hỏi bạn phải cuộn tới lui để nhập toàn bộ 10 trường cho mỗi bản ghi. Trong phần này, bạn sẽ học cách tạo form cho tblCustomer, giúp việc nhập, sửa, và xóa thông tin khách hàng dễ hơn nhiều.

BÀI TẬP 8.10: TẠO FORM NHẬP LIỆU KHÁCH HÀNG

Bạn có thể tạo form cho tblCustomer bằng cách dùng công cụ AutoForm.

1. Kích tblCustomer trong Navigation Pane. Kích CREATE tab rồi kích Form trong nhóm Forms.

2. Kích X ở góc phải trên của tblCustomer tab để đóng form.

3. Khi hộp thoại Save As xuất hiện, hãy đổi tên form thành frmCustomer. Hãy dùng tiền tố frm cho form để dễ phân biệt giữa bảng khách hàng (tbl) và form nhập liệu khách hàng.

Công cụ Form sẽ xem xét bảng đã chọn rồi tạo một form phù hợp với nhiều đặc trưng trường của bảng. Công cụ Form nhanh gọn và thường tạo form dễ dùng (xem Hình 8.9). Thậm chí khi không tạo được form lý tưởng, việc chỉnh sửa form do Access phát sinh để thỏa nhu cầu cụ thể có thể nhanh hơn là bắt đầu từ form trống. Nếu không thể thấy toàn bộ form, bạn có thể đóng Navigation Pane để mở rộng form bằng cách kích << ở đỉnh Navigation Pane.

Hình 8.9 Form nhập liệu khách hàng do công cụ Form phát sinh.

Mặc dù công cụ Form đã tạo một form khả dụng, bạn sẽ học cách cải thiện giao diện và tính khả dụng của nó trong bài tập kế. Khi theo hướng dẫn, hãy nhớ rằng bạn cần cố gắng phát triển cảm nhận của mình về các đặc trưng làm form dễ dùng. Vì thế, form của bạn có thể không giống hoàn toàn form trong tài liệu này.

BÀI TẬP 8.11: CẢI THIỆN FORM NHẬP LIỆU KHÁCH HÀNG

1. Kích kép frmCustomer trong Navigation Pane để mở ở góc nhìn Form. Đây là góc nhìn bạn dùng để nhập dữ liệu vào form. Đóng Navigation Pane nếu không thể thấy toàn bộ form.

2. Chuyển sang góc nhìn Layout. Kích mũi tên trỏ xuống ở phía đáy View trong nhóm Views (trên Home tab) rồi kích Layout View.

3. Để làm mọi trường nhập liệu hẹp hơn, kích trường dữ liệu CustomerName, di chuyển con trỏ về cạnh phải của ô, rồi kích và kéo cạnh đó sang trái cho đến khi đạt chiều rộng mong muốn (khoảng không mà bạn nghĩ dữ liệu dài nhất sẽ dùng). Bạn có để ý mọi trường dữ liệu cùng di chuyển khi bạn kéo?

4. Để cho phép từng trường di chuyển độc lập bạn cần chuyển sang góc nhìn Design. Nhấn Ctrl+A để chọn mọi đối tượng, kích ARRANGE tab, rồi kích Remove Layout trong nhóm Table.

5. Bây giờ hãy điều chỉnh các trường khác. Trở về góc nhìn Layout bằng cách kích phải frmCustomer tab nằm ngay dưới dải lệnh rồi chọn Layout View. Kích FORMAT tab. Hãy điều chỉnh các trường luôn có cùng số ký tự: CustomerID, CustomerState, CustomerZipCode, và CustomerTelephone.

6. Hạn mức tín dụng khách hàng tối đa là bao nhiêu? Bạn đã nhập số này vào qui tắc kiểm tra hợp lệ ở Bài tập 8.6. Bạn có nên điều chỉnh chiều rộng trường để phù hợp hạn mức tín dụng tối đa không? Điều gì xảy ra nếu Pipefitters tăng giá trị tối đa lên $100,000?

7. Hãy điều chỉnh nhãn. Nhãn là các phụ đề bạn đã nhập khi tạo tblCustomer. Phụ đề cũng sẽ xuất hiện trong các truy vấn và báo cáo thay vì tên trường thực sự. Hãy chọn tất cả các nhãn bằng cách giữ phím Shift xuống khi kích từng nhãn một. Kích Align Right Text trong nhóm Font để canh phải cho nhãn. Kích Bold trong nhóm Font để định dạng thuộc tính in đậm cho nhãn.

8. Cuối cùng hãy đổi tiêu đề form. Kích kép tiêu đề tblCustomer. Hãy đổi thành Customer Information (thông tin khách hàng). Kích biểu tượng Form kế tiêu đề rồi nhấn Delete để xóa. Kích và kéo tiêu đề sang trái.

9. Lưu rồi đóng form. Nếu bạn quên lưu trước khi đóng form, Access sẽ hỏi bạn có muốn lưu trước khi đóng form không.

Bạn có thể điều chỉnh giao diện của form theo mỹ quan của mình. Hình 8.10 trình bày bản hoàn chỉnh của form thông tin khách hàng.

Hình 8.10 Form thông tin khách hàng hoàn chỉnh ở góc nhìn Form.

THỬ NGHIỆM

Hãy mở frmCustomer ở góc nhìn Layout. Kích phải frmCustomer trong Navigation Pane rồi kích Layout View. Form sẽ xuất hiện ở góc nhìn Layout. Bạn cũng có thể chuyển góc nhìn bằng cách kích phải vào form trong Navigation Pane.

Chủ Nhật, 21 tháng 2, 2016

Phát triển HTTT kế toán bằng MS Access - Chương 8 - Thuộc tính trường giá trị mặc định Default Value

James Perry, Richard Newmark


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


Thuộc tính trường giá trị mặc định Default Value


Đặt thuộc tính Default Value là phương pháp khác nhằm kiểm soát dữ liệu nhập từ người dùng. Chẳng hạn, nhân viên bán hàng có thể nhập thông tin khách hàng vào cơ sở dữ liệu trước khi đặt hạn mức tín dụng cho khách hàng đó. Tuy nhiên, vì CustomerCreditLimit là trường bắt buộc, nhân viên bán hàng phải nhập giá trị vào trường CustomerCreditLimit để Access có thể lưu bản ghi. Một giải pháp là đặt giá trị mặc định về “0”, đây là giá trị được phép (qui tắc kiểm tra hợp lệ là “<=50000”). Ở Chương 9, bạn sẽ học cách đặt giá trị mặc định cho trường ngày tháng năm về ngày tháng năm hiện thời. Điều này sẽ hạn chế sai sót khi nhập liệu cho các giao dịch được ghi nhận vào thời điểm chúng phát sinh (chẳng hạn đơn đặt hàng, giải ngân).

BÀI TẬP 8.9: THÊM GIÁ TRỊ MẶC ĐỊNH CHO CUSTOMERCREDITLIMIT

1. Kích phải (right-click) vào tblMyCustomer rồi kích Design View.

2. Kích trường CustomerCreditLimit, rồi kích ô thuộc tính Default Value.

3. Gõ 0. Bây giờ kích Datasheet View trong nhóm Views. Để ý rằng trường Credit Limit trong bản ghi mới đã được gán sẵn giá trị mặc định $0.00. Tại sao Access lại thêm dấu dollar $ mặc dù bạn đặt giá trị mặc định là “0”?

4. tblMyCustomer giờ đây đã hoàn tất. Hãy đóng bảng và lưu các thay đổi.

Phát triển HTTT kế toán bằng MS Access - Chương 8 - Thuộc tính trường chỉ mục Indexed

James Perry, Richard Newmark


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


Thuộc tính trường chỉ mục Indexed


Vì CustomerID là khóa chính của tblMyCustomer, Access yêu cầu nhập giá trị duy nhất vào từng bản ghi trước khi lưu. Đó là lý do tại sao Access tự động đặt thuộc tính cho CustomerID là Yes (No Duplicates) trong Bài tập 8.5. Việc đặt phần “(No Duplicates)” của thuộc tính Indexed về Yes (No Duplicates) đảm bảo rằng định danh của từng khách hàng là duy nhất, vì thế ngăn được lỗi gây ra do 2 khách hàng có cùng CustomerID.

Phần “Yes” của thiết đặt sẽ khiến Access phát sinh một thao tác đặc biệt trên trường đó – phát sinh một chỉ mục index – để tăng tốc tìm kiếm trên trường đó. Đó là lý do tại sao chỉ mục được đặt là Yes cho khóa chính – vì các truy vấn và tìm kiếm khác thường dựa trên khóa chính. Vì khóa ngoại cũng là cơ sở để tìm kiếm, khóa ngoại cũng nên được lập chỉ mục. Tuy nhiên, thuộc tính Indexed cho khóa ngoại cần được đặt là Yes (Duplicates OK) vì khóa ngoại không duy nhất. Bạn cũng có thể lập chỉ mục cho các trường phi khóa. Chẳng hạn, thư tín gửi hàng loạt cần được sắp xếp theo zip code. Vì vậy, Pipefitters cần lập chỉ mục CustomerZipCode nếu họ thường xuyên gửi thư hàng loạt đến khách hàng.

BÀI TẬP 8.8: THIẾT ĐẶT THUỘC TÍNH TRƯỜNG INDEXED CHO TBLMYCUSTOMER

Hãy xét các thuộc tính trong tblMyCustomer. Có khóa ngoại nào không? Pipefitters có thể dùng các thuộc tính khác để tìm kiếm thường xuyên không?

1. Hãy mở tblMyCustomer ở góc nhìn Design và đặt thuộc tính trường Indexed thích hợp cho mọi thuộc tính.

2. Hãy đóng bảng và lưu những thay đổi.

Phát triển HTTT kế toán bằng MS Access - Chương 8 - Thuộc tính trường bắt buộc Required

James Perry, Richard Newmark


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


Thuộc tính trường bắt buộc Required


Trong khi mặt nạ nhập liệu và qui tắc kiểm tra hợp lệ kiểm soát giá trị nhập vào hệ thống kế toán, thì thuộc tính trường bắt buộc Required đảm bảo mọi dữ liệu cần thiết phải được nhập vào hệ thống kế toán. Điều này được thực hiện đơn giản bằng cách đặt giá trị thuộc tính trường Required là Yes. Khi đặt Yes, người dùng phải nhập mọi trường bắt buộc trước khi bản ghi có thể được lưu là một bản ghi hợp lệ. Việc đặt thuộc tính trường Required là No sẽ thích hợp đối với dữ liệu tùy chọn hay nếu trường đó sẽ hoàn tất sau khi dữ liệu ban đầu được nhập.

Thuộc tính trường cho phép chiều dài 0 Allow Zero Length dường như luôn phải đặt là No khi Required được đặt là Yes. Tuy nhiên, trường có chiều dài 0 là chuỗi văn bản trống được tạo bằng cách gõ 2 dấu nháy kép liền nhau mà không có ký tự nào bên trong. Vì thế, giá trị thuộc tính trường Allow Zero Length sẽ phụ thuộc liệu chuỗi ký tự trống có hợp lý không đối với trường đó. Hơn nữa, việc đặt thuộc tính Validation sẽ phủ định thuộc tính Allow Zero Length. Mặc dù việc đặt thuộc tính Required của khóa chính là Yes sẽ không thay đổi hành vi cơ sở dữ liệu, làm vậy là một thực hành tốt vì khóa chính trường bắt buộc.

BÀI TẬP 8.7: ĐẶT THUỘC TÍNH TRƯỜNG REQUIRED CHO TBLMYCUSTOMER

Hãy xét các thuộc tính trong tblMyCustomer. Những trường nào bạn yêu cầu phải có khi thêm một khách hàng mới vào cơ sở dữ liệu? Có trường nào tùy chọn tức không bắt buộc không?

1. Hãy mở tblMyCustomer ở góc nhìn Design và đặt thuộc tính trường Required cho mọi thuộc tính.

2. Chuỗi rỗng (chiều dài 0) có phải là giá trị hợp lệ cho trường bất kỳ trong tblMyCustomer không? Nếu đúng, hãy đặt Allow Zero Length là Yes. Nếu không, hãy đặt là No. Bạn có thể xem đáp án bằng cách mở tblCustomer trong cơ sở dữ liệu Ch08.accdb.

Phát triển HTTT kế toán bằng MS Access - Chương 8 - Mặt nạ nhập liệu so với qui tắc kiểm tra hợp lệ

James Perry, Richard Newmark


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


Mặt nạ nhập liệu so với qui tắc kiểm tra hợp lệ


Mặt nạ nhập liệu (input mask) và qui tắc kiểm tra hợp lệ (validation rule) là hai cách kiểm soát các giá trị người dùng nhập vào. Mặt nạ nhập liệu đặc biệt hữu ích khi giá trị có một định dạng cụ thể như số điện thoại, ngày tháng năm, và tên bang viết tắt. Chẳng hạn, mặt nạ nhập liệu cho số điện thoại sẽ cung cấp dấu ngoặc đơn và dấu gạch ngang. Người dùng chỉ cần nhập số, nhờ đó tăng tốc việc nhập liệu và giảm sai sót khi nhập.

Thêm vào đó, mặt nạ nhập liệu có thể được thiết đặt để chỉ cho phép các kiểu ký tự nhất định (chẳng hạn chỉ được nhập số, chỉ được nhập văn bản) và qui định các ký tự đó là bắt buộc hay tùy chọn.

Thiết đặt thuộc tính mặt nạ nhập liệu Input Mask gồm ba phần; mỗi phần cách nhau bằng dấu chấm phẩy. Phần đầu tiên chứa khuôn dạng (template), có thể chứa các vị trí bắt buộc và/hay tùy chọn. Khuôn dạng còn có thể chứa một hay nhiều literals, tức các ký tự đứng sau dấu chéo /, nhằm báo cho Access nhận diện ký tự kế tiếp là chính ký tự đó. Phần thứ hai của thiết đặt, nằm giữa dấu chấm phẩy thứ nhất và thứ hai, bảo Access có lưu hay không các literals cùng với các ký tự được nhập vào trường. Phần thứ ba của thiết đặt là ký tự được dùng làm vật thế chỗ mà sẽ xuất hiện trong các thành phần điều khiển trường trên các forms nhập liệu.

Thuộc tính qui tắc kiểm tra hợp lệ Validation Rule cũng hạn chế các giá trị người dùng có thể nhập vào trường bảng. Giống như mặt nạ nhập liệu, qui tắc kiểm tra hợp lệ có thể được dùng để qui định kiểu ký tự hợp lệ và số lượng ký tự bắt buộc. Tuy nhiên, qui tắc kiểm tra hợp lệ có thể qui định miền giá trị hợp lệ. Chẳng hạn, qui tắc kiểm tra hợp lệ có thể qui định hạn mức tín dụng credit limit phải từ $0 đến $50,000.

Một mình mặt nạ nhập liệu sẽ đủ kiểm soát khi các giá trị của trường phải có một định dạng và chiều dài cụ thể, nhưng không có ràng buộc nào trên giá trị ký tự, chẳng hạn khóa chính CustomerID trong tblMyCustomer phải có 5 chữ số. Mặc dù qui tắc kiểm tra hợp lệ cũng có thể cung cấp kiểm soát tương tự, mặt nạ nhập liệu được ưa thích hơn trong trường hợp này vì các ký tự không hợp lệ hoàn toàn không thể được nhập vào, trong khi qui tắc kiểm tra hợp lệ cho phép nhập và chỉ từ chối khi người dùng chuyển sang trường khác hay bản ghi khác.

Tuy nhiên, qui tắc kiểm tra hợp lệ cho CustomerID sẽ ưu việt hơn mặt nạ nhập liệu nếu CustomerID phải thuộc một miền giá trị cụ thể (chẳng hạn trong đoạn từ 10001 đến 99999) vì qui tắc kiểm tra hợp lệ có thể yêu cầu phải có 5 chữ số giá trị nhập phải thuộc miền giá trị qui định.

Cuối cùng, việc dùng đồng thời mặt nạ nhập liệu và qui tắc kiểm tra hợp lệ sẽ thích hợp khi phải tuân theo một định dạng cụ thể, chẳng hạn phải dùng 2 chữ hoa cho tên bang viết tắt, và không cho phép người dùng dùng địa chỉ giao hàng ở Alaska (AK) hay Hawaii (HI). Trong trường hợp này, mặt nạ nhập liệu sẽ đảm bảo chỉ dùng 2 ký tự (mặt nạ nhập liệu sẽ chuyển chữ thường thành chữ hoa như bạn sẽ thấy trong bài tập kế) còn qui tắc kiểm tra hợp lệ sẽ qui định rằng AK và HI là không hợp lệ.

THỬ NGHIỆM

Bài tập sau sẽ dùng những kiểu ký tự khác nhau trong thuộc tính mặt nạ nhập liệu Input Mask của các trường trong tblMyCustomer. Để xem danh sách đầy đủ ký tự có thể dùng để định nghĩa thuộc tính Input Mask, hãy dùng đặc trưng hỗ trợ trực tuyến của Microsoft Access. Sau khi đã đóng tất cả các bảng, hãy kích biểu tượng hỗ trợ (hình dấu hỏi) rồi gõ input mask. Phần hỗ trợ này sẽ bao gồm danh sách đầy đủ ký tự có thể dùng và ví dụ hướng dẫn cách dùng.

BÀI TẬP 8.6: THIẾT ĐẶT CÁC THUỘC TÍNH INPUT MASK VÀ VALIDATION RULE CHO TBLMYCUSTOMER

1. Hãy mở tblMyCustomer ở góc nhìn Design View rồi kích CustomerID.

2. Nhấn F6 để chuyển sang khung Field Properties, rồi nhấn Tab 2 lần hay kích ô thuộc tính Input Mask.

3. Gõ biểu thức 00000;0;_ vào ô Input Mask để ngăn không cho người dùng nhập bất kỳ thứ gì không phải 5 chữ số vào trường CustomerID.

4. Kích biểu tượng Datasheet View (góc nhìn bảng dữ liệu). Kích Yes để lưu những thay đổi trên bảng trước khi chuyển sang góc nhìn Datasheet. Hãy thử gõ vào chữ hay ký hiệu; mặt nạ nhập liệu sẽ không cho nhập. Bây giờ gõ 1234 rồi thử Tab sang trường kế, Acccess sẽ phát sinh thông báo lỗi cho bạn biết rằng giá trị nhập không thích hợp theo mặt nạ nhập liệu đã qui định cho trường này. Nhấn OK rồi Esc hai lần để xóa bản ghi mới.

5. Trở về góc nhìn Design bằng cách kích biểu tượng Design View trên dải lệnh.

6. Kích CustomerCreditLimit. Rồi kích ô thuộc tính Validation Rule. Gõ <=50000 để đặt hạn mức tín dụng tối đa cho khách hàng là $50,000. Qui tắc kiểm tra hợp lệ này sẽ áp đặt qui tắc tác nghiệp của Pipefitters là cho khách hàng nợ không quá $50,000.

7. Nhấn Tab một lần hay kích ô thuộc tính Validation Text. Gõ Invalid entry. The maximum customer credit limit is $50,000 (Dữ liệu nhập không hợp lệ. Hạn mức tín dụng tối đa cho khách hàng là $50,000). Văn bản nhập vào thuộc tính Validation Text sẽ xuất hiện trong hộp thoại thông báo lỗi khi người dùng nhập một giá trị CustomerCreditLimit vi phạm qui tắc kiểm tra hợp lệ. Hãy trở về góc nhìn Datasheet (kích Yes để lưu bảng). Gõ 65000 vào trường CustomerCreditLimit rồi Tab để sang trường kế. Chuyện gì đã xảy ra? Bạn kiểm soát được giống như mặt nạ nhập liệu không?

8. Nhấn Esc hai lần để xóa bản ghi mới và trở về góc nhìn Design. Giờ bạn sẽ tạo mặt nạ nhập liệu để đảm bảo các bang viết tắt theo đúng dạng đồng thời dùng một qui tắc kiểm tra hợp lệ để áp đặt qui tắc tác nghiệp của Pipefitters là chỉ vận chuyển sản phẩm đến các bang trong lục địa Hoa Kỳ (không chấp nhận AK tức Alaska và HI tức Hawaii).

9. Kích CustomerState. Rồi kích ô thuộc tính Input Mask. Gõ >LL vào ô thuộc tính Input Mask. Ký hiệu > sẽ chuyển chữ thường thành chữ hoa. Ví dụ, nếu người dùng nhập vào oh, mặt nạ nhập liệu sẽ chuyển thành OH. Các ký tự đặt chỗ LL trong biểu thức qui định rằng dữ liệu nhập phải chứa đúng hai chữ.

 10. Di chuyển con trỏ hoặc bằng phím tab hoặc bằng chuột đến ô thuộc tính Validation Rule. Gõ not ("AK" or "HI") vào ô thuộc tính Validation Rule. Qui tắc này ngăn việc nhập AK hay HI cho CustomerState. Các dấu ngoặc là cần thiết để áp dụng “not” vào mọi thứ trong ngoặc.

11. Kích ô thuộc tính Validation Text. Gõ Invalid entry. Customer addresses must be within the continental United States (Dữ liệu nhập không hợp lệ. Địa chỉ khách hàng phải trong lục địa Hoa Kỳ) vào ô thuộc tính Validation Text. Kiểm soát đối với CustomerState đến đây hoàn tất.

THỬ NGHIỆM

Input Mask Wizard chứa sẵn một số mặt nạ nhập liệu cho nhiều trường thường dùng (xem Hình 8.8). Hãy dùng Input Mask Wizard để tạo một mặt nạ nhập liệu cho CustomerZipCode. Để mở Input Mask Wizard, kích thuộc tính trường Input Mask rồi kích nút Builder (nút có hình dấu ba chấm). Phần mở rộng của mặt nạ nhập liệu cho zip code (4 chữ số cuối) là tùy chọn (9 là ký hiệu chữ số tùy chọn) vì nhiều người không biết hay không dùng phần mở rộng của zip code. Bây giờ hãy dùng Input Mask Wizard để tạo mặt nạ nhập liệu cho CustomerTelephone. Bạn có nghĩ rằng mã vùng (area code) nên là tùy chọn như đã được ký hiệu 999 trong mặt nạ nhập liệu? Điều gì sẽ xảy ra nếu mã vùng của công ty thay đổi?

Hình 8.8. Input Mask Wizard.

Phát triển HTTT kế toán bằng MS Access - Chương 8 - Thêm các kiểm soát vào bảng khách hàng

James Perry, Richard Newmark


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


Thêm các kiểm soát vào bảng khách hàng


Các thuộc tính trường (field properties) là một cách tuyệt vời để áp đặt những kiểm soát nội bộ mang tính phòng ngừa (preventive) – tức các kiểm soát nhằm ngăn chặn không đưa dữ liệu sai vào hệ thống. Hai nhóm kiểm soát nội bộ chính khác là (1) Các kiểm soát có tính dò tìm (detective), chẳng hạn đối chiếu ngân hàng (bank reconciliation), tức tìm lỗi sau khi đã xảy ra nhưng trước khi gây thiệt hại; và (2) các kiểm soát có tính điều chỉnh (corrective), được thiết kế để phục hồi thiệt hại do sai sót gây ra chẳng hạn dùng files dự trữ để phục hồi dữ liệu tình cờ bị xóa.

Thứ Bảy, 20 tháng 2, 2016

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

James Perry, Richard Newmark


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


Bảng khách hàng Customer


Bảng đầu tiên trong qui trình bán hàng - thu tiền mà ta sẽ mô tả là bảng khách hàng. Bảng khách hàng là nơi tập trung lưu mọi thông tin của từng khách hàng. Điều này giúp cho việc hiển thị, thêm, xóa, và sửa thông tin khách hàng được dễ dàng và hiệu quả. Bảng khách hàng cần một trường khóa chính để nhận diện duy nhất từng dòng trong bảng.

Để đảm bảo mỗi mã khách hàng CustomerID là duy nhất, nhiều công ty gán một số tuần tự cho khách hàng mới. Phương án số tuần tự sẽ gán khách hàng mới một số lớn hơn 1 so với mã khách hàng lớn nhất hiện có. Trong Bài tập 8.5, bạn sẽ tạo bảng khách hàng tblMyCustomer. Bạn bắt đầu bằng việc mở một bảng mới và tạo khóa chính CustomerID. Pipefitters dùng phương án số tuần tự gồm 5 chữ số cho mã khách hàng, bắt đầu là 10001, tức có thể lưu 89.999 khách hàng (từ 10001 đến 99999).

BÀI TẬP 8.5: TẠO BẢNG KHÁCH HÀNG

1. Khởi động Microsoft Access và mở cơ sở dữ liệu Ch08.accdb.

2. Kích CREATE tab, kích Table từ nhóm Tables, rồi kích lệnh Design View trong nhóm Views. Access sẽ yêu cầu đặt tên bảng.

3. Gõ tblMyCustomer trong hộp thoại Save As rồi kích OK để lưu bảng. Access sẽ hiển thị bảng, chưa định nghĩa, ở Design View.

4. Gõ tên trường đầu tiên của tblMyCustomer CustomerID rồi nhấn phím Tab. Khi nhấn Tab, dòng đầu tiên ở cột Data Type sẽ chuyển thành combo box, và danh sách thuộc tính trường Field Properties sẽ xuất hiện ở phần dưới cửa sổ.

5. Để ý rằng, theo mặc định, dòng đầu tiên có một chìa khóa nhỏ ở cột chọn bản ghi. Chìa khóa cho biết CustomerID là khóa chính của bảng. Bạn có thể tự đặt khóa chính hay đổi khóa chính ở một cột khác. Thật ra thì CustomerID đã là cột khóa chính nên ta để nguyên. Cũng để ý rằng thuộc tính Indexed có sẵn giá trị Yes (No Duplicates).

6. Vì bạn sẽ không dùng trường CustomerID trong bất kỳ tính toán nào, hãy đặt kiểu dữ liệu của nó là Short Text.

7. Nhấn Tab. Bạn có thể dùng cột Description để mô tả trường CustomerID nếu muốn. Cột Description là công cụ lập tư liệu có sẵn, đặc biệt hữu ích để lưu diễn giải cho những trường phức tạp hoặc dễ gây hiểu lầm.

8. Nhấn F6 để chuyển sang khung Field Properties. Con trỏ sẽ làm nổi bật giá trị mặc định kích cỡ trường Field Size 255. Gõ 5 vào cột Field Size để thay giá trị mặc định.

9. Nhấn Tab 3 lần để chuyển đến thuộc tính phụ đề Caption rồi gõ Customer # (có khoảng trống). Việc thiết đặt thuộc tính Caption này sẽ khiến Customer #, thay vì tên trường CustomerID, là văn bản mặc định cho các thành phần điều khiển trong forms và báo cáo có tham chiếu đến trường đó. Việc thiết đặt thuộc tính Caption có thể tiết kiệm thời gian khi tạo báo cáo và forms có dùng các trường bảng. Phần bên phải của khung Field Properties sẽ hướng dẫn chi tiết (bằng tiếng Anh) từng bước trong quá trình thiết đặt thuộc tính. Hình 8.6 cho thấy bảng khách hàng mới với trường khóa chính CustomerID và thiết đặt Caption ở góc nhìn Design.

Hình 8.6. Trường CustomerID trong tblMyCustomer.

10. Hãy dùng Hình 8.7 để thêm 9 thuộc tính còn lại vào tblMyCustomer. Tham khảo cột Description, hãy dùng số ở đó cho thuộc tính Field Size và văn bản ở đó cho thuộc tính Caption.

Hình 8.7. Các thuộc tính cho tblMyCustomer.

Phát triển HTTT kế toán bằng MS Access - Chương 8 - Thông tin khách hàng

James Perry, Richard Newmark


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


Thông tin khách hàng


Khách hàng là nguồn dinh dưỡng nuôi sống doanh nghiệp; vì vậy, các bảng cơ sở dữ liệu hệ thống kế toán phải chứa nhiều chi tiết của từng khách hàng. Tối thiểu, công ty cần biết khách hàng ở đâu, đã mua những mặt hàng nào, và khi nào. Doanh nghiệp còn muốn theo dõi thời điểm khách hàng trả tiền và số tiền ở mỗi lần trả. Một số doanh nghiệp không ghi nhận danh tính khách hàng. Chẳng hạn, những doanh nghiệp như cửa hàng bán lẻ, cửa hàng bán thức ăn nhanh, khu vui chơi giải trí, hiếm khi ghi nhận tên và địa chỉ khách hàng. Các khách hàng của những doanh nghiệp này trả tiền mặt và không chấp nhận bỏ thời gian cung cấp thông tin. Ngày càng nhiều doanh nghiệp kiểu này tìm cách thu thập thông tin danh tính khách hàng. Hiện nay nhiều cửa hàng dùng thẻ khách hàng thân thiết để giảm giá và có những khuyến mãi khác. Chi phí của việc giảm giá và khuyến mãi là phí công ty muốn chi để nhận được thông tin danh tính khách hàng. Thậm chí doanh nghiệp không phát hành thẻ khách hàng thân thiết vẫn ghi chép cẩn thận lưu lượng khách hàng theo ngày, giờ, và địa điểm.

Thông tin khách hàng xuất hiện trên nhiều tài liệu mà doanh nghiệp tạo ra và sử dụng. Hóa đơn, vận đơn, báo cáo tài khoản cuối tháng đều cần tên và địa chỉ khách hàng. Chẳng hạn, phòng kế toán muốn có danh sách khách hàng gồm tên và điện thoại của người liên hệ hay cần địa chỉ của một nhóm khách hàng nào đó. Để đảm bảo tính nhất quán về thông tin khách hàng bất kỳ khi nào cần dùng, nhiều công ty lưu mọi thông tin khách hàng vào một bảng cơ sở dữ liệu. Mọi tài liệu hay báo cáo cần đến thông tin khách hàng đều tìm đến bảng đó. Chẳng hạn, nếu một khách hàng chuyển địa chỉ, địa chỉ đó chỉ được thay đổi một lần. Hệ cơ sở dữ liệu quan hệ kế toán sẽ lưu thông tin khách hàng trong bảng khách hàng.

Phát triển HTTT kế toán bằng MS Access - Chương 8 - Hoàn thành mô hình bán hàng - thu tiền

James Perry, Richard Newmark


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


Hoàn thành mô hình bán hàng - thu tiền


Bây giờ mọi thực thể (tài nguyên, biến cố, và tác nhân), quan hệ, và lực lượng đã được nhận diện, khóa chính phải được chọn cho từng thực thể, và các quan hệ phải được tạo ra bằng cách dùng khóa ngoại (áp đặt khóa chính ở phía “1” trong quan hệ một-nhiều lên bảng ở phía “M”) và các bảng-quan-hệ (dùng khóa chính phức hợp cho quan hệ nhiều-nhiều).

BÀI TẬP 8.4: TẠO CÁC QUAN HỆ BẰNG CÁCH DÙNG KHÓA NGOẠI VÀ BẢNG-QUAN-HỆ

1. Bằng việc dùng các khóa chính được cung cấp cho mô hình dữ liệu của Pipefitters ở Hình 8.4, hãy tạo khóa ngoại cho các quan hệ một-nhiều.
2. Hãy thêm bảng-quan-hệ và khóa chính phức hợp cho các quan hệ nhiều-nhiều.

Hình 8.4. Qui trình bán hàng - thu tiền với các khóa chính.

Nếu các khóa ngoại và bảng-quan-hệ không khớp với Hình 8.5, hãy ôn lại phần “Hệ quản trị cơ sở dữ liệu” ở Chương 2.

Hình 8.5. Qui trình bán hàng - thu tiền với các khóa chính, khóa ngoại, và bảng-quan-hệ.

Ngoài việc xử lý các đơn đặt hàng, hóa đơn, và chi trả, qui trình bán hàng - thu tiền của hệ thống kế toán còn phải duy trì một bản ghi thường trực về thông tin khách hàng và cung cấp các công cụ để cập nhật và rà soát lại thông tin khách hàng. Người dùng còn phải có khả năng thi hành các nhiệm vụ cập nhật và bảo trì thông tin hàng tồn kho. Như đã biết từ Chương 2, một đặc trưng chính của hệ thông tin kế toán là lưu rất nhiều thông tin so với hệ bút toán kép truyền thống. Để khai thác hết đặc trưng này, người dùng phải có khả năng truy cập thông tin thuộc qui trình bán hàng - thu tiền bên trong hệ thống để cung cấp dữ liệu tài chính và phi tài chính cho người ra quyết định nội bộ cũng như làm báo cáo tài chính ra bên ngoài.