Quản lý kho phân biệt theo nguồn - có kho chính và nhiều kho lẻ
duyennguyen2008 > 06-12-12, 11:14 PM
Thân chào các anh em chiến hữu trên thuthuataccess!
Mình vừa học hỏi bác Xuân Thanh để biên soạn cơ bản về việc lập báo cáo tồn kho và in thẻ kho bằng query.
Về cơ bản đã làm được rồi! Nhưng mình muốn có thêm một chút sáng kiến nữa, nhưng không biết cách thực hiện, mong nhận được sự chỉ giúp của anh em gần xa!
Mình có 2 kho chính là A (sử dụng tiền được cấp để mua hàng) và B (sử dụng tiền của mình tự mua hàng).
Yêu cầu như sau:
1/ Nhập vào kho chính A và khi kho chính A xuất cho kho lẻ A1,A2... thì số lượng kho lẻ A1,A2... sẽ được tự động thêm vào tồn kho (như vậy ở kho A1,A2... đã có hàng để xuất mà không phải nhập một lần nữa từ phiếu xuất của kho A. Mình đã tìm hiểu về Appen Query nhưng do trình độ có hạn nên không biết cách tạo điều kiện để Appen cho đúng). Tương tự như vậy cho kho B và kho B1,B2... (vì mình không muốn nhập A và B thành 02 chương trình quản lý để theo dõi riêng)
2/ Nếu yêu cầu 1 thỏa, khi đó kho A1,A2... hay B1,B2..sẽ có số nhập (bằng số xuất từ kho A cho kho A1,A2..hay B1,B2...tùy điều kiện), vậy muốn đưa số tồn đầu hiện có của các kho A1,A2 hay B1,B2 này vào như thế nào?
3/ 5 Query hướng dẫn của bác Xuân Thanh mình rất tâm đắc, nhưng giờ khi muốn chạy riêng cho kho chẳn và lẻ mình phải làm điều kiện gì? Với Query thẻ kho lại thiếu cột tồn cuối nhìn thấy đơn điệu làm sao, nhìn giống nhật ký nhập xuất hơn là thẻ kho. (VD: lọc từ ngày 23/09/12 đến 06/12/12, mặt hàng Alpha... xuất hiện đến 4 lần nhưng vẫn không biết tồn cuối cùng là bao nhiêu?)
TRÍCH DẪN CỦA BÁC XUÂN THANH!
"Hướng dẫn cơ bản về việc lập báo cáo tồn kho và in thẻ kho bằng query
Vừa qua trên diễn đàn có một số bạn thắc mắc về việc tính tồn kho và thẻ kho. Bản thân tôi thích dùng VBA hơn vì nó bảo mật tốt hơn. Để giúp các bạn tham khảo, tôi lập chủ đề này, hướng dẫn các bạn làm tồn kho và thẻ kho hoàn toàn bằng query. Nói thêm, với Access, có đến hơn 90% kết quả có được ta có thể dùng hoàn toàn bằng query truy vấn.
Để làm được, các bạn tạo một CSDL TonKho với các bảng sau
1/ tblHangHoa
- Mahang Text 20 PrimariKey
- Tenhang Text 50
2/ tblNhapHang
- MaSoNhap text 20 PrimaryKey
- NgayLap Date
3/ tblNhapHangChiTiet
- MaSoNhap Text 20
- MaHang Text 20
- SoLuong Number
4/ tblXuatHang
- MaSoXuat Text 20 PrimaryKey
- NgayLap Date
3/ tblXuatHangChiTiet
- MaSoXuat Text 20
- MaHang Text 20
- SoLuong Number
Sau khi lập xong các table, các bạn tạo mối quan hệ cho các table (cái này đơn giản khỏi cần hướng dẫn nhé)
MaHang - MaHang, MaSoNhap - MaSoNhap, MaSoXuat - MaSoXuat
Để có báo cáo Tồn Kho, ta chỉ cần sử dụng 5 query sau đây
1/ qryNhapXuat : Tính số lượng nhập xuất hàng hóa
Mã:
SELECT tblNhapHang.NgayLap, tblNhapHangChiTiet.MaHang, tblNhapHangChiTiet.SoLuong AS SoLuongNhap, 0 AS SoLuongXuat FROM tblNhapHang INNER JOIN tblNhapHangChiTiet ON tblNhapHang.MaSoNhap = tblNhapHangChiTiet.MaSoNhap;
UNION SELECT tblXuatHang.NgayLap, tblXuatHangChiTiet.MaHang, 0 AS SoLuongNhap, tblXuatHangChiTiet.SoLuong AS SoLuongXuat FROM tblXuatHang INNER JOIN tblXuatHangChiTiet ON tblXuatHang.MaSoXuat = tblXuatHangChiTiet.MaSoXuat;
2/ qryTruoc : tính số lượng hàng trước ngày chỉ định bất kỳ
Mã:
SELECT qryNhapXuat.MaHang, qryNhapXuat.SoLuongNhap AS Nhap, qryNhapXuat.SoLuongXuat AS Xuat FROM qryNhapXuat WHERE (((qryNhapXuat.NgayLap)<[TuNgay]));
3/ qryTonDau : Tính tổng số lượng tồn của các mạt hàng trước ngày chỉ định bất kỳ
Mã:
SELECT qryTruoc.MaHang, Sum(qryTruoc.Nhap) AS SoLuongNhap, Sum(qryTruoc.Xuat) AS SoLuongXuat, [SoLuongNhap]-[SoLuongXuat] AS TonDau FROM qryTruoc GROUP BY qryTruoc.MaHang;
4/ qryTrong : Tính tổng lượng nhập xuất của các mặt hàng theo thời điểm cho trước(từ ngay đến ngày)
Mã:
SELECT qryNhapXuat.MaHang, qryNhapXuat.SoLuongNhap AS Nhap, qryNhapXuat.SoLuongXuat AS Xuat, qryNhapXuat.NgayLap FROM qryNhapXuat WHERE (((qryNhapXuat.NgayLap) Between [TuNgay] And [DenNgay]));
5/ qryTonCuoi : Xác định tồn kho của tất cả các mạt hàng
Mã:
SELECT tblHangHoa.MaHang, tblHangHoa.TenHang, IIf([TonDau]>0,[TonDau],0) AS TonDauKy, Sum(NZ([Nhap])) AS TongNhap, Sum(NZ([Xuat])) AS TongXuat, [TonDauKy]+[TongNhap]-[TongXuat] AS TonCuoi FROM (tblHangHoa LEFT JOIN qryTrong ON tblHangHoa.MaHang = qryTrong.MaHang) LEFT JOIN qryTonDau ON tblHangHoa.MaHang = qryTonDau.MaHang GROUP BY tblHangHoa.MaHang, tblHangHoa.TenHang, IIf([TonDau]>0,[TonDau],0);
Như vậy là ta đã tính được tồn kho của tất cả các mặt hàng chỉ thông qua 5 query đơn giản. Lưu ý query thứ nhất, qryNhapXuat là một Union query, qry thứ 5 cách JOIN các tabble, query trong lưới query. Các bạn tự nghiên cứu nhé
Thêm một query nữa là ta có báo cáo thẻ kho rồi : qryTheKho
Mã:
SELECT tblHangHoa.MaHang, tblHangHoa.TenHang, NZ([TonDau]) AS Ton, qryTrong.NgayLap, IIf([Nhap]>0,[Nhap],0) AS NhapTK, IIf([Xuat]>0,[Xuat],0) AS XuatTK FROM (tblHangHoa LEFT JOIN qryTonDau ON tblHangHoa.MaHang = qryTonDau.MaHang) LEFT JOIN qryTrong ON tblHangHoa.MaHang = qryTrong.MaHang WHERE (((tblHangHoa.MaHang)=[HangNao])) ORDER BY qryTrong.NgayLap;
Với cách tính này, có thể có một số mặt hàng không có dữ liệu(Đầu kỳ = 0, Tổng Nhập = 0, Tổng Xuất = 0, Tồn cuối = 0). Nếu muốn xóa những dòng này cho đỡ rối mắt, các bạn chuyển cái qryTonCuoi thành Make-Table Query (chuyển sang một table mới, ví dụ tblTonKho) rồi dùng một query xóa nữa là ổn
Mã:
DELETE tblTonKho.TonDauKy, tblTonKho.TongNhap, tblTonKho.TongXuat FROM tblTonKho WHERE (((tblTonKho.TonDauKy)=0) AND ((tblTonKho.TongNhap)=0) AND ((tblTonKho.TongXuat)=0));
Khi viết bằng VBA thì không có hiện tượng này, Chỉ có những mặt hàng nào có dữ liệu thì mới hiển thị
Thân mến"