预制发票——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.
落霞与孤鹜齐飞,秋水共长天一色