Tự động hóa quy trình giao hàng giữa các công ty trong SAP: Triển khai BAPI_OUTB_DELIVERY_CREATE_STO cho nghiệp vụ gửi hàng ký gửi và điều chuyển nội bộ

Trong kiến trúc quản lý chuỗi cung ứng SAP, việc tự động hóa chuyển đổi từ đơn đặt hàng mua (PO) sang chứng từ giao hàng là yêu cầu then chốt đối với các mô hình kinh doanh đa thực thể pháp lý — đặc biệt khi vận hành kho hàng ký gửi, điều chuyển nội bộ giữa các công ty con hoặc quản lý thiết bị mẫu. Phương thức thủ công không chỉ gây chậm trễ mà còn làm gia tăng rủi ro sai lệch dữ liệu do thiếu kiểm soát logic nghiệp vụ. Bài viết này trình bày cách triển khai hàm BAPI_OUTB_DELIVERY_CREATE_STO để xây dựng quy trình giao hàng toàn diện, đồng thời làm rõ cách tích hợp với các cấu hình nghiệp vụ đặc thù như gửi hàng ký gửi (consignment), điều chuyển kho nội bộ (stock transfer order – STO) và phân phối tài sản mẫu.

1. Phân tích bối cảnh nghiệp vụ và lựa chọn kỹ thuật

1.1 Các trường hợp sử dụng điển hình

  • Điều chuyển hàng tồn kho giữa các công ty con: Khi công ty A cần nhận vật tư từ kho của công ty B, hệ thống phải tạo chứng từ giao hàng có thông tin thanh toán liên công ty chính xác (intercompany billing).
  • Kho hàng ký gửi từ nhà cung cấp: Hàng hóa được lưu trữ tại kho khách hàng nhưng quyền sở hữu vẫn thuộc về nhà cung cấp cho đến khi phát sinh tiêu thụ thực tế.
  • Quản lý thiết bị mẫu: Thiết bị được cấp phát tạm thời cho phòng Marketing để trưng bày, yêu cầu theo dõi chặt chẽ nguồn gốc và trạng thái sở hữu.

1.2 So sánh hai BAPI chính

Tính năng BAPI_DELIVERYPROCESSING_EXEC BAPI_OUTB_DELIVERY_CREATE_STO
Cách gọi Xử lý từng dòng (line-item level) Xử lý theo đơn (header-level), hỗ trợ nhiều dòng cùng lúc
Cơ sở định lượng Số lượng trên dòng đơn hàng Số lượng cam kết (ATP – Available-to-Promise)
Vấn đề bộ nhớ đệm Có nguy cơ lỗi khi xử lý khối lượng lớn do cache không được làm mới Không phụ thuộc vào cache; đảm bảo tính nhất quán dữ liệu
Hỗ trợ nghiệp vụ đặc biệt Chỉ hỗ trợ giao hàng tiêu chuẩn Hỗ trợ đầy đủ: gửi hàng ký gửi, điều chuyển nội bộ, giao hàng theo hợp đồng mẫu
Mức độ hoàn chỉnh Cần cập nhật bổ sung sau khi tạo (batch, storage location, v.v.) Tạo đầy đủ thông tin giao hàng trong một lần gọi
Lưu ý: Với các kịch bản đòi hỏi xử lý thanh toán liên công ty hoặc quản lý quyền sở hữu hàng hóa động (ví dụ: ký gửi), BAPI_OUTB_DELIVERY_CREATE_STO là lựa chọn kỹ thuật ưu tiên.

2. Chuẩn bị dữ liệu và cấu hình nền tảng

2.1 Cấu hình master data bắt buộc

  • Loại giao hàng (Delivery Type): Duyệt cấu hình tại OVLJ; đảm bảo các loại như NLCC (điều chuyển nội bộ) và NL (ký gửi) được ánh xạ đúng với loại lệnh chuyển hàng (STO type) và mã di chuyển (movement type).
  • Mở rộng trường lô hàng (Batch Enhancement): Nếu yêu cầu nhập lô trong quá trình tạo giao hàng, sử dụng cấu trúc mở rộng BAPI_OB_DLV_ITEM_CHG:
DATA: lt_enhancement TYPE TABLE OF bapiparex,
      ls_enhancement TYPE bapiparex.

ls_enhancement-structure = 'BAPI_OB_DLV_ITEM_CHG'.
ls_enhancement-partype   = 'BATCH'.
ls_enhancement-parname   = 'CHARG'.
ls_enhancement-parvalue  = gs_item-batch_no.
APPEND ls_enhancement TO lt_enhancement.
  • Dấu hiệu nghiệp vụ trên đơn mua: Đảm bảo cột RETP0 (Consignment Indicator) được đánh dấu đúng trên dòng đơn mua, đồng thời kiểm tra mối quan hệ giữa điều khoản thương mại quốc tế (INCO1/INCO2) và loại nghiệp vụ trong bảng TVM2.

2.2 Logic phân nhánh nghiệp vụ

Logic xác định chế độ xử lý đặc biệt thường dựa trên tổ hợp các trường sau:

IF ls_po_header-doc_type = 'EB'         " Loại đơn mua
AND ls_po_header-vendor_id = '0000010142'
AND ls_po_header-comp_code(2) = '23'
AND ls_po_header-incoterm = 'CONSIGNMENT'
AND ls_po_item-return_flag IS INITIAL.
  lv_trigger_flag = abap_true.  " Kích hoạt luồng ký gửi
ENDIF.

Các bảng cấu hình liên quan cần đồng bộ:

  • ZTMM_PO_RULES: Bảng tùy chỉnh chứa quy tắc phân loại đơn mua
  • T156: Định nghĩa mã di chuyển và hành vi kho
  • TVKO: Liên kết tổ chức bán hàng – công ty con

3. Thực thi BAPI theo quy trình chuẩn

3.1 Quy trình 6 bước

  1. Khởi tạo môi trường giao hàng:
CALL FUNCTION 'RV_DELIVERY_INIT'
  EXPORTING
    delivery_type = 'NLCC'.  " Ví dụ: điều chuyển nội bộ
  1. Xây dựng bảng tham chiếu STO:
DATA: lt_ref_items TYPE TABLE OF bapidlvreftosto,
      ls_ref_item  TYPE bapidlvreftosto.

SELECT ebeln ebelp
  INTO TABLE @DATA(lt_po_lines)
  FROM ekpo
  WHERE ebeln = @lv_po_number.

LOOP AT lt_po_lines INTO DATA(ls_line).
  CLEAR ls_ref_item.
  ls_ref_item-ref_doc  = ls_line-ebeln.
  ls_ref_item-ref_item = ls_line-ebelp.
  APPEND ls_ref_item TO lt_ref_items.
ENDLOOP.
  1. Gọi BAPI chính:
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_STO'
  IMPORTING
    delivery = lv_delivery_number
  TABLES
    stock_trans_items = lt_ref_items
    return            = lt_messages.
  1. Xử lý commit và rollback:
IF lv_delivery_number IS NOT INITIAL.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = abap_true.
ELSE.
  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  " Xử lý thông báo lỗi chi tiết từ lt_messages
ENDIF.
  1. Bổ sung thông tin sau tạo: Dùng BAPI_OUTB_DELIVERY_CHANGE để cập nhật lô hàng, ngày giao thực tế hoặc vị trí lưu kho.
  2. Cập nhật trạng thái nghiệp vụ: Đồng bộ trạng thái vào bảng nghiệp vụ tùy chỉnh:
UPDATE zmm_sto_log
  SET delivery_no = lv_delivery_number,
      status      = 'IN_PROGRESS'
  WHERE po_number = lv_po_number
    AND item_no   = lv_item_no.

3.2 Mẹo xử lý tình huống đặc biệt

  • Điều chuyển nội bộ: Kiểm tra cấu hình quy tắc xác định loại giao hàng trong TBD14, đảm bảo mã di chuyển 301 hoặc 351 được ánh xạ đúng với NLCC. Cần duy trì đồng bộ đơn vị đo lường giữa hai nhà máy nếu khác nhau.
  • Quản lý lô hàng: Không truyền lô ngay trong bước tạo giao hàng; thay vào đó, dùng cấu trúc mở rộng ở bước 5 để cập nhật chính xác sau khi chứng từ đã được sinh.

4. Xử lý ngoại lệ và tối ưu hiệu năng

4.1 Mã lỗi phổ biến và khắc phục

Mã lỗi Nguồn gốc Giải pháp
VL 150 Kiểm tra khả dụng (ATP) thất bại Điều chỉnh quy tắc ATP trong OVZ2 hoặc bổ sung tồn kho ảo (virtual stock)
VR 420 Đơn hàng đã giao hết Thêm kiểm tra trạng thái ELIKZ trong EKET trước khi gọi BAPI
VLBAPI 004 Đơn vị đo không khớp giữa PO và giao hàng Đảm bảo tất cả trường số lượng (LFIMG, LFMNG) đều được điền đồng bộ
Không tìm thấy loại giao hàng Không đọc được cấu hình từ ME_EKPV_ARRAY_READ Tăng cường hàm đọc bằng cách thêm điều kiện lọc BSARTBUKRS

4.2 Chiến lược tối ưu hiệu năng

  • Xử lý theo lô: Truyền tối đa 100 dòng vào lt_ref_items mỗi lần gọi BAPI thay vì xử lý từng dòng riêng lẻ.
  • Làm sạch bộ nhớ đệm: Gọi hàm FUNCTION_INCLUDE_FREE với tên chương trình SAPLV58A trước khi thực hiện vòng lặp xử lý khối lượng lớn.
  • Xử lý bất đồng bộ: Với khối lượng >500 dòng, chia thành các nhóm 50 dòng và chạy song song qua RFC queue (SMQS) để giảm thời gian tổng thể tới 40%.

Thực tế triển khai cho thấy việc tải trước toàn bộ master data (như T001W, T001L, T156) vào bảng nội bộ (itab) giúp giảm 65% thời gian truy vấn cơ sở dữ liệu trong suốt quy trình.

Thẻ: BAPI_OUTB_DELIVERY_CREATE_STO SAP-MM SAP-SD consignment stock-transfer-order

Đăng vào ngày 28 tháng 6 lúc 20:59