Thứ Sáu, 8 tháng 4, 2016

Phát triển HTTT kế toán bằng MS Access - Chương 1 - Bao gồm biểu thức trong câu truy vấn

James Perry, Richard Newmark


Chương 1
Nhập môn Microsoft Access


Bao gồm biểu thức trong câu truy vấn


Phần lớn các ứng dụng đều có phần tính toán những giá trị không lưu sẵn trong cơ sở dữ liệu. Các ứng dụng kế toán cũng vậy. Chẳng hạn, quản lý viên thường xuyên để mắt đến các tổng trị giá đã được lập hóa đơn. Một cách cộng dồn các doanh số đã được lập hóa đơn là ghi nhận tổng trị giá từng dòng-hóa-đơn trong tblInvoiceLines. Tuy nhiên, bảng tblInvoiceLines không ghi nhận giá trị đó – vì đó là điều không nên nếu bảng tuân thủ các chuẩn thiết kế cơ sở dữ liệu đã được thừa nhận rộng rãi. Có hai cách giải quyết vấn đề này; một cách đúng và một cách sai hoàn toàn.

Giải pháp sai là tạo một cột mới trong bảng tblInvoiceLines để lưu tổng trị giá của từng mặt hàng đã mua. Mặc dù đây có thể là giải pháp khả dĩ khi dùng phần mềm bảng tính spreadsheet, làm vậy với cơ sở dữ liệu có thể đưa đến bất nhất trong cơ sở dữ liệu và gây khó về sau. Tại sao? Giả sử tổng trị giá được tính bằng tích số lượng Quantity nhân đơn giá UnitPriceCharged. Bây giờ giả sử có người phát hiện lỗi nhập số lượng cho một mặt hàng cụ thể. Thay vì nhập số lượng là 20 (hai mươi) cho mặt hàng đó, người ta lại nhập 200 (hai trăm). Khi phát hiện sai sót, số lượng được điều chỉnh về 20 trong cột Quantity của tblInvoiceLines.

Chú thích đặc biệt: Access cung cấp khả năng đặt một trường tính toán vào bảng nếu đó là biểu thức liên quan đến các trường thuộc bảng đó. Có thể đây là ý kiến hay, nhưng vi phạm qui tắc chuẩn hóa cơ sở dữ liệu. Bạn nên tạo các trường tính toán bằng một truy vấn lên bảng.

Mặc dù giá trị Quantity giờ đây đã đúng trong bản ghi cơ sở dữ liệu ứng với giao dịch bị lỗi, tổng trị giá vẫn chưa đúng. Không như bảng tính spreadsheet, giá trị trường trong dòng cơ sở dữ liệu không tự động đổi khi các giá trị khác mà nó phụ thuộc thay đổi. Đây là qui tắc quan trọng cho tình huống này: Đừng bao giờ lưu vào bảng bất kỳ giá trị (trường) nào phụ thuộc hàm nhiều hơn một trường trong bản ghi. Đó là một đơn giản hóa của qui tắc được trình bày ở Chương 2 và đơn thuần phát biểu rằng bạn không nên lưu vào bảng giá trị bạn có thể tính toán hay dẫn xuất từ một hay nhiều bảng trong cơ sở dữ liệu.

Như vậy, cách nào là đúng để tính tổng trị giá cho từng dòng-hóa-đơn? Cách đúng là thêm một biểu thức (expression) vào truy vấn để tính giá trị động – mỗi khi thi hành truy vấn. Thay vì bạn phải tạo một truy vấn như thế, chúng tôi cung cấp một ví dụ để bạn thi hành. Bạn sẽ thấy truy vấn này chứa tính toán được mô tả ở đây trong cơ sở dữ liệu Chương 1. Trong phân loại Queries, đó là qryInvoices.

THỬ NGHIỆM

Kích kép truy vấn hóa đơn qryInvoices. Truy vấn này hiển thị các dòng từ hai bảng: bảng dòng-hóa-đơn tblInvoiceLines và bảng sản phẩm tblProducts. (Bảng tblProducts không cần để minh họa tính toán, nhưng việc thêm bảng thứ hai cho phép ta hiển thị tên sản phẩm trong tập động dynaset.) Hãy khảo sát truy vấn ở Hình 1.26 cũng như tập động dynaset hiển thị kết quả tra cứu và tính toán. Biểu thức được tính và được hiển thị ở cột Extended thật ra phức tạp hơn phép nhân hai số một chút. Nó còn tính đến phần trăm giảm giá áp trên mặt hàng rồi làm tròn toàn bộ biểu thức về hai vị trí thập phân. Bây giờ hãy bỏ qua vấn đề làm tròn và giảm giá. Cứ để mở câu truy vấn để dùng về sau.

Hình 1.26 Một truy vấn chứa biểu thức số học.

Kích nút Design View rồi khảo sát thiết kế truy vấn. Đặc biệt để ý đến biểu thức trên dòng Field. (Bạn có thể phải kích thanh trượt ngang để thấy được trường đó.) Biểu thức

Extended: Round([Quantity]*[UnitPriceCharged]*(1-[Discount]),2)

sẽ tính giá mở rộng (extended price) cho từng dòng rồi tạo cột mới trong tập động dynaset. Từ Extended theo sau là dấu hai chấm và khoảng trống là tên cột (còn được gọi là biệt danh alias). Các biến biểu thức [Quantity] và [UnitPriceCharged] tham chiếu đến các tên trường trong bảng và nhận giá trị từ chúng cho từng dòng.

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

Đăng nhận xét