采购发票差异清单

15 篇文章 0 订阅

*&---------------------------------------------------------------------*
*& Report ZFIR0046
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zfir0046.


INCLUDE zfir0046_top.
INCLUDE zfir0046_sel.
INCLUDE zfir0046_f01.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_ymonth.
  PERFORM frm_ymonth_helpf4.

START-OF-SELECTION.
  IF p5 = 'X'.
    PERFORM frm_get_header_data.
    PERFORM frm_display_alv TABLES gt_header.
  ELSEIF p6 = 'X'.
    PERFORM frm_get_item_data.
    PERFORM frm_display_alv TABLES gt_item.
  ENDIF.
*&---------------------------------------------------------------------*
*& 包含               ZFIR0046_TOP
*&---------------------------------------------------------------------*
TABLES:sscrfields,icon,rlgrap.
DATA:gt_fieldcat TYPE lvc_t_fcat,
     gw_fieldcat TYPE lvc_s_fcat,
     gv_repid    TYPE sy-repid,
     gs_layout   TYPE lvc_s_layo,
     gt_sort     TYPE lvc_t_sort,
     gw_sort     TYPE lvc_s_sort.

TYPES:BEGIN OF tys_header,
        bukrs             TYPE rbkp-bukrs, "下单公司
        lifnr             TYPE rbkp-lifnr,  "供应商
        lifnr_txt         TYPE but000-name_org1, "供应商名称
        gjahr             TYPE rbkp-gjahr,  "会计年度
        monat             TYPE rbkp-monat, "期间
        belnr_rbkp        TYPE rbkp-belnr, "发票凭证
        bktxt             TYPE rbkp-bktxt, "发票抬头文本
        belnr_bkpf        TYPE belnr_d, "发票会计凭证
        waers             TYPE waers, "凭证货币
        ukurs	            TYPE ukurs_curr, "汇率
        fpzgzjeyb         TYPE dmbtr, "发票暂估总金额原币
        fpzgzjebb         TYPE dmbtr, "发票暂估总金额本币
        tzybje            TYPE dmbtr, "调整原币金额
        tzbbje            TYPE dmbtr, "调整本币金额
        mwskz1            TYPE rbkp-mwskz1, ""税码
        sjybje            TYPE dmbtr, "税金原币金额
        sjbbje            TYPE dmbtr, "税金本币金额
        zfpybje           TYPE dmbtr, "总发票原币金额
        zfpbbje           TYPE dmbtr, "总发票本币金额
        shybje            TYPE dmbtr, "收货原币金额
        shbbje            TYPE dmbtr, "收货本币金额
        shhfpcyyb         TYPE dmbtr, "收货和发票差异原币
        shhfpcybb         TYPE dmbtr, "收货和发票差异本币
        xdgsshzgybje      TYPE dmbtr, "下单公司收货暂估原币金额
        xdgsshbb          TYPE waers, "下单公司收货币别
        xdgsshzgbbje      TYPE dmbtr, "下单公司收货暂估本币金额
        xdgsshzghfpzgybcy TYPE dmbtr, "下单公司收货暂估和发票暂估原币差异
        xdgsshzghfpzgbbcy TYPE dmbtr, "下单公司收货暂估和发票暂估本币差异
        sel(1),
      END OF tys_header.

TYPES:BEGIN OF tys_item,
        bukrs           TYPE rbkp-bukrs,   "下单公司
        lifnr           TYPE rbkp-lifnr,   "供应商
        lifnr_txt       TYPE but000-name_org1,  "供应商名称
        gjahr           TYPE rbkp-gjahr,   "会计年度
        monat           TYPE rbkp-monat,   "期间
        belnr_rbkp      TYPE rbkp-belnr,   "发票凭证
        bktxt           TYPE rbkp-bktxt,   "发票抬头文本
        budat           TYPE rbkp-budat,
        buzei_rbkp      TYPE rseg-buzei, "发票项目
        gjahr_bkpf      TYPE bkpf-gjahr, "年度
        bukrs_bkpf      TYPE bkpf-bukrs, "公司代码
        belnr_bkpf      TYPE bkpf-belnr, "发票会计凭证
        ebeln           TYPE rseg-ebeln, "采购凭证
        ebelp           TYPE rseg-ebelp, "项目
        matnr           TYPE rseg-matnr, "物料
        menge           TYPE rseg-menge, "数量
        bstme           TYPE rseg-bstme, "订单单位
        wrbtr           TYPE dmbtr, "发票校验原币金额
        waers           TYPE waers, "发票币别
        dmbtr           TYPE dmbtr, "发票校验本币金额
        shkzg           TYPE rseg-shkzg, "借/贷标识
        mwskz           TYPE rseg-mwskz, "税码
        werks           TYPE rseg-werks, "收货工厂
        lfbnr           TYPE rseg-lfbnr, "收货物料凭证
        lfgja           TYPE rseg-lfgja,
        lfpos           TYPE rseg-lfpos, "去除前导0" "物料凭证项目
        shybje          TYPE dmbtr, "收货原币金额
        shbb            TYPE waers, "收货币别
        shbbje          TYPE dmbtr, "收货本币金额
        shhfpybcy       TYPE dmbtr, "收货和发票原币差异
        shhfpbbcy       TYPE dmbtr, "收货和发票本币差异
        xdgsshpz        TYPE belnr_d, "下单公司收货凭证
        xdgsshybje      TYPE dmbtr, "下单公司收货原币金额
        xdgssjbb        TYPE waers, "下单公司收货币别
        xdgsshbbje      TYPE dmbtr, "下单公司收货本币金额
        shgchxdgsshybcy TYPE dmbtr, "收货工厂和下单公司收货原币差异
        shgchxdgsshbbcy TYPE dmbtr, "收货工厂和下单公司收货收货本币差异
        fpqzpz          TYPE belnr_d, "发票清账凭证
        fpqzrq          TYPE budat, "发票清账日期
        sel(1),
      END OF tys_item.

DATA:gt_header TYPE TABLE OF tys_header,
     gw_header LIKE LINE OF gt_header,
     gt_item   TYPE TABLE OF tys_item,
     gw_item   LIKE LINE OF gt_item.
*&---------------------------------------------------------------------*
*& 包含               ZFIR0046_SEL
*&---------------------------------------------------------------------*
TABLES:isellist,bkpf,rbkp.
SELECTION-SCREEN:BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  PARAMETERS:p_ymonth TYPE isellist-month OBLIGATORY DEFAULT sy-datum+0(6),
             p_bukrs  TYPE bkpf-bukrs OBLIGATORY DEFAULT '1000'.
  SELECT-OPTIONS:s_belnr FOR rbkp-belnr.
SELECTION-SCREEN:END OF BLOCK b1.

SELECTION-SCREEN:BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
  PARAMETERS:p1 RADIOBUTTON GROUP g1 DEFAULT 'X' USER-COMMAND uex, "一般发票   勾选则显示收货工厂属于公司代码的数据
             p2 RADIOBUTTON GROUP g1. "跨公司采购发票   勾选则显示收货工厂不属于公司代码的数据
SELECTION-SCREEN:END OF BLOCK b2.

SELECTION-SCREEN:BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-003.
  PARAMETERS:p3 AS CHECKBOX DEFAULT '', "预制发票    勾选取查询公司+年+期间在表RBKP中=查询年度GJAHR+期间MONAT+公司代码BUKRS对应的冲销者STBLG=空+发票凭证状态RBSTAT=A的发票号;
             p4 AS CHECKBOX DEFAULT ''. "过账发票    勾选取查询公司+年+期间在表RBKP中=查询年度GJAHR+期间MONAT+公司代码BUKRS对应的冲销者STBLG=空+发票凭证状态RBSTAT=5的发票号;
SELECTION-SCREEN:END OF BLOCK b3.

SELECTION-SCREEN:BEGIN OF BLOCK b4 WITH FRAME TITLE TEXT-004.
  PARAMETERS:p5 RADIOBUTTON GROUP g2 DEFAULT 'X' USER-COMMAND uex2,
             p6 RADIOBUTTON GROUP g2.
SELECTION-SCREEN:END OF BLOCK b4.
*&---------------------------------------------------------------------*
*& 包含               ZFIR0046_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_ymonth_HELPF4
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_ymonth_helpf4 .
  CALL FUNCTION 'POPUP_TO_SELECT_MONTH'
    EXPORTING
      actual_month   = sy-datum+0(6)
*     FACTORY_CALENDAR                 = ' '
*     HOLIDAY_CALENDAR                 = ' '
*     LANGUAGE       = SY-LANGU
*     START_COLUMN   = 8
*     START_ROW      = 5
    IMPORTING
      selected_month = p_ymonth
*     RETURN_CODE    =
*   EXCEPTIONS
*     FACTORY_CALENDAR_NOT_FOUND       = 1
*     HOLIDAY_CALENDAR_NOT_FOUND       = 2
*     MONTH_NOT_FOUND                  = 3
*     OTHERS         = 4
    .
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_header_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_header_data.
  DATA:lt_where TYPE TABLE OF edpline.
  DATA:lr_bukrs TYPE RANGE OF t001-bukrs .
  DATA:lr_hkont TYPE RANGE OF skat-saknr.
  TYPES:BEGIN OF tys_bseg,
          bukrs TYPE bukrs,
          gjahr TYPE gjahr,
          belnr TYPE belnr_d,
          dmbtr TYPE dmbtr,
          wrbtr TYPE dmbtr,
        END OF tys_bseg.

  TYPES:BEGIN OF tys_xdgs,
          mjahr TYPE mseg-mjahr,
          mblnr TYPE mseg-mblnr,
          zeile TYPE mseg-zeile,
          dmbtr TYPE dmbtr,
          wrbtr TYPE dmbtr,
          waers TYPE waers,
        END OF tys_xdgs.

  DEFINE def_collect_data.
    &1-bukrs = &2-bukrs.
    &1-gjahr = &2-gjahr.
    &1-belnr = &2-belnr.
    IF &2-shkzg = 'H'.
     &1-dmbtr = &2-dmbtr * -1.
     &1-wrbtr = &2-wrbtr * -1.
    ELSE.
     &1-dmbtr = &2-dmbtr.
     &1-wrbtr = &2-wrbtr.
    ENDIF.
    COLLECT &1 INTO &3.
  END-OF-DEFINITION.

  DEFINE def_collect_jf_data.
    &1-bukrs = &2-bukrs.
    &1-gjahr = &2-gjahr.
    &1-belnr = &2-belnr.
    IF &2-shkzg = 'S'.
     &1-dmbtr = &2-dmbtr * -1.
     &1-wrbtr = &2-wrbtr * -1.
    ELSE.
     &1-dmbtr = &2-dmbtr.
     &1-wrbtr = &2-wrbtr.
    ENDIF.
    COLLECT &1 INTO &3.
  END-OF-DEFINITION.

  DATA:lt_bseg_fpzg  TYPE TABLE OF tys_bseg, "发票暂估总金额
       lw_bseg_fpzg  LIKE LINE OF lt_bseg_fpzg,
       lt_bseg_tzje  TYPE TABLE OF tys_bseg, "调整金额
       lw_bseg_tzje  LIKE LINE OF lt_bseg_tzje,
       lt_bseg_sjje  TYPE TABLE OF tys_bseg, "税金金额
       lw_bseg_sjje  LIKE LINE OF lt_bseg_sjje,
       lt_bseg_zfpje TYPE TABLE OF tys_bseg, "总发票金额
       lw_bseg_zfpje LIKE LINE OF lt_bseg_zfpje,
       lt_bseg_shje  TYPE TABLE OF tys_bseg, "收货金额
       lw_bseg_shje  LIKE LINE OF lt_bseg_shje.
  DATA:lt_xdgs TYPE TABLE OF tys_xdgs,
       lw_xdgs LIKE LINE OF lt_xdgs.

  DATA:lv_wrbtr TYPE wrbtr,
       lv_waers TYPE waers,
       lv_dmbtr TYPE dmbtr.

  TYPES:BEGIN OF tys_curr,
          gjahr TYPE gjahr,
          monat TYPE monat,
          fcurr TYPE tcurr-fcurr,
          tcurr TYPE tcurr-tcurr,
          gdatu TYPE char10,
          ukurs TYPE tcurr-ukurs,
        END OF tys_curr.

  DATA:lt_curr TYPE TABLE OF tys_curr.
  DATA:lv_date TYPE char10.

  TYPES:BEGIN OF tys_sh,
          lfbnr	TYPE lfbnr,
          lfgja	TYPE lfgja,
          lfpos	TYPE lfpos,
          dmbtr TYPE dmbtr,
          wrbtr TYPE dmbtr,
        END OF tys_sh.

  DATA:lt_sh       TYPE TABLE OF tys_sh,
       lw_sh       LIKE LINE OF  lt_sh,
       lt_sh_exist TYPE TABLE OF tys_sh,
       lw_sh_exist LIKE LINE OF  lt_sh_exist.

  DATA:BEGIN OF lt_sh_hz OCCURS 0,
         belnr_rbkp TYPE rbkp-belnr,
         gjahr      TYPE rbkp-gjahr,
         dmbtr      TYPE dmbtr,
         wrbtr      TYPE dmbtr,
       END OF lt_sh_hz.

  APPEND VALUE #( sign = 'I' option = 'EQ' low = p_bukrs ) TO lr_bukrs.

  SELECT SINGLE waers INTO @DATA(lv_waers_local) FROM t001 WHERE bukrs IN @lr_bukrs.

  APPEND VALUE #( sign = 'I' option = 'EQ' low = '2202010100' ) TO lr_hkont.
  APPEND VALUE #( sign = 'I' option = 'EQ' low = '2221020202' ) TO lr_hkont.
  APPEND VALUE #( sign = 'I' option = 'EQ' low = '2202010200' ) TO lr_hkont.

  IF p3 = 'X'.
    "勾选取查询公司+年+期间在表RBKP中=查询年度GJAHR+期间MONAT+公司代码BUKRS对应的冲销者STBLG=空+发票凭证状态RBSTAT=A的发票号;
    APPEND 'rbkp~RBSTAT = ''A''' TO lt_where.
  ELSEIF p4 = 'X'.
    "勾选取查询公司+年+期间在表RBKP中=查询年度GJAHR+期间MONAT+公司代码BUKRS对应的冲销者STBLG=空+发票凭证状态RBSTAT=5的发票号;
    APPEND 'rbkp~RBSTAT = ''5''' TO lt_where.
  ENDIF.



  SELECT rbkp~bukrs,
         rbkp~belnr AS belnr_rbkp,
         rbkp~gjahr,
         rbkp~lifnr,
         rbkp~monat,
         rbkp~bktxt,
         rbkp~waers,
         bkpf~budat,
         bkpf~belnr AS belnr_bkpf,
         bkpf~gjahr AS gjahr_bkpf,
         bkpf~bukrs AS bukrs_bkpf,
         bkpf~awkey,
         rbkp~mwskz1,
         rseg~lfbnr,
         rseg~lfgja,
         rseg~lfpos,
         CAST( concat( rseg~lfbnr,rseg~lfgja  ) AS CHAR( 20 )  ) AS awkey_sh
    FROM rbkp INNER JOIN rseg ON rbkp~belnr = rseg~belnr AND rbkp~gjahr = rseg~gjahr
              LEFT JOIN bkpf ON concat( rseg~belnr, rseg~gjahr ) = bkpf~awkey
    WHERE rbkp~bukrs IN @lr_bukrs AND
          rbkp~belnr IN @s_belnr AND
          rbkp~gjahr = @p_ymonth+0(4) AND
          rbkp~monat = @p_ymonth+4(2) AND
          rbkp~stblg = '' AND
          (lt_where)
    INTO TABLE @DATA(lt_rbkp).

  DELETE lt_rbkp WHERE bukrs_bkpf NOT IN lr_bukrs[].
  SORT lt_rbkp BY belnr_rbkp gjahr.

  IF lt_rbkp[] IS NOT INITIAL.
    SELECT cvi_vend_link~vendor AS lifnr,
           but000~name_org1 INTO TABLE @DATA(lt_but000)
    FROM but000
    INNER JOIN cvi_vend_link ON but000~partner_guid = cvi_vend_link~partner_guid
    FOR ALL ENTRIES IN @lt_rbkp
    WHERE cvi_vend_link~vendor = @lt_rbkp-lifnr.
    SORT lt_but000 BY lifnr.

    SELECT kurst,
           fcurr,
           tcurr,
           gdatu,
           ukurs
    INTO TABLE @DATA(lt_tcurr)
    FROM tcurr
    FOR ALL ENTRIES IN @lt_rbkp
    WHERE fcurr = @lt_rbkp-waers AND
          tcurr = @lv_waers_local AND
          kurst = 'M'.


    LOOP AT lt_tcurr INTO DATA(lw_tcurr).
      CLEAR:lv_date.
      CALL FUNCTION 'CONVERSION_EXIT_INVDT_OUTPUT'
        EXPORTING
          input  = lw_tcurr-gdatu
        IMPORTING
          output = lv_date.

      lt_curr[] = VALUE #( BASE lt_curr ( fcurr = lw_tcurr-fcurr
                                          tcurr = lw_tcurr-tcurr
                                          gdatu = lv_date
                                          ukurs = lw_tcurr-ukurs
                                          gjahr = lv_date+0(4)
                                          monat = lv_date+5(2) ) ).
    ENDLOOP.

    SORT lt_curr BY gjahr monat fcurr tcurr .

    SELECT belnr,
           bukrs,
           gjahr,
           buzei,
           hkont,
           shkzg,
           dmbtr,
           wrbtr
      INTO TABLE @DATA(lt_bseg)
      FROM bseg
      FOR ALL ENTRIES IN @lt_rbkp
      WHERE belnr = @lt_rbkp-belnr_bkpf AND
            gjahr = @lt_rbkp-gjahr_bkpf AND
            bukrs = @lt_rbkp-bukrs_bkpf.

    "取发票的物料凭证 对应的会计凭证 取 科目类型为M 的数据进行
    "发票号在BSEG中所有收货工厂物料凭证的会计凭证原币金额合计
    "发票号在BSEG中所有收货工厂物料凭证的会计凭证本币金额合计
    SELECT bkpf~awkey AS awkey_sh,
           acdoca~belnr,
           acdoca~rbukrs AS bukrs,
           acdoca~gjahr,
           acdoca~docln,
           bkpf~waers,
           acdoca~drcrk AS shkzg,
           acdoca~tsl AS dmbtr,
           acdoca~wsl AS wrbtr,
           acdoca~awref,
           acdoca~awitem
      INTO TABLE @DATA(lt_bseg_sh)
      FROM bkpf INNER JOIN acdoca ON bkpf~belnr = acdoca~belnr AND bkpf~bukrs = acdoca~rbukrs AND bkpf~gjahr = acdoca~gjahr
      FOR ALL ENTRIES IN @lt_rbkp
      WHERE bkpf~awkey = @lt_rbkp-awkey_sh AND
            acdoca~racct = '2202010200'.""buzid IN ('M','P','A').

    LOOP AT lt_bseg_sh INTO DATA(lw_bseg_sh).
      READ TABLE lt_rbkp INTO DATA(lw_rbkp_te) WITH KEY lfgja = lw_bseg_sh-gjahr lfbnr = lw_bseg_sh-awref lfpos = lw_bseg_sh-awitem.
      IF sy-subrc EQ 0.
        "lw_sh-awkey_sh = lw_bseg_sh-awkey_sh.
        lw_sh-lfgja = lw_bseg_sh-gjahr.
        lw_sh-lfbnr = lw_bseg_sh-awref.
        lw_sh-lfpos = lw_bseg_sh-awitem.
        lw_sh-dmbtr = lw_bseg_sh-dmbtr * -1.
        lw_sh-wrbtr = lw_bseg_sh-wrbtr * -1.
        COLLECT lw_sh INTO lt_sh.
      ENDIF.
    ENDLOOP.

    SORT lt_sh BY lfgja lfbnr lfpos."awkey_sh.

*    "发票对应的收货会计凭证再根据发票进行汇总
*    LOOP AT lt_rbkp INTO DATA(lw_rbkp_temp).
*      READ TABLE lt_sh_exist INTO lw_sh_exist WITH KEY awkey_sh = lw_rbkp_temp-awkey_sh.
*      IF sy-subrc EQ 0.
*        CONTINUE.
*      ENDIF.
*
*      CLEAR:lv_wrbtr,lv_dmbtr.
*      READ TABLE lt_sh INTO lw_sh WITH KEY awkey_sh = lw_rbkp_temp-awkey_sh TRANSPORTING NO FIELDS BINARY SEARCH.
*      IF sy-subrc EQ 0.
*        LOOP AT lt_sh INTO lw_sh FROM sy-tabix.
*          IF lw_rbkp_temp-awkey_sh <> lw_sh-awkey_sh.
*            EXIT.
*          ENDIF.
*          lv_dmbtr = lv_dmbtr + lw_sh-dmbtr.
*          lv_wrbtr = lv_wrbtr + lw_sh-wrbtr.
*        ENDLOOP.
*
*        lt_sh_hz-belnr_rbkp = lw_rbkp_temp-belnr_rbkp.
*        lt_sh_hz-gjahr = lw_rbkp_temp-gjahr.
*        lt_sh_hz-dmbtr = lv_dmbtr.
*        lt_sh_hz-wrbtr = lv_wrbtr.
*        COLLECT lt_sh_hz.
*        CLEAR:lt_sh_hz.
*
*        lt_sh_exist[] = VALUE #( BASE lt_sh_exist ( awkey_sh = lw_rbkp_temp-awkey_sh ) ).
*      ENDIF.
*    ENDLOOP.

    "    SORT lt_sh_hz BY belnr_rbkp gjahr.

    SELECT ztfi0035_log~bukr2,
           ztfi0035_log~belnr,
           ztfi0035_log~gjahr,
           bseg~buzei,
           bseg~hkont,
           bseg~shkzg,
           bseg~dmbtr,
           bseg~wrbtr,
           bkpf~waers,
           ztfi0035_log~mblnr,
           ztfi0035_log~mjahr,
           ztfi0035_log~zeile
      INTO TABLE @DATA(lt_ztfi0035)
      FROM ztfi0035_log INNER JOIN bseg ON ztfi0035_log~bukr2 = bseg~bukrs AND ztfi0035_log~belnr = bseg~belnr AND ztfi0035_log~gjahr = bseg~gjahr
                    LEFT JOIN bkpf ON ztfi0035_log~bukr2 = bkpf~bukrs AND ztfi0035_log~belnr = bkpf~belnr AND ztfi0035_log~gjahr = bkpf~gjahr
      FOR ALL ENTRIES IN @lt_rbkp
      WHERE ztfi0035_log~mblnr = @lt_rbkp-lfbnr AND
            ztfi0035_log~mjahr = @lt_rbkp-lfgja AND
            ztfi0035_log~zeile = @lt_rbkp-lfpos AND
            ztfi0035_log~zpzzh = 'A001' AND
            bseg~hkont = '2202010200'.

    LOOP AT lt_bseg INTO DATA(lw_bseg).
      "发票暂估总金额 会计凭证对应的2202010200科目原币汇总金额;
      "发票暂估总金额 会计凭证对应的2202010200科目本币汇总金额;
      IF lw_bseg-hkont = '2202010200'.
        def_collect_data lw_bseg_fpzg lw_bseg lt_bseg_fpzg.
      ENDIF.

      "调整金额 会计凭证中除:2202010100、2221020202、2202010200科目外的原币金额S-H,余为负数则显示负数,正数显示正数;
      "调整金额 会计凭证中除:2202010100、2221020202、2202010200科目外的本币金额S-H,余为负数则显示负数,正数显示正数;
      IF lw_bseg-hkont NOT IN lr_hkont..
        def_collect_data lw_bseg_tzje lw_bseg lt_bseg_tzje.
      ENDIF.

      "税金 会计凭证对应的2221020202科目原币汇总金额;借方显示正数,贷方显示负数;
      "税金 会计凭证对应的2221020202科目本币汇总金额;借方显示正数,贷方显示负数;
      IF lw_bseg-hkont = '2221020202'.
        def_collect_data lw_bseg_sjje lw_bseg lt_bseg_sjje.
      ENDIF.

      "总发票金额 会计凭证对应的2202010100科目原币汇总金额;借方显示负数,贷方显示正数;
      "总发票金额 会计凭证对应的2202010100科目本币汇总金额;借方显示负数,贷方显示正数;
      IF lw_bseg-hkont = '2202010100'.
        def_collect_jf_data lw_bseg_zfpje lw_bseg lt_bseg_zfpje.
      ENDIF.

      "发票号在BSEG中所有收货工厂物料凭证的会计凭证原币金额合计
      "发票号在BSEG中所有收货工厂物料凭证的会计凭证本币金额合计
      def_collect_data lw_bseg_shje lw_bseg lt_bseg_shje.
    ENDLOOP.

    SORT lt_bseg_fpzg BY bukrs gjahr belnr.
    SORT lt_bseg_tzje BY bukrs gjahr belnr.
    SORT lt_bseg_sjje BY bukrs gjahr belnr.
    SORT lt_bseg_zfpje BY bukrs gjahr belnr.
    SORT lt_bseg_shje BY bukrs gjahr belnr.

    LOOP AT lt_ztfi0035 INTO DATA(lw_ztfi0035).
      lw_xdgs-zeile = lw_ztfi0035-zeile.
      lw_xdgs-mjahr = lw_ztfi0035-mjahr.
      lw_xdgs-mblnr = lw_ztfi0035-mblnr.
      IF lw_ztfi0035-shkzg = 'S'.
        lw_xdgs-dmbtr = lw_ztfi0035-dmbtr * -1.
        lw_xdgs-wrbtr = lw_ztfi0035-wrbtr * -1.
      ELSE.
        lw_xdgs-dmbtr = lw_ztfi0035-dmbtr.
        lw_xdgs-wrbtr = lw_ztfi0035-wrbtr.
      ENDIF.
      lw_xdgs-waers = lw_ztfi0035-waers.
      COLLECT lw_xdgs INTO lt_xdgs.
    ENDLOOP.

    SORT lt_xdgs BY mjahr mblnr zeile.

    DATA(lv_dmbtr_sh) = VALUE dmbtr( ).
    DATA(lv_wrbtr_sh) = VALUE dmbtr( ).

    LOOP AT lt_rbkp INTO DATA(lw_rbkp)  GROUP BY ( belnr_rbkp = lw_rbkp-belnr_rbkp
                                                gjahr = lw_rbkp-gjahr
                                                size = GROUP SIZE
                                                index = GROUP INDEX )
      ASCENDING ASSIGNING FIELD-SYMBOL(<fs_group>).

      CLEAR:lv_wrbtr,lv_waers,lv_dmbtr,lv_dmbtr_sh,lv_wrbtr_sh.
      LOOP AT GROUP <fs_group> ASSIGNING FIELD-SYMBOL(<ls_group>).
        READ TABLE lt_xdgs INTO lw_xdgs WITH KEY mjahr = <ls_group>-lfgja   mblnr = <ls_group>-lfbnr  zeile = <ls_group>-lfpos BINARY SEARCH.
        IF sy-subrc EQ 0.
          lv_wrbtr = lv_wrbtr + lw_xdgs-wrbtr.     "下单公司收货暂估原币金额
          lv_waers   = lw_xdgs-waers.     "下单公司收货币别
          lv_dmbtr  = lv_dmbtr + lw_xdgs-dmbtr.       "下单公司收货暂估本币金额
        ENDIF.


        READ TABLE lt_sh INTO lw_sh WITH KEY lfgja = <ls_group>-lfgja   lfbnr = <ls_group>-lfbnr  lfpos = <ls_group>-lfpos BINARY SEARCH.
        IF sy-subrc EQ 0.
          lv_wrbtr_sh = lv_wrbtr_sh + lw_sh-wrbtr.
          lv_dmbtr_sh = lv_dmbtr_sh + lw_sh-dmbtr.
        ENDIF.
      ENDLOOP.

      gw_header-shbbje = lv_dmbtr_sh."收货本币金额
      gw_header-shybje = lv_wrbtr_sh."收货原币金额

      gw_header-lifnr = <ls_group>-lifnr.
      gw_header-bukrs = <ls_group>-bukrs.
      gw_header-gjahr = <ls_group>-gjahr.
      gw_header-monat = <ls_group>-monat.
      gw_header-belnr_rbkp = <ls_group>-belnr_rbkp.
      gw_header-bktxt = <ls_group>-bktxt.
      gw_header-belnr_bkpf = <ls_group>-belnr_bkpf.
      gw_header-waers = <ls_group>-waers.
      gw_header-mwskz1 = <ls_group>-mwskz1.

      READ TABLE lt_curr INTO DATA(lw_curr) WITH KEY tcurr = lv_waers_local fcurr = gw_header-waers gjahr = <ls_group>-budat+0(4) monat = <ls_group>-budat+4(2) BINARY SEARCH.
      IF sy-subrc EQ 0.
        gw_header-ukurs = lw_curr-ukurs.
      ENDIF.
      "PERFORM frm_change_waers USING lv_waers_local gw_header-waers <ls_group>-budat CHANGING gw_header-ukurs.


      "      gw_header-ukurs =
      READ TABLE lt_but000 INTO DATA(lw_but000) WITH KEY lifnr = <ls_group>-lifnr BINARY SEARCH.
      IF sy-subrc EQ 0.
        gw_header-lifnr_txt = lw_but000-name_org1.
      ENDIF.

      READ TABLE lt_bseg_fpzg INTO lw_bseg_fpzg WITH KEY bukrs = <ls_group>-bukrs_bkpf gjahr = <ls_group>-gjahr_bkpf belnr = <ls_group>-belnr_bkpf BINARY SEARCH.
      IF sy-subrc EQ 0.
        gw_header-fpzgzjeyb = lw_bseg_fpzg-wrbtr. "发票暂估总金额原币
        gw_header-fpzgzjebb = lw_bseg_fpzg-dmbtr."发票暂估总金额本币
      ENDIF.

      READ TABLE lt_bseg_tzje INTO lw_bseg_tzje WITH KEY bukrs = <ls_group>-bukrs_bkpf gjahr = <ls_group>-gjahr_bkpf belnr = <ls_group>-belnr_bkpf BINARY SEARCH.
      IF sy-subrc EQ 0.
        gw_header-tzybje = lw_bseg_tzje-wrbtr. "调整原币金额
        gw_header-tzbbje = lw_bseg_tzje-dmbtr."调整本币金额
      ENDIF.

      READ TABLE lt_bseg_sjje INTO lw_bseg_sjje WITH KEY bukrs = <ls_group>-bukrs_bkpf gjahr = <ls_group>-gjahr_bkpf belnr = <ls_group>-belnr_bkpf BINARY SEARCH.
      IF sy-subrc EQ 0.
        gw_header-sjybje = lw_bseg_sjje-wrbtr. "税金原币金额
        gw_header-sjbbje = lw_bseg_sjje-dmbtr."税金本币金额
      ENDIF.

      READ TABLE lt_bseg_zfpje INTO lw_bseg_zfpje WITH KEY bukrs = <ls_group>-bukrs_bkpf gjahr = <ls_group>-gjahr_bkpf belnr = <ls_group>-belnr_bkpf BINARY SEARCH.
      IF sy-subrc EQ 0.
        gw_header-zfpybje = lw_bseg_zfpje-wrbtr. "总发票原币金额
        gw_header-zfpbbje = lw_bseg_zfpje-dmbtr."总发票本币金额
      ENDIF.

*      READ TABLE lt_bseg_shje INTO lw_bseg_shje WITH KEY bukrs = <ls_group>-bukrs_bkpf gjahr = <ls_group>-gjahr_bkpf belnr = <ls_group>-belnr_bkpf BINARY SEARCH.
*      IF sy-subrc EQ 0.
*        gw_header-shybje = lw_bseg_shje-wrbtr. "收货原币金额
*        gw_header-shbbje = lw_bseg_shje-dmbtr."收货本币金额
*      ENDIF.
*
*      READ TABLE lt_bseg_shje INTO lw_bseg_shje WITH KEY bukrs = <ls_group>-bukrs_bkpf gjahr = <ls_group>-gjahr_bkpf belnr = <ls_group>-belnr_bkpf BINARY SEARCH.
*      IF sy-subrc EQ 0.
*        gw_header-shybje = lw_bseg_shje-wrbtr. "收货原币金额
*        gw_header-shbbje = lw_bseg_shje-dmbtr."收货本币金额
*      ENDIF.

      gw_header-shhfpcyyb = gw_header-shybje -  gw_header-fpzgzjeyb.    "收货和发票差异原币 = 收货原币金额 - 发票暂估总金额原币
      gw_header-shhfpcybb = gw_header-shbbje -  gw_header-fpzgzjebb.      "收货和发票差异本币  =  收货本币金额  - 发票暂估总金额本币


      gw_header-xdgsshzgybje =  lv_wrbtr.     "下单公司收货暂估原币金额
      gw_header-xdgsshbb      = lv_waers.     "下单公司收货币别
      gw_header-xdgsshzgbbje = lv_dmbtr.       "下单公司收货暂估本币金额


      gw_header-xdgsshzghfpzgybcy = gw_header-xdgsshzgybje - gw_header-fpzgzjeyb.   "下单公司收货暂估和发票暂估原币差异   = 下单公司收货暂估原币金额  -   发票暂估总金额原币
      gw_header-xdgsshzghfpzgbbcy = gw_header-xdgsshzgbbje - gw_header-fpzgzjebb. "下单公司收货暂估和发票暂估本币差异 =  下单公司收货暂估本币金额  -  发票暂估总金额本币

      APPEND gw_header TO gt_header.
      CLEAR:gw_header.
    ENDLOOP.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_alv TABLES pt_out.
  DATA:g_repid TYPE sy-repid.
  g_repid = sy-repid.
  "g_layout-zebra             = 'X' .
  gs_layout-zebra = 'X'.
  gs_layout-cwidth_opt = 'X'.
  gs_layout-box_fname = 'SEL'.
  CLEAR  gt_fieldcat[].
  PERFORM frm_generate_field_catalogu.

*  gw_sort-fieldname = 'MATNR'.
*  gw_sort-down = 'X'.
*  APPEND gw_sort TO gt_sort.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'SET_PF'
      i_callback_user_command  = 'USER_COM'
      is_layout_lvc            = gs_layout
      it_fieldcat_lvc          = gt_fieldcat
      it_sort_lvc              = gt_sort
    TABLES
      t_outtab                 = pt_out
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SET_PF
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_pf USING  extab TYPE slis_t_extab.
  SET TITLEBAR 'TITLE'.
  SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.                    "SET_PF
*&---------------------------------------------------------------------*
*&      Form  user_com
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM user_com USING r_ucomm LIKE sy-ucomm
                  rs_selfield TYPE slis_selfield.
  DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
  DATA: gd_repid LIKE sy-repid,
        ref_grid TYPE REF TO cl_gui_alv_grid.
  DATA:lv_answer.

  IF ref_grid IS INITIAL.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        e_grid = ref_grid.
  ENDIF.
  IF NOT ref_grid IS INITIAL.
    CALL METHOD ref_grid->check_changed_data.
  ENDIF.

  CASE r_ucomm.
    WHEN '&BACK' OR '&EXIT' OR '&EXIT'.
      LEAVE TO SCREEN 0.
    WHEN '&IC1'.
      IF rs_selfield-fieldname = 'BELNR_BKPF'.
        IF p5 = 'X'.
          READ TABLE gt_header INTO gw_header INDEX rs_selfield-tabindex.
          IF sy-subrc EQ 0 AND gw_header-belnr_bkpf IS NOT INITIAL.
            SET PARAMETER ID 'BLN' FIELD gw_header-belnr_bkpf.
            SET PARAMETER ID 'BUK' FIELD gw_header-bukrs.
            SET PARAMETER ID 'GJR' FIELD gw_header-gjahr.
            CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
          ENDIF.
        ELSEIF p6 = 'X'.
          READ TABLE gt_item INTO gw_item INDEX rs_selfield-tabindex.
          IF sy-subrc EQ 0 AND gw_item-belnr_bkpf IS NOT INITIAL.
            SET PARAMETER ID 'BLN' FIELD gw_item-belnr_bkpf.
            SET PARAMETER ID 'BUK' FIELD gw_item-bukrs.
            SET PARAMETER ID 'GJR' FIELD gw_item-gjahr.
            CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
          ENDIF.
        ENDIF.
      ELSEIF rs_selfield-fieldname = 'BELNR_RBKP'.
        IF p5 = 'X'.
          READ TABLE gt_header INTO gw_header INDEX rs_selfield-tabindex.
          IF sy-subrc EQ 0 AND gw_header-belnr_rbkp IS NOT INITIAL.
            SET PARAMETER ID 'RBN' FIELD gw_header-belnr_rbkp.
            SET PARAMETER ID 'GJR' FIELD gw_header-gjahr.
            CALL TRANSACTION 'MIR4' AND SKIP FIRST SCREEN.
          ENDIF.
        ELSEIF p6 = 'X'.
          READ TABLE gt_item INTO gw_item INDEX rs_selfield-tabindex.
          IF sy-subrc EQ 0 AND gw_item-belnr_rbkp IS NOT INITIAL.
            SET PARAMETER ID 'RBN' FIELD gw_item-belnr_rbkp.
            SET PARAMETER ID 'GJR' FIELD gw_item-gjahr.
            CALL TRANSACTION 'MIR4' AND SKIP FIRST SCREEN.
          ENDIF.
        ENDIF.
      ENDIF.
    WHEN OTHERS.
  ENDCASE.
  rs_selfield-refresh = 'X'.
ENDFORM.                    "USER_COM
*&---------------------------------------------------------------------*
*&      Form  FRM_GENERATE_FIELD_CATALOGU
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_generate_field_catalogu.
  DATA:lr_fieldname TYPE RANGE OF lvc_s_fcat-fieldname.

  DEFINE def_append_fieldname.
    APPEND VALUE #( sign = 'I' option = 'EQ' low = &1 ) TO lr_fieldname.
  END-OF-DEFINITION.

  DEFINE def_modify_fieldcat.
    &1-scrtext_l = &2.
    &1-scrtext_m = &2.
    &1-reptext =   &2.
    &1-scrtext_s = &2.
  END-OF-DEFINITION.

  IF p5 = 'X'.
    TRY.
        cl_salv_table=>factory( IMPORTING r_salv_table = DATA(salv_table)
                                CHANGING  t_table      = gt_header ).
        gt_fieldcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
          r_columns      = salv_table->get_columns( )
          r_aggregations = salv_table->get_aggregations( ) ).
      CATCH cx_root.
    ENDTRY.
  ELSE.
    TRY.
        cl_salv_table=>factory( IMPORTING r_salv_table = salv_table
                                CHANGING  t_table      = gt_item ).
        gt_fieldcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
          r_columns      = salv_table->get_columns( )
          r_aggregations = salv_table->get_aggregations( ) ).
      CATCH cx_root.
    ENDTRY.
  ENDIF.

  REFRESH lr_fieldname.

  IF p1 = 'X' AND p5 = 'X'.
    "下单公司收货暂估原币金额 下单公司收货币别  下单公司收货暂估本币金额  下单公司收货暂估和发票暂估原币差异 下单公司收货暂估和发票暂估本币差异
    def_append_fieldname 'XDGSSHZGYBJE'.
    def_append_fieldname 'XDGSSHBB'.
    def_append_fieldname 'XDGSSHZGBBJE'.
    def_append_fieldname 'XDGSSHZGHFPZGYBCY'.
    def_append_fieldname 'XDGSSHZGHFPZGBBCY'.

    DELETE gt_fieldcat WHERE fieldname IN lr_fieldname.
  ELSEIF p1 = 'X' AND p6 = 'X'.
    "  下单公司收货凭证 下单公司收货原币金额  下单公司收货币别  下单公司收货本币金额  收货工厂和下单公司收货原币差异 收货工厂和下单公司收货收货本币差异 发票清账凭证  发票清账日期
    def_append_fieldname 'XDGSSHPZ'.
    def_append_fieldname 'XDGSSHYBJE'.
    def_append_fieldname 'XDGSSJBB'.
    def_append_fieldname 'XDGSSHBBJE'.
    def_append_fieldname 'SHGCHXDGSSHYBCY'.
    def_append_fieldname 'SHGCHXDGSSHBBCY'.
    def_append_fieldname 'FPQZPZ'.
    def_append_fieldname 'FPQZRQ'.

    DELETE gt_fieldcat WHERE fieldname IN lr_fieldname.
  ENDIF.

  LOOP AT gt_fieldcat ASSIGNING FIELD-SYMBOL(<fs_filedcat>).
    CASE <fs_filedcat>-fieldname.
      WHEN 'SEL'.
        <fs_filedcat>-no_out = 'X'.
      WHEN 'BUKRS'.
        def_modify_fieldcat <fs_filedcat> '下单公司'.
      WHEN 'LIFNR_TXT'.
        def_modify_fieldcat <fs_filedcat> '供应商名称'.
      WHEN 'BELNR_RBKP'.
        def_modify_fieldcat <fs_filedcat> '发票凭证'.
      WHEN 'BELNR_BKPF'.
        def_modify_fieldcat <fs_filedcat> '发票会计凭证'.
      WHEN 'FPJYYBJE'.
        def_modify_fieldcat <fs_filedcat> '发票校验原币金额'.
      WHEN 'FPBB'.
        def_modify_fieldcat <fs_filedcat> '发票币别'.
      WHEN 'WAERS'.
        def_modify_fieldcat <fs_filedcat> '凭证货币'.
      WHEN 'FPJYBBJE'.
        def_modify_fieldcat <fs_filedcat> '发票校验本币金额'.
      WHEN 'SHKZG'.
        def_modify_fieldcat <fs_filedcat> '借/贷标识'.
      WHEN 'WERKS'.
        def_modify_fieldcat <fs_filedcat> '收货工厂'.
      WHEN 'LFBNR'.
        def_modify_fieldcat <fs_filedcat> '收货物料凭证'.
      WHEN 'LFPOS'.
        def_modify_fieldcat <fs_filedcat> '物料凭证项目'.
      WHEN 'SHYBJE'.
        def_modify_fieldcat <fs_filedcat> '收货原币金额'.
      WHEN 'SHBB'.
        def_modify_fieldcat <fs_filedcat> '收货币别'.
      WHEN 'SHBBJE'.
        def_modify_fieldcat <fs_filedcat> '收货本币金额'.
      WHEN 'SHHFPYBCY'.
        def_modify_fieldcat <fs_filedcat> '收货和发票原币差异'.
      WHEN 'SHHFPBBCY'.
        def_modify_fieldcat <fs_filedcat> '收货和发票本币差异'.
      WHEN 'XDGSSHPZ'.
        def_modify_fieldcat <fs_filedcat> '下单公司收货凭证'.
      WHEN 'XDGSSHYBJE'.
        def_modify_fieldcat <fs_filedcat> '下单公司收货原币金额'.
      WHEN 'XDGSSJBB'.
        def_modify_fieldcat <fs_filedcat> '下单公司收货币别'.
      WHEN 'XDGSSHBBJE'.
        def_modify_fieldcat <fs_filedcat> '下单公司收货本币金额'.
      WHEN 'SHGCHXDGSSHYBCY'.
        def_modify_fieldcat <fs_filedcat> '收货工厂和下单公司收货原币差异'.
      WHEN 'SHGCHXDGSSHBBCY'.
        def_modify_fieldcat <fs_filedcat> '收货工厂和下单公司收货收货本币差异'.
      WHEN 'FPQZPZ'.
        def_modify_fieldcat <fs_filedcat> '发票清账凭证'.
      WHEN 'FPQZRQ'.
        def_modify_fieldcat <fs_filedcat> '发票清账日期'.
      WHEN 'FPZGZJEYB'.
        def_modify_fieldcat <fs_filedcat> '发票暂估总金额原币'.
      WHEN 'FPZGZJEBB'.
        def_modify_fieldcat <fs_filedcat> '发票暂估总金额本币'.
      WHEN 'TZYBJE'.
        def_modify_fieldcat <fs_filedcat> '调整原币金额'.
      WHEN 'TZBBJE'.
        def_modify_fieldcat <fs_filedcat> '调整本币金额'.
      WHEN 'MWSKZ1'.
        def_modify_fieldcat <fs_filedcat> '税码'.
      WHEN 'WRBTR'.
        def_modify_fieldcat <fs_filedcat> '发票校验原币金额'.
      WHEN 'WAERS'.
        def_modify_fieldcat <fs_filedcat> '发票币别'.
      WHEN 'DMBTR'.
        def_modify_fieldcat <fs_filedcat> '发票校验本币金额'.
      WHEN 'SJYBJE'.
        def_modify_fieldcat <fs_filedcat> '税金原币金额'.
      WHEN 'SJBBJE'.
        def_modify_fieldcat <fs_filedcat> '税金本币金额'.
      WHEN 'ZFPYBJE'.
        def_modify_fieldcat <fs_filedcat> '总发票原币金额'.
      WHEN 'ZFPBBJE'.
        def_modify_fieldcat <fs_filedcat> '总发票本币金额'.
      WHEN 'SHHFPCYYB'.
        def_modify_fieldcat <fs_filedcat> '收货和发票差异原币'.
      WHEN 'SHHFPCYBB'.
        def_modify_fieldcat <fs_filedcat> '收货和发票差异本币'.
      WHEN 'XDGSSHZGYBJE'.
        def_modify_fieldcat <fs_filedcat> '下单公司收货暂估原币金额'.
      WHEN 'XDGSSHBB'.
        def_modify_fieldcat <fs_filedcat> '下单公司收货币别'.
      WHEN 'XDGSSHZGBBJE'.
        def_modify_fieldcat <fs_filedcat> '下单公司收货暂估本币金额'.
      WHEN 'XDGSSHZGHFPZGYBCY'.
        def_modify_fieldcat <fs_filedcat> '下单公司收货暂估和发票暂估原币差异'.
      WHEN 'XDGSSHZGHFPZGBBCY'.
        def_modify_fieldcat <fs_filedcat> '下单公司收货暂估和发票暂估本币差异'.
      WHEN OTHERS.
    ENDCASE.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_item_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_item_data .
  DATA:lt_where TYPE TABLE OF edpline.
  DATA:lr_bukrs TYPE RANGE OF t001-bukrs .
  DATA:lr_hkont TYPE RANGE OF skat-saknr.
  TYPES:BEGIN OF tys_bseg,
          bukrs TYPE bukrs,
          gjahr TYPE gjahr,
          belnr TYPE belnr_d,
          dmbtr TYPE dmbtr,
          wrbtr TYPE dmbtr,
        END OF tys_bseg.

  TYPES:BEGIN OF tys_xdgs,
          mjahr    TYPE mseg-mjahr,
          mblnr    TYPE mseg-mblnr,
          zeile    TYPE mseg-zeile,
          belnr_xd TYPE belnr_d,
          augbl    TYPE bseg-augbl,
          augdt    TYPE bseg-augdt,
          dmbtr    TYPE dmbtr,
          wrbtr    TYPE dmbtr,
          waers    TYPE waers,
        END OF tys_xdgs.

  DEFINE def_collect_data.
    &1-bukrs = &2-bukrs.
    &1-gjahr = &2-gjahr.
    &1-belnr = &2-belnr.
    IF &2-shkzg = 'H'.
     &1-dmbtr = &2-dmbtr * -1.
     &1-wrbtr = &2-wrbtr * -1.
    ELSE.
     &1-dmbtr = &2-dmbtr.
     &1-wrbtr = &2-wrbtr.
    ENDIF.
    COLLECT &1 INTO &3.
  END-OF-DEFINITION.

  DATA:lt_bseg_fpzg  TYPE TABLE OF tys_bseg, "发票暂估总金额
       lw_bseg_fpzg  LIKE LINE OF lt_bseg_fpzg,
       lt_bseg_tzje  TYPE TABLE OF tys_bseg, "调整金额
       lw_bseg_tzje  LIKE LINE OF lt_bseg_tzje,
       lt_bseg_sjje  TYPE TABLE OF tys_bseg, "税金金额
       lw_bseg_sjje  LIKE LINE OF lt_bseg_sjje,
       lt_bseg_zfpje TYPE TABLE OF tys_bseg, "总发票金额
       lw_bseg_zfpje LIKE LINE OF lt_bseg_zfpje,
       lt_bseg_shje  TYPE TABLE OF tys_bseg, "收货金额
       lw_bseg_shje  LIKE LINE OF lt_bseg_shje.
  DATA:lt_xdgs TYPE TABLE OF tys_xdgs,
       lw_xdgs LIKE LINE OF lt_xdgs.

*  TYPES:BEGIN OF tys_rbkp,
*          bukrs      TYPE bukrs,
*          belnr_rbkp TYPE rbkp-belnr,
*          buzei_rbkp TYPE rseg-buzei,
*          gjahr      TYPE rbkp-gjahr,
*          lifnr      TYPE rbkp-lifnr,
*          monat      TYPE rbkp-monat,
*          bktxt      TYPE rbkp-bktxt,
*          waers      TYPE rbkp-waers,
*          budat      TYPE bkpf-budat,
*          belnr_bkpf TYPE bkpf-belnr,
*          gjahr_bkpf TYPE bkpf-gjahr,
*          bukrs_bkpf TYPE bkpf-bukrs,
*          awkey      TYPE bkpf-awkey,
*          mwskz      TYPE rbkp-mwskz1,
*          werks      TYPE werks_d,
*          shkzg      TYPE rseg-shkzg,
*          ebeln      TYPE rseg-ebeln,
*          ebelp      TYPE rseg-ebelp,
*          matnr      TYPE rseg-matnr,
*          menge      TYPE rseg-menge,
*          bstme      TYPE rseg-bstme,
*          lfbnr      TYPE rseg-lfbnr,
*          lfgja      TYPE rseg-lfgja,
*          lfpos      TYPE rseg-lfpos,
*          awkey_sh   TYPE bkpf-awkey,
*        END OF tys_rbkp.
*  DATA:lt_rbkp TYPE TABLE OF tys_rbkp.

  TYPES:BEGIN OF tys_sh,
          lfbnr	TYPE lfbnr,
          lfgja	TYPE lfgja,
          lfpos	TYPE lfpos,
          waers TYPE waers,
          dmbtr TYPE dmbtr,
          wrbtr TYPE dmbtr,
        END OF tys_sh.

  DATA:lt_sh TYPE TABLE OF tys_sh,
       lw_sh LIKE LINE OF  lt_sh.

  DATA:lv_wrbtr TYPE wrbtr,
       lv_waers TYPE waers,
       lv_dmbtr TYPE dmbtr.
  DATA:lv_ukurs TYPE ukurs_curr.

  TYPES:BEGIN OF tys_curr,
          gjahr TYPE gjahr,
          monat TYPE monat,
          fcurr TYPE tcurr-fcurr,
          tcurr TYPE tcurr-tcurr,
          gdatu TYPE char10,
          ukurs TYPE tcurr-ukurs,
        END OF tys_curr.

  DATA:lt_curr TYPE TABLE OF tys_curr.
  DATA:lv_date TYPE char10.

  APPEND VALUE #( sign = 'I' option = 'EQ' low = p_bukrs ) TO lr_bukrs.


  APPEND VALUE #( sign = 'I' option = 'EQ' low = '2202010200' ) TO lr_hkont.

  SELECT SINGLE waers INTO @DATA(lv_waers_local) FROM t001 WHERE bukrs IN @lr_bukrs.

  IF p3 = 'X'.
    "勾选取查询公司+年+期间在表RBKP中=查询年度GJAHR+期间MONAT+公司代码BUKRS对应的冲销者STBLG=空+发票凭证状态RBSTAT=A的发票号;
    APPEND 'rbkp~RBSTAT = ''A''' TO lt_where.
  ELSEIF p4 = 'X'.
    "勾选取查询公司+年+期间在表RBKP中=查询年度GJAHR+期间MONAT+公司代码BUKRS对应的冲销者STBLG=空+发票凭证状态RBSTAT=5的发票号;
    APPEND 'rbkp~RBSTAT = ''5''' TO lt_where.
  ENDIF.

  SELECT rbkp~bukrs,
         rbkp~belnr AS belnr_rbkp,
         rseg~buzei AS buzei_rbkp,
         rbkp~gjahr,
         rbkp~lifnr,
         rbkp~monat,
         rbkp~bktxt,
         rbkp~waers,
         bkpf~budat,
         bkpf~belnr AS belnr_bkpf,
         bkpf~gjahr AS gjahr_bkpf,
         bkpf~bukrs AS bukrs_bkpf,
         bkpf~awkey,
         bkpf~kursf,
         rseg~werks,
         rseg~mwskz,
         rseg~wrbtr,
         rseg~shkzg,
         rseg~ebeln,
         rseg~ebelp,
         rseg~matnr,
         rseg~menge,
         rseg~bstme,
         rseg~lfbnr,
         rseg~lfgja,
         rseg~lfpos,
         CAST( concat( rseg~lfbnr,rseg~lfgja  ) AS CHAR( 20 )  ) AS awkey_sh
    FROM rbkp INNER JOIN rseg ON rbkp~belnr = rseg~belnr AND rbkp~gjahr = rseg~gjahr
              LEFT JOIN bkpf ON concat( rseg~belnr, rseg~gjahr ) = bkpf~awkey
    WHERE rbkp~bukrs IN @lr_bukrs AND
          rbkp~belnr IN @s_belnr AND
          rbkp~gjahr = @p_ymonth+0(4) AND
          rbkp~monat = @p_ymonth+4(2) AND
          rbkp~stblg = '' AND
          (lt_where)
    INTO TABLE @DATA(lt_rbkp).

  DELETE lt_rbkp WHERE bukrs_bkpf NOT IN lr_bukrs[].
  SORT lt_rbkp BY belnr_rbkp gjahr buzei_rbkp.

  IF lt_rbkp[] IS NOT INITIAL.
    SELECT cvi_vend_link~vendor AS lifnr,
           but000~name_org1 INTO TABLE @DATA(lt_but000)
    FROM but000
    INNER JOIN cvi_vend_link ON but000~partner_guid = cvi_vend_link~partner_guid
    FOR ALL ENTRIES IN @lt_rbkp
    WHERE cvi_vend_link~vendor = @lt_rbkp-lifnr.
    SORT lt_but000 BY lifnr.

    SELECT kurst,
            fcurr,
            tcurr,
            gdatu,
            ukurs
     INTO TABLE @DATA(lt_tcurr)
     FROM tcurr
     FOR ALL ENTRIES IN @lt_rbkp
     WHERE fcurr = @lt_rbkp-waers AND
           tcurr = @lv_waers_local AND
           kurst = 'M'.


    LOOP AT lt_tcurr INTO DATA(lw_tcurr).
      CLEAR:lv_date.
      CALL FUNCTION 'CONVERSION_EXIT_INVDT_OUTPUT'
        EXPORTING
          input  = lw_tcurr-gdatu
        IMPORTING
          output = lv_date.

      lt_curr[] = VALUE #( BASE lt_curr ( fcurr = lw_tcurr-fcurr
                                          tcurr = lw_tcurr-tcurr
                                          gdatu = lv_date
                                          ukurs = lw_tcurr-ukurs
                                          gjahr = lv_date+0(4)
                                          monat = lv_date+5(2) ) ).
    ENDLOOP.

    SORT lt_curr BY gjahr monat fcurr tcurr .

    "取发票的物料凭证 对应的会计凭证 取 科目类型为M 的数据进行
    "发票号在BSEG中所有收货工厂物料凭证的会计凭证原币金额合计
    "发票号在BSEG中所有收货工厂物料凭证的会计凭证本币金额合计
    SELECT bkpf~awkey AS awkey_sh,
           acdoca~belnr,
           acdoca~rbukrs AS bukrs,
           acdoca~gjahr,
           acdoca~docln,
           bkpf~waers,
           acdoca~drcrk AS shkzg,
           acdoca~tsl AS dmbtr,
           acdoca~wsl AS wrbtr,
           acdoca~awref,
           acdoca~awitem
      INTO TABLE @DATA(lt_acdoca_sh)
      FROM bkpf INNER JOIN acdoca ON bkpf~belnr = acdoca~belnr AND bkpf~bukrs = acdoca~rbukrs AND bkpf~gjahr = acdoca~gjahr
      FOR ALL ENTRIES IN @lt_rbkp
      WHERE bkpf~awkey = @lt_rbkp-awkey_sh AND
            acdoca~racct = '2202010200'."koart IN ('M','P','A').

    LOOP AT lt_acdoca_sh INTO DATA(lw_acdoca_sh).
      lw_sh-lfgja = lw_acdoca_sh-gjahr.
      lw_sh-lfbnr = lw_acdoca_sh-awref.
      lw_sh-lfpos = lw_acdoca_sh-awitem.
      "      IF lw_acdoca_sh-shkzg = 'S'."借方显示负数 贷方显示正数,直接相反
      lw_sh-dmbtr = lw_acdoca_sh-dmbtr * -1.
      lw_sh-wrbtr = lw_acdoca_sh-wrbtr * -1..
      lw_sh-waers = lw_acdoca_sh-waers.
      COLLECT lw_sh INTO lt_sh.
    ENDLOOP.

    SORT lt_sh BY  lfgja lfbnr lfpos.

    SELECT ztfi0035_log~bukr2,
           ztfi0035_log~belnr,
           ztfi0035_log~gjahr,
           bseg~buzei,
           bseg~hkont,
           bseg~shkzg,
           bseg~dmbtr,
           bseg~wrbtr,
           bkpf~waers,
           bseg~augbl,
           bseg~augdt,
           ztfi0035_log~mblnr,
           ztfi0035_log~mjahr,
           ztfi0035_log~zeile
      INTO TABLE @DATA(lt_ztfi0035)
      FROM ztfi0035_log INNER JOIN bseg ON ztfi0035_log~bukr2 = bseg~bukrs AND ztfi0035_log~belnr = bseg~belnr AND ztfi0035_log~gjahr = bseg~gjahr
                    LEFT JOIN bkpf ON ztfi0035_log~bukr2 = bkpf~bukrs AND ztfi0035_log~belnr = bkpf~belnr AND ztfi0035_log~gjahr = bkpf~gjahr
      FOR ALL ENTRIES IN @lt_rbkp
      WHERE ztfi0035_log~mblnr = @lt_rbkp-lfbnr AND
            ztfi0035_log~mjahr = @lt_rbkp-lfgja AND
            ztfi0035_log~zeile = @lt_rbkp-lfpos AND
            ztfi0035_log~zpzzh = 'A001' AND
            bseg~hkont = '2202010200'.


    LOOP AT lt_ztfi0035 INTO DATA(lw_ztfi0035).
      lw_xdgs-zeile = lw_ztfi0035-zeile.
      lw_xdgs-mjahr = lw_ztfi0035-mjahr.
      lw_xdgs-mblnr = lw_ztfi0035-mblnr.
      lw_xdgs-waers = lw_ztfi0035-waers.
      lw_xdgs-belnr_xd = lw_ztfi0035-belnr.
      lw_xdgs-augbl = lw_ztfi0035-augbl.
      lw_xdgs-augdt = lw_ztfi0035-augdt.
      IF lw_ztfi0035-shkzg = 'S'.
        lw_xdgs-dmbtr = lw_ztfi0035-dmbtr * -1.
        lw_xdgs-wrbtr = lw_ztfi0035-wrbtr * -1.
      ELSE.
        lw_xdgs-dmbtr = lw_ztfi0035-dmbtr.
        lw_xdgs-wrbtr = lw_ztfi0035-wrbtr.
      ENDIF.
      lw_xdgs-waers = lw_ztfi0035-waers.
      COLLECT lw_xdgs INTO lt_xdgs.
    ENDLOOP.

    SORT lt_xdgs BY mjahr mblnr zeile.

    LOOP AT lt_rbkp INTO DATA(lw_rbkp).

      gw_item-bukrs       = lw_rbkp-bukrs .
      gw_item-belnr_rbkp  = lw_rbkp-belnr_rbkp .
      gw_item-buzei_rbkp  = lw_rbkp-buzei_rbkp .
      gw_item-gjahr       = lw_rbkp-gjahr .
      gw_item-lifnr       = lw_rbkp-lifnr .
      gw_item-monat       = lw_rbkp-monat .
      gw_item-bktxt       = lw_rbkp-bktxt .
      gw_item-waers       = lw_rbkp-waers .
      gw_item-budat       = lw_rbkp-budat .
      gw_item-belnr_bkpf  = lw_rbkp-belnr_bkpf .
      gw_item-gjahr_bkpf  = lw_rbkp-gjahr_bkpf .
      gw_item-bukrs_bkpf  = lw_rbkp-bukrs_bkpf .
      gw_item-mwskz       = lw_rbkp-mwskz .
      gw_item-werks       = lw_rbkp-werks .
      gw_item-shkzg       = lw_rbkp-shkzg .
      gw_item-ebeln       = lw_rbkp-ebeln .
      gw_item-ebelp       = lw_rbkp-ebelp .
      gw_item-matnr       = lw_rbkp-matnr .
      gw_item-menge       = lw_rbkp-menge .
      gw_item-bstme       = lw_rbkp-bstme .
      gw_item-lfbnr       = lw_rbkp-lfbnr .
      gw_item-lfgja       = lw_rbkp-lfgja .
      gw_item-lfpos       = lw_rbkp-lfpos .

      IF gw_item-shkzg = 'H'.
        gw_item-wrbtr = lw_rbkp-wrbtr * -1.
      ELSE.
        gw_item-wrbtr = lw_rbkp-wrbtr.
      ENDIF.
      "gw_item-awkey_sh    = lw_rbkp-awkey_sh   .

      READ TABLE lt_sh INTO lw_sh WITH KEY lfgja = lw_rbkp-lfgja lfbnr = lw_rbkp-lfbnr lfpos = lw_rbkp-lfpos BINARY SEARCH.
      IF sy-subrc EQ 0.
        gw_item-shbbje = lw_sh-dmbtr."收货本币金额
        gw_item-shbb   = lw_sh-waers.
        gw_item-shybje = lw_sh-wrbtr."收货原币金额
      ENDIF.

      READ TABLE lt_but000 INTO DATA(lw_but000) WITH KEY lifnr = lw_rbkp-lifnr BINARY SEARCH.
      IF sy-subrc EQ 0.
        gw_item-lifnr_txt = lw_but000-name_org1.
      ENDIF.

      CLEAR:lv_ukurs.
      READ TABLE lt_curr INTO DATA(lw_curr) WITH KEY tcurr = lv_waers_local fcurr = lw_rbkp-waers gjahr = lw_rbkp-budat+0(4) monat = lw_rbkp-budat+4(2) BINARY SEARCH.
      IF sy-subrc EQ 0.
        lv_ukurs = lw_curr-ukurs.
      ENDIF.

      "PERFORM frm_change_waers USING lv_waers_local lw_rbkp-waers lw_rbkp-budat CHANGING lv_ukurs.
      IF lw_rbkp-kursf <> '0.00000'."修改直接取凭证的汇率,存在预制情况,汇率是当时预制的日期汇率与过账日期又区别 20240902
        gw_item-dmbtr = gw_item-wrbtr * lw_rbkp-kursf."* lv_ukurs.
      ELSE.
        gw_item-dmbtr = gw_item-wrbtr.
      ENDIF.

      gw_item-shhfpybcy  = gw_item-shybje - gw_item-wrbtr."收货和发票原币差异 = 发票校验原币金额 -  收货原币金额
      gw_item-shhfpbbcy  = gw_item-shbbje - gw_item-dmbtr."收货和发票本币差异 = 发票校验本币金额 - 收货本币金额

      READ TABLE lt_xdgs INTO lw_xdgs WITH KEY mjahr = lw_rbkp-lfgja  mblnr = lw_rbkp-lfbnr  zeile = lw_rbkp-lfpos BINARY SEARCH.
      IF sy-subrc EQ 0.
        gw_item-xdgsshpz    = lw_xdgs-belnr_xd.   "下单公司收货凭证
        gw_item-xdgsshybje  = lw_xdgs-wrbtr .    "下单公司收货原币金额
        gw_item-xdgssjbb    = lw_xdgs-waers.     "下单公司收货币别
        gw_item-xdgsshbbje     = lw_xdgs-dmbtr.    "下单公司收货本币金额
        gw_item-fpqzpz          = lw_xdgs-augbl.  "发票清账凭证
        gw_item-fpqzrq          = lw_xdgs-augdt.  "发票清账日期
      ENDIF.

      gw_item-shgchxdgsshybcy = gw_item-shybje - gw_item-xdgsshybje.  "收货工厂和下单公司收货原币差异     = 收货原币金额  - 下单公司收货原币金额
      gw_item-shgchxdgsshbbcy = gw_item-shbbje - gw_item-xdgsshbbje.  "收货工厂和下单公司收货收货本币差异  =  收货本币金额 - 下单公司收货本币金额

      APPEND gw_item TO gt_item.
      CLEAR:gw_item.
    ENDLOOP.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHANGE_WAERS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> GV_WAERS
*&      --> WAERS
*&      --> BUDAT
*&      <-- LV_FACTOR
*&---------------------------------------------------------------------*
FORM frm_change_waers  USING    pv_waers_local TYPE waers
                                pv_waers_foreign TYPE waers
                                pv_budat TYPE budat
                       CHANGING pv_factor TYPE ukurs_curr.

  DATA:lv_factor TYPE char20.

  CALL FUNCTION 'READ_EXCHANGE_RATE'
    EXPORTING
      date             = pv_budat
      foreign_currency = pv_waers_foreign
      local_currency   = pv_waers_local
      type_of_rate     = 'M'
    IMPORTING
      foreign_factor   = lv_factor
    EXCEPTIONS
      no_rate_found    = 1
      no_factors_found = 2
      no_spread_found  = 3
      derived_2_times  = 4
      overflow         = 5
      zero_rate        = 6
      OTHERS           = 7.

  pv_factor = lv_factor.

ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值