SAP VL02N 交货单过账函数 WS_DELIVERY_UPDATE

25 篇文章 7 订阅

SAP VL02N 交货单过账函数 WS_DELIVERY_UPDATE

前言

用BDC模拟VL02N过账也可以,并不复杂
只不过用SAP提供的Function Module在扩展性上要好一些

代码总览

测试报表

TABLES: likp.

DATA: gs_likp   TYPE likp,
      gt_lips   TYPE STANDARD TABLE OF lips,
      gs_lips   TYPE lips,
      gs_return TYPE zcommon_return.

SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS: s_vbeln FOR likp-vbeln MEMORY ID vbe.
SELECTION-SCREEN END OF BLOCK blk1.

START-OF-SELECTION.

  SELECT SINGLE * FROM likp WHERE vbeln IN @s_vbeln INTO CORRESPONDING FIELDS OF @gs_likp.
  gs_likp-wadat_ist = gs_likp-wadat.

  SELECT * FROM lips WHERE vbeln IN @s_vbeln INTO CORRESPONDING FIELDS OF TABLE @gt_lips.

  CALL FUNCTION 'ZSDFM01_DELIVERY'
    EXPORTING
      wa_likp   = gs_likp
    IMPORTING
      wa_return = gs_return
    TABLES
      it_lips   = gt_lips.

  WRITE gs_return.

END-OF-SELECTION.

FM ZSDFM01_DELIVERY

FUNCTION zsdfm01_delivery.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(WA_LIKP) TYPE  LIKP
*"  EXPORTING
*"     VALUE(WA_RETURN) TYPE  ZCOMMON_RETURN
*"  TABLES
*"      IT_LIPS STRUCTURE  LIPS
*"----------------------------------------------------------------------
  DATA: wa_lips  LIKE LINE OF it_lips,
        wa_vbkok TYPE vbkok.

  DATA: it_vbpok TYPE STANDARD TABLE OF vbpok,
        wa_vbpok TYPE vbpok.

  DATA: it_prott TYPE STANDARD TABLE OF prott,
        wa_prott TYPE prott.

  DATA: v_msg TYPE string.
  LOOP AT it_lips INTO wa_lips.
    CLEAR:wa_vbpok.
    wa_vbpok = VALUE #( vbeln_vl = wa_lips-vbeln
                        posnr_vl = wa_lips-posnr
                        vbeln    = wa_lips-vgbel
                        posnn    = wa_lips-vgpos
                        matnr    = wa_lips-matnr
                        lgort    = wa_lips-lgort
                        lfimg    = wa_lips-lfimg
                        lgmng    = wa_lips-lfimg          " 以仓库保管单位级的实际交货数量
                        pikmg    = wa_lips-lfimg          " 参考数量以基本计量单位计算
                         ).
    APPEND wa_vbpok TO it_vbpok.
  ENDLOOP.

  wa_vbkok = VALUE #( vbeln_vl  = wa_likp-vbeln
                      wadat_ist = wa_likp-wadat_ist   " 实际货物移动日期
                      wabuc     = 'X'                 " 自动过帐货物移动
                      komue    = 'X'             " 自动以拣配数量覆盖交货数量
                      ).
  CALL FUNCTION 'WS_DELIVERY_UPDATE'
    EXPORTING
      vbkok_wa       = wa_vbkok
      commit         = 'X'
      delivery       = wa_likp-vbeln
      update_picking = 'X'
    TABLES
      vbpok_tab      = it_vbpok
      prot           = it_prott.

  DELETE it_prott WHERE msgty NE 'E' AND msgty NE 'A'.
  IF it_prott IS INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    wa_return-mtype = 'S'.
    wa_return-mtext = '过账成功!' .

  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

    LOOP AT it_prott INTO wa_prott.
      CALL FUNCTION 'MESSAGE_TEXT_BUILD'
        EXPORTING
          msgid               = wa_prott-msgid
          msgnr               = wa_prott-msgno
          msgv1               = wa_prott-msgv1
          msgv2               = wa_prott-msgv2
          msgv3               = wa_prott-msgv3
          msgv4               = wa_prott-msgv4
        IMPORTING
          message_text_output = v_msg.
      wa_return-mtext = wa_return-mtext && '过账失败! 原因如下:' && v_msg .
    ENDLOOP.
    wa_return-mtype = 'E'.
  ENDIF.
ENDFUNCTION.

代码解析

没什么好分析的,vbpok 类型中的字段和 lips 表的字段差不多
代表需要过账的明细行

需要关注的是抬头数据 vbkok 中实际货物移动日期 wadat_ist 和 wabuc 自动过账货物移动需要给到值

wadat_ist = wa_likp-wadat_ist   " 实际货物移动日期
wabuc     = 'X'                 " 自动过帐货物移动

然后FM WS_DELIVERY_UPDATE的传入需要设置参数 commit 和 update_picking
这两个参数的默认值都为空,需要设置为 abap_true

commit = 'X'
update_picking = 'X'

调用FM过账后,获取 prot 的返回值

it_prott 里会存储错误信息

通过FM MESSAGE_TEXT_BUILD来获取文本内容
最后输出

结语

如果本文对你有所帮助请为它点个赞吧

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值