发出商品差异分摊
*&---------------------------------------------------------------------*
*& 单位/APPLICANT : **** SAP
*& 程序名称/PROGRAM NAME. : ZFI013
*& 程序描述/PROGRAM DES. : 发出商品差异分摊平台
*& 开发编号/FS NO. :
*& 功能顾问/FUNCTION CONST. :
*& 申请日期/APPLICATION DATE : 2023.11.20
*& 技术顾问/DEVELOP CONST. : ZGQ
*& 开发日期/DEVELOP DATE. : 2023.11.20
*&---------------------------------------------------------------------*
*&摘要:
*& 一. 业务背景
*& 查看XXXX信息
*& 二. 使用场景
*&
*& 三. 程序使用:
*& 运行TCODE: ZFI013
*&
*&注意:
*& 一. 代码规范
*& 遵循 《**SAP标准化程序开发规范 V1.0》;
*& 二. 代码更改(标准化代码使用标准化发布的模板代码)
*& 个人代码更改点为如下代码片段(非此片段不能更改)
*&---------------------------------------------------------------------*
*&变更记录: *
*&DATE DEVELOPER REQNO DESCRIPTIONS *
*& ========== ================== ========== ========================*
*&20.11.2023 10:11:30
*&---------------------------------------------------------------------*
REPORT zfi013.
TYPE-POOLS:slis,icon.
TABLES:sscrfields,bkpf.
*----------------------------------------------------------------------*
* 全局类型定义
*----------------------------------------------------------------------*
TYPES:BEGIN OF ty_alv,
bukrs TYPE bkpf-bukrs, "公司代码
matnr TYPE vbrp-matnr, "物料
werks TYPE vbrp-werks, "工厂
vkorg_auft TYPE vbrp-vkorg_auft, "销售组织
gjahr1 TYPE bkpf-gjahr, "会计年度
monat1 TYPE bkpf-monat, "期间
ktgrd TYPE vbrk-ktgrd, "客户科目组
ktgrm TYPE vbrp-ktgrm, "物料科目设置组
gjahr TYPE bkpf-gjahr, "会计年度
monat TYPE bkpf-monat, "期间
vbeln TYPE vbrp-vbeln, "发票号
posnr TYPE vbrp-posnr, "发票行项目
belnr TYPE bkpf-belnr, "会计凭证
vgbel TYPE lips-vbeln, "交货单号
vgpos TYPE lips-posnr, "交货单行项目
aubel TYPE vbrp-aubel, "销售凭证
aupos TYPE vbrp-aupos, "销售凭证项目
prctr TYPE vbrp-prctr, "利润中心
vtext TYPE tvkot-vtext, "销售组织描述
kunrg_ana TYPE vbrp-kunrg_ana, "客户
name1 TYPE kna1-name1, "客户名称
vtext2 TYPE tvktt-vtext, "客户科目组名称
arktx TYPE vbrp-arktx, "物料描述
matkl TYPE vbrp-matkl, "物料组
wgbez TYPE text20, "物料组描述
vtext3 TYPE v_tvkm-vtext, "物料科目设置组描述
fkimg TYPE vbrp-fkimg, "开票数量
lfimg TYPE lips-lfimg, "交货数量
fksta TYPE lips-fksta, "开票状态
wsl1 TYPE acdoca-wsl, "发出商品差异
wsl2 TYPE acdoca-wsl, "本期调整差异
cbox TYPE char2, "复选框
status TYPE char04, "状态灯
msg TYPE string, "消息
belnr1 TYPE bkpf-belnr, "调整凭证
belnr2 TYPE bkpf-belnr, "冲销凭证
wsl TYPE acdoca-wsl,
racct TYPE acdoca-racct,
blart TYPE acdoca-blart,
sfakn TYPE vbrk-sfakn,
shkzg TYPE vbrp-shkzg,
END OF ty_alv.
TYPES:BEGIN OF ty_alv2,
bukrs TYPE bkpf-bukrs, "公司代码
gjahr TYPE bkpf-gjahr, "会计年度
monat TYPE bkpf-monat, "期间
vbeln TYPE vbrp-vbeln, "发票号
posnr TYPE vbrp-posnr, "发票行项目
prctr TYPE vbrp-prctr, "利润中心
matnr TYPE vbrp-matnr, "物料
werks TYPE vbrp-werks, "工厂
vkorg_auft TYPE vbrp-vkorg_auft, "销售组织
ktgrd TYPE vbrk-ktgrd, "客户科目组
ktgrm TYPE vbrp-ktgrm, "物料科目设置组
belnr TYPE bkpf-belnr, "会计凭证
vgbel TYPE lips-vbeln, "交货单号
vgpos TYPE lips-posnr, "交货单行项目
aubel TYPE vbrp-aubel, "销售凭证
aupos TYPE vbrp-aupos, "销售凭证项目
vtext TYPE tvkot-vtext, "销售组织描述
kunrg_ana TYPE vbrp-kunrg_ana, "客户
name1 TYPE kna1-name1, "客户名称
vtext2 TYPE tvktt-vtext, "客户科目组名称
arktx TYPE vbrp-arktx, "物料描述
matkl TYPE vbrp-matkl, "物料组
wgbez TYPE text20, "物料组描述
vtext3 TYPE v_tvkm-vtext, "物料科目设置组描述
fkimg TYPE vbrp-fkimg, "开票数量
lfimg TYPE lips-lfimg, "交货数量
fksta TYPE lips-fksta, "开票状态
wsl1 TYPE acdoca-wsl, "发出商品差异
wsl2 TYPE acdoca-wsl, "本期调整差异
cbox TYPE char2, "复选框
status TYPE char04, "状态灯
msg TYPE string, "消息
belnr1 TYPE bkpf-belnr, "调整凭证
belnr2 TYPE bkpf-belnr, "冲销凭证
wsl TYPE acdoca-wsl,
racct TYPE acdoca-racct,
blart TYPE acdoca-blart,
END OF ty_alv2.
*----------------------------------------------------------------------*
* 全局变量定义
*----------------------------------------------------------------------*
DATA:gt_alv TYPE TABLE OF ty_alv,
gs_alv TYPE ty_alv,
gt_data TYPE TABLE OF ty_alv,
gs_data TYPE ty_alv.
DATA:
gt_data2 TYPE TABLE OF ty_alv2,
gs_data2 TYPE ty_alv2.
DATA:gt_fi013 TYPE TABLE OF ztfi013,
gs_fi013 TYPE ztfi013.
DATA:gv_wsl TYPE acdoca-wsl.
*----------------------------------------------------------------------*
* 常量定义
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* 宏定义
*----------------------------------------------------------------------*
DEFINE init_fieldcat.
CLEAR gs_fieldcat.
gs_fieldcat-fieldname = &1."表中字段名,大写
gs_fieldcat-coltext = &2."alv显示字段名
gs_fieldcat-key = &3.
gs_fieldcat-no_zero = &4.
gs_fieldcat-icon = &5.
gs_fieldcat-ref_table = &6.
gs_fieldcat-ref_field = &7.
gs_fieldcat-no_out = &8.
gs_fieldcat-outputlen = &9.
APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
*----------------------------------------------------------------------*
* ALV定义
*----------------------------------------------------------------------*
DATA:gt_fieldcat TYPE lvc_t_fcat, "字段目录内表
gs_fieldcat TYPE lvc_s_fcat, "字段目录工作区
gs_layout TYPE lvc_s_layo. "用于定义ALV表单的相关格式、属性
*----------------------------------------------------------------------*
* 选择屏幕
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1.
PARAMETERS:p_bukrs TYPE bkpf-bukrs OBLIGATORY, "公司代码
p_gjahr TYPE bkpf-gjahr OBLIGATORY, "会计年度
p_monat TYPE bkpf-monat OBLIGATORY. "期间
SELECTION-SCREEN END OF BLOCK b1.
*--------------------------------------------------------------------*
*事件流 1
*--------------------------------------------------------------------*
INITIALIZATION.
*--------------------------------------------------------------------*
*事件流 2
*--------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT .
*--------------------------------------------------------------------*
*事件流 3
*--------------------------------------------------------------------*
AT SELECTION-SCREEN.
*--------------------------------------------------------------------*
*事件流 4
*--------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM frm_get_data. "获取数据
PERFORM frm_display. "数据展示
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data .
*获取发票凭证
SELECT vbrp~vbeln ,
vbrp~posnr ,
acdoca~rbukrs AS bukrs ,
acdoca~gjahr ,
acdoca~poper AS monat ,
acdoca~wsl ,
acdoca~racct ,
acdoca~blart ,
vbrk~belnr ,
vbrk~ktgrd ,
vbrp~vgbel ,
vbrp~vgpos ,
vbrp~aubel ,
vbrp~aupos ,
vbrp~prctr ,
vbrp~vkorg_auft ,
vbrp~kunrg_ana ,
vbrp~matnr ,
vbrp~arktx ,
vbrp~werks ,
vbrp~matkl ,
vbrp~ktgrm ,
vbrp~fkimg ,
vbrk~sfakn ,
vbrp~shkzg
* substring( likp~wadat_ist , 1 ,4 ) AS gjahr1,
* substring( likp~wadat_ist , 5 ,2 ) AS monat1
FROM acdoca
JOIN vbrp ON acdoca~awref = vbrp~vbeln AND acdoca~awitem = vbrp~posnr
JOIN vbrk ON acdoca~awref = vbrk~vbeln
JOIN likp ON vbrp~vgbel = likp~vbeln
WHERE acdoca~rbukrs = @p_bukrs
AND acdoca~gjahr = @p_gjahr
AND acdoca~poper = @p_monat
* AND substring( likp~wadat_ist , 1 ,4 ) = @p_gjahr
* AND substring( likp~wadat_ist , 5 ,2 ) = @p_monat
AND acdoca~blart IN ('RV','ML')
INTO CORRESPONDING FIELDS OF TABLE @gt_alv.
* AND vbrp~shkzg = ''
* AND vbrk~sfakn = ''.
IF gt_alv IS NOT INITIAL.
DATA:lr_range LIKE RANGE OF vbrk-vbeln.
DATA:lrs_range LIKE LINE OF lr_range.
*排除被冲销的数据
CLEAR:lr_range,lrs_range.
LOOP AT gt_alv INTO gs_alv WHERE sfakn <> ''.
APPEND VALUE #( sign = 'I' option = 'EQ' low = gs_alv-sfakn ) TO lr_range.
APPEND VALUE #( sign = 'I' option = 'EQ' low = gs_alv-vbeln ) TO lr_range.
ENDLOOP.
DELETE gt_alv WHERE vbeln IN lr_range.
"销售组织描述
SELECT spras,
vkorg,
vtext
INTO TABLE @DATA(lt_tvkot)
FROM tvkot
FOR ALL ENTRIES IN @gt_alv
WHERE vkorg = @gt_alv-vkorg_auft
AND spras = @sy-langu.
SORT lt_tvkot BY vkorg.
"客户名称
SELECT kunnr,
name1
INTO TABLE @DATA(lt_kna1)
FROM kna1
FOR ALL ENTRIES IN @gt_alv
WHERE kunnr = @gt_alv-kunrg_ana.
SORT lt_kna1 BY kunnr.
"客户科目组名称
SELECT spras,
ktgrd,
vtext
INTO TABLE @DATA(lt_tvktt)
FROM tvktt
FOR ALL ENTRIES IN @gt_alv
WHERE ktgrd = @gt_alv-ktgrd
AND spras = @sy-langu.
SORT lt_tvktt BY ktgrd.
"物料组描述
SELECT matkl,
wgbez,
spras
INTO TABLE @DATA(lt_t023t)
FROM t023t
FOR ALL ENTRIES IN @gt_alv
WHERE matkl = @gt_alv-matkl
AND spras = @sy-langu.
SORT lt_t023t BY matkl.
"物料科目设置组描述
SELECT ktgrm,
vtext
INTO TABLE @DATA(lt_tvkmt)
FROM tvkmt
FOR ALL ENTRIES IN @gt_alv
WHERE ktgrm = @gt_alv-ktgrm
AND spras = @sy-langu.
SORT lt_tvkmt BY ktgrm.
"交货数量、开票状态
SELECT lips~vbeln,
lips~posnr,
lips~lfimg,
lips~fksta,
lips~fkivp,
likp~lfart,
likp~wadat_ist
INTO TABLE @DATA(lt_lips)
FROM lips
JOIN likp ON lips~vbeln = likp~vbeln
FOR ALL ENTRIES IN @gt_alv
WHERE lips~vbeln = @gt_alv-vgbel
AND lips~posnr = @gt_alv-vgpos.
SORT lt_lips BY vbeln posnr.
*&&&---数据处理
*发出商品差异总额
* LOOP AT gt_alv INTO gs_alv WHERE blart = 'ML' AND racct = '1407010001'.
* gv_wsl = gv_wsl + gs_alv-wsl.
* CLEAR:gs_alv.
* ENDLOOP.
DATA:lv_fkimg TYPE vbrp-fkimg, "开票数量
lv_lfimg TYPE lips-lfimg. "交货数量
gt_data = gt_alv.
SORT gt_data BY vbeln posnr.
DELETE ADJACENT DUPLICATES FROM gt_data COMPARING vbeln posnr.
SORT gt_data BY bukrs gjahr monat matnr werks vkorg_auft ktgrd ktgrm.
LOOP AT gt_data INTO gs_data.
"销售组织描述
READ TABLE lt_tvkot INTO DATA(ls_tvkot) WITH KEY vkorg = gs_data-vkorg_auft BINARY SEARCH.
IF sy-subrc = 0.
gs_data-vtext = ls_tvkot-vtext.
CLEAR:ls_tvkot.
ENDIF.
""客户名称
READ TABLE lt_kna1 INTO DATA(ls_kna1) WITH KEY kunnr = gs_data-kunrg_ana BINARY SEARCH.
IF sy-subrc = 0.
gs_data-name1 = ls_kna1-name1.
CLEAR:ls_kna1.
ENDIF.
"客户科目组名称
READ TABLE lt_tvktt INTO DATA(ls_tvktt) WITH KEY ktgrd = gs_data-ktgrd BINARY SEARCH.
IF sy-subrc = 0.
gs_data-vtext2 = ls_tvktt-vtext.
CLEAR:ls_tvktt.
ENDIF.
"物料组描述
READ TABLE lt_t023t INTO DATA(ls_t023t) WITH KEY matkl = gs_data-matkl BINARY SEARCH.
IF sy-subrc = 0.
gs_data-wgbez = ls_t023t-wgbez.
CLEAR:ls_t023t.
ENDIF.
"物料科目设置组描述
READ TABLE lt_tvkmt INTO DATA(ls_tvkmt) WITH KEY ktgrm = gs_data-ktgrm BINARY SEARCH.
IF sy-subrc = 0.
gs_data-vtext3 = ls_tvkmt-vtext.
CLEAR:ls_tvkmt.
ENDIF.
"交货数量、开票状态
READ TABLE lt_lips INTO DATA(ls_lips) WITH KEY vbeln = gs_data-vgbel posnr = gs_data-vgpos BINARY SEARCH.
IF sy-subrc = 0.
gs_data-lfimg = ls_lips-lfimg.
IF ls_lips-lfart = 'NLCC'.
gs_data-fksta = ls_lips-fkivp.
ELSE.
gs_data-fksta = ls_lips-fksta.
ENDIF.
*增加交货年度
gs_data-gjahr1 = ls_lips-wadat_ist+(4).
gs_data-monat1 = ls_lips-wadat_ist+4(2).
CLEAR:ls_lips.
ENDIF.
* "发出商品差异
* gs_data-wsl1 = gv_wsl.
MODIFY gt_data FROM gs_data.
CLEAR:gs_data.
ENDLOOP.
DATA(lt_alv) = gt_data.
SORT lt_alv BY bukrs gjahr1 monat1 werks matnr .
DELETE ADJACENT DUPLICATES FROM lt_alv COMPARING bukrs gjahr1 monat1 werks matnr .
SELECT
a~monat1,
rbukrs,
acdoca~gjahr AS gjahr1,
acdoca~werks,
acdoca~matnr,
SUM( acdoca~wsl ) AS wsl
FROM acdoca
INNER JOIN @lt_alv AS a ON a~bukrs = acdoca~rbukrs
AND a~werks = acdoca~werks
AND a~matnr = acdoca~matnr
AND a~gjahr1 = acdoca~gjahr
AND a~monat1 = substring( acdoca~poper , 2,2 )
WHERE acdoca~blart = 'ML'
AND acdoca~racct = '1407010001'
GROUP BY
a~monat1,
rbukrs,
acdoca~gjahr,
acdoca~werks,
acdoca~matnr
INTO TABLE @DATA(lt_acdo).
LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs1>).
READ TABLE lt_acdo INTO DATA(ls_acdo) WITH KEY rbukrs = <fs1>-bukrs
gjahr1 = <fs1>-gjahr1
werks = <fs1>-werks
matnr = <fs1>-matnr
monat1 = <fs1>-monat1 .
IF sy-subrc = 0.
<fs1>-wsl1 = ls_acdo-wsl.
ENDIF.
CLEAR ls_acdo.
ENDLOOP.
LOOP AT gt_data INTO gs_data.
"开票数量加总
lv_fkimg = lv_fkimg + gs_data-fkimg.
"交货数量加总
lv_lfimg = lv_lfimg + gs_data-lfimg.
MOVE-CORRESPONDING gs_data TO gs_alv.
CLEAR ls_acdo.
READ TABLE lt_acdo INTO ls_acdo WITH KEY rbukrs = gs_data-bukrs
gjahr1 = gs_data-gjahr1
monat1 = gs_data-monat1
matnr = gs_data-matnr
werks = gs_data-werks .
AT END OF ktgrm.
"本期差异调整
IF lv_lfimg <> 0.
gs_data-wsl2 = ls_acdo-wsl * ( lv_fkimg / lv_lfimg ).
ELSE.
gs_data-wsl2 = 0.
ENDIF.
LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<lv_data>) WHERE matnr = gs_alv-matnr
AND werks = gs_alv-werks
AND vkorg_auft = gs_alv-vkorg_auft
AND ktgrd = gs_alv-ktgrd
AND gjahr1 = gs_alv-gjahr1
AND monat1 = gs_alv-monat1
AND ktgrm = gs_alv-ktgrm.
<lv_data>-wsl2 = gs_data-wsl2.
ENDLOOP.
CLEAR:lv_fkimg,lv_lfimg,gs_data.
ENDAT.
ENDLOOP.
ENDIF.
IF gt_data IS NOT INITIAL .
SELECT * FROM ztfi013
FOR ALL ENTRIES IN @gt_data
WHERE bukrs = @gt_data-bukrs
AND gjahr = @gt_data-gjahr
AND monat = @gt_data-monat
AND vbeln = @gt_data-vbeln
AND posnr = @gt_data-posnr
INTO TABLE @DATA(lt_fi013).
SORT lt_fi013 BY bukrs
gjahr
monat
vbeln
posnr.
LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<data>).
READ TABLE lt_fi013 INTO DATA(ls_013) WITH KEY bukrs = <data>-bukrs
gjahr = <data>-gjahr
monat = <data>-monat
vbeln = <data>-vbeln
posnr = <data>-posnr BINARY SEARCH.
IF sy-subrc = 0.
<data>-belnr1 = ls_013-belnr1.
<data>-belnr2 = ls_013-belnr2.
ENDIF.
CLEAR ls_013.
ENDLOOP.
SORT gt_data BY vbeln posnr.
CLEAR:gv_wsl.
endif.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display .
PERFORM frm_fieldcat.
PERFORM frm_build_layout.
PERFORM frm_alvout.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_fieldcat .
REFRESH gt_fieldcat.
* 复选框
CLEAR gs_fieldcat .
gs_fieldcat-fieldname = 'CBOX' .
gs_fieldcat-scrtext_l = '复选框' .
gs_fieldcat-checkbox = 'X'.
gs_fieldcat-edit = 'X'.
gs_fieldcat-key = 'X'.
* ls_fcat2-hotspot = 'X'.
APPEND gs_fieldcat TO gt_fieldcat.
init_fieldcat 'STATUS ' '状态灯' '' '' '' '' '' '' '' .
init_fieldcat 'MSG ' '消息' '' '' '' '' '' '' '' .
init_fieldcat 'BUKRS ' '公司代码' '' '' '' 'BKPF' 'BUKRS' '' '' .
init_fieldcat 'GJAHR ' '开票会计年度' '' '' '' 'BKPF' 'GJAHR' '' '' .
init_fieldcat 'MONAT ' '开票期间' '' '' '' 'BKPF' 'MONAT' '' '' .
init_fieldcat 'VBELN ' '发票号' '' '' '' 'VBRP' 'VBELN' '' '' .
init_fieldcat 'POSNR ' '发票行项目' '' '' '' 'VBRP' 'POSNR' '' '' .
init_fieldcat 'BELNR ' '会计凭证' '' '' '' 'BKPF' 'BELNR' '' '' .
init_fieldcat 'VGBEL ' '交货单号' '' '' '' 'LIPS' 'VBELN' '' '' .
init_fieldcat 'VGPOS ' '交货单行项目' '' '' '' 'LIPS' 'POSNR' '' '' .
init_fieldcat 'AUBEL ' '销售凭证' '' '' '' 'VBRP' 'AUBEL' '' '' .
init_fieldcat 'AUPOS ' '销售凭证项目' '' '' '' 'VBRP' 'AUPOS' '' '' .
init_fieldcat 'GJAHR1 ' '交货会计年度' '' '' '' 'BKPF' 'GJAHR' '' '' .
init_fieldcat 'MONAT1 ' '交货期间' '' '' '' 'BKPF' 'MONAT' '' '' .
init_fieldcat 'PRCTR ' '利润中心' '' '' '' 'VBRP' 'PRCTR' '' '' .
init_fieldcat 'VKORG_AUFT ' '销售组织' '' '' '' 'VBRP' 'VKORG_AUFT' '' '' .
init_fieldcat 'VTEXT ' '销售组织描述' '' '' '' 'TVKOT' 'VTEXT' '' '' .
init_fieldcat 'KUNRG_ANA ' '客户' '' '' '' 'VBRP' 'KUNRG_ANA' '' '' .
init_fieldcat 'NAME1 ' '客户名称' '' '' '' 'KNA1' 'NAME1' '' '' .
init_fieldcat 'KTGRD ' '客户组科目' '' '' '' 'VBRK' 'KTGRD' '' '' .
init_fieldcat 'VTEXT2 ' '客户科目组名称' '' '' '' 'TVKTT' 'VTEXT' '' '' .
init_fieldcat 'MATNR ' '物料' '' '' '' 'VBRP' 'MATNR' '' '' .
init_fieldcat 'ARKTX ' '物料描述' '' '' '' 'VBRP' 'ARKTX' '' '' .
init_fieldcat 'WERKS ' '工厂' '' '' '' 'VBRP' 'WERKS' '' '' .
init_fieldcat 'MATKL ' '物料组' '' '' '' 'VBRP' 'MATKL' '' '' .
init_fieldcat 'WGBEZ ' '物料组描述' '' '' '' '' '' '' '' .
init_fieldcat 'KTGRM ' '物料科目设置组' '' '' '' 'VBRP' 'KTGRM' '' '' .
init_fieldcat 'VTEXT3 ' '物料科目设置组描述' '' '' '' 'VBRP' 'VTEXT' '' '' .
init_fieldcat 'FKIMG ' '开票数量' '' '' '' 'VBRP' 'KTGRM' '' '' .
init_fieldcat 'LFIMG ' '交货数量' '' '' '' 'LIPS' 'LFIMG' '' '' .
init_fieldcat 'FKSTA ' '开票状态' '' '' '' 'LIPS' 'FKSTA' '' '' .
init_fieldcat 'WSL1 ' '发出商品差异' '' '' '' 'ACDOCA' 'WSL' '' '' .
init_fieldcat 'WSL2 ' '本期调整差异' '' '' '' 'ACDOCA' 'WSL' '' '' .
init_fieldcat 'BELNR1 ' '调整凭证' '' '' '' 'BKPF' 'BELNR' '' '' .
init_fieldcat 'BELNR2 ' '冲销凭证' '' '' '' 'BKPF' 'BELNR' '' '' .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_build_layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_build_layout .
CLEAR gs_layout.
gs_layout-sel_mode = 'A'. "设置选择模式"
gs_layout-cwidth_opt = 'X'. "优化列宽设置"
gs_layout-zebra = 'X'. "设置斑马线"
* gs_layout-box_fname = 'CBOX'. "行可选中
gs_layout-no_toolbar = 'X'. "隐藏工具栏。
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_alvout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_alvout .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
* i_grid_title = r_title
i_callback_program = sy-repid
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat
* it_event_exit = gt_event_exit[]
* I_GRID_SETTINGS = GW_LVC_S_GLAY
i_callback_pf_status_set = 'PF_STATUS_SET'
i_callback_user_command = 'USER_COMMAND'
i_default = 'X'
i_save = 'A'
TABLES
t_outtab = gt_data
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form PF_STATUS_SET
FORM pf_status_set USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD'. "自定义状态名称
ENDFORM.
*----------------------------------------------------------------------*
* -->R_UCOMM text
* -->RS_SELFIELD text
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
DATA: lo_grid TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lo_grid. "获取全局变量
CALL METHOD lo_grid->check_changed_data. "获取响应事件
CASE r_ucomm.
WHEN 'ZPOST'.
PERFORM frm_zpost.
WHEN 'ZCX'.
PERFORM frm_zcx.
ENDCASE.
CALL METHOD lo_grid->check_changed_data. "获取响应事件
rs_selfield-refresh = 'X'. "刷新界面
rs_selfield-col_stable = 'X'.
rs_selfield-row_stable = 'X'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_zpost
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_zpost.
*&---BAPI变量定义
DATA:ls_documentheader TYPE bapiache09, "抬头
lt_accountgl TYPE STANDARD TABLE OF bapiacgl09, "总账
ls_accountgl TYPE bapiacgl09,
lt_accountreceivable TYPE STANDARD TABLE OF bapiacar09, "客户
ls_accountreceivable TYPE bapiacar09,
lt_accountpayable TYPE STANDARD TABLE OF bapiacap09, "供应商
ls_accountpayable TYPE bapiacap09,
lt_currencyamount TYPE STANDARD TABLE OF bapiaccr09, "金额
ls_currencyamount TYPE bapiaccr09,
lt_tax TYPE STANDARD TABLE OF bapiactx09, "税
ls_tax TYPE bapiactx09,
lt_copac TYPE STANDARD TABLE OF bapiackec9, "CO-PA 科目分配特性
ls_copac TYPE bapiackec9,
lt_copav TYPE STANDARD TABLE OF bapiackev9, "CO-PA 科目分配值字段
ls_copav TYPE bapiackev9,
lt_extension2 TYPE STANDARD TABLE OF bapiparex, "增强字段
ls_extension2 TYPE bapiparex,
ls_zsfi_bseg TYPE zsfi_bseg,
lt_return TYPE STANDARD TABLE OF bapiret2, "返回消息
ls_return TYPE bapiret2,
lv_key TYPE bapiache09-obj_key, "返回凭证号
lv_msg TYPE bapi_msg,
lv_msg2 TYPE bapi_msg,
lt_mwdat TYPE TABLE OF rtax1u15, "税计算
ls_mwdat TYPE rtax1u15.
DATA:lv_date TYPE sy-datum.
lv_date = p_gjahr && p_monat && '00'.
* 获取本月最后一天
CALL FUNCTION 'LAST_DAY_OF_MONTHS'
EXPORTING
day_in = lv_date " 输入日期 20140101
IMPORTING
last_day_of_month = lv_date "返回日期:20140131
EXCEPTIONS
day_in_no_date = 1
OTHERS = 2.
IF gt_data IS NOT INITIAL .
SELECT vkorg,
ktgrd,
ktgrm,
sakn2
INTO TABLE @DATA(lt_c001)
FROM c001
FOR ALL ENTRIES IN @gt_data
WHERE vkorg = @gt_data-vkorg_auft
AND ktgrd = @gt_data-ktgrd
AND ktgrm = @gt_data-ktgrm
AND kschl = 'KOFI'
AND ktopl = 'ZUCH'
AND kvsl1 = 'ZV1'.
SORT lt_c001 BY vkorg ktgrd ktgrm.
ENDIF.
*检查会计凭证是否存在
IF gt_data IS NOT INITIAL.
"冲销凭证
* SELECT BUKRS,
* BELNR,
* GJAHR,
* STBLG
* INTO TABLE @DATA(lt_bkpf)
* FROM bkpf
* FOR ALL ENTRIES IN @gt_data
* WHERE bukrs = @gt_data-bukrs
* AND gjahr = @gt_data-gjahr
* AND belnr = @gt_data-belnr.
* SORT lt_bkpf by bukrs gjahr belnr.
ENDIF.
IF gt_data IS NOT INITIAL.
SELECT bukrs,
gjahr,
monat,
vbeln,
posnr,
belnr1,
belnr2
INTO TABLE @DATA(lt_log)
FROM ztfi013
FOR ALL ENTRIES IN @gt_data
WHERE bukrs = @gt_data-bukrs
AND gjahr = @gt_data-gjahr
AND monat = @gt_data-monat
AND vbeln = @gt_data-vbeln
AND posnr = @gt_data-posnr.
SORT lt_log BY bukrs gjahr monat vbeln posnr.
ENDIF.
*抬头数据
" 公司代码
ls_documentheader-username = sy-uname.
ls_documentheader-comp_code = p_bukrs.
" 凭证日期
ls_documentheader-doc_date = lv_date.
" 过账日期
ls_documentheader-pstng_date = lv_date.
" 凭证类型
ls_documentheader-doc_type = 'SU'.
" 过账期间
ls_documentheader-fis_period = p_monat.
* " 参考凭证号
* ls_documentheader-ref_doc_no = ls_head-xblnr.
" 凭证抬头文本
ls_documentheader-header_txt = p_monat && '月发出商品差异调整'.
*数据执行
MOVE-CORRESPONDING gt_data TO gt_data2.
SORT gt_data2 BY vbeln posnr.
LOOP AT gt_data2 INTO gs_data2 WHERE cbox = 'X'.
READ TABLE lt_log INTO DATA(ls_log) WITH KEY bukrs = gs_data-bukrs gjahr = gs_data-gjahr monat = gs_data-monat
vbeln = gs_data-vbeln posnr = gs_data-posnr BINARY SEARCH.
IF sy-subrc = 0.
IF ls_log-belnr1 IS NOT INITIAL AND ls_log-belnr2 IS INITIAL.
gs_data2-status = icon_red_light."红灯
gs_data2-msg = '请先冲销调整凭证!'.
MODIFY gt_data2 FROM gs_data2.
CONTINUE.
ENDIF.
ENDIF.
CLEAR:gs_alv.
MOVE-CORRESPONDING gs_data2 TO gs_alv.
AT END OF vbeln.
*行项目数据1
"行项目编号
ls_zsfi_bseg-posnr = '10'.
"记账码
IF gs_alv-wsl2 < 0.
ls_zsfi_bseg-bschl = '40'.
ELSE.
ls_zsfi_bseg-bschl = '50'.
ENDIF.
ls_extension2-structure = 'ZSFI_BSEG'.
ls_extension2-valuepart1 = ls_zsfi_bseg. " ZSFI_BSEG超出240位就放VALUEPART2/3/4
APPEND ls_extension2 TO lt_extension2.
CLEAR:ls_accountgl.
" 行项目编号
ls_accountgl-itemno_acc = '10'.
"总账科目
ls_accountgl-gl_account = '1407010001'.
" 利润中心
ls_accountgl-profit_ctr = gs_alv-prctr.
"分配编号
ls_accountgl-alloc_nmbr = gs_alv-matnr.
"项目文本
ls_accountgl-item_text = gs_alv-arktx.
APPEND ls_accountgl TO lt_accountgl.
CLEAR:ls_accountgl.
*金额
CLEAR:ls_currencyamount.
" 行项目编号
ls_currencyamount-itemno_acc = '10'.
" 货币码
ls_currencyamount-currency = 'CNY'.
" 交易货币金额
IF gs_alv-wsl2 < 0.
ls_currencyamount-amt_doccur = abs( gs_alv-wsl2 ).
ELSE.
ls_currencyamount-amt_doccur = -1 * abs( gs_alv-wsl2 ).
ENDIF.
APPEND ls_currencyamount TO lt_currencyamount.
*行项目数据2
"行项目编号
ls_zsfi_bseg-posnr = '20'.
"记账码
IF gs_alv-wsl2 < 0.
ls_zsfi_bseg-bschl = '50'.
ELSE.
ls_zsfi_bseg-bschl = '40'.
ENDIF.
ls_extension2-structure = 'ZSFI_BSEG'.
ls_extension2-valuepart1 = ls_zsfi_bseg. " ZSFI_BSEG超出240位就放VALUEPART2/3/4
APPEND ls_extension2 TO lt_extension2.
" 行项目编号
ls_accountgl-itemno_acc = '20'.
"总账科目
READ TABLE lt_c001 INTO DATA(ls_c001) WITH KEY vkorg = gs_alv-vkorg_auft ktgrd = gs_alv-ktgrd ktgrm = gs_alv-ktgrm BINARY SEARCH.
IF sy-subrc = 0.
ls_accountgl-gl_account = ls_c001-sakn2.
CLEAR:ls_c001.
ENDIF.
" 利润中心
ls_accountgl-profit_ctr = gs_alv-prctr.
"分配编号
ls_accountgl-alloc_nmbr = gs_alv-matnr.
"项目文本
ls_accountgl-item_text = gs_alv-arktx.
APPEND ls_accountgl TO lt_accountgl.
CLEAR:ls_accountgl.
*金额
CLEAR:ls_currencyamount.
" 行项目编号
ls_currencyamount-itemno_acc = '20'.
" 货币码
ls_currencyamount-currency = 'CNY'.
" 交易货币金额
IF gs_alv-wsl1 > 0.
ls_currencyamount-amt_doccur = abs( gs_alv-wsl2 ).
ELSE.
ls_currencyamount-amt_doccur = -1 * abs( gs_alv-wsl2 ).
ENDIF.
APPEND ls_currencyamount TO lt_currencyamount.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = ls_documentheader
IMPORTING
obj_key = lv_key
TABLES
accountgl = lt_accountgl
accountreceivable = lt_accountreceivable
accountpayable = lt_accountpayable
accounttax = lt_tax
currencyamount = lt_currencyamount
criteria = lt_copac
valuefield = lt_copav
extension2 = lt_extension2
return = lt_return.
CLEAR:lv_msg.
LOOP AT lt_return INTO ls_return WHERE type = 'E' OR type = 'A'.
CLEAR:lv_msg2.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = ls_return-id
msgnr = ls_return-number
msgv1 = ls_return-message_v1
msgv2 = ls_return-message_v2
msgv3 = ls_return-message_v3
msgv4 = ls_return-message_v4
IMPORTING
message_text_output = lv_msg2.
lv_msg = |{ lv_msg }/{ lv_msg2 }|.
ENDLOOP.
IF lv_msg IS NOT INITIAL .
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT gt_data2 ASSIGNING FIELD-SYMBOL(<lv_data1>) WHERE vbeln = gs_alv-vbeln.
<lv_data1>-status = icon_red_light."红灯
<lv_data1>-msg = lv_msg.
ENDLOOP.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
LOOP AT gt_data2 ASSIGNING FIELD-SYMBOL(<lv_data2>) WHERE vbeln = gs_alv-vbeln .
<lv_data2>-status = icon_green_light."绿灯
<lv_data2>-msg = '会计凭证创建成功!'.
<lv_data2>-belnr1 = lv_key+0(10).
ENDLOOP.
"o_resp-sapnum = lv_key+0(10).
ENDIF.
CLEAR:ls_zsfi_bseg,lt_extension2,lt_return,lt_accountgl,ls_accountgl,lt_currencyamount,ls_currencyamount.
ENDAT.
ENDLOOP.
*存表
CLEAR:gt_data.
MOVE-CORRESPONDING gt_data2 TO gt_data.
DELETE gt_data2 WHERE cbox <> 'X'.
MOVE-CORRESPONDING gt_data2 TO gt_fi013.
MODIFY ztfi013 FROM TABLE gt_fi013.
COMMIT WORK.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_zcx
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_zcx.
DATA : l_bkpf TYPE bkpf.
DATA : l_reversal TYPE bapiacrev,
l_bus_act TYPE bapiache09-bus_act,
l_obj_key TYPE bapiacrev-obj_key,
gt_return TYPE TABLE OF bapiret2 WITH HEADER LINE,
i_return TYPE bapiret2.
IF gt_data IS NOT INITIAL.
SELECT bukrs,
gjahr,
monat,
vbeln,
posnr,
belnr1,
belnr2
INTO TABLE @DATA(gt_log)
FROM ztfi013
FOR ALL ENTRIES IN @gt_data
WHERE bukrs = @gt_data-bukrs
AND gjahr = @gt_data-gjahr
AND monat = @gt_data-monat
AND vbeln = @gt_data-vbeln
AND posnr = @gt_data-posnr.
SORT gt_log BY bukrs gjahr monat vbeln posnr.
ENDIF.
CLEAR:gt_data2[].
MOVE-CORRESPONDING gt_data TO gt_data2.
LOOP AT gt_data2 INTO gs_data2 WHERE cbox = 'X'.
"校验日志
READ TABLE gt_log INTO DATA(gs_log) WITH KEY bukrs = gs_data2-bukrs gjahr = gs_data2-gjahr monat = gs_data2-monat
vbeln = gs_data2-vbeln posnr = gs_data2-posnr BINARY SEARCH.
IF sy-subrc = 0.
IF gs_log-belnr1 IS INITIAL.
gs_data2-status = icon_red_light."红灯
gs_data2-msg = '未进行调整,不允许冲销!'.
MODIFY gt_data2 FROM gs_data2.
CONTINUE.
ENDIF.
ENDIF.
CLEAR:gs_alv.
MOVE-CORRESPONDING gs_data2 TO gs_alv.
AT END OF vbeln.
SELECT SINGLE * FROM bkpf INTO l_bkpf WHERE bukrs = gs_alv-bukrs
AND belnr = gs_alv-belnr1
AND gjahr = gs_alv-gjahr
AND xreversal = ''.
IF sy-subrc <> 0.
LOOP AT gt_data2 ASSIGNING FIELD-SYMBOL(<ls_data3>) WHERE vbeln = gs_alv-vbeln.
<ls_data3>-status = icon_red_light."红灯
<ls_data3>-msg = '没有数据或该凭证已冲销!'.
ENDLOOP.
ELSE.
l_reversal-obj_type = l_bkpf-awtyp.
l_reversal-obj_key_r = l_bkpf-awkey.
l_reversal-pstng_date = l_bkpf-budat.
l_reversal-fis_period = l_bkpf-monat.
l_reversal-comp_code = l_bkpf-bukrs.
* l_reversal-ac_doc_no = l_bkpf-belnr.
l_reversal-reason_rev = '03'.
* 取得系统 LOGICAL SYSTEM
CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
IMPORTING
own_logical_system = l_reversal-obj_sys.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_REV_POST'
EXPORTING
reversal = l_reversal
bus_act = l_bkpf-glvor
* IMPORTING
* OBJ_TYPE =
obj_key = l_obj_key
* OBJ_SYS =
TABLES
return = gt_return.
READ TABLE gt_return WITH KEY type = 'E'.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT gt_data2 ASSIGNING FIELD-SYMBOL(<ls_data1>) WHERE vbeln = gs_alv-vbeln.
<ls_data1>-status = icon_red_light."红灯
<ls_data1>-msg = '冲销失败!'.
ENDLOOP.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
LOOP AT gt_data2 ASSIGNING FIELD-SYMBOL(<ls_data2>) WHERE vbeln = gs_alv-vbeln .
<ls_data2>-status = icon_green_light."绿灯
<ls_data2>-msg = '冲销成功!'.
<ls_data2>-belnr2 = l_obj_key(10).
ENDLOOP.
ENDIF.
ENDIF.
CLEAR:gt_return,l_obj_key,l_bkpf,l_reversal.
ENDAT.
ENDLOOP.
*存表
CLEAR:gt_data.
MOVE-CORRESPONDING gt_data2 TO gt_data.
DELETE gt_data2 WHERE cbox <> 'X'.
MOVE-CORRESPONDING gt_data2 TO gt_fi013.
MODIFY ztfi013 FROM TABLE gt_fi013.
COMMIT WORK.
ENDFORM.