logo

Are you need IT Support Engineer? Free Consultant

使用API创建交货单库存不足提醒 – SAP Community

  • By Sanjay
  • 25/06/2026
  • 4 Views


业务需求

客户在使用API创建外向交货单时,当库存不足小于销售订单数量时,API会直接生成外向交货单并取库存数量,这样会导致客户外围系统与S/4数据不一致,并且会无效占据库存。

系统实现

案例销售订单,行项目产品ZTG12数量100

1.Png

库存数量剩下90

2.Png

方法1

使用BADI:LE_SHP_SAVE_DOCUMENT_PREPARE (Modify Standard and Custom Fields for Delivery Header and Items) 逻辑当库存数量小于销售订单行项目数量时,自定义字段赋值提醒:该产品库存不足

1.创建自定义字段YY1_Message

7.Png

2.创建自定义逻辑并且发布

3.Png

4.Png

IF DOCUMENTPROCESSINGMODE = 'CREATE'.
CONSTANTS:
  lc_plant  TYPE werks_d VALUE '1310',
  lc_vkorg  TYPE vkorg   VALUE '1310',
  lc_vtweg  TYPE vtweg   VALUE '20',
  lc_spart  TYPE spart   VALUE '00'.

DATA:
  lv_so_qty TYPE menge_d,
  lv_stock TYPE menge_d.

move-corresponding delivery_document_in to delivery_document_out.
delivery_document_items_out = delivery_document_items_in.
LOOP AT delivery_document_items_in INTO DATA(ls_item).

  SELECT SINGLE orderquantity
    FROM i_salesorderitem
    WHERE salesorder     = @LS_item-referencesddocument
      AND salesorderitem = @LS_item-referencesddocumentitem
    INTO @LV_so_qty.
  " 读取物料的库存数量
  SELECT SINGLE MATLWRHSSTKQTYINMATLBASEUNIT
    FROM I_STOCKQUANTITYCURRENTVALUE_2( P_DisplayCurrency = 'CNY' )
    WHERE PRODUCT = @LS_item-MATERIAL
    INTO @LV_stock.
  IF sy-subrc <> 0.
    CONTINUE. " 未找到对应销售订单行项目,跳过
  ENDIF.

  " 比较库存数量与销售订单数量
  IF lv_stock < lv_so_qty.
    " 更新自定义字段
    DELIVERY_DOCUMENT_OUT-yy1_message_dlh="Warning: 该物料库存数量不足。".
  ENDIF.

ENDLOOP.
ENDIF.

3.创建外向交货单,系统会自动读取库存数量

5.Png

保存后,查看交货单抬头自定义字段:

6.Png

方法2

使用BADI:LE_SHP_DELIVERY_FINAL_CHECK (Last Checks Before Saving the Delivery)

逻辑当库存数量小于销售订单行项目数量时,系统报Error,这里不能设置报Warning,因为API创建时,会直接跳过Warning无视BADI。

13.Png

12.Png

 CONSTANTS:
    lc_plant    TYPE werks_d VALUE '1310',
    lc_vkorg    TYPE vkorg   VALUE '1310',
    lc_vtweg    TYPE vtweg   VALUE '20',
    lc_spart    TYPE spart   VALUE '00'.

    DATA:
    lv_so_qty    TYPE menge_d,
    lv_stock TYPE menge_d.

    IF documentprocessingmode="CREATE".
      LOOP AT delivery_document_items_in INTO DATA(ls_item) .
      IF ls_item-plant = lc_plant.
      " 读取销售订单行项目的订单数量
      SELECT SINGLE orderquantity
      FROM i_salesorderitem
      WHERE salesorder     = @LS_item-referencesddocument
        AND salesorderitem = @LS_item-referencesddocumentitem
      INTO @LV_so_qty.
      " 读取物料的库存数量
      SELECT SINGLE MATLWRHSSTKQTYINMATLBASEUNIT
      FROM I_STOCKQUANTITYCURRENTVALUE_2( P_DisplayCurrency = 'CNY' )
      WHERE PRODUCT = @LS_item-MATERIAL
      INTO @LV_stock.
      IF sy-subrc <> 0.
        CONTINUE. " No SO item found – skip this delivery item
      ENDIF.
      IF lv_stock < lv_so_qty.
        message-messagetype="W". " saving of the delivery document will be warned
        message-messagetext = |Warning: 该物料库存数量不足|.
        EXIT.
      ENDIF.
      ENDIF.
      ENDLOOP.
    ENDIF.

 

创建交货单

11.Png

感谢观看

 



Source link

Leave a Reply

Your email address will not be published. Required fields are marked *