预制发票——BAPI_INCOMINGINVOICE_PARK

效果:

 

 

有微小差额就能手工调整吧

 

代码:

REPORT zmmr001.

************************************************************************
* Type Pools Definitions          定义类型池
************************************************************************
TYPE-POOLS slis.

************************************************************************
* Tables Definitions
************************************************************************
TABLES: mkpf,mseg.
************************************************************************
* Data Definitions                定义数据
************************************************************************
TYPES: BEGIN OF  ty_data,
         werks TYPE mseg-werks, "工厂
         lifnr TYPE mseg-lifnr, "供应商
         sortl TYPE lfa1-sortl, "供应商简称
         budat TYPE mkpf-budat, "过账日期
         mjahr TYPE mkpf-mjahr, "物料凭证年度
         mblnr TYPE mkpf-mblnr, "物料凭证号码
         zeile TYPE mseg-zeile, "物料凭证项目
         lfbja TYPE mseg-lfbja, "参考凭证年度
         lfbnr TYPE mseg-lfbnr, "参考凭证的凭证号
         lfpos TYPE mseg-lfpos, "参考凭证项目
         bwart TYPE mseg-bwart, "移动类型
         shkzg TYPE mseg-shkzg, "借贷项
         ebeln TYPE mseg-ebeln, "采购订单
         ebelp TYPE mseg-ebelp, "采购订单项目
         matnr TYPE mseg-matnr, "料号
         erfmg TYPE mseg-erfmg, "数量(订购单位)
         erfme TYPE mseg-erfme, "订购单位
         menge TYPE mseg-menge, "数量(基本单位)
         meins TYPE mseg-meins, "基本单位
         mwskz TYPE ekpo-mwskz, "税码
         kbetr TYPE konp-kbetr, "税率
         netpr TYPE ekpo-netpr, "单价
         waers TYPE ekko-waers, "价格单位
         peinh TYPE ekpo-peinh, "
         price  TYPE ekpo-netpr, "不含税金额
         price2 TYPE ekpo-netpr, "含税金额
       END OF ty_data,
       BEGIN OF ty_po,
         ebeln TYPE mseg-ebeln, "采购订单
         ebelp TYPE mseg-ebelp, "采购订单项目
         mwskz TYPE ekpo-mwskz, "税码
         kbetr TYPE konp-kbetr, "税率
         netpr TYPE ekpo-netpr, "净价
         waers TYPE ekko-waers, "价格单位
         peinh TYPE ekpo-peinh, "
       END OF ty_po.

DATA: gt_data TYPE TABLE OF ty_data,
      gt_po   TYPE TABLE OF ty_po.

DATA: gs_layout   TYPE lvc_s_layo, "布局
      gt_fieldcat TYPE lvc_t_fcat. "字段

************************************************************************
* Includes Module                 包含模块
************************************************************************

************************************************************************
* Selection Screen                选择屏幕
************************************************************************
PARAMETERS: p_werks LIKE mseg-werks DEFAULT '2000' OBLIGATORY,
            p_lifnr LIKE mseg-lifnr DEFAULT 'VCGC0009' OBLIGATORY.

SELECT-OPTIONS: s_budat FOR mkpf-budat,
                s_bwart FOR mseg-bwart.

************************************************************************
* Initialization                  初始化事件
************************************************************************
INITIALIZATION.
  PERFORM frm_screen_init.
************************************************************************
* At Selection Screen             PAI事件
************************************************************************
AT SELECTION-SCREEN.

************************************************************************
* At Selection Screen Output      PBO事件
************************************************************************
AT SELECTION-SCREEN OUTPUT.

************************************************************************
* Report Format                   报表格式
************************************************************************
TOP-OF-PAGE.

END-OF-PAGE.

************************************************************************
* Main Process                    主要逻辑
************************************************************************
START-OF-SELECTION.

  "获取数据
  PERFORM frm_get_data.
  "显示数据
  PERFORM frm_display_data.

END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .

  DATA: ls_data TYPE ty_data,
        ls_po   TYPE ty_po.

  "进料明细
  SELECT lfa1~sortl
         mkpf~budat
         mkpf~mjahr
         mkpf~mblnr
         mseg~werks
         mseg~lifnr
         mseg~zeile
         mseg~lfbja
         mseg~lfbnr
         mseg~lfpos
         mseg~bwart
         mseg~shkzg
         mseg~ebeln
         mseg~ebelp
         mseg~matnr
         mseg~erfmg
         mseg~erfme
         mseg~menge
         mseg~meins
         INTO CORRESPONDING FIELDS OF TABLE gt_data
         FROM mkpf
         INNER JOIN mseg ON mkpf~mjahr = mseg~mjahr AND mkpf~mblnr = mseg~mblnr
         INNER JOIN lfa1 ON mseg~lifnr = lfa1~lifnr
         WHERE mseg~werks = p_werks
         AND mseg~lifnr = p_lifnr
         AND mseg~bwart IN s_bwart
         AND mseg~sobkz NE 'K'     "非寄售
         AND mkpf~budat IN s_budat.

  "采购订单
  SELECT ekpo~ebeln,
         ekpo~ebelp,
         ekpo~mwskz, "税码
         ekpo~netpr, "净价
         ekpo~peinh, "
         ekko~waers, "币别
         konp~kbetr  "税率
         FROM ekpo
         INNER JOIN @gt_data AS a ON ekpo~ebeln = a~ebeln
         AND ekpo~ebelp = a~ebelp
         INNER JOIN ekko ON ekko~ebeln = ekpo~ebeln
         INNER JOIN a003 ON ekpo~mwskz = a003~mwskz
         INNER JOIN konp ON konp~knumh = a003~knumh
         WHERE a003~aland = 'CN'
         AND a003~kschl = 'MWVS'
         INTO CORRESPONDING FIELDS OF TABLE @gt_po.

  SORT: gt_po BY ebeln ebelp.

  LOOP AT gt_data INTO ls_data.

    READ TABLE gt_po INTO ls_po WITH KEY ebeln = ls_data-ebeln
         ebelp = ls_data-ebelp
         BINARY SEARCH.
    IF sy-subrc = 0.

      ls_po-kbetr = ls_po-kbetr / 10.

      MOVE: ls_po-mwskz TO ls_data-mwskz,
            ls_po-kbetr TO ls_data-kbetr,
            ls_po-netpr TO ls_data-netpr,
            ls_po-waers TO ls_data-waers,
            ls_po-peinh TO ls_data-peinh.
    ENDIF.


    "不含税金额
    ls_data-price = ls_data-netpr / ls_data-peinh * ls_data-erfmg.

    "含税金额
    ls_data-price2 = ls_data-netpr / ls_data-peinh * ls_data-erfmg * ( ( 100 + ls_po-kbetr ) / 100 ).

    IF ls_data-shkzg = 'H'.
      ls_data-price = ls_data-price * -1.
      ls_data-price2 = ls_data-price2 * -1.
    ENDIF.

    MODIFY gt_data FROM ls_data.
  ENDLOOP.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_data .

  "栏位最适宽度
  gs_layout-cwidth_opt = 'X'.

  "ALV条纹
  gs_layout-zebra = 'X'.

  "构建ALV的栏位
  PERFORM frm_create_field.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid       "当前程序名
      is_layout_lvc            = gs_layout      "Layout
      it_fieldcat_lvc          = gt_fieldcat    "Fieldcat
      i_save                   = 'A'
      i_callback_pf_status_set = 'FRM_STATUS_SET'    "状态栏
      i_callback_user_command  = 'FRM_USER_COMMAND' "按钮操作
    TABLES
      t_outtab                 = gt_data
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_FIELD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create_field .

  DATA: ls_fieldcat TYPE lvc_s_fcat,
        lv_count    TYPE i.

  DEFINE fieldcat.
    ADD 1 TO lv_count.

    "栏位显示顺序
    ls_fieldcat-col_pos    = lv_count.
    "内表栏位
    ls_fieldcat-fieldname  = &1.
    "参考栏位
    ls_fieldcat-ref_field = &2.
    "参考表
    ls_fieldcat-ref_table = &3.
    "单位
    ls_fieldcat-qfieldname = &4.
    "栏位标题(长文或中等文或短文)
    ls_fieldcat-scrtext_s = ls_fieldcat-scrtext_m =
    ls_fieldcat-scrtext_l = &5.
    "显示长文或中等文或短文
    ls_fieldcat-colddictxt = &6.

    APPEND ls_fieldcat TO gt_fieldcat.
    CLEAR ls_fieldcat.
  END-OF-DEFINITION.

  fieldcat 'WERKS' 'WERKS' 'MSEG' '' '' ''.
  fieldcat 'LIFNR' 'LIFNR' 'MSEG' '' '' ''.
  fieldcat 'SORTL' 'SORTL' 'LFA1' '' '供应商简称' 'L'.
  fieldcat 'BUDAT' 'BUDAT' 'MKPF' '' '' ''.
  fieldcat 'MJAHR' 'MJAHR' 'MKPF' '' '' ''.
  fieldcat 'MBLNR' 'MBLNR' 'MKPF' '' '' ''.
  fieldcat 'ZEILE' 'ZEILE' 'MSEG' '' '' ''.
  fieldcat 'LFBJA' 'LFBJA' 'MSEG' '' '' ''.
  fieldcat 'LFBNR' 'LFBNR' 'MSEG' '' '' ''.
  fieldcat 'LFPOS' 'LFPOS' 'MSEG' '' '' ''.
  fieldcat 'BWART' 'BWART' 'MSEG' '' '' ''.
  fieldcat 'SHKZG' 'SHKZG' 'MSEG' '' '' ''.
  fieldcat 'EBELN' 'EBELN' 'MSEG' '' '' ''.
  fieldcat 'EBELP' 'EBELP' 'MSEG' '' '' ''.
  fieldcat 'MATNR' 'MATNR' 'MSEG' '' '' ''.
  fieldcat 'ERFMG' 'ERFMG' 'MSEG' 'ERFME' '' ''.
  fieldcat 'ERFME' 'ERFME' 'MSEG' '' '' ''.
  fieldcat 'MWSKZ' 'MWSKZ' 'EKPO' '' '' ''.
  fieldcat 'KBETR' 'KBETR' 'KONP' '' '税率' 'L'.
  fieldcat 'NETPR' 'NETPR' 'EKPO' 'WAERS' '' ''.
  fieldcat 'WAERS' 'WAERS' 'EKKO' '' '' ''.
  fieldcat 'PEINH' 'PEINH' 'EKPO' '' '' ''.
  fieldcat 'MENGE' 'MENGE' 'MSEG' 'MEINS' '' ''.
  fieldcat 'MEINS' 'MEINS' 'MSEG' '' '' ''.
  fieldcat 'PRICE'  '' '' 'WAERS' '不含税金额' 'L'.
  fieldcat 'PRICE2' '' '' 'WAERS' '含税金额' 'L'.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_SCREEN_INIT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_screen_init .

  s_bwart-sign = 'I'.
  s_bwart-option = 'EQ'.
  s_bwart-low = '101'. "采购单收货至未限制库存
  APPEND s_bwart.

  s_bwart-sign = 'I'.
  s_bwart-option = 'EQ'.
  s_bwart-low = '102'. "冲销采购单收货至未限制库存
  APPEND s_bwart.

  s_bwart-sign = 'I'.
  s_bwart-option = 'EQ'.
  s_bwart-low = '105'. "IQC移量至未限制库存
  APPEND s_bwart.

  s_bwart-sign = 'I'.
  s_bwart-option = 'EQ'.
  s_bwart-low = '106'. "冲销IQC移量至未限制库存
  APPEND s_bwart.

  s_bwart-sign = 'I'.
  s_bwart-option = 'EQ'.
  s_bwart-low = '161'. "退货采购单退货
  APPEND s_bwart.

  s_bwart-sign = 'I'.
  s_bwart-option = 'EQ'.
  s_bwart-low = '162'. "冲销退货采购单退货
  APPEND s_bwart.

  s_bwart-sign = 'I'.
  s_bwart-option = 'EQ'.
  s_bwart-low = '122'. "采购单收料至未限制库存的退货(仓退)
  APPEND s_bwart.

  s_bwart-sign = 'I'.
  s_bwart-option = 'EQ'.
  s_bwart-low = '123'. "冲销采购单收料至未限制库存的退货
  APPEND s_bwart.

ENDFORM.

*&---------------------------------------------------------------------*
*&  FORM  FRM_PF_STATUS
*&---------------------------------------------------------------------*
*&                             GUI状态栏
*&---------------------------------------------------------------------*
FORM frm_status_set USING it_extab TYPE slis_t_extab.
  SET PF-STATUS 'PF_001'.
ENDFORM.

*&---------------------------------------------------------------------*
*&  FORM  FRM_PF_STATUS
*&---------------------------------------------------------------------*
*&                             按钮操作
*&---------------------------------------------------------------------*
FORM frm_user_command USING iv_ucomm LIKE sy-ucomm
                            is_selfield TYPE slis_selfield.
  CASE iv_ucomm.
    WHEN '&MIR7'.
      PERFORM frm_invoice_pack.
  ENDCASE.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_INVOICE_PACK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_invoice_pack .

  DATA: lt_data   TYPE TABLE OF ty_data,
        ls_data   TYPE ty_data,
        lv_row    TYPE i,
        lv_amount TYPE bapi_rmwwr.

  DATA: ls_sklin  TYPE sklin,
        ls_header TYPE bapi_incinv_create_header,
        lt_item   TYPE TABLE OF bapi_incinv_create_item,
        ls_item   TYPE bapi_incinv_create_item,
        lt_return TYPE TABLE OF bapiret2,
        lv_belnr  TYPE rbkp-belnr,
        lv_gjahr  TYPE rbkp-gjahr.

  MODIFY gt_data FROM ls_data TRANSPORTING mjahr mblnr zeile budat WHERE mblnr NE ''.

  "1次103多次105合并
  LOOP AT gt_data INTO ls_data.
    "含税总金额
    ADD ls_data-price2 TO lv_amount.
    COLLECT ls_data INTO lt_data.
    CLEAR ls_data.
  ENDLOOP.

"过账标识 ls_header-invoice_ind = 'X'. "文件类型 ls_header-doc_type = 'RE'. "发票日期 ls_header-doc_date = '20221015'. "过账日期 ls_header-pstng_date = '20221015'. "参考号码 ls_header-ref_doc_no = ''. "公司 ls_header-comp_code = '2000'. "发票方 ls_header-diff_inv = p_lifnr. "币别 SELECT SINGLE waers INTO ls_header-currency FROM lfm1 WHERE lifnr = p_lifnr. "金额(含税总金额) ls_header-gross_amount = lv_amount. "自动计算税额 ls_header-calc_tax_ind = 'X'. "付款方式、付款冻结 SELECT SINGLE zwels zahls INTO ( ls_header-pymt_meth,ls_header-pmnt_block ) FROM lfb1 WHERE lifnr = p_lifnr AND bukrs = '2000'. "基准日期 CALL FUNCTION 'FI_FIND_PAYMENT_CONDITIONS' EXPORTING i_zterm = ls_header-pmnttrms i_bldat = ls_header-doc_date i_budat = ls_header-pstng_date IMPORTING e_zfbdt = ls_header-bline_date e_sklin = ls_sklin. "天数 ls_header-dsct_days1 = ls_sklin-ztag1. "抬头文本 ls_header-header_txt = ''. LOOP AT lt_data INTO ls_data. ADD 1 TO lv_row. "项目 ls_item-invoice_doc_item = lv_row. "采购订单 ls_item-po_number = ls_data-ebeln. "采购订单项目 ls_item-po_item = ls_data-ebelp. "物料凭证 ls_item-ref_doc = ls_data-lfbnr. "物料凭证年度 ls_item-ref_doc_year = ls_data-lfbja. "物料凭证项目 ls_item-ref_doc_it = ls_data-lfpos. "税码 ls_item-tax_code = ls_data-mwskz. "金额(项目为不含税金额) ls_item-item_amount = ls_data-price. "数量 ls_item-quantity = ls_data-erfmg. "订购单位 ls_item-po_unit = ls_data-erfme. APPEND ls_item TO lt_item. CLEAR ls_item. ENDLOOP. CALL FUNCTION 'BAPI_INCOMINGINVOICE_PARK' EXPORTING headerdata = ls_header IMPORTING invoicedocnumber = lv_belnr fiscalyear = lv_gjahr TABLES itemdata = lt_item return = lt_return. READ TABLE lt_return WITH KEY type = 'E' TRANSPORTING NO FIELDS. IF sy-subrc = 0. ROLLBACK WORK. ELSE. COMMIT WORK AND WAIT. ENDIF. "M8 429 物料凭证使用103的凭证不是105的凭证 "M8 321 一次103收货对应多次105需要合并 cl_demo_output=>write( lt_return ). cl_demo_output=>write( lv_belnr ). cl_demo_output=>display( ). ENDFORM.

 

posted @ 2022-11-14 16:57  鲸与海  阅读(822)  评论(0编辑  收藏  举报