Mình chưa hiểu thuật toán của Minhlev lắm. Mình nghĩ nên sử dụng biện pháp như thế này:
- Tạo thêm 1 bảng XNT VT thứ hai (tạm gọi bảng NXT2), mỗi mặt hàng sẽ có nhiều dòng, mỗi dòng là 1 lần nhập, có ngày tháng, số lượng thành tiền nhập.
- Mỗi lần xuất nó sẽ trừ dần vào mặt hàng đó theo thứ tự ngày tháng bên cột xuất, và tính ra cột tồn cuối của bảng NXT2
Mình nghĩ rằng nên áp dụng thuật toán sau:
1- Mỗi lần nhâp: chèn thêm 1 dòng dữ liệu: mã, tồn đầu:0, nhập: sl & đơn giá nhập & thành tiền, tính tồn cuối = nhập - xuất (0) = nhập
2- mỗi lần xuất: dùng 1 biến X lưu số lượng cần xuất, khai báo biến Y = 0
a- Lọc bảng NXT2 lấy tất cả mã cùng với mã xuất.
b- Dò từ ngày nhỏ nhất xuống,
- nếu tồn cuối = 0 --> xuất = 0
- nếu tồn cuối >0, xuất = min (slx , tồn cuối dòng đó),
- chèn 1 dòng xuất số lượng này vào dữ liệu NX với đơn giá của dòng này, tính số tồn cuối lại cho bảng NXT2
- Gán Y = Y + sl vừa mới lấy
- so sánh Y và X, nếu bằng thì thoát. Nếu Y ít hơn, quay lại bước 2-b.
Như vậy, nếu X lớn hơn sl tồn của dòng đầu tiên (khác không), sẽ có ít nhất 2 dòng xuất 1 mặt hàng với 2 đơn giá.
Đó là cách mình gõ tay và tính để kiểm tra code trong bài trên của mình.
Định kỳ (theo ThuNghi là cuối tháng), delete tất cả các dòng trong bảng NXT2 có sl tồn cuôi bằng zero. --> Bảng NXT2 sẽ chỉ còn mặt hàng còn tồn cuối --> Danh sách ngắn lại --> giải quyết được vấn đề của Thu Nghi.
Ngoài ra kiểm tra được mặt hàng có sl hết mà thành tiền còn vài đồng do sai số làm tròn.
Các bạn thử nghiên cứu hướng này xem có tốt hơn không.