BAPI

预制发票:BAPI_INCOMINGINVOICE_PARK

复制代码
   DATA: ls_header     TYPE bapi_incinv_create_header,
        lt_itemdata   TYPE TABLE OF bapi_incinv_create_item,
        ls_itemdata   TYPE bapi_incinv_create_item,

        lt_taxdata    TYPE TABLE OF bapi_incinv_create_tax,
        ls_taxdata    TYPE bapi_incinv_create_tax,

        bapi_return_t TYPE TABLE OF bapiret2,
        bapi_return_s TYPE bapiret2,
        lv_belnr      TYPE belnr_d,
        lv_gjahr      TYPE gjahr,
        lv_rblgp      TYPE rblgp,
        lv_meins      LIKE ekpo-meins,
        lt_save TYPE TABLE OF znymmt00620,
        ls_save TYPE znymmt00620.


  CLEAR: ls_header, lt_itemdata, lt_taxdata, bapi_return_t,lv_rblgp,
         lv_meins,ls_save,lt_save,ls_tmp,lt_tmp.

  LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>).
    lv_rblgp = lv_rblgp + 10.
*   如果是第一个行项目,填充表头
    IF lv_rblgp = '10'.
      ls_header-invoice_ind = 'X'.
      ls_header-doc_type    = 'RE'.
      ls_header-doc_date    = <fs_alv>-bldat.
      ls_header-ref_doc_no  = <fs_alv>-xblnr."参考凭证号
      ls_header-pstng_date  = <fs_alv>-budat.
      ls_header-comp_code   = <fs_alv>-bukrs.
      ls_header-bline_date  = <fs_alv>-zfbdt.

*   读取供应商
    SELECT SINGLE lifnr INTO ls_header-diff_inv  FROM ekko WHERE ebeln = <fs_alv>-ebeln.
*   抬头文本
      IF <fs_alv>-ztext IS INITIAL.
        ls_header-header_txt = 'MIS发票预制'.
      ELSE.
        ls_header-header_txt = <fs_alv>-ztext.
      ENDIF.
*   读取币别
      SELECT SINGLE waers  INTO ls_header-currency FROM t001 WHERE bukrs = <fs_alv>-bukrs.
    ENDIF.

*   总金额
*    ls_header-gross_amount =  ls_header-gross_amount + <fs_alv>-wrbtr.
    ls_header-gross_amount =  <fs_alv>-wrbtr.
*   行项目
    ls_itemdata-invoice_doc_item = lv_rblgp.  "发票行项目号
    ls_itemdata-po_number        = <fs_alv>-ebeln.
    ls_itemdata-po_item          = <fs_alv>-ebelp.

*    ls_itemdata-item_amount      = <fs_alv>-wrbtr1.  "changed by gxsk_guoyp 20250106
    ls_itemdata-quantity         = <fs_alv>-menge.
*   单位
    SELECT SINGLE meins INTO ls_itemdata-po_unit FROM ekpo WHERE ebeln = <fs_alv>-ebeln AND ebelp = <fs_alv>-ebelp.
    ls_itemdata-po_unit_iso   = ls_itemdata-po_unit.
    ls_itemdata-tax_code         = <fs_alv>-mwskz1.
    APPEND  ls_itemdata TO lt_itemdata.
    CLEAR: ls_itemdata.
*&-----  税额
    ls_taxdata-tax_code     = <fs_alv>-mwskz1.
    ls_taxdata-tax_amount   = <fs_alv>-wmwst.
    APPEND ls_taxdata TO lt_taxdata.

**&   处理税码
*  DATA: ws_taxdata LIKE ls_taxdata.
*  SORT lt_taxdata BY tax_code.
*  CLEAR ws_taxdata.
*  LOOP AT lt_taxdata INTO ls_taxdata.
*    ws_taxdata-tax_code  = ls_taxdata-tax_code.
*    ws_taxdata-tax_amount = ws_taxdata-tax_amount + ls_taxdata-tax_amount.
*    AT END OF tax_code.
*      MODIFY lt_taxdata FROM ws_taxdata TRANSPORTING tax_amount
*                        WHERE tax_code = ws_taxdata-tax_code.
*      CLEAR ws_taxdata.
*    ENDAT.
*  ENDLOOP.
  DELETE ADJACENT DUPLICATES FROM lt_taxdata COMPARING tax_code.

  MOVE-CORRESPONDING <fs_alv> TO ls_save.
  ls_save-i_date = sy-datum.
  ls_save-i_uzeit = sy-uzeit.
  ls_save-uname = sy-uname.
  APPEND ls_save TO lt_save.
  AT END OF HBFLG.
*  调用BAPI 生成预制凭证
  CLEAR:lv_belnr,lv_gjahr.
  CALL FUNCTION 'BAPI_INCOMINGINVOICE_PARK'
    EXPORTING
      headerdata       = ls_header
*     ADDRESSDATA      =
    IMPORTING
      invoicedocnumber = lv_belnr
      fiscalyear       = lv_gjahr
    TABLES
      itemdata         = lt_itemdata
*     ACCOUNTINGDATA   =
*     GLACCOUNTDATA    =
*     MATERIALDATA     =
      taxdata          = lt_taxdata
*     WITHTAXDATA      =
*     VENDORITEMSPLITDATA       =
      return           = bapi_return_t
*     EXTENSIONIN      =
*     TM_ITEMDATA      =
    .
  READ TABLE bapi_return_t INTO bapi_return_s WITH KEY type = 'E'.
  IF sy-subrc = 0.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    <fs_alv>-status = icon_red_light.
    LOOP AT bapi_return_t INTO bapi_return_s WHERE type = 'E'.
      CONCATENATE <fs_alv>-msg '/' bapi_return_s-message INTO <fs_alv>-msg.
    ENDLOOP.
  ELSE.
    <fs_alv>-status = icon_green_light.
    <fs_alv>-msg = '发票创建成功'.
   CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
       EXPORTING
         WAIT          = 'X'.
    WAIT UP TO 1 SECONDS.
    <fs_alv>-belnr = lv_belnr.
    <fs_alv>-gjahr = lv_gjahr.
  ENDIF.
    MOVE-CORRESPONDING <fs_alv> TO ls_tmp.
    APPEND ls_tmp TO lt_tmp.
    CLEAR:ls_tmp,ls_header,ls_itemdata,lt_itemdata,ls_taxdata,lt_taxdata,
          bapi_return_t,lv_belnr,lv_rblgp.
  ENDAT.

  ENDLOOP.
View Code
复制代码

发票过账:BAPI_INCOMINGINVOICE_POST

复制代码
 DATA:message   TYPE c LENGTH 200.
  DATA:lv_awkey  TYPE bkpf-awkey.
  DATA:lt_return LIKE TABLE OF bapiret2 WITH HEADER LINE.
  DATA:lt_save TYPE TABLE OF znymmt00620,
       ls_save TYPE znymmt00620.

  CLEAR:lt_tmp,ls_tmp.

  SORT gt_alv BY belnr.
  LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>) WHERE status = icon_green_light.
    AT END OF belnr.

   CALL FUNCTION 'BAPI_INCOMINGINVOICE_POST'
    EXPORTING
      invoicedocnumber = <fs_alv>-belnr
      fiscalyear       = <fs_alv>-gjahr
    TABLES
      return           = lt_return.
  CLEAR:message.
  LOOP AT lt_return WHERE type = 'A' OR type = 'E' .
    CONCATENATE message lt_return-message INTO message SEPARATED BY  '/'.
  ENDLOOP.
  IF  sy-subrc <> '0'.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.

    CLEAR lv_awkey.
    CONCATENATE <fs_alv>-belnr <fs_alv>-gjahr INTO lv_awkey.
    SELECT SINGLE belnr
      INTO @DATA(lv_belnr)
      FROM bkpf
      WHERE awkey = @lv_awkey.
    CONCATENATE '凭证:' lv_belnr '创建成功' INTO message.
    <fs_alv>-status = icon_green_light.
    <fs_alv>-msg = message.
    <fs_alv>-belnr1 = lv_belnr.
  ELSE.
    <fs_alv>-status = icon_red_light.
    <fs_alv>-msg = message.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ENDIF.
View Code
复制代码

 

posted @   年轻的小菜鸟  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示