*&---------------------------------------------------------------------*
*& 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.