创建交货单 DN

BAPI_DELIVERYPROCESSING_EXEC

SA只能用这个BAPI

参考多张采购订单合并创建交货单:BBP_INB_DELIVERY_CREATE(写不进去物料需要做一个增强)

1.无法写入批次,需要调用BAPI_OUTB_DELIVERY_CHANGE修改(可能数量单位之类的都要传一遍,否则会报错VLBAPI 004 "Error in document &1 item &2 (quantity consistency check)";WS_DELIVERY_UPDATE也写不进去

lt_request-extdelv_no = uv_dn. 写不进去 外部交货单号,WS_DELIVERY_UPDATE修改的时候写

附:

DATA: ls_item TYPE bapiibdlvitemchg.

SELECT SINGLE lfimg lgmng lfimg_flo lgmng_flo umvkz umvkn umrev

     FROM lips

     INTO (ls_item-dlv_qty, ls_item-dlv_qty_imunit, ls_item-del_qty_flo, ls_item-dlv_qty_st_flo,

           ls_item-fact_unit_nom, ls_item-fact_unit_denom, ls_item-conv_fact)

     WHERE vbeln = '0180001234'

       AND posnr = '000010'.

分享

2.报错 “没有传入交货类型”

这个原因是函数ME_EKPV_ARRAY_READ没有返回ekpv的数据,后面会判断ekpv是否位空,如果为空的话后面会有一系列赋值的代码(包括交货类型LFART)不执行。

这个是bapi自身的bug,没有打note。

另外,如果输入了一个不存在的订单行项目,也会报这个错误。

这里赋值了ebeln,在后面递归循环的时候,read table用的是ebeln ebelp,所以会导致最终返回的ekpv一直是空

 

这个函数中有个对象lo_db,lo_db有个属性mv_iter作为计数器,属性mt_data存放从表ekpv取到的数据。而这个对象是单例的

 

所以在重复调用bapi的时候mv_iter和mt_data不会自动清空,所以如果第二次调用这个bapi,此时mv_iter =2不会进入递归(就不会受到赋值给lt_intpu的影响),此时执行可以成功创建交货单

3.如果配置了可用性检查,可用库存不足会报 I VL 150,还有一条E

4.不能指定项目,项目从10开始累加

 

实际发货日期(过账日期)

bapi没有参数写入实际发货日期,如果不写实际发货日期,过账时使用的就是创建日期

使用WS_DELIVERY_UPDATE或WS_DELIVERY_UPDATE_2过账时,可以通过vbkok-wadat_ist写入过账日期

直接改表

 

DEMO

function zflg_dn_create.

*"----------------------------------------------------------------------

*"*"本地接口:

*"  IMPORTING

*"     VALUE(VBTYP) TYPE  VBTYP

*"     VALUE(VBELV) TYPE  VBELN_VON

*"     VALUE(LIFEX) TYPE  ZDN_PLAN OPTIONAL

*"  EXPORTING

*"     VALUE(RTYPE) TYPE  BAPI_MTYPE

*"     VALUE(RTMSG) TYPE  BAPI_MSG

*"     VALUE(VBELN) TYPE  VBELN_VL

*"  TABLES

*"      IT_ITEM STRUCTURE  ZDN_METHOD_S1

*"      RETURN STRUCTURE  BAPIRET2 OPTIONAL

*"----------------------------------------------------------------------

  zfmdatasave1 'ZFLG_DN_CREATE'.

  zfmdatasave2 'B'.

 

*创建

  data:

    lt_request      like bapideliciousrequest occurs 0 with header line,

    lt_createditems like bapideliciouscreateditems occurs 0 with header line.

 

*修改

  data:

    it_header_partner   like table of bapidlvpartnerchg           , "交货:合作伙伴更改

    it_header_deadlines like table of bapidlvdeadln               , "交货截止日期

    it_item_data        like table of bapiobdlvitemchg            , "更改外向交货拣配数据项目等级

    it_item_control     like table of bapiobdlvitemctrlchg        , "外向交货项目级别控制数据

    et_return           like table of bapiret2   with header line , "返回参数

    it_item_data_spl    like table of /spe/bapiobdlvitemchg       , "更改向外交货拣配数据项目等级(SPE)

    is_header_data      like          bapiobdlvhdrchg             , "更改外向交货拣配数据表头等级

    is_header_control   like          bapiobdlvhdrctrlchg         , "外向交货标题级别控制数据

    iv_delivery         like          bapiobdlvhdrchg-deliv_numb  . "交货

  data:

    lw_header_partner   like          bapidlvpartnerchg           , "交货:合作伙伴更改

    lw_header_deadlines like          bapidlvdeadln               , "交货截止日期

    lw_item_data        like          bapiobdlvitemchg            , "更改外向交货拣配数据项目等级

    lw_item_control     like          bapiobdlvitemctrlchg        , "外向交货项目级别控制数据

    lw_return           like          bapiret2                    . "返回参数

  data: l_techn_control  type bapidlvcontrol.

  data:

    ls_item         type bapiobdlvitemchg,

    ls_item_t       type bapiobdlvitemchg,

    ls_item_control type bapiobdlvitemctrlchg,

    ls_deadlines    type bapidlvdeadln.

 

  call function 'CONVERSION_EXIT_ALPHA_INPUT'

    exporting

      input  = vbelv

    importing

      output = vbelv.

 

  perform alpha_input changing lifex.

 

  loop at  it_item.

    lt_request-document_type      = vbtyp. "B表示采购订单,A销售订单

    lt_request-document_numb      = vbelv. "参考订单号

    lt_request-document_item      = it_item-posnv. "参考订单项目号

    lt_request-plant              = it_item-werks.

    lt_request-stge_loc           = it_item-lgort.

    lt_request-quantity_sales_uom = it_item-lfimg. "交货数量(可用库存数量不足时数量写不上去)

    lt_request-delivery_date      = sy-datum.

    lt_request-extdelv_no      = lifex. "交货单的外部标识(存放计划单号) chenyl for wangnl 20170518 为了合并开票_20170602放出来了

    lt_request-date               = sy-datum.

    lt_request-time               = sy-uzeit.

    append lt_request.

  endloop.

 

  call function 'RV_DELIVERY_INIT'.

 

  call function 'BAPI_DELIVERYPROCESSING_EXEC'

    tables

      request      = lt_request

      createditems = lt_createditems

      return       = return.

 

*1.此BAPI有BUG,有些错误不会RETURN,所以RETURN为空不一定创建了交货单成功(如销售订单找不到、销售订单已经创建完交货单了),也可能是没有创建

  read table lt_createditems index 1.

  vbeln = lt_createditems-document_numb. "交货单号

  read table return with key type = 'E'.

  if vbeln is not initial and sy-subrc ne 0. "有个bug,库存地点错误时return会返回错误,但是会生成交货单号

    call function 'BAPI_TRANSACTION_COMMIT'

      exporting

        wait = 'X'.

    rtype = 'S'.

    rtmsg = '交货单创建成功'.

 

*写入拆分

    call function 'RV_DELIVERY_INIT'.

*头信息

    is_header_data-deliv_numb     = vbeln. "交货单号

    is_header_control-deliv_numb  = vbeln.

 

*修改原10行项目数量

    loop at it_item where charg is not initial.

      clear lw_item_data.

      lw_item_data-deliv_numb     = vbeln.

      lw_item_data-deliv_item     = sy-tabix * 10.      "原行项目

      lw_item_data-dlv_qty        = it_item-lfimg.

      lw_item_data-dlv_qty_imunit =  it_item-lfimg.

*      lw_item_data-base_uom       = 'TO'.    "基本单位

*      lw_item_data-sales_unit     = 'TO'.    "销售单位

      lw_item_data-fact_unit_nom   = 1.      "销售数量转换成SKU的分子(因子)

      lw_item_data-fact_unit_denom = 1.      "销售数量转换为 SKU 的值(除数)

      lw_item_data-batch = it_item-charg.      "批次

      append lw_item_data to it_item_data .

 

      clear lw_item_control.

      lw_item_control-deliv_numb = vbeln.

      lw_item_control-deliv_item = sy-tabix * 10.       "原行项目

      lw_item_control-chg_delqty = 'X'.      "数量修改标志

      append lw_item_control to it_item_control.

    endloop.

 

    if it_item_data[] is not initial.

      call function 'BAPI_OUTB_DELIVERY_CHANGE'

        exporting

          header_data      = is_header_data

          header_control   = is_header_control

          delivery         = vbeln

        tables

          header_partner   = it_header_partner

          header_deadlines = it_header_deadlines

          item_data        = it_item_data

          item_control     = it_item_control

          return           = et_return

*         ITEM_DATA_SPL    = IT_ITEM_DATA_SPL

        .

      if et_return[] is initial.

        call function 'BAPI_TRANSACTION_COMMIT'

          exporting

            wait = 'X'.

      endif.

 

      loop at et_return where type = 'E'.

        message id  et_return-id

        type   'E'

        number et_return-number

        with   et_return-message_v1

        et_return-message_v2

        et_return-message_v3

        et_return-message_v4

        into   rtmsg.

      endloop.

    endif.

 

*sms

    if lifex is not initial.

      loop at it_item.

        update zsd001_item

        set dn = vbeln zt = '进行中'

        where dn_plan = lifex and dn_posnr = it_item-dn_posnr.

      endloop.

      commit work and wait.

    endif.

    perform alpha_output changing vbeln.

  else.

    clear vbeln.

    call function 'BAPI_TRANSACTION_ROLLBACK'.

    rtype = 'E'.

    rtmsg = '交货单创建失败:'.

    loop at return.

      rtmsg = rtmsg && return-message.

    endloop.

  endif.

 

 

  zfmdatasave2 'R'.

 

endfunction.

 

BAPI_OUTB_DELIVERY_CREATE_STO 参考PO

BAPI_OUTB_DELIVERY_CREATE_SLS 参考SO

参考采购订单创建交货单,可以不传输数量。创建的交货单的数量参考订单的承诺数量而非行项目数量,订单的承诺数量可能是创建订单时的 库存数量

可以整单创建

 

代码

po创建dn "add by cyl 2016/9/13

*判断p17

      select count(*) from ztmm_po_lis2 where ebeln = lisnum and bsart = 'EB'.

      if sy-subrc = 0.

        select single

          ekko~bsart ekko~lifnr ekko~bukrs ekko~inco2

          ekpo~ebelp retpo

          into corresponding fields of ls_ekpo2

          from ekko

          inner join ekpo on ekko~ebeln = ekpo~ebeln

          where ekko~ebeln = lisnum.

 

        split ls_ekpo2-inco2 at '+' into lv_bukrs lv_kunnr lv_type.

        shift lv_kunnr left by 2 places.

 

        if ls_ekpo2-bsart = 'EB' and ls_ekpo2-lifnr = '0000010142'

          and ls_ekpo2-bukrs+0(2) = '23' and ls_ekpo2-bukrs ne '2300' and ls_ekpo2-bukrs ne '2330'

          and lv_bukrs+0(2) = '23' and lv_bukrs ne '2300' and lv_bukrs ne '2330'

          and ( lv_type = '寄售' or lv_type = '样机' )

          and ls_ekpo2-retpo is initial.

          lv_p17 = 'X'.

        endif.

      endif.

 

      if lv_p17 = 'X'.

      call function 'RV_DELIVERY_INIT'.

      select ebeln ebelp

        into corresponding fields of table lt_ekpo

        from ekpo

        where ebeln = lisnum.

 

      loop at lt_ekpo into ls_ekpo.

        ls_bapidlvreftosto-ref_doc  = ls_ekpo-ebeln.

        ls_bapidlvreftosto-ref_item = ls_ekpo-ebelp.

        append ls_bapidlvreftosto to lt_bapidlvreftosto.

      endloop.

 

      call function 'BAPI_OUTB_DELIVERY_CREATE_STO'

        importing

          delivery          = lv_vbeln

        tables

          stock_trans_items = lt_bapidlvreftosto

          return            = lt_return.

 

      if lv_vbeln is not initial.

        call function 'BAPI_TRANSACTION_COMMIT'

          exporting

            wait = 'X'.

        concatenate remark '采购订单' lisnum '创建新的交货单号' lv_vbeln into remark.

        concatenate '采购订单' lisnum '创建新的交货单号' lv_vbeln into ls_logitem-remark .

        ls_logitem-msg_no = ls_logitem-msg_no + 1.

        append ls_logitem.

      else.

        call function 'BAPI_TRANSACTION_ROLLBACK'.

        read table lt_return into ls_return with key type = 'E' id = 'VR' number = '420'. "已经交完货了

        if sy-subrc = 0.

          concatenate remark '采购订单' lisnum '没有创建新的交货单号' into remark.

          concatenate '采购订单' lisnum '没有创建新的交货单号' into ls_logitem-remark .

          ls_logitem-msg_no = ls_logitem-msg_no + 1.

        else.

          text_code = '003'.

          concatenate remark '采购订单' lisnum '创建交货单失败:' into remark.

          concatenate '采购订单' lisnum '创建交货单失败:' into ls_logitem-remark .

          ls_logitem-msg_no = ls_logitem-msg_no + 1.

          loop at lt_return into ls_return where type = 'E' or type = 'A'.

            concatenate remark ls_return-message into remark.

            ls_logitem-remark = ls_return-message.

            ls_logitem-msg_no = ls_logitem-msg_no + 1.

          endloop.

        endif.

      endif.

      endif.

*结束 cyl

 

猜你喜欢

转载自blog.csdn.net/cylcylcylcylwo/article/details/114014976