tranthanhan1962 > 07-06-17, 07:08 PM
thanhtruong > 08-06-17, 11:48 AM
tranthanhan1962 > 08-06-17, 01:37 PM
thanhtruong > 08-06-17, 03:36 PM
(08-06-17, 01:37 PM)tranthanhan1962 Đã viết: Tôi quên không đưa cái tồn đầu vào query union. Bạn đưa vào thì nó cộng thêm. Thường giải quyết tồn kho tôi không làm nhiều table nhập xuất riêng biệt mà chỉ làm chung một table thôi. Query union rất nguy hiểm, tôi đưa vào để tạo query TON cho bạn nắm bắt cách xử lý phần combobox. Khi số lượng record nhiều và bị trùng thì query union sẽ bỏ những record trùng nhau và chỉ giữ lai một (Ví dụ bạn có 3 lần nhập paracetamol với số lượng là 500, nó sẽ chừa 1 record paracetamol có số lượng 500 và bỏ đi 2 cái còn lại) đều này sẽ làm sai số liệu. Vì vậy bạn nên thiết kế lại chỉ dùng 1 table cho xuất nhập hàng hóa chứ không nên nên làm 3 table như bây giờ.
SELECT PhieuNhap_Sub.MaHH, DanhMucHangHoa.TenHH, PhieuNhap_Sub.SoLuongNhap AS Soluong
FROM DanhMucHangHoa INNER JOIN PhieuNhap_Sub ON DanhMucHangHoa.MaHH = PhieuNhap_Sub.MaHH;
UNION SELECT PhieuXuat_Sub.MaHH, DanhMucHangHoa.TenHH, -[SoLuongBan] AS SoLuong
FROM DanhMucHangHoa INNER JOIN PhieuXuat_Sub ON DanhMucHangHoa.MaHH = PhieuXuat_Sub.MaHH;
(08-06-17, 01:37 PM)tranthanhan1962 Đã viết: Khi số lượng record nhiều và bị trùng thì query union sẽ bỏ những record trùng nhau và chỉ giữ lai một (Ví dụ bạn có 3 lần nhập paracetamol với số lượng là 500, nó sẽ chừa 1 record paracetamol có số lượng 500 và bỏ đi 2 cái còn lại) đều này sẽ làm sai số liệu.
tranthanhan1962 > 08-06-17, 05:29 PM
SELECT tblTonDauKy.MaHH, DanhMucHangHoa.TenHH, tblTonDauKy.SoLuongTon AS SoLuong
FROM DanhMucHangHoa INNER JOIN tblTonDauKy ON DanhMucHangHoa.MaHH = tblTonDauKy.MaHH;
SELECT PhieuNhap_Sub.MaHH, DanhMucHangHoa.TenHH, PhieuNhap_Sub.SoLuongNhap AS Soluong
FROM DanhMucHangHoa INNER JOIN PhieuNhap_Sub ON DanhMucHangHoa.MaHH = PhieuNhap_Sub.MaHH;
UNION
SELECT PhieuXuat_Sub.MaHH, DanhMucHangHoa.TenHH, -[SoLuongBan] AS SoLuong
FROM DanhMucHangHoa INNER JOIN PhieuXuat_Sub ON DanhMucHangHoa.MaHH = PhieuXuat_Sub.MaHH;
UNION
SELECT tblTonDauKy.MaHH, DanhMucHangHoa.TenHH, tblTonDauKy.SoLuongTon AS SoLuong
FROM DanhMucHangHoa INNER JOIN tblTonDauKy ON DanhMucHangHoa.MaHH = tblTonDauKy.MaHH;
maidinhdan > 08-06-17, 06:13 PM
(08-06-17, 05:29 PM)tranthanhan1962 Đã viết: OK, Nếu bạn không tin thì thử xuất kho một loại hàng hóa nào đó cùng tên, có cùng số lượng vài ba record rồi vào xem query union xem nó hiển thị mấy cái.
Vì bạn xử lý nhiều table nên mình phải dùng nó gom lại thành 1 cho nhanh để dùng total query tính tồn kho chứ thực ra đây là chuyện vô cùng tầm bậy. Nhập xuất hàng hóa phải nằm cùng một table, nếu 2 hoặc nhiều table phải dùng một table tổng hợp bằng phương pháp append query, hoặc xử lý bằng các query tổng phức tạp hơn nhiều.
Còn cách gom nhiều table bằng union thì cứ dùng select query có các field phù hợp rồi nối nhau bẳng UNION.
Lại phức tạp chỗ bạn xử lý liện kết sai nữa đây:
Bạn xóa liên kết của MaHH từ table tblTonDauKy đến các table PhieuNhap_Sub và PhieuXuat_Sub, bỏ khóa chính của table tblTonDauKy, tạo liên kết từ MaHH của table DanhMucHangHoa và MaHH của table tblTonDauKy.
Bạn tạo một select query
Thêm vào sau query NhapXuat+ UNION là xong.Mã:SELECT tblTonDauKy.MaHH, DanhMucHangHoa.TenHH, tblTonDauKy.SoLuongTon AS SoLuong
FROM DanhMucHangHoa INNER JOIN tblTonDauKy ON DanhMucHangHoa.MaHH = tblTonDauKy.MaHH;
Cái này để chỉ bạn cách sử dụng query union chứ không khuyến khích bạn xử dụng trong CSDL của bạn.Mã:SELECT PhieuNhap_Sub.MaHH, DanhMucHangHoa.TenHH, PhieuNhap_Sub.SoLuongNhap AS Soluong
FROM DanhMucHangHoa INNER JOIN PhieuNhap_Sub ON DanhMucHangHoa.MaHH = PhieuNhap_Sub.MaHH;
UNION
SELECT PhieuXuat_Sub.MaHH, DanhMucHangHoa.TenHH, -[SoLuongBan] AS SoLuong
FROM DanhMucHangHoa INNER JOIN PhieuXuat_Sub ON DanhMucHangHoa.MaHH = PhieuXuat_Sub.MaHH;
UNION
SELECT tblTonDauKy.MaHH, DanhMucHangHoa.TenHH, tblTonDauKy.SoLuongTon AS SoLuong
FROM DanhMucHangHoa INNER JOIN tblTonDauKy ON DanhMucHangHoa.MaHH = tblTonDauKy.MaHH;
Mình chỉ có một lời khuyên duy nhất: bỏ cái này đi, phân tích lại xử lý kho hàng là 1 table. trên forum mình cũng bàn nhiều về vấn đề này. bạn có thể xem ở đậy:
[Hướng dẫn] Demo Tính tồn kho ( rất chi tiết)
Trích dẫn:Hiện trong này có 3 tên thuốc. tên thuốc mã A001 còn 10 viên vì đã xuất 10 viênVấn đề này bạn phải thống nhất quản lý mã thuốc cho 1 loại thuốc, Phần này bạn xem trong demo trên table Thuoc là sẽ rõ.
A002 còn 20 viên
A003 còn 10 viên
tranthanhan1962 > 08-06-17, 07:53 PM
thanhtruong > 09-06-17, 12:20 PM
tranthanhan1962 > 09-06-17, 12:56 PM
thanhtruong > 10-06-17, 08:22 AM
(09-06-17, 12:56 PM)tranthanhan1962 Đã viết: Hì hì! Viết phần mềm không có chuyện lỡ rồi. Việc phải bỏ tất cả để phân tích lại từ đầu là bình thường. Cái cảnh mình viết phần mềm cho khách hàng, đôi khi chỉ một cú alo: "Anh thêm dùm tôi cái vụ này, hôm trước quên nói" . Vậy là xong delete hết làm lại từ đầu. Tất nhiên sẽ có thể tính phụ thu với khách hàng . Cũng đôi khi tổng cục thế rãnh rỗi, đẩy xuống một công văn thêm bớt một cái gì đó. Anh phải bỏ cả chương trình cũ của khách hàng đang sử dụng để xử lý lại. Nhưng cảnh này mới khổ. Bỏ chương trình nhưng phải giữ lại dữ liệu. Có nghĩa là phải giữ dữ liệu cũ, điều chỉnh cho phù hợp chương trình mới rồi đưa vào. Rồi thời gian xử lý phải nhanh để khách hàng kịp thời báo cáo cho đơn vị thuế.
Công việc của bạn chỉ mới khởi đầu thời gian không bó buột, bỏ nó đễ xử lý lại tốt hơn. Có gì mà tiếc. Cách thì mình và maidinhdan cũng đã gợi ý. Bạn nên vào đó nghiên cứu kỹ rồi phân tích lại để viết ứng dụng của mình tốt hơn.
Chúc bạn thành công!