Đến nội dung chính
ERP Thực Chiến
Thư viện
Menu

Công thức Item Availability trên Sales Order Business Central

Công thức Item Availability trên Sales Order Business Central: năm dòng trong FactBox Sales Line Details cộng trừ ra sao, và đọc số âm để biết thiếu bao nhiêu.

Item Availability trên Sales Order Business Central tính bằng công thức: Available Inventory + (Scheduled Receipt − Reserved Receipt) − (Gross Requirements − Reserved Requirements). Năm số này nằm ngay dưới Item Availability trong FactBox Sales Line Details. Số âm nghĩa là tới Shipment Date của dòng, ở đúng kho của dòng, kể cả dòng đang xem, còn thiếu bấy nhiêu.

Ở một dự án, dòng bán hiện Item Availability âm hơn 200 hộp trong khi tồn ở kho còn hơn hai mươi nghìn hộp, và không ai trả lời được số đó từ đâu ra. Tôi đọc code Base Application 28.1 (page Sales Line FactBox, codeunit Sales Info-Pane Management và Available to Promise), ráp năm số trên màn hình vào công thức và ra đúng số BC hiện. Ví dụ trong bài là số tự dựng theo cùng công thức, viết theo định dạng BC: dấu phẩy ngăn hàng nghìn, dấu chấm thập phân.

Năm dòng trong FactBox Sales Line Details#

Trên Sales Order, chọn một dòng hàng, FactBox Sales Line Details có nhóm Availability. Field Item Availability gọi hàm CalcAvailability, hàm này đặt filter lên Item rồi gọi CalcQtyAvailableToPromise. Từng dòng bên dưới là một thành phần của phép tính:

Dòng trên FactBoxGồm
Available InventoryInventory trừ phần tồn đã reserve
Scheduled ReceiptHàng sắp về: Purchase Order, lệnh sản xuất, Assembly Order, Transfer Order chiều nhận, hàng đang đi đường, Sales Return Order
Reserved ReceiptPhần hàng sắp về đã reserve cho đơn khác
Gross RequirementsHàng sắp xuất: Sales Order, linh kiện của lệnh sản xuất và Assembly, Transfer Order chiều xuất, Purchase Return Order, Job, dòng planning
Reserved RequirementsPhần nhu cầu đã reserve

Filter đặt lên Item lấy từ chính dòng bán:

  • Date Filter = từ đầu tới Shipment Date của dòng. Dòng chưa có Shipment Date thì lấy Work Date.
  • Location Filter = Location Code của dòng. Dòng để trống Location Code thì BC chỉ tính tồn và chứng từ có Location Code trống, không cộng các kho khác.
  • Variant Filter = Variant Code của dòng.

Ba chỗ hay đọc nhầm#

Tồn không lọc theo ngày, chứng từ dự kiến thì có. CalcFormula của Inventory không có điều kiện ngày, nên Available Inventory là toàn bộ tồn hiện có ở kho đó. Date Filter chỉ cắt phần nhập xuất dự kiến: Purchase Order theo Expected Receipt Date, Sales Order theo Shipment Date. Hệ quả: Purchase Order hay Assembly Order đã quá ngày mà chưa post vẫn được cộng, đơn bán quá hạn chưa giao vẫn bị trừ, còn hàng về sau ngày giao của dòng thì không được cộng.

Gross Requirements đã gồm chính dòng đang xem. Dòng bán 60 thùng hiện Item Availability −10 nghĩa là thiếu 10 thùng tính cả 60 thùng này, không phải thiếu 70.

Số hiện theo đơn vị của dòng. Code lấy số theo base chia cho Qty. per Unit of Measure của dòng, làm tròn 5 chữ số. Base là thùng, dòng bán theo hộp thì số hiện ra theo hộp, và hệ số lưu thiếu chữ số làm số ra lẻ.

Ví dụ: −10 thùng tính ra từ đâu#

Một mặt hàng base là thùng, 24 hộp mỗi thùng. Dòng đang xem bán 60 thùng ở kho TP, Shipment Date 25/11. Không đơn nào reserve. Chứng từ đang mở ở kho TP:

Chứng từNgàySố thùngCó vào phép tính không
Tồn hiện có240Có
Purchase Order, đã quá ngày, chưa nhận18/11+60Có
Purchase Order28/11+100Không, sau 25/11
Sales Order A, quá hạn chưa giao24/11−150Có
Sales Order B25/11−100Có
Dòng đang xem25/11−60Có
Sales Order C27/11−80Không, sau 25/11

FactBox hiện:

DòngThùng
Available Inventory240
Scheduled Receipt60
Reserved Receipt0
Gross Requirements310
Reserved Requirements0
Item Availability240 + (60 − 0) − (310 − 0) = −10

Đọc ra ba việc. Tới 25/11, kho TP thiếu 10 thùng cho ba đơn A, B và dòng này. Nếu Purchase Order ngày 18/11 không về, thiếu thật là 70 thùng. Purchase Order 100 thùng ngày 28/11 không cứu được dòng này, vì về sau ngày giao.

Bán theo hộp thì cùng phép tính đó hiện −240 hộp. Nếu Qty. per Unit of Measure của hộp đang lưu 0.04167 thay vì 1/24 đủ chữ số, FactBox hiện −239.9808. Phần lẻ đó đến từ hệ số, không phải từ tồn kho. Bài lỗi làm tròn đơn vị tính khi base là thùng giải thích vì sao và cách sửa.

Biết thiếu bao nhiêu rồi, thiếu cho đơn nào#

FactBox chỉ cho một con số tổng. Bấm vào số Item Availability, BC mở trang Item Availability by Event cho mặt hàng của dòng. Trang này liệt kê từng chứng từ theo ngày kèm số dư dự kiến sau mỗi chứng từ, nên thấy ngay chứng từ nào kéo số dư xuống âm.

Ở ví dụ trên, ba đơn A, B và dòng đang xem chưa reserve, nên BC chỉ trừ theo tổng. Nó không xác định đơn nào là đơn bị thiếu, việc chọn giao đơn nào trước vẫn do người làm kế hoạch quyết. Muốn giữ hàng cho một đơn thì reserve đơn đó: con số tổng không đổi, nhưng tồn đã reserve không còn dùng được cho các đơn khác, và phần thiếu dồn về các đơn chưa reserve.

Khi số âm bất thường, tôi soát theo thứ tự:

  1. Location Code của dòng có đúng kho xuất không. Sai kho hoặc để trống là số tính trên kho khác.
  2. Shipment Date của dòng. Đẩy ngày giao lùi thêm vài ngày thì phần hàng về sau được cộng vào.
  3. Chứng từ nhập dự kiến đã quá ngày mà chưa post (Purchase Order, Assembly Order, Transfer Order). BC vẫn cộng chúng, nên con số có thể đẹp hơn thực tế.
  4. Đơn bán quá hạn chưa giao. Đơn khách đã hủy mà chưa xóa vẫn bị trừ.

Ngoài ra, trước khi đọc số theo công thức chuẩn, cần biết dự án có extension nào thay cách tính không. Codeunit Sales Info-Pane Management có event OnBeforeCalcAvailability cho phép extension tự trả số. Ở dự án của tôi, rà source các app có sẵn không thấy app nào subscribe event này, còn các app của bên thứ ba không có source thì chưa rà được.

Thiếu hàng lặp lại ở cùng nhóm mặt hàng thì vấn đề nằm ở khâu đặt hàng chứ không ở FactBox. Lúc đó số đáng xem là độ chính xác của dự báo.

Tài liệu Microsoft về các trang xem tồn theo sự kiện, theo kỳ: View the availability of items.

Đọc tiếp