业务需求
客户在使用API创建外向交货单时,当库存不足小于销售订单数量时,API会直接生成外向交货单并取库存数量,这样会导致客户外围系统与S/4数据不一致,并且会无效占据库存。
系统实现
案例销售订单,行项目产品ZTG12数量100
库存数量剩下90
方法1
使用BADI:LE_SHP_SAVE_DOCUMENT_PREPARE (Modify Standard and Custom Fields for Delivery Header and Items) 逻辑当库存数量小于销售订单行项目数量时,自定义字段赋值提醒:该产品库存不足
1.创建自定义字段YY1_Message
2.创建自定义逻辑并且发布
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.创建外向交货单,系统会自动读取库存数量
保存后,查看交货单抬头自定义字段:
方法2
使用BADI:LE_SHP_DELIVERY_FINAL_CHECK (Last Checks Before Saving the Delivery)
逻辑当库存数量小于销售订单行项目数量时,系统报Error,这里不能设置报Warning,因为API创建时,会直接跳过Warning无视BADI。
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.
创建交货单
感谢观看



