*&---------------------------------------------------------------------*
*&程序名称 :ZFI144
*&程序描述 : 发出商品计提收入报表 (批量操作 F.02 / 查询 FB03)
*&申请单位 :
*&申请人 :
*&申请日期 :2024年08月09日
*&作者 :
*&---------------------------------------------------------------------*
REPORT zfi144.
TABLES: faglflext,sscrfields, acdoca.
CONSTANTS: gc_icon_green TYPE icon-id VALUE '@08@',
gc_icon_red TYPE icon-id VALUE '@0A@'.
CONSTANTS: gc_saknr2221010600 TYPE saknr VALUE '5001040101',
* gc_saknr2221010500 TYPE saknr VALUE '2221010500',
* gc_saknr2221020100 TYPE saknr VALUE '2221020100',
gc_saknr2221000000 TYPE saknr VALUE '8021000000'.
*&---------------------------------------------------------------------*
*& 数据类型
*&---------------------------------------------------------------------*
TYPES: BEGIN OF s_head,
bukrs TYPE bkpf-bukrs,
belnr TYPE bkpf-belnr,
gjahr TYPE bkpf-gjahr,
blart TYPE bkpf-blart,
bldat TYPE bkpf-bldat,
budat TYPE bkpf-budat,
monat TYPE bkpf-monat,
waers TYPE bkpf-waers,
END OF s_head.
TYPES: t_head TYPE TABLE OF s_head.
TYPES: BEGIN OF s_item,
sel TYPE char1,
belnr TYPE acdoca-belnr, "分录
docln TYPE numc06, "凭证行
saknr TYPE ska1-saknr,
txt50 TYPE skat-txt50,
bschl TYPE acdoca-bschl,
hsl TYPE acdoca-hsl,
rhcur TYPE acdoca-rhcur,
drcrk TYPE acdoca-drcrk,
bukrs TYPE acdoca-rbukrs,
gjahr TYPE acdoca-gjahr,
monat TYPE bkpf-monat,
blart TYPE bkpf-blart,
sgtxt TYPE bseg-sgtxt, "文本
fkber TYPE bseg-fkber, "功能范围
kostl TYPE bseg-kostl, "成本中心
gsber TYPE bseg-gsber, "业务范围
prctr TYPE bseg-prctr, "利润中心
werks TYPE bseg-werks, "工厂
matnr TYPE lips-matnr,
kunag TYPE likp-kunag, "售达方
vbeln TYPE lips-vbeln, "销售出库单号-----链接
posnr TYPE lips-posnr, "销售出库单行号
lgmngs TYPE lips-lgmng, "未开票数量
kmein TYPE lips-kmein,
zuonr TYPE bseg-zuonr,
mwskz TYPE ekpo-mwskz, "税码
* zterm TYPE zterm, "付款条件
koart TYPE koart,
type TYPE bapiret2-type,
message TYPE bapiret2-message,
icon TYPE icon-id,
END OF s_item.
TYPES: t_item TYPE TABLE OF s_item.
"参考ZFI021_NA
TYPES : BEGIN OF ty_alv,
kdmat TYPE lips-kdmat, "客户料号
matnr TYPE lips-matnr, "领胜集团内部料号
arktx TYPE lips-arktx, "物料描述
vgbel TYPE lips-vgbel, "我司订单号 "参考凭证
vbeln TYPE lips-vbeln, "销售出库单号-----链接
posnr TYPE lips-posnr, "销售出库单行号
lgort TYPE lips-lgort, "仓库
* GEWEI TYPE LIPS-GEWEI, "单位
wadat_ist TYPE likp-wadat_ist, "销售出库(退货)日期
zbgno TYPE likp-zbgno, "国内报关发票号
werks TYPE lips-werks, "工厂
kunnr TYPE likp-kunnr, "送达方
kunag TYPE likp-kunag, "售达方
vgpos TYPE lips-vgpos, "参考项目
* LGMNG TYPE LIPS-LGMNG, "数量(库存单位)
wbstk TYPE likp-wbstk, "出发货状态
pstyv TYPE lips-pstyv, "交易类型
erdat1 TYPE lips-erdat, "日期
erdat2 TYPE likp-erdat, "日期
lfimg_s TYPE lips-lfimg, "参考数量
uecha TYPE lips-uecha, "上层项目批
charg TYPE lips-charg, "批次
meins TYPE lips-meins, "基本单位
vrkme TYPE lips-vrkme, "销售单位
umvkz TYPE lips-umvkz, "分子
umvkn TYPE lips-umvkn, "分母
shkzg TYPE mseg-shkzg, "正反方向
gsber TYPE lips-gsber,
bklas TYPE mbew-bklas,
bukrs TYPE bukrs,
gtext TYPE ztsd001-gtext,
* AUART TYPE VBAK-AUART,"交易类型值
bezei TYPE tvakt-bezei, "交易类型值
* AUART TYPE VBAK-AUART, "交易类型值
audat TYPE vbak-audat, "销售订单日期
waerk TYPE vbak-waerk, "币别
bukrs_vf TYPE tvko-bukrs, "法人公司编码
name1 TYPE lfa1-name1, "对应客服
name2 TYPE lfa1-name1, "对应销售
bstkd TYPE vbkd-bstkd, "客户订单号
name_org1 TYPE but000-name_org1, "客户名称
bu_name TYPE t001w-name1, "BU
netprs TYPE p DECIMALS 5, "销售未税单价
mwsbps TYPE vbap-mwsbp, "税率
cmpre TYPE p DECIMALS 5, "销售含税单价
lfimg TYPE lips-lfimg, "出货数量
kzwi3 TYPE vbrp-fkimg, "已开票数量
stprs TYPE ddddlcurrtypes-curr17_8, "P DECIMALS 8, "成本单价
mwsbpss TYPE p DECIMALS 5, "出货含税金额
mwsbpsss TYPE p DECIMALS 5, "出货未税金额
mwsbp_a TYPE p DECIMALS 5, "发出商品金额(实际)
mwsbp_as TYPE p DECIMALS 5, "发出商品金额(标准)
lgobe TYPE t001l-lgobe, "若为VMI,标识code号
lgmngs TYPE lips-lgmng, "未开票数量
mwsbp_1 TYPE ddddlcurrtypes-curr17_5, "P DECIMALS 5, "发出商品金额1
mwsbp_2 TYPE ddddlcurrtypes-curr17_5, "P DECIMALS 5, "发出商品金额2
mwsbp_3 TYPE ddddlcurrtypes-curr17_5, "P DECIMALS 5, "发出商品金额3
mwsbps_a TYPE vbap-mwsbp, "发出商品毛利率
name1_a TYPE t001-butxt, "法人公司名称
erdat TYPE vbrp-erdat, "发出商品报表查询截止时日
gjahr TYPE gjahr,
monat TYPE bseg-h_monat,
kmein TYPE lips-kmein,
hkont TYPE t030-konts,
txt50 TYPE skat-txt50,
zbg TYPE ztmm010-zbgmc, " BG
zbg_xg TYPE ztmm010-zbgmc, " 信管专用BG
zdcbu TYPE char40, " 生产地BU
zjxqj TYPE ztmm010-zjxqj, " 仙剑区间
gewei TYPE lips-gewei, "单位
ntgew TYPE mara-ntgew,
inum TYPE i, "序号
sel TYPE c, "选择
END OF ty_alv.
TYPES : BEGIN OF ty_output,
bukrs TYPE bukrs,
* gtext TYPE ztsd001-gtext,
gjahr TYPE gjahr,
monat TYPE bseg-h_monat,
vbeln TYPE lips-vbeln, "销售出库单号-----链接
posnr TYPE lips-posnr, "销售出库单行号
pstyv TYPE lips-pstyv, "交易类型
werks TYPE lips-werks, "工厂
bukrs_vf TYPE tvko-bukrs, "法人公司编码
name1_a TYPE t001-butxt, "法人公司名称
* kdmat TYPE lips-kdmat, "客户料号
matnr TYPE lips-matnr, "领胜集团内部料号
arktx TYPE lips-arktx, "物料描述
audat TYPE vbak-audat, "销售订单日期
waerk TYPE vbak-waerk, "币别
vgbel TYPE lips-vgbel, "我司订单号 "参考凭证
* vgpos TYPE lips-vgpos, "参考项目
* lgort TYPE lips-lgort, "仓库
** GEWEI TYPE LIPS-GEWEI, "单位
bstkd TYPE vbkd-bstkd, "客户订单号
wadat_ist TYPE likp-wadat_ist, "销售出库(退货)日期
netprs TYPE p DECIMALS 5, "销售未税单价
mwsbps TYPE vbap-mwsbp, "税率
cmpre TYPE p DECIMALS 5, "销售含税单价
mwsbps_a TYPE vbap-mwsbp, "发出商品毛利率
mwsbp_1 TYPE ddddlcurrtypes-curr17_5, "P DECIMALS 5, "发出商品金额1
mwsbp_2 TYPE ddddlcurrtypes-curr17_5, "P DECIMALS 5, "发出商品金额2
mwsbp_3 TYPE ddddlcurrtypes-curr17_5, "P DECIMALS 5, "发出商品金额3
* lfimg TYPE lips-lfimg, "出货数量
* zbgno TYPE likp-zbgno, "国内报关发票号
* kunnr TYPE likp-kunnr, "送达方
kunag TYPE likp-kunag, "售达方
** LGMNG TYPE LIPS-LGMNG, "数量(库存单位)
* wbstk TYPE likp-wbstk, "出发货状态
* erdat1 TYPE lips-erdat, "日期
* erdat2 TYPE likp-erdat, "日期
* lfimg_s TYPE lips-lfimg, "参考数量
* uecha TYPE lips-uecha, "上层项目批
* charg TYPE lips-charg, "批次
* meins TYPE lips-meins, "基本单位
* vrkme TYPE lips-vrkme, "销售单位
* umvkz TYPE lips-umvkz, "分子
* umvkn TYPE lips-umvkn, "分母
* shkzg TYPE mseg-shkzg, "正反方向
gsber TYPE lips-gsber,
* bklas TYPE mbew-bklas,
*
** AUART TYPE VBAK-AUART,"交易类型值
* bezei TYPE tvakt-bezei, "交易类型值
** AUART TYPE VBAK-AUART, "交易类型值
* name1 TYPE lfa1-name1, "对应客服
* name2 TYPE lfa1-name1, "对应销售
name_org1 TYPE but000-name_org1, "客户名称
* bu_name TYPE t001w-name1, "BU
* kzwi3 TYPE vbrp-fkimg, "已开票数量
* stprs TYPE ddddlcurrtypes-curr17_8, "P DECIMALS 8, "成本单价
* mwsbpss TYPE p DECIMALS 5, "出货含税金额
* mwsbpsss TYPE p DECIMALS 5, "出货未税金额
* mwsbp_a TYPE p DECIMALS 5, "发出商品金额(实际)
* mwsbp_as TYPE p DECIMALS 5, "发出商品金额(标准)
* lgobe TYPE t001l-lgobe, "若为VMI,标识code号
lgmngs TYPE lips-lgmng, "未开票数量
kmein TYPE lips-kmein,
* erdat TYPE vbrp-erdat, "发出商品报表查询截止时日
*
hsly1 TYPE zsf_zfi040a-hsly1, "本年累计借方(本币)
hsly2 TYPE zsf_zfi040a-hsly2, "本年累计贷方(本币)
hkont TYPE t030-konts,
* txt50 TYPE skat-txt50,
*
* zbg TYPE ztmm010-zbgmc, " BG
* zbg_xg TYPE ztmm010-zbgmc, " 信管专用BG
* zdcbu TYPE char40, " 生产地BU
* zjxqj TYPE ztmm010-zjxqj, " 仙剑区间
*
* gewei TYPE lips-gewei, "单位
* ntgew TYPE mara-ntgew,
* inum TYPE i, "序号
* sel TYPE c, "选择
END OF ty_output,
BEGIN OF ty_dncoll,
vbeln TYPE lips-vbeln,
hsly1 TYPE zsf_zfi040a-hsly1,
hsly2 TYPE zsf_zfi040a-hsly2,
END OF ty_dncoll,
BEGIN OF ty_zrate,
waerk TYPE vbak-waerk, "币别
zrate TYPE ukursp,
END OF ty_zrate .
*&---------------------------------------------------------------------*
*& 结构
*&---------------------------------------------------------------------*
DATA: BEGIN OF gs_hide_code,
code TYPE sy-ucomm,
END OF gs_hide_code.
*&---------------------------------------------------------------------*
*& 内表
*&---------------------------------------------------------------------*
DATA: gt_alv TYPE TABLE OF ty_alv, "参考ZFI058
gs_alv TYPE ty_alv,
gt_dn TYPE TABLE OF ty_dncoll,
gs_dn TYPE ty_dncoll.
DATA: gt_head TYPE t_head,
gt_item TYPE t_item,
gs_zdate TYPE zsdate_time,
gt_ztfi144 TYPE TABLE OF ztfi144,
gs_ztfi144 TYPE ztfi144,
gt_hide_code LIKE TABLE OF gs_hide_code.
*&---------------------------------------------------------------------*
*& 对象
*&---------------------------------------------------------------------*
CLASS lcl_alv_event_0100 DEFINITION DEFERRED.
DATA: go_dock_100 TYPE REF TO cl_gui_docking_container,
go_dock_200 TYPE REF TO cl_gui_docking_container,
go_grid_100 TYPE REF TO cl_gui_alv_grid,
go_grid_200 TYPE REF TO cl_gui_alv_grid,
go_alv_event_100 TYPE REF TO lcl_alv_event_0100. "类接收器
*&---------------------------------------------------------------------*
*& 变量
*&---------------------------------------------------------------------*
DATA: ok_code TYPE sy-ucomm,
gv_code TYPE sy-ucomm,
gv_title TYPE repti,
gv_lines TYPE i,
gv_saknr TYPE ska1-saknr,
gv_bukrs TYPE bkpf-bukrs,
gv_post TYPE char1,
gv_last_date TYPE sy-datum.
*
DATA:gt_output0 TYPE TABLE OF ty_output."zsf_zfi040a.
DATA:gt_output TYPE TABLE OF ty_output."zsf_zfi040a.
DATA:gs_output TYPE ty_output."zsf_zfi040a.
DATA:itab TYPE TABLE OF zsfi009.
TYPES: BEGIN OF ty_data,
sel TYPE char1,
belnr1 TYPE acdoca-belnr, "分录
ryear TYPE zsf_zfi040a-ryear,
rpmax TYPE zsf_zfi040a-rpmax,
bukrs TYPE acdoca-rbukrs,
butxt TYPE t001-butxt,
racct TYPE zsf_zfi040a-racct, "库存科目
txt50 TYPE zsf_zfi040a-txt50,
werks TYPE werks_d,
bukrs_vf TYPE tvko-bukrs, "法人公司编码
name1_a TYPE t001-butxt, "法人公司名称
matnr TYPE matnr,
arktx TYPE lips-arktx, "物料描述
waerk TYPE vbak-waerk, "币别
bstkd TYPE vbkd-bstkd, "客户订单号
wadat_ist TYPE likp-wadat_ist, "销售出库(退货)日期
kunag TYPE likp-kunag, "售达方
name_org1 TYPE but000-name_org1, "客户名称
vbeln TYPE lips-vbeln, "销售出库单号-----链接
posnr TYPE lips-posnr, "销售出库单行号
netprs TYPE p DECIMALS 5, "销售未税单价
mwsbps TYPE vbap-mwsbp, "税率
cmpre TYPE p DECIMALS 5, "销售含税单价
mwsbps_a TYPE vbap-mwsbp, "发出商品毛利率
mwsbp_1 TYPE ddddlcurrtypes-curr17_5, "P DECIMALS 5, "发出商品金额1
mwsbp_2 TYPE ddddlcurrtypes-curr17_5, "P DECIMALS 5, "发出商品金额2
mwsbp_3 TYPE ddddlcurrtypes-curr17_5, "P DECIMALS 5, "发出商品金额3
lgmngs TYPE lips-lgmng, "未开票数量
kmein TYPE lips-kmein,
rcntr TYPE zsf_zfi040a-rcntr, "成本中心
ktext TYPE zsf_zfi040a-ktext,
rbusa TYPE zsf_zfi040a-rbusa, "业务范围
gtext TYPE zsf_zfi040a-gtext,
rfarea TYPE zsf_zfi040a-rfarea, "功能范围
fkbtx TYPE zsf_zfi040a-fkbtx,
prctr TYPE zsf_zfi040a-prctr, "利润中心
rtcur TYPE zsf_zfi040a-rtcur,
hsly1 TYPE zsf_zfi040a-hsly1, "收入
hsly2 TYPE zsf_zfi040a-hsly2, "应收(汇总)
hsly3 TYPE zsf_zfi040a-hsly2, "税额(汇总)
hslz1 TYPE zsf_zfi040a-hslz1, "成本,库存
zrate TYPE ukursp,
belnr TYPE acdoca-belnr, "会计凭证
saknr1 TYPE ska1-saknr, "应收科目
saknr2 TYPE ska1-saknr, "收入科目
saknr3 TYPE ska1-saknr, "税金科目
saknr TYPE ska1-saknr, "成本科目
txt50s TYPE skat-txt50,
type TYPE bapiret2-type,
message TYPE bapiret2-message,
icon TYPE icon-id,
flag TYPE char1,
edit TYPE lvc_t_styl,
END OF ty_data.
DATA: lt_data TYPE TABLE OF ty_data,
ls_data TYPE ty_data,
ls_data1 TYPE ty_data,
lv_waers TYPE bkpf-waers,
lt_vf01 TYPE TABLE OF ty_data,
gt_zrate TYPE TABLE OF ty_zrate,
gs_zrate TYPE ty_zrate,
gr_saknr TYPE RANGE OF ska1-saknr, "Add By IT065 At 20240322 For 袁志琴 新增加海外业务逻辑
num TYPE i.
*&---------------------------------------------------------------------*
*& 选择屏幕
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK bl01 WITH FRAME TITLE TEXT-t01.
SELECT-OPTIONS: s_bukrs FOR acdoca-rbukrs NO-EXTENSION NO INTERVALS,
s_gjahr FOR acdoca-gjahr NO-EXTENSION NO INTERVALS
DEFAULT sy-datum(4),
s_poper FOR acdoca-poper NO-EXTENSION NO INTERVALS
DEFAULT sy-datum+4(2).
SELECT-OPTIONS: "S_POPER FOR VBRK-POPER OBLIGATORY,
s_racct FOR faglflext-racct NO-DISPLAY. " 5 与 8 开头的 总帐科目
SELECTION-SCREEN END OF BLOCK bl01.
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN FUNCTION KEY 2.
DATA: restrict TYPE sscr_restrict,
optlist TYPE sscr_opt_list,
ass TYPE sscr_ass.
INITIALIZATION.
optlist-name = 'OBJECTKEY1'.
optlist-options-eq = 'X'.
optlist-options-bt = ''.
APPEND optlist TO restrict-opt_list_tab.
ass-kind = 'S'.
ass-name = 'S_GJAHR'.
ass-sg_main = 'I'.
ass-sg_addy = space.
ass-op_main = 'OBJECTKEY1'.
APPEND ass TO restrict-ass_tab.
CLEAR optlist.
CLEAR ass.
optlist-name = 'OBJECTKEY2'.
optlist-options-cp = 'X'.
optlist-options-ge = 'X'.
optlist-options-lt = 'X'.
optlist-options-ne = 'X'.
optlist-options-eq = 'X'.
optlist-options-bt = 'X'.
APPEND optlist TO restrict-opt_list_tab.
ass-kind = 'S'.
ass-name = 'S_POPER'.
ass-sg_main = 'I'.
ass-sg_addy = space.
ass-op_main = 'OBJECTKEY2'.
APPEND ass TO restrict-ass_tab.
CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
EXPORTING
restriction = restrict
EXCEPTIONS
too_late = 1
repeated = 2
selopt_without_options = 3
selopt_without_signs = 4
invalid_sign = 5
empty_option_list = 6
invalid_kind = 7
repeated_kind_a = 8
OTHERS = 9.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* PERFORM set_button_text.
AT SELECTION-SCREEN OUTPUT.
PERFORM init_screen_1000.
AT SELECTION-SCREEN.
PERFORM ucomm_screen_1000.
START-OF-SELECTION.
PERFORM program_main.
*----------------------------------------------------------------------*
* CLASS LCL_ALV_EVENT_0100 DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_alv_event_0100 DEFINITION.
PUBLIC SECTION.
" Toolbar事件
METHODS handle_toolbar
FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive.
" USER-COMMAND 事件
METHODS handle_user_command
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
" 双击事件
METHODS header_double_click FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column.
"数据修改
METHODS handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
METHODS handle_data_changed_finished
FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING e_modified et_good_cells.
METHODS handle_onf4_help FOR EVENT onf4 OF cl_gui_alv_grid
IMPORTING e_fieldname e_fieldvalue es_row_no er_event_data e_display.
ENDCLASS. "LCL_ALV_EVENT_0100 DEFINITION
*----------------------------------------------------------------------*
* CLASS LCL_ALV_EVENT_0100 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_alv_event_0100 IMPLEMENTATION.
" Toolbar事件
METHOD handle_toolbar.
PERFORM alv_toolbar CHANGING e_object->mt_toolbar.
ENDMETHOD. "handle_toolbar
" USER_COMMAND 事件
METHOD handle_user_command.
PERFORM alv_user_command USING e_ucomm.
ENDMETHOD. "HANDLE_USER_COMMAND
" 双击事件
METHOD header_double_click.
PERFORM frm_double_click USING e_row e_column.
ENDMETHOD.
METHOD handle_data_changed.
PERFORM frm_changed_data USING er_data_changed.
ENDMETHOD.
METHOD handle_data_changed_finished.
PERFORM frm_data_changed_finished USING et_good_cells.
ENDMETHOD.
METHOD handle_onf4_help.
PERFORM frm_onf4_help USING e_fieldname e_fieldvalue es_row_no er_event_data e_display.
er_event_data->m_event_handled = abap_true.
ENDMETHOD.
ENDCLASS. "LCL_ALV_EVENT_0100 IMPLEMENTATION
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
gv_title = TEXT-t02.
CLEAR gt_hide_code[].
gs_hide_code-code = '&ZAFFIRM'.
APPEND gs_hide_code TO gt_hide_code.
gs_hide_code-code = '&ZCANCEL'.
APPEND gs_hide_code TO gt_hide_code.
SET PF-STATUS 'STATUS_BAR' EXCLUDING gt_hide_code.
SET TITLEBAR 'TITLE_BAR' WITH gv_title gv_lines.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module STATUS_0200 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0200 OUTPUT.
gv_title = TEXT-t04.
CLEAR gt_hide_code[].
IF gv_post IS INITIAL.
gs_hide_code-code = '&ZAFFIRM'.
APPEND gs_hide_code TO gt_hide_code.
ENDIF.
SET PF-STATUS 'STATUS_BAR' EXCLUDING gt_hide_code.
SET TITLEBAR 'TITLE_BAR' WITH gv_title ''.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module INIT_SCREEN_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE init_screen_0100 OUTPUT.
PERFORM init_alv_100.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module INIT_SCREEN_0200 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE init_screen_0200 OUTPUT.
PERFORM init_alv_200.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
gv_code = ok_code.
CLEAR ok_code.
CASE gv_code.
WHEN '&BACK'.
LEAVE TO SCREEN 0.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0200 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0200 INPUT.
gv_code = ok_code.
CLEAR ok_code.
CASE gv_code.
WHEN '&BACK'.
LEAVE TO SCREEN 0.
WHEN '&ZAFFIRM'.
PERFORM call_bapi_import USING gv_post.
LEAVE TO SCREEN 0.
WHEN '&ZCANCEL'.
LEAVE TO SCREEN 0.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form PROGRAM_MAIN
*&---------------------------------------------------------------------*
* text 程序入口
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM program_main.
DATA: lv_subrc TYPE sy-subrc.
PERFORM check_screen_1000.
PERFORM get_data_head CHANGING gt_head.
PERFORM frm_getdata . "获得数据
IF lt_data[] IS INITIAL.
MESSAGE TEXT-m01 TYPE 'S' DISPLAY LIKE 'E'. " 无符合条件的数据!
EXIT.
ENDIF.
PERFORM check_data CHANGING lv_subrc.
DESCRIBE TABLE lt_data LINES gv_lines. " 统计内表行数
CALL SCREEN 100.
ENDFORM. " PROGRAM_MAIN
*&---------------------------------------------------------------------*
*& Form SET_BUTTON_TEXT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM set_button_text .
DATA: ls_smp_dyntxt TYPE smp_dyntxt.
ls_smp_dyntxt-icon_id = '@U3@'.
ls_smp_dyntxt-icon_text = TEXT-t03. " 科目维护
ls_smp_dyntxt-quickinfo = TEXT-t03. " 科目维护
sscrfields-functxt_01 = ls_smp_dyntxt.
CLEAR ls_smp_dyntxt.
ls_smp_dyntxt-icon_id = icon_list.
ls_smp_dyntxt-icon_text = TEXT-t06. " 成本中心维护
ls_smp_dyntxt-quickinfo = TEXT-t06. " 成本中心维护
sscrfields-functxt_02 = ls_smp_dyntxt.
ENDFORM. "SET_BUTTON_TEXT
*&---------------------------------------------------------------------*
*& Form INIT_SCREEN_1000
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM init_screen_1000 .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form UCOMM_SCREEN_1000
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM ucomm_screen_1000 .
CASE sscrfields-ucomm.
WHEN 'FC01'.
PERFORM call_view_edit.
WHEN 'FC02'.
PERFORM call_view_edit2.
WHEN OTHERS.
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CALL_VIEW_EDIT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM call_view_edit .
CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
EXPORTING
action = 'S'
view_name = 'ZTFI104'
EXCEPTIONS
client_reference = 1
foreign_lock = 2
invalid_action = 3
no_clientindependent_auth = 4
no_database_function = 5
no_editor_function = 6
no_show_auth = 7
no_tvdir_entry = 8
no_upd_auth = 9
only_show_allowed = 10
system_failure = 11
unknown_field_in_dba_sellist = 12
view_not_found = 13
maintenance_prohibited = 14
OTHERS = 15.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CALL_VIEW_EDIT2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM call_view_edit2 .
CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
EXPORTING
action = 'S'
view_name = 'ZTFI107'
EXCEPTIONS
client_reference = 1
foreign_lock = 2
invalid_action = 3
no_clientindependent_auth = 4
no_database_function = 5
no_editor_function = 6
no_show_auth = 7
no_tvdir_entry = 8
no_upd_auth = 9
only_show_allowed = 10
system_failure = 11
unknown_field_in_dba_sellist = 12
view_not_found = 13
maintenance_prohibited = 14
OTHERS = 15.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CHECK_SCREEN_1000
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM check_screen_1000 .
DATA: lv_message TYPE bapiret2-message.
DATA: str1 TYPE char6,
str2 TYPE char6.
IF s_bukrs[] IS INITIAL.
" 请输入公司代码!
MESSAGE TEXT-m03 TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
IF s_gjahr[] IS INITIAL.
" 请输入年度!
MESSAGE TEXT-m04 TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
IF s_poper[] IS INITIAL.
" 请输入期间!
MESSAGE TEXT-m05 TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
str1 = s_gjahr-low && s_poper-low+1(2).
str2 = sy-datum+(6).
"检则输入的年月
* IF STR1 <> STR2.
* MESSAGE TEXT-M12 TYPE 'S' DISPLAY LIKE 'E'.
* LEAVE LIST-PROCESSING.
* ENDIF.
AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
ID 'BUKRS' FIELD s_bukrs-low
ID 'ACTVT' FIELD '03'.
IF sy-subrc <> 0.
lv_message = TEXT-m06. " 没有公司代码&1的权限!
REPLACE '&1' IN lv_message WITH s_bukrs-low.
MESSAGE s001(00) DISPLAY LIKE 'E' WITH lv_message.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_DATA_HEAD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- ct_head
*&---------------------------------------------------------------------*
FORM get_data_head CHANGING ct_head TYPE t_head.
DATA: ls_head TYPE s_head.
DATA: lv_first_date TYPE sy-datum,
lv_monat TYPE bkpf-monat,
* LV_WAERS TYPE BKPF-WAERS,
lv_index TYPE sy-index.
CLEAR: lv_waers, ct_head[].
gv_bukrs = s_bukrs-low.
lv_monat = s_poper-low.
lv_first_date = s_gjahr-low && lv_monat && '01'.
CALL FUNCTION 'BKK_GET_MONTH_LASTDAY'
EXPORTING
i_date = lv_first_date
IMPORTING
e_date = gv_last_date.
SELECT SINGLE waers INTO lv_waers
FROM t001
WHERE bukrs = gv_bukrs
%_HINTS HDB 'RESULT_LAG(''hana_sr'')'.
DO 2 TIMES.
lv_index = sy-index.
ls_head-belnr = lv_index.
ls_head-bukrs = gv_bukrs.
ls_head-gjahr = gv_last_date(4).
ls_head-bldat = gv_last_date.
ls_head-budat = gv_last_date.
ls_head-monat = gv_last_date+4(2).
ls_head-blart = 'SS'.
ls_head-waers = lv_waers.
APPEND ls_head TO ct_head.
ENDDO.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form init_alv_100
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM init_alv_100.
DATA: ls_layout TYPE lvc_s_layo,
ls_variant TYPE disvariant.
DATA: lw_lvc_t_f4 TYPE lvc_t_f4,
ls_lvc_t_f4 TYPE LINE OF lvc_t_f4.
DATA: lt_fieldcatalog TYPE lvc_t_fcat,
lt_exclude TYPE ui_functions.
IF go_dock_100 IS INITIAL.
" 容器
CREATE OBJECT go_dock_100
EXPORTING
repid = sy-repid " 程序名
dynnr = sy-dynnr " 屏幕号
* SIDE = DOCK_AT_LEFT
extension = 1500 " ALV宽度
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
" ALV
CREATE OBJECT go_grid_100
EXPORTING
i_parent = go_dock_100
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ls_variant-report = sy-repid.
" ALV字段
PERFORM set_fieldcatalog USING '100'
CHANGING lt_fieldcatalog.
" ALV布局
PERFORM set_layout USING '100' CHANGING ls_layout .
" 隐藏工具条按钮
PERFORM set_toolbar_excluding CHANGING lt_exclude.
" 显示ALV
CALL METHOD go_grid_100->set_table_for_first_display
EXPORTING
i_bypassing_buffer = 'X'
is_variant = ls_variant
i_save = 'A'
i_default = 'X'
is_layout = ls_layout
it_toolbar_excluding = lt_exclude
CHANGING
it_outtab = lt_data[]
it_fieldcatalog = lt_fieldcatalog[]
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
CLEAR: ls_lvc_t_f4,lw_lvc_t_f4[].
ls_lvc_t_f4-fieldname = 'SAKNR'.
ls_lvc_t_f4-register = 'X'.
ls_lvc_t_f4-chngeafter = 'X'.
INSERT ls_lvc_t_f4 INTO TABLE lw_lvc_t_f4.
CLEAR ls_lvc_t_f4.
ls_lvc_t_f4-fieldname = 'SAKNR1'.
ls_lvc_t_f4-register = 'X'.
ls_lvc_t_f4-chngeafter = 'X'.
INSERT ls_lvc_t_f4 INTO TABLE lw_lvc_t_f4.
CLEAR ls_lvc_t_f4.
ls_lvc_t_f4-fieldname = 'SAKNR2'.
ls_lvc_t_f4-register = 'X'.
ls_lvc_t_f4-chngeafter = 'X'.
INSERT ls_lvc_t_f4 INTO TABLE lw_lvc_t_f4.
CLEAR ls_lvc_t_f4.
ls_lvc_t_f4-fieldname = 'SAKNR3'.
ls_lvc_t_f4-register = 'X'.
ls_lvc_t_f4-chngeafter = 'X'.
INSERT ls_lvc_t_f4 INTO TABLE lw_lvc_t_f4.
CALL METHOD go_grid_100->register_f4_for_fields EXPORTING it_f4 = lw_lvc_t_f4.
CALL METHOD go_grid_100->register_edit_event EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_enter.
CALL METHOD go_grid_100->set_ready_for_input EXPORTING i_ready_for_input = 1.
CALL METHOD go_grid_100->register_edit_event EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified.
" ALV "注册事件
CREATE OBJECT go_alv_event_100.
SET HANDLER go_alv_event_100->handle_toolbar FOR go_grid_100.
SET HANDLER go_alv_event_100->handle_user_command FOR go_grid_100.
SET HANDLER go_alv_event_100->header_double_click FOR go_grid_100.
SET HANDLER go_alv_event_100->handle_onf4_help FOR go_grid_100.
SET HANDLER go_alv_event_100->handle_data_changed FOR go_grid_100.
SET HANDLER go_alv_event_100->handle_data_changed_finished FOR go_grid_100.
CALL METHOD go_grid_100->set_toolbar_interactive.
ELSE.
PERFORM refresh_alv USING go_grid_100.
ENDIF.
ENDFORM. "init_alv_100
*&---------------------------------------------------------------------*
*& Form init_alv_200
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM init_alv_200.
DATA: ls_layout TYPE lvc_s_layo,
ls_variant TYPE disvariant.
DATA: lt_fieldcatalog TYPE lvc_t_fcat,
lt_exclude TYPE ui_functions.
IF go_dock_200 IS INITIAL.
" 容器
CREATE OBJECT go_dock_200
EXPORTING
repid = sy-repid " 程序名
dynnr = sy-dynnr " 屏幕号
extension = 1500 " ALV宽度
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
" ALV
CREATE OBJECT go_grid_200
EXPORTING
i_parent = go_dock_200
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
" ALV字段
PERFORM set_fieldcatalog USING '200'
CHANGING lt_fieldcatalog.
" ALV布局
PERFORM set_layout USING '200' CHANGING ls_layout .
" 隐藏工具条按钮
PERFORM set_toolbar_excluding CHANGING lt_exclude.
" 显示ALV
CALL METHOD go_grid_200->set_table_for_first_display
EXPORTING
i_bypassing_buffer = 'X'
is_layout = ls_layout
it_toolbar_excluding = lt_exclude
CHANGING
it_outtab = gt_item[]
it_fieldcatalog = lt_fieldcatalog[]
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ELSE.
PERFORM refresh_alv USING go_grid_200.
ENDIF.
ENDFORM. "init_alv_200
*&---------------------------------------------------------------------*
*& Form SET_FIELDCATALOG
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->pv_screen text
* <--ct_fcat text
*----------------------------------------------------------------------*
FORM set_fieldcatalog USING pv_screen TYPE scradnum
CHANGING ct_fcat TYPE lvc_t_fcat.
DEFINE lm_add_fcat.
CLEAR ls_fcat.
ls_fcat-fieldname = &1. " 字段名
ls_fcat-coltext = &2. " 显示字段文本
ls_fcat-scrtext_l = &2. " 显示字段文本
ls_fcat-scrtext_m = &2. " 显示字段文本
* ls_fcat-scrtext_s = &2. " 显示字段文本
ls_fcat-col_pos = &3. " 列顺序
ls_fcat-checkbox = &4. " 复选框
ls_fcat-edit = &5. " 可修改
ls_fcat-no_zero = &6. " 隐藏前导零
ls_fcat-outputlen = &7. " 输出长度
ls_fcat-ref_table = &8. " 参考表
ls_fcat-ref_field = &9. " 参考字段
IF &3 < 7.
ls_fcat-fix_column = 'X'. " 固定列
ENDIF.
IF ls_fcat-fieldname+0(5) EQ 'SAKNR'.
ls_fcat-f4availabl = 'X'.
ENDIF.
APPEND ls_fcat TO ct_fcat.
END-OF-DEFINITION.
DATA: ls_fcat TYPE lvc_s_fcat.
CLEAR: ct_fcat[].
IF pv_screen = '100'.
lm_add_fcat 'ICON' TEXT-f17 '0' '' '' '' '' '' ''. " 状态
lm_add_fcat 'MESSAGE' TEXT-f18 '0' '' '' '' '90' '' ''. " 提示信息
lm_add_fcat 'BELNR1' TEXT-f00 '1' '' '' '' '' '' ''. " 分录
lm_add_fcat 'RYEAR' TEXT-f01 '1' '' '' '' '' '' ''. " 年度
lm_add_fcat 'RPMAX' TEXT-f02 '2' '' '' '' '' '' ''. " 期间
lm_add_fcat 'BUKRS' TEXT-f03 '3' '' '' '' '' '' ''. " 公司编码
lm_add_fcat 'BUTXT' TEXT-f04 '4' '' '' '' '' '' ''. " 公司名称
lm_add_fcat 'WERKS' TEXT-f28 '5' '' '' '' '' '' ''. " 工厂
lm_add_fcat 'BUKRS_VF' TEXT-f29 '6' '' '' '' '' '' ''. " 法人公司编码
lm_add_fcat 'NAME1_A' TEXT-f30 '7' '' '' '' '' '' ''. " 法人公司
lm_add_fcat 'MATNR' TEXT-f34 '8' '' '' '' '' '' ''. " 料号
lm_add_fcat 'ARKTX' TEXT-f31 '9' '' '' '' '' '' ''. " 料号描述
lm_add_fcat 'RACCT' TEXT-f05 '10' '' '' '' '' '' ''. " 科目编号
lm_add_fcat 'TXT50' TEXT-f06 '11' '' '' '' '' '' ''. " 科目名称
* lm_add_fcat 'RCNTR' TEXT-f07 '7' '' '' '' '' '' ''. " 成本中心
* lm_add_fcat 'KTEXT' TEXT-f08 '8' '' '' '' '' '' ''. " 成本中心名称
lm_add_fcat 'RBUSA' TEXT-f09 '12' '' '' '' '' '' ''. " 业务范围
lm_add_fcat 'GTEXT' TEXT-f10 '13' '' '' '' '' '' ''. " 业务范围名称
lm_add_fcat 'BSTKD' TEXT-f35 '14' '' '' '' '' '' ''. " 客户订单号
lm_add_fcat 'WADAT_IST' TEXT-f36 '15' '' '' '' '' '' ''. " 销售出库(退货)日期
lm_add_fcat 'VBELN' TEXT-f37 '16' '' '' '' '' '' ''. " 销售出库单号
* lm_add_fcat 'FKBTX' TEXT-f12 '12' '' '' '' '' '' ''. " 功能范围名称
* lm_add_fcat 'PRCTR' TEXT-f24 '12' '' '' '' '' '' ''. " 利润中心
lm_add_fcat 'LGMNGS' TEXT-f45 '17' '' '' '' '' '' ''. " 未开票数量
lm_add_fcat 'KMEIN' TEXT-f46 '18' '' '' '' '' '' ''. " 单位
lm_add_fcat 'RTCUR' TEXT-f13 '19' '' '' '' '' '' ''. " 币别
lm_add_fcat 'NETPRS' TEXT-f38 '20' '' '' '' '' '' ''. " 销售未税单价
lm_add_fcat 'MWSBPS' TEXT-f39 '21' '' '' '' '' '' ''. " 税率
lm_add_fcat 'CMPRE' TEXT-f40 '22' '' '' '' '' '' ''. " 销售含税单价
lm_add_fcat 'MWSBPS_A' TEXT-f41 '23' '' '' '' '' '' ''. " 发出商品毛利率
lm_add_fcat 'MWSBP_1' TEXT-f42 '24' '' '' '' '' '' ''. " 发出商品金额1
lm_add_fcat 'MWSBP_2' TEXT-f43 '25' '' '' '' '' '' ''. " 发出商品金额2
lm_add_fcat 'MWSBP_3' TEXT-f44 '26' '' '' '' '' '' ''. " 发出商品金额3
lm_add_fcat 'ZRATE' TEXT-f52 '26' '' '' '' '' '' ''. " 汇率
lm_add_fcat 'HSLZ1' TEXT-f14 '27' '' '' '' '' '' ''. " 调整金额(成本库存)
lm_add_fcat 'HSLY1' TEXT-f26 '28' '' '' '' '' '' ''. " 收入
lm_add_fcat 'HSLY2' TEXT-f27 '29' '' '' '' '' '' ''. " 应收(汇总)
lm_add_fcat 'HSLY3' TEXT-f47 '30' '' '' '' '' '' ''. " 税额(汇总)
lm_add_fcat 'SAKNR1' TEXT-f48 '31' '' 'X' '' '' '' ''. " 应收科目
lm_add_fcat 'SAKNR2' TEXT-f49 '32' '' 'X' '' '' '' ''. " 收入科目
lm_add_fcat 'SAKNR3' TEXT-f50 '33' '' 'X' '' '' '' ''. " 税金科目
lm_add_fcat 'SAKNR' TEXT-f15 '34' '' 'X' '' '' '' ''. " 成本科目
* lm_add_fcat 'TXT50S' TEXT-f16 '35' '' '' '' '' '' ''. " 对方科目名称
lm_add_fcat 'BELNR' TEXT-f19 '36' '' '' '' '10' '' ''. " 会计凭证
ELSEIF pv_screen = '200'.
lm_add_fcat 'BELNR' TEXT-f00 '10' '' '' '' '' '' ''. " 分录
lm_add_fcat 'DOCLN' TEXT-f21 '10' '' '' '' '' '' ''. " 凭证行
lm_add_fcat 'SAKNR' TEXT-f05 '10' '' '' '' '' '' ''. " 总账科目
* lm_add_fcat 'TXT50' TEXT-f06 '20' '' '' '' '' '' ''. " 科目名称
lm_add_fcat 'SGTXT' TEXT-f25 '20' '' '' '' '' '' ''. " 文本
* lm_add_fcat 'FKBER' TEXT-f11 '20' '' '' '' '' '' ''. " 功能范围
* lm_add_fcat 'KOSTL' TEXT-f07 '20' '' '' '' '' '' ''. " 成本中心
* lm_add_fcat 'KTEXT' TEXT-f08 '20' '' '' '' '' '' ''. " 成本中心名称
lm_add_fcat 'GSBER' TEXT-f09 '20' '' '' '' '' '' ''. " 业务范围
* lm_add_fcat 'PRCTR' TEXT-f24 '20' '' '' '' '' '' ''. " 利润中心
lm_add_fcat 'BSCHL' TEXT-f32 '30' '' '' '' '' '' ''. " 记账码
lm_add_fcat 'HSL' TEXT-f22 '40' '' '' '' '' '' ''. " 金额
lm_add_fcat 'RHCUR' TEXT-f13 '50' '' '' '' '' '' ''. " 货币码
lm_add_fcat 'BUKRS' TEXT-f03 '60' '' '' '' '' '' ''. " 公司代码
lm_add_fcat 'GJAHR' TEXT-f01 '70' '' '' '' '' '' ''. " 年度
lm_add_fcat 'MONAT' TEXT-f02 '80' '' '' '' '' '' ''. " 期间
lm_add_fcat 'BLART' TEXT-f23 '80' '' '' '' '' '' ''. " 凭证类型
lm_add_fcat 'VBELN' TEXT-f37 '80' '' '' '' '' '' ''. " 销售出库单号
lm_add_fcat 'MATNR' TEXT-f34 '80' '' '' '' '' '' ''. " 料号
lm_add_fcat 'LGMNGS' TEXT-f45 '80' '' '' '' '' '' ''. " 未开票数量
lm_add_fcat 'KMEIN' TEXT-f46 '80' '' '' '' '' '' ''. " 单位
lm_add_fcat 'ZUONR' TEXT-f51 '80' '' '' '' '' '' ''. " 分配号
ENDIF.
ENDFORM. "SET_FIELDCATALOG
*&---------------------------------------------------------------------*
*& Form SET_LAYOUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->cs_layout text
*----------------------------------------------------------------------*
FORM set_layout USING pv_screen TYPE scradnum CHANGING cs_layout TYPE lvc_s_layo .
CLEAR: cs_layout.
cs_layout-cwidth_opt = 'X'. " 自动调节字段长度
cs_layout-zebra = 'X'. " 颜色交替显示
cs_layout-sel_mode = 'D'. " A、B、C、D
cs_layout-box_fname = 'SEL'. "设置列SEL是选择框
* CS_LAYOUT-EDIT = 'X'. "单元格可编辑
IF pv_screen = '100'.
cs_layout-stylefname = 'EDIT'. "单元格可编辑
ENDIF.
ENDFORM. "SET_LAYOUT
*&---------------------------------------------------------------------*
*& Form SET_TOOLBAR_EXCLUDING
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->CT_FUNCTION text
*----------------------------------------------------------------------*
FORM set_toolbar_excluding CHANGING ct_function TYPE ui_functions.
DATA: ls_function TYPE ui_func.
CLEAR: ct_function[].
ls_function = cl_gui_alv_grid=>mc_fc_print. " 打印
APPEND ls_function TO ct_function.
ls_function = cl_gui_alv_grid=>mc_fc_graph. " 显示图形
APPEND ls_function TO ct_function.
ls_function = cl_gui_alv_grid=>mc_mb_view. " 视图
APPEND ls_function TO ct_function.
ls_function = cl_gui_alv_grid=>mc_fc_info. " 最终用户文档
APPEND ls_function TO ct_function.
ls_function = cl_gui_alv_grid=>mc_fc_print_back. " 打印
APPEND ls_function TO ct_function.
ls_function = cl_gui_alv_grid=>mc_fc_loc_insert_row. " 插入行
APPEND ls_function TO ct_function.
ls_function = cl_gui_alv_grid=>mc_fc_loc_delete_row. " 删除行
APPEND ls_function TO ct_function.
ls_function = cl_gui_alv_grid=>mc_fc_loc_append_row. " 附加行
APPEND ls_function TO ct_function.
ls_function = cl_gui_alv_grid=>mc_fc_loc_copy_row. " 复制行
APPEND ls_function TO ct_function.
ls_function = cl_gui_alv_grid=>mc_fc_loc_copy. " 复制
APPEND ls_function TO ct_function.
ls_function = cl_gui_alv_grid=>mc_fc_loc_cut. " 剪切
APPEND ls_function TO ct_function.
ls_function = cl_gui_alv_grid=>mc_fc_loc_paste. " 插入总览
APPEND ls_function TO ct_function.
ls_function = cl_gui_alv_grid=>mc_fc_loc_paste_new_row. " 插入新行
APPEND ls_function TO ct_function.
ls_function = cl_gui_alv_grid=>mc_fc_loc_undo. " 撤销
APPEND ls_function TO ct_function.
* ls_function = cl_gui_alv_grid=>mc_mb_export. " 导出
* APPEND ls_function TO ct_function.
* ls_function = cl_gui_alv_grid=>mc_fc_maximum. " 最大值
* APPEND ls_function TO ct_function.
* ls_function = cl_gui_alv_grid=>mc_fc_minimum. " 最小值
* APPEND ls_function TO ct_function.
* ls_function = cl_gui_alv_grid=>mc_fc_sum. " 总计
* APPEND ls_function TO ct_function.
* ls_function = cl_gui_alv_grid=>mc_fc_average. " 平均值
* APPEND ls_function TO ct_function.
* ls_function = cl_gui_alv_grid=>mc_fc_refresh. " 刷新
* APPEND ls_function TO ct_function.
* ls_function = cl_gui_alv_grid=>mc_fc_detail. " 明细
* APPEND ls_function TO ct_function.
ENDFORM. "SET_TOOLBAR_EXCLUDING
*&---------------------------------------------------------------------*
*& Form REFRESH_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->PO_GRID text
*----------------------------------------------------------------------*
FORM refresh_alv USING po_grid TYPE REF TO cl_gui_alv_grid.
DATA: ls_scroll TYPE lvc_s_stbl.
ls_scroll-row = 'X'.
ls_scroll-col = 'X'.
CALL METHOD po_grid->refresh_table_display
EXPORTING
is_stable = ls_scroll
i_soft_refresh = 'X'
EXCEPTIONS
finished = 1
OTHERS = 2.
ENDFORM. "REFRESH_ALV
*&---------------------------------------------------------------------*
*& Form ALV_TOOLBAR
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- ct_toolbar
*&---------------------------------------------------------------------*
FORM alv_toolbar CHANGING ct_toolbar TYPE ttb_button.
DATA: ls_toolbar TYPE stb_button.
ls_toolbar-butn_type = 3.
APPEND ls_toolbar TO ct_toolbar.
CLEAR: ls_toolbar.
ls_toolbar-function = '&ZPOST'.
ls_toolbar-icon = '@3H@'.
ls_toolbar-quickinfo = TEXT-b01. " 过账
ls_toolbar-butn_type = 0.
ls_toolbar-disabled = ''.
ls_toolbar-text = TEXT-b01. " 过账
APPEND ls_toolbar TO ct_toolbar.
CLEAR: ls_toolbar.
ls_toolbar-butn_type = 3.
APPEND ls_toolbar TO ct_toolbar.
CLEAR: ls_toolbar.
ls_toolbar-function = '&ZCHECK'.
ls_toolbar-icon = '@8Z@'.
ls_toolbar-quickinfo = TEXT-b02. " 模拟
ls_toolbar-butn_type = 0.
ls_toolbar-disabled = ''.
ls_toolbar-text = TEXT-b02. " 模拟
APPEND ls_toolbar TO ct_toolbar.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form ALV_USER_COMMAND
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> pv_ucomm
*&---------------------------------------------------------------------*
FORM alv_user_command USING pv_ucomm TYPE sy-ucomm.
CASE pv_ucomm.
WHEN '&ZPOST'.
PERFORM call_screen_200 USING '1'.
WHEN '&ZCHECK'.
PERFORM call_screen_200 USING '2'.
WHEN '&IC1'.
READ TABLE lt_data INTO ls_data INDEX 1. "PS_SELFIELD-TABINDEX.
IF sy-subrc = 0 .
SET PARAMETER ID 'ACC' FIELD ls_data-racct.
SET PARAMETER ID 'BUK' FIELD ls_data-bukrs.
SET PARAMETER ID 'GJR' FIELD ls_data-ryear.
CALL TRANSACTION 'FAGLB03' AND SKIP FIRST SCREEN.
ENDIF.
ENDCASE.
PERFORM refresh_alv USING go_grid_100.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form call_bapi_import
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> pv_post text
*&---------------------------------------------------------------------*
FORM call_bapi_import USING pv_post TYPE char1.
DATA: ls_documentheader TYPE bapiache09,
ls_accountgl TYPE bapiacgl09,
ls_accountreceivable TYPE bapiacar09,
ls_currencyamount TYPE bapiaccr09,
ls_return TYPE bapiret2,
ls_extension1 TYPE bapiacextc,
ls_extension2 TYPE bapiparex.
DATA: ls_head TYPE s_head,
ls_item TYPE s_item,
ls_ztfi105 TYPE ztfi105.
DATA: lt_accountgl LIKE TABLE OF ls_accountgl,
lt_accountreceivable LIKE TABLE OF ls_accountreceivable, "Customer Item
lt_currencyamount LIKE TABLE OF ls_currencyamount,
lt_return LIKE TABLE OF ls_return,
lt_extension1 LIKE TABLE OF bapiacextc WITH HEADER LINE,
lt_extension2 LIKE TABLE OF bapiparex WITH HEADER LINE. "Reference Structure for BAPI
DATA: lt_ztfi105 LIKE TABLE OF ls_ztfi105.
DATA: lv_obj_type TYPE bapiache09-obj_type,
lv_obj_key TYPE bapiache09-obj_key,
lv_obj_sys TYPE bapiache09-obj_sys.
DATA: lv_hsl TYPE acdoca-hsl,
lv_subrc TYPE sy-subrc,
lv_tabix TYPE sy-tabix,
lv_buzei TYPE bseg-buzei,
lv_mark TYPE c, "Add By IT065 At 20240322 For 袁志琴 新增加海外业务逻辑
lv_message TYPE bapiret2-message.
CLEAR ls_data1.
LOOP AT lt_data INTO ls_data1 WHERE sel = 'X'.
READ TABLE gt_head INTO ls_head INDEX 1.
CLEAR: lt_accountgl[], lt_currencyamount[], lt_accountreceivable[], lt_return[].
CLEAR: ls_documentheader, lv_buzei.
ls_documentheader-username = sy-uname. " 用户名
ls_documentheader-comp_code = ls_data1-bukrs. " 公司代码
ls_documentheader-doc_date = ls_data1-wadat_ist. " 凭证中的凭证日期ls_head-bldat
ls_documentheader-pstng_date = ls_head-budat. " 凭证中的过帐日期
ls_documentheader-fisc_year = ls_head-gjahr. " 财年
ls_documentheader-fis_period = ls_head-monat. " 会计期间
ls_documentheader-doc_type = ls_head-blart. " 凭证类型
ls_documentheader-header_txt = ls_head-budat && |{ ls_data1-kunag ALPHA = OUT }|. " 凭证抬头文本
CLEAR: ls_data.
* ENDLOOP.
LOOP AT gt_item INTO ls_item WHERE belnr = ls_data1-belnr1.
IF ls_item-koart EQ 'D'.
CLEAR ls_accountreceivable.
ls_accountreceivable-itemno_acc = ls_item-docln.
ls_accountreceivable-gl_account = |{ ls_item-saknr ALPHA = IN }|. "总帐帐目
* lt_accountreceivable-customer = gt_out-hkont. "客户
ls_accountreceivable-customer = |{ ls_item-kunag ALPHA = IN }| ."GT_OUT-KUNNR. "客户
* ls_accountreceivable-sp_gl_ind = gt_out-umskz. "特别总帐标志
ls_accountreceivable-item_text = ls_item-sgtxt. "行项文本
* lt_accountreceivable-bline_date = gt_out-zfbdt. "基准日期-到期日
* ls_accountreceivable-pmnttrms = ls_item-zterm. "付款条件
* CLEAR:l_ztag1.
* SELECT SINGLE ztag1 INTO l_ztag1 "lt_accountreceivable-DSCT_DAYS1
* FROM t052 WHERE zterm = ls_item-zterm.
* ls_accountreceivable-dsct_days1 = l_ztag1.
ls_accountreceivable-bus_area = ls_item-gsber. "业务范围
***** 如果特别总帐标志不为空,则清掉付款条件并加上到期日
* IF gt_out-umskz <> ''.
* CLEAR lt_accountreceivable-pmnttrms.
* IF lt_accountreceivable-bline_date IS INITIAL.
* lt_accountreceivable-bline_date = ls_documentheader-pstng_date .
* ENDIF.
* ENDIF.
* ls_accountreceivable-pymt_meth = gt_out-zlsch. "付款方式
ls_accountreceivable-alloc_nmbr = ls_item-zuonr. "分配号
* ls_accountreceivable-tax_code = ls_item-mwskz.
APPEND ls_accountreceivable TO lt_accountreceivable.
ELSE.
CLEAR ls_accountgl.
ls_accountgl-itemno_acc = ls_item-docln. "项目行号
ls_accountgl-gl_account = ls_item-saknr. "会计科目
ls_accountgl-item_text = ls_item-sgtxt. "项目文本
ls_accountgl-func_area = ls_item-fkber. "功能范围
ls_accountgl-costcenter = ls_item-kostl. "成本中心
ls_accountgl-bus_area = ls_item-gsber. "业务范围
ls_accountgl-profit_ctr = ls_item-prctr. "利润中心
ls_accountgl-ref_key_1 = ls_item-vbeln.
ls_accountgl-ref_key_2 = ls_item-posnr.
ls_accountgl-plant = ls_item-werks.
ls_accountgl-material = ls_item-matnr.
ls_accountgl-customer = |{ ls_item-kunag ALPHA = OUT }|.
ls_accountgl-alloc_nmbr = ls_item-zuonr.
ls_accountgl-quantity = ls_item-lgmngs.
ls_accountgl-base_uom = ls_item-kmein.
APPEND ls_accountgl TO lt_accountgl.
ENDIF.
CLEAR ls_currencyamount.
ls_currencyamount-itemno_acc = ls_item-docln. " 会计凭证行项目编号
ls_currencyamount-curr_type = '00'. " 货币和评估视图
ls_currencyamount-currency = ls_head-waers . " Modify By IT065 At 20240325 LS_ITEM-RHCUR. " 货币码
IF ls_item-drcrk = 'S'.
ls_currencyamount-amt_doccur = abs( ls_item-hsl ). " 金额
ELSEIF ls_item-drcrk = 'H'.
ls_currencyamount-amt_doccur = abs( ls_item-hsl ) * ( -1 ). " 金额
ENDIF.
APPEND ls_currencyamount TO lt_currencyamount.
ENDLOOP.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
EXPORTING
documentheader = ls_documentheader
TABLES
accountgl = lt_accountgl
accountreceivable = lt_accountreceivable
currencyamount = lt_currencyamount
return = lt_return.
LOOP AT lt_return INTO ls_return WHERE type CA 'EA'.
lv_subrc = '1'.
lv_message = lv_message && ls_return-message.
ENDLOOP.
IF lv_subrc <> 0.
LOOP AT lt_data INTO ls_data WHERE sel = 'X' AND belnr1 = ls_data1-belnr1.
lv_tabix = sy-tabix.
ls_data-type = 'E'.
ls_data-icon = gc_icon_red.
ls_data-message = lv_message.
MODIFY lt_data FROM ls_data INDEX lv_tabix TRANSPORTING type icon message.
CLEAR ls_data.
ENDLOOP.
LOOP AT gt_item INTO ls_item WHERE belnr = ls_data1-belnr1.
lv_tabix = sy-tabix.
ls_item-type = 'E'.
ls_item-icon = gc_icon_red.
ls_item-message = lv_message.
MODIFY gt_item FROM ls_item INDEX lv_tabix TRANSPORTING type icon message.
CLEAR ls_item.
ENDLOOP.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
EXIT.
ENDIF.
ENDLOOP.
CHECK pv_post = 'X'.
CHECK lv_subrc = 0.
CLEAR ls_data1.
LOOP AT lt_data INTO ls_data1 WHERE sel = 'X'.
READ TABLE gt_head INTO ls_head INDEX 1.
CLEAR: lt_accountgl[], lt_currencyamount[], lt_accountreceivable[], lt_return[],
lt_ztfi105[], lv_obj_type, lv_obj_key, lv_obj_sys .
CLEAR: ls_documentheader, lv_buzei.
ls_documentheader-username = sy-uname. " 用户名
ls_documentheader-comp_code = ls_data1-bukrs. " 公司代码
ls_documentheader-doc_date = ls_data1-wadat_ist. " 凭证中的凭证日期
ls_documentheader-pstng_date = ls_head-budat. " 凭证中的过帐日期
ls_documentheader-fisc_year = ls_head-gjahr. " 财年
ls_documentheader-fis_period = ls_head-monat. " 会计期间
ls_documentheader-doc_type = ls_head-blart. " 凭证类型
ls_documentheader-header_txt = ls_head-budat && |{ ls_data1-kunag ALPHA = OUT }|. " 凭证抬头文本
CLEAR ls_data.
* ENDLOOP.
DATA: wa_zexten LIKE zexten.
LOOP AT gt_item INTO ls_item WHERE belnr = ls_data1-belnr1.
IF ls_item-koart EQ 'D'.
CLEAR ls_accountreceivable.
ls_accountreceivable-itemno_acc = ls_item-docln.
ls_accountreceivable-gl_account = |{ ls_item-saknr ALPHA = IN }|. "总帐帐目
* lt_accountreceivable-customer = gt_out-hkont. "客户
ls_accountreceivable-customer = |{ ls_item-kunag ALPHA = IN }| ."GT_OUT-KUNNR. "客户
* ls_accountreceivable-sp_gl_ind = gt_out-umskz. "特别总帐标志
ls_accountreceivable-item_text = ls_item-sgtxt. "行项文本
* lt_accountreceivable-bline_date = gt_out-zfbdt. "基准日期-到期日
* ls_accountreceivable-pmnttrms = ls_item-zterm. "付款条件
* SELECT SINGLE ztag1 INTO @DATA(L_ZTAG1) "lt_accountreceivable-DSCT_DAYS1
* FROM t052 WHERE zterm = ls_item-zterm.
* ls_accountreceivable-dsct_days1 = l_ztag1.
ls_accountreceivable-bus_area = ls_item-gsber. "业务范围
***** 如果特别总帐标志不为空,则清掉付款条件并加上到期日
* IF gt_out-umskz <> ''.
* CLEAR lt_accountreceivable-pmnttrms.
* IF lt_accountreceivable-bline_date IS INITIAL.
* lt_accountreceivable-bline_date = ls_documentheader-pstng_date .
* ENDIF.
* ENDIF.
* ls_accountreceivable-pymt_meth = gt_out-zlsch. "付款方式
ls_accountreceivable-alloc_nmbr = ls_item-zuonr. "分配号
* ls_accountreceivable-tax_code = ls_item-mwskz.
APPEND ls_accountreceivable TO lt_accountreceivable.
ELSE.
CLEAR:lv_mark, ls_accountgl.
ls_accountgl-itemno_acc = ls_item-docln. " 会计凭证行项目编号
ls_accountgl-gl_account = ls_item-saknr. " 会计科目
ls_accountgl-item_text = ls_item-sgtxt. " 项目文本
ls_accountgl-func_area = ls_item-fkber. " 功能范围
ls_accountgl-costcenter = ls_item-kostl. " 成本中心
ls_accountgl-bus_area = ls_item-gsber. " 业务范围
ls_accountgl-profit_ctr = ls_item-prctr. " 利润中心
ls_accountgl-ref_key_1 = ls_item-vbeln.
ls_accountgl-ref_key_2 = ls_item-posnr.
ls_accountgl-plant = ls_item-werks.
ls_accountgl-material = ls_item-matnr.
ls_accountgl-customer = |{ ls_item-kunag ALPHA = OUT }|.
ls_accountgl-alloc_nmbr = ls_item-zuonr.
ls_accountgl-quantity = ls_item-lgmngs.
ls_accountgl-base_uom = ls_item-kmein.
APPEND ls_accountgl TO lt_accountgl.
ENDIF.
CLEAR ls_currencyamount.
ls_currencyamount-itemno_acc = ls_item-docln. " 会计凭证行项目编号
ls_currencyamount-curr_type = '00'. " 货币和评估视图
ls_currencyamount-currency = ls_head-waers . " Modify By IT065 At 20240325 LS_ITEM-RHCUR. " 货币码
IF ls_item-drcrk = 'S'.
"Add By IT065 At 20240322 For 袁志琴 新增加海外业务逻辑 start
IF ls_item-saknr+0(1) EQ '8'.
IF ls_item-hsl GT 0 .
lv_mark = 'X'.
ENDIF.
ELSE.
IF ls_item-hsl LT 0 .
lv_mark = 'X'.
ENDIF.
ENDIF.
"Add By IT065 At 20240322 For 袁志琴 新增加海外业务逻辑 end
ls_currencyamount-amt_doccur = abs( ls_item-hsl ). " 金额
ELSEIF ls_item-drcrk = 'H'.
ls_currencyamount-amt_doccur = abs( ls_item-hsl ) * ( -1 ). " 金额
ENDIF.
APPEND ls_currencyamount TO lt_currencyamount.
* "标识: 反记帐
** IF lv_mark = 'X'."Add By IT065 At 20240322 For 袁志琴 新增加海外业务逻辑
* IF ls_item-drcrk = 'H'.
* CLEAR: wa_zexten.
* wa_zexten-posnr = ls_item-docln. "行号
* wa_zexten-bschl = ls_item-bschl. "过账码
* wa_zexten-xnegp = 'X'. "标识: 反记帐
* ls_extension2-structure = 'ZEXTEN'.
* ls_extension2-valuepart1 = wa_zexten.
* APPEND ls_extension2 TO lt_extension2.
* ENDIF.
CLEAR ls_item.
ENDLOOP.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = ls_documentheader
IMPORTING
obj_type = lv_obj_type
obj_key = lv_obj_key
obj_sys = lv_obj_sys
TABLES
accountgl = lt_accountgl
accountreceivable = lt_accountreceivable
currencyamount = lt_currencyamount
return = lt_return
extension1 = lt_extension1
extension2 = lt_extension2.
LOOP AT lt_return INTO ls_return WHERE type CA 'EA'.
lv_subrc = '1'.
lv_message = lv_message && ls_return-message.
CLEAR ls_return.
ENDLOOP.
IF lv_subrc = 0.
LOOP AT lt_data INTO ls_data WHERE sel = 'X' AND belnr1 = ls_data1-belnr1.
lv_tabix = sy-tabix.
ls_data-belnr = lv_obj_key(10).
ls_data-ryear = lv_obj_key+14(4).
ls_data-type = 'S'.
ls_data-icon = gc_icon_green.
ls_data-message = TEXT-m02. " 凭证&1记账到公司代码&2中!
REPLACE '&1' IN ls_data-message WITH ls_data-belnr.
REPLACE '&2' IN ls_data-message WITH ls_data-bukrs.
MODIFY lt_data FROM ls_data
INDEX lv_tabix TRANSPORTING belnr ryear type icon message.
CLEAR ls_ztfi105.
LOOP AT gt_item INTO ls_item WHERE belnr = ls_data-belnr1.
ls_ztfi105-rbukrs = ls_data-bukrs.
ls_ztfi105-gjahr = ls_data-ryear.
ls_ztfi105-belnr = ls_data-belnr.
ls_ztfi105-belnr1 = ls_data-belnr1.
ls_ztfi105-docln = ls_item-docln.
ls_ztfi105-poper = ls_head-monat.
ls_ztfi105-racct = ls_data-racct. " 原始查询出的 会计科目
ls_ztfi105-saknr = ls_item-saknr. " 凭证上会计科目
ls_ztfi105-rhcur = ls_data-rtcur.
ls_ztfi105-drcrk = ls_item-drcrk.
ls_ztfi105-hsly1 = ls_data-hsly1. "本年累计借方(本币)
ls_ztfi105-hsly2 = ls_data-hsly2. "本年累计货方(本币)
IF ls_item-drcrk = 'S'.
ls_ztfi105-hsl = abs( ls_item-hsl ). " 金额 LS_ITEM-HSL_S.
ELSEIF ls_item-drcrk = 'H'.
ls_ztfi105-hsl = abs( ls_item-hsl ) * ( -1 ). " 金额 LS_ITEM-HSL_H.
ENDIF.
ls_ztfi105-sgtxt = ls_item-sgtxt. "文本
ls_ztfi105-fkber = ls_item-vbeln. "功能范围
ls_ztfi105-kostl = ls_item-posnr. "成本中心
ls_ztfi105-gsber = ls_item-gsber. "业务范围
ls_ztfi105-prctr = ls_item-prctr. "利润中心
ls_ztfi105-tcode = 'ZFI144'.
ls_ztfi105-uname = sy-uname.
ls_ztfi105-udate = sy-datum.
ls_ztfi105-utime = sy-uzeit.
APPEND ls_ztfi105 TO lt_ztfi105.
CLEAR ls_item.
ENDLOOP.
CLEAR ls_data.
ENDLOOP.
IF lt_ztfi105[] IS NOT INITIAL.
MODIFY ztfi105 FROM TABLE lt_ztfi105.
ENDIF.
IF gt_ztfi144[] IS NOT INITIAL.
MODIFY ztfi144 FROM TABLE gt_ztfi144.
ENDIF.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ELSE.
LOOP AT lt_data INTO ls_data WHERE sel = 'X' AND belnr1 = ls_data1-belnr1.
lv_tabix = sy-tabix.
ls_data-type = 'E'.
ls_data-icon = gc_icon_red.
ls_data-message = lv_message.
MODIFY lt_data FROM ls_data INDEX lv_tabix TRANSPORTING type icon message.
CLEAR ls_data.
ENDLOOP.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
EXIT.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CALL_SCREEN_200
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> pv_flag text
*&---------------------------------------------------------------------*
FORM call_screen_200 USING pv_flag TYPE char1.
* 处理带选择行 SEL ='X'
DATA : lt_dn TYPE RANGE OF vbeln_vl WITH HEADER LINE,
lt_row TYPE lvc_t_roid, "内表
ls_row TYPE lvc_s_roid. "工作区
CLEAR: lt_row[],ls_row.
CALL METHOD go_grid_100->get_selected_rows
IMPORTING
et_row_no = lt_row.
CLEAR: ls_data, lt_dn, lt_dn[], lt_vf01[].
LOOP AT lt_data INTO ls_data.
ls_data-sel = ''.
MODIFY lt_data FROM ls_data.
CLEAR : ls_data.
ENDLOOP.
LOOP AT lt_row INTO ls_row.
READ TABLE lt_data INTO ls_data INDEX ls_row-row_id .
IF sy-subrc EQ 0 .
* ls_data-sel = 'X'.
* MODIFY lt_data FROM ls_data INDEX sy-tabix TRANSPORTING sel.
LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<fs_data>) WHERE vbeln EQ ls_data-vbeln. "同DN勾选择
<fs_data>-sel = 'X'.
IF <fs_data>-saknr IS INITIAL OR <fs_data>-saknr1 IS INITIAL OR
<fs_data>-saknr2 IS INITIAL OR <fs_data>-saknr3 IS INITIAL .
<fs_data>-icon = gc_icon_red.
<fs_data>-message = '未获取到相应科目'.
ENDIF.
IF <fs_data>-hsly2 EQ 0.
<fs_data>-icon = gc_icon_red.
<fs_data>-message = '未获取到应收金额'.
ENDIF.
APPEND <fs_data> TO lt_vf01.
ENDLOOP.
lt_dn-low = ls_data-vbeln. COLLECT lt_dn. "统计DN数量
CLEAR : ls_data.
ENDIF.
CLEAR: ls_row.
ENDLOOP .
IF lines( lt_dn[] ) NE 1.
MESSAGE '有且只能勾选一张出货单(DN)进行操作!请确认勾选!' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
DATA: ls_item TYPE s_item.
DATA: lv_subrc TYPE sy-subrc,
lv_msg TYPE string.
* "READ TABLE LT_DATA INTO LS_DATA INDEX 1.
LOOP AT lt_data INTO ls_data WHERE sel = 'X' AND icon = gc_icon_red. "AND BELNR IS NOT INITIAL.
" 凭证已经生成,不允许再次创建!
MESSAGE TEXT-m13 TYPE 'S' DISPLAY LIKE 'E'. "有错误行项,不允许此次创建!
RETURN.
ENDLOOP.
PERFORM check_data CHANGING lv_subrc.
CLEAR lv_subrc.
PERFORM check_data_vf01 CHANGING lv_subrc lv_msg.
IF lv_subrc NE 0.
MESSAGE lv_msg TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
* CHECK LV_SUBRC = 0.
PERFORM get_item_data CHANGING gt_item.
IF pv_flag = '1'.
gv_post = 'X'.
ELSEIF pv_flag = '2'.
gv_post = ''.
PERFORM call_bapi_import USING gv_post.
ENDIF.
READ TABLE gt_item INTO ls_item WITH KEY type = 'E'.
IF sy-subrc EQ 0.
" 凭证有错误,请检查!
MESSAGE TEXT-m07 TYPE 'S' DISPLAY LIKE 'E'.
EXIT.
ENDIF.
CALL SCREEN 200
STARTING AT 5 2
ENDING AT 160 20.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_ITEM_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- ct_ITEM
*&---------------------------------------------------------------------*
FORM get_item_data CHANGING ct_item TYPE t_item.
DATA: BEGIN OF ls_skat,
spras TYPE skat-spras,
ktopl TYPE skat-ktopl,
saknr TYPE skat-saknr,
txt20 TYPE skat-txt20,
txt50 TYPE skat-txt50,
END OF ls_skat.
DATA: ls_head TYPE s_head,
ls_item TYPE s_item,
sno TYPE i.
DATA: lt_skat LIKE TABLE OF ls_skat.
DATA: lv_hsl TYPE acdoca-hsl,
lv_new1 TYPE char1,
lv_new2 TYPE i,
lv_tabix TYPE sy-tabix,
lv_accountgl40 TYPE bapiacgl09-gl_account,
lv_accountgl50 TYPE bapiacgl09-gl_account.
CLEAR gs_zdate.
gs_zdate-erdat = sy-datum.
gs_zdate-erzet = sy-uzeit.
gs_zdate-ernam = sy-datum.
sno = 0. "凭证序号
CLEAR: ct_item[],ls_head,ls_data,ls_item,lv_new1,lv_new2, gt_ztfi144[],gs_ztfi144.
lv_new1 = 'X'.
LOOP AT gt_head INTO ls_head.
"借方 S
lv_new2 = lv_new2 + 1.
LOOP AT lt_data INTO ls_data WHERE sel = 'X'.
CLEAR ls_item. "下面逻辑 增加每行 成本,库存
ls_item-belnr = ls_data-belnr1.
ls_item-rhcur = ls_data-rtcur.
ls_item-bukrs = ls_data-bukrs.
ls_item-gjahr = ls_head-gjahr.
ls_item-monat = ls_head-monat.
ls_item-blart = ls_head-blart.
ls_item-docln = ls_head-belnr.
ls_item-sgtxt = ls_data-name_org1 && ls_data-wadat_ist && '发出商品确认收入'. "文本
ls_item-fkber = ls_data-rfarea. "功能范围
ls_item-kostl = ls_data-rcntr. "成本中心
ls_item-gsber = ls_data-rbusa. "业务范围
ls_item-prctr = ls_data-prctr. "利润中心
sno = sno + 1. "凭证序号
IF lv_new1 IS NOT INITIAL.
IF ls_data-hsly2 NE 0 .
ls_item-docln = 4.
ELSE.
ls_item-docln = 4.
ENDIF.
ELSE.
ls_item-docln = sno.
ENDIF.
ls_item-werks = ls_data-werks.
ls_item-matnr = ls_data-matnr.
ls_item-vbeln = ls_data-vbeln.
ls_item-posnr = ls_data-posnr.
IF ls_head-belnr = 1. "借方 S
"如果 本年累计借方(本币) + 本年累计贷方(本币)> 0, 则对方科目 作为借方科目
IF ls_data-hslz1 < 0.
ls_item-saknr = ls_data-saknr. "对方科目 作 借方 科目编号
ls_item-txt50 = ls_data-txt50s.
ls_item-bschl = '40'.
ls_item-drcrk = 'S'.
ls_item-hsl = abs( ls_data-hslz1 ).
ELSE.
ls_item-saknr = ls_data-racct. "科目编号 作 借方 科目编号
ls_item-txt50 = ls_data-txt50.
ls_item-bschl = '40'.
ls_item-drcrk = 'S'.
ls_item-hsl = abs( ls_data-hslz1 ).
ls_item-lgmngs = ls_data-lgmngs.
ls_item-kmein = ls_data-kmein.
ls_item-zuonr = |{ ls_data-kunag ALPHA = OUT }|.
ENDIF.
ELSE. "贷方 H
"如果 期末余额借方(本币) <> 0, 则 科目 作为 贷方科目
IF ls_data-hslz1 < 0.
ls_item-saknr = ls_data-racct. "科目编号 作 贷方 科目编号
ls_item-txt50 = ls_data-txt50.
ls_item-bschl = '50'.
ls_item-drcrk = 'H'.
ls_item-hsl = abs( ls_data-hslz1 ).
ls_item-lgmngs = ls_data-lgmngs.
ls_item-kmein = ls_data-kmein.
ls_item-zuonr = |{ ls_data-kunag ALPHA = OUT }|.
ELSE.
ls_item-saknr = ls_data-saknr. "对方科目 作 贷方 科目编号
ls_item-txt50 = ls_data-txt50s.
ls_item-bschl = '50'.
ls_item-drcrk = 'H'.
ls_item-hsl = abs( ls_data-hslz1 ).
ENDIF.
ENDIF.
* IF ls_item-txt50 CP '*主营业务成本*' . " 科目名称 含有 “主营业务成本” 字眼 时, 以下 3 栏位 置空
* ls_item-kostl = ''. "成本中心
* ls_item-fkber = ''. "功能范围
* ENDIF.
APPEND ls_item TO ct_item.
CLEAR: ls_item-lgmngs,ls_item-kmein,ls_item-zuonr.
"再增加 收入 hsly1 saknr2
IF lv_new2 EQ 1.
IF ls_data-hsly1 NE 0.
IF ls_data-hsly2 NE 0 .
ls_item-docln = 3.
sno = 4.
ELSE.
ls_item-docln = 2.
sno = 3.
ENDIF.
IF ls_data-hsly1 < 0.
ls_item-saknr = ls_data-saknr2. "
* ls_item-txt50 = ls_data-txt50.
ls_item-bschl = '40'.
ls_item-drcrk = 'S'.
ls_item-hsl = abs( ls_data-hsly1 ).
ELSE.
ls_item-saknr = ls_data-saknr2. "
* ls_item-txt50 = ls_data-txt50s.
ls_item-bschl = '50'.
ls_item-drcrk = 'H'.
ls_item-hsl = abs( ls_data-hsly1 ).
ENDIF.
ls_item-lgmngs = ls_data-lgmngs.
ls_item-kmein = ls_data-kmein.
ls_item-zuonr = |{ ls_data-kunag ALPHA = OUT }|.
APPEND ls_item TO ct_item.
CLEAR: ls_item-lgmngs,ls_item-kmein, ls_item-zuonr.
ENDIF.
ENDIF.
IF lv_new1 IS NOT INITIAL. " 逻辑增加 应收 hsly2 saknr1,税金 hsly3 saknr3
CLEAR: ls_item-werks, ls_item-matnr, ls_item-vbeln, ls_item-posnr, gs_ztfi144.
CLEAR lv_new1."有且只执行一次 因为是汇总数据
"增加应收 hsly2 saknr1
IF ls_data-hsly2 NE 0.
ls_item-docln = 1.
IF ls_data-hsly2 < 0.
ls_item-saknr = ls_data-saknr1. "
* ls_item-txt50 = ls_data-txt50.
ls_item-bschl = '11'.
ls_item-drcrk = 'H'.
ls_item-hsl = abs( ls_data-hsly2 ).
ELSE.
ls_item-saknr = ls_data-saknr1. "
* ls_item-txt50 = ls_data-txt50s.
ls_item-bschl = '01'.
ls_item-drcrk = 'S'.
ls_item-hsl = abs( ls_data-hsly2 ).
ENDIF.
ls_item-kunag = ls_data-kunag.
ls_item-koart = 'D'.
APPEND ls_item TO ct_item.
CLEAR: ls_item-kunag,ls_item-koart.
ENDIF.
"增加税金hsly3 saknr3
IF ls_data-hsly3 NE 0.
ls_item-docln = 2.
IF ls_data-hsly3 < 0.
ls_item-saknr = ls_data-saknr3. "
* ls_item-txt50 = ls_data-txt50.
ls_item-bschl = '40'.
ls_item-drcrk = 'S'.
ls_item-hsl = abs( ls_data-hsly3 ).
ELSE.
ls_item-saknr = ls_data-saknr3. "
* ls_item-txt50 = ls_data-txt50s.
ls_item-bschl = '50'.
ls_item-drcrk = 'H'.
ls_item-hsl = abs( ls_data-hsly3 ).
ENDIF.
CLEAR ls_item-gsber.
APPEND ls_item TO ct_item.
ENDIF.
CLEAR gs_alv.
READ TABLE gt_alv INTO gs_alv WITH KEY vbeln = ls_data-vbeln posnr = ls_data-posnr BINARY SEARCH.
IF sy-subrc EQ 0.
MOVE-CORRESPONDING gs_alv TO gs_ztfi144.
gs_ztfi144-erdat1 = gs_alv-erdat.
MOVE-CORRESPONDING gs_zdate TO gs_ztfi144.
gs_ztfi144-saknr = ls_data-saknr.
gs_ztfi144-saknr1 = ls_data-saknr1.
gs_ztfi144-saknr2 = ls_data-saknr2.
gs_ztfi144-saknr3 = ls_data-saknr3.
gs_ztfi144-hsly1 = ls_data-hsly1.
gs_ztfi144-hsly2 = ls_data-hsly2.
gs_ztfi144-hsly3 = ls_data-hsly3.
gs_ztfi144-hslz1 = ls_data-hslz1.
gs_ztfi144-zrate = ls_data-zrate.
APPEND gs_ztfi144 TO gt_ztfi144.
ENDIF.
ENDIF.
CLEAR ls_data.
ENDLOOP.
ENDLOOP.
SORT ct_item BY belnr docln.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CHECK_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- CV_SUBRC
*&---------------------------------------------------------------------*
FORM check_data CHANGING cv_subrc TYPE sy-subrc.
DATA: BEGIN OF ls_acdoca,
rldnr TYPE acdoca-rldnr,
rbukrs TYPE acdoca-rbukrs,
gjahr TYPE acdoca-gjahr,
belnr TYPE acdoca-belnr,
docln TYPE acdoca-docln,
xreversed TYPE acdoca-xreversed,
END OF ls_acdoca.
DATA: ls_ztfi105 TYPE ztfi105.
DATA: lt_ztfi105 LIKE TABLE OF ls_ztfi105,
lt_acdoca LIKE TABLE OF ls_acdoca.
DATA: lv_tabix TYPE sy-tabix.
DATA:t_edit TYPE lvc_t_styl. "定义单元格编辑
DATA:s_edit TYPE lvc_s_styl.
CLEAR cv_subrc.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE lt_ztfi105
FROM ztfi105
WHERE tcode = 'ZFI144'
AND rbukrs IN s_bukrs
AND gjahr IN s_gjahr
AND poper IN s_poper
%_HINTS HDB 'RESULT_LAG(''hana_sr'')'.
IF lt_ztfi105[] IS NOT INITIAL.
SELECT rldnr rbukrs gjahr belnr docln xreversed
INTO CORRESPONDING FIELDS OF TABLE lt_acdoca
FROM acdoca
FOR ALL ENTRIES IN lt_ztfi105
WHERE rldnr = '0L'
AND rbukrs = lt_ztfi105-rbukrs
AND gjahr = lt_ztfi105-gjahr
AND belnr = lt_ztfi105-belnr
AND docln = lt_ztfi105-docln
%_HINTS HDB 'RESULT_LAG(''hana_sr'')'.
SORT lt_acdoca BY rbukrs gjahr belnr docln.
LOOP AT lt_ztfi105 INTO ls_ztfi105.
lv_tabix = sy-tabix.
READ TABLE lt_acdoca INTO ls_acdoca WITH KEY rbukrs = ls_ztfi105-rbukrs
gjahr = ls_ztfi105-gjahr
belnr = ls_ztfi105-belnr
docln = ls_ztfi105-docln BINARY SEARCH.
IF sy-subrc EQ 0.
IF ls_acdoca-xreversed = 'X'.
DELETE lt_ztfi105 INDEX lv_tabix.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
IF lt_ztfi105[] IS NOT INITIAL.
cv_subrc = 1.
SORT lt_ztfi105 BY rbukrs gjahr racct fkber kostl gsber prctr."BELNR1
LOOP AT lt_data INTO ls_data.
lv_tabix = sy-tabix.
READ TABLE lt_ztfi105 INTO ls_ztfi105 WITH KEY rbukrs = ls_data-bukrs
gjahr = s_gjahr-low
"BELNR1 = LS_DATA-BELNR1
"RACCT = LS_DATA-SAKNR
racct = ls_data-racct " 科目
fkber = ls_data-vbeln " 功能范围
kostl = ls_data-posnr " 成本中心
gsber = ls_data-rbusa " 业务范围
prctr = ls_data-prctr " 利润中心
BINARY SEARCH.
IF sy-subrc EQ 0.
ls_data-ryear = ls_ztfi105-gjahr.
ls_data-belnr = ls_ztfi105-belnr.
ls_data-type = 'E'.
ls_data-icon = gc_icon_red.
ls_data-message = TEXT-m10.
CLEAR:s_edit.
REFRESH t_edit.
s_edit-fieldname = 'SAKNR'.
s_edit-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT s_edit INTO TABLE t_edit.
s_edit-fieldname = 'SAKNR1'.
s_edit-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT s_edit INTO TABLE t_edit.
s_edit-fieldname = 'SAKNR2'.
s_edit-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT s_edit INTO TABLE t_edit.
s_edit-fieldname = 'SAKNR3'.
s_edit-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT s_edit INTO TABLE t_edit.
REFRESH ls_data-edit.
INSERT LINES OF t_edit INTO TABLE ls_data-edit.
MODIFY lt_data FROM ls_data INDEX lv_tabix TRANSPORTING ryear belnr type icon message edit.
ELSE.
READ TABLE lt_ztfi105 INTO ls_ztfi105 WITH KEY rbukrs = ls_data-bukrs
gjahr = s_gjahr-low
racct = ls_data-saknr " 科目
fkber = ls_data-vbeln " 功能范围
kostl = ls_data-posnr " 成本中心
gsber = ls_data-rbusa " 业务范围
prctr = ls_data-prctr " 利润中心
BINARY SEARCH.
IF sy-subrc EQ 0.
ls_data-ryear = ls_ztfi105-gjahr.
ls_data-belnr = ls_ztfi105-belnr.
ls_data-type = 'E'.
ls_data-icon = gc_icon_red. "黄灯 GC_ICON_RED.
ls_data-message = TEXT-m11. "M10. 本月凭证已生成,不允许重复创建凭证!
CLEAR:s_edit.
REFRESH t_edit.
s_edit-fieldname = 'SAKNR'.
s_edit-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT s_edit INTO TABLE t_edit.
s_edit-fieldname = 'SAKNR1'.
s_edit-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT s_edit INTO TABLE t_edit.
s_edit-fieldname = 'SAKNR2'.
s_edit-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT s_edit INTO TABLE t_edit.
s_edit-fieldname = 'SAKNR3'.
s_edit-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT s_edit INTO TABLE t_edit.
REFRESH ls_data-edit.
INSERT LINES OF t_edit INTO TABLE ls_data-edit.
MODIFY lt_data FROM ls_data INDEX lv_tabix TRANSPORTING ryear belnr type icon message edit.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM.
FORM frm_getdata .
DATA: sdate TYPE sy-datum,
edate TYPE sy-datum,
smonat TYPE bkpf-monat,
lv_rcntr TYPE ztfi107-rcntr,
ls_exch_rate TYPE bapi1093_0.
DATA: lv_gjahr TYPE bseg-gjahr,
lv_monat TYPE bseg-h_monat.
DATA: l_budat TYPE sy-datum,
lv_vbeln TYPE vbeln_vl.
DATA: l_gjahr TYPE gjahr,
lv_rtype TYPE c.
RANGES: r_monat FOR bseg-h_monat.
DATA: lt_alv TYPE TABLE OF ty_alv,
seltab TYPE TABLE OF rsparams,
seltab_wa LIKE LINE OF seltab.
DATA lcl_data TYPE REF TO data.
FIELD-SYMBOLS <lt_data> TYPE STANDARD TABLE. "定义承接数据的动态内表
RANGES: gr_kostl FOR cskt-kostl. "用Ranges 将 GetData 与 成本中心配置表ZTFI107中成本中心 先取好 以备 AFRU 取值时提升效率
"以下为取数逻辑 参考程序 复制报表ZFI021NA,删除销售出库单为空的数据
"初始设置
CLEAR: lv_rtype,seltab[],seltab_wa.
* CLEAR :seltab_wa .
* seltab_wa-selname = 'S_EKORG'.
* seltab_wa-sign = 'I'.
* seltab_wa-option = 'EQ'.
* seltab_wa-low = s_bukrs[ 1 ]-low .
* APPEND seltab_wa TO seltab.
*
* cl_salv_bs_runtime_info=>set( EXPORTING display = abap_false
* metadata = abap_false
* data = abap_true ).
*
* SUBMIT zfi021na WITH SELECTION-TABLE seltab
* WITH s_erdat = gv_last_date AND RETURN .
* IF sy-subrc = 0.
* "获取ALV内表的值
* TRY .
* WAIT UP TO '0.5' SECONDS.
* cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lcl_data ).
*
* CATCH cx_salv_bs_sc_runtime_info INTO DATA(cx_error).
* lv_rtype = 'E'.
* ENDTRY.
*
* ENDIF.
*
* IF lv_rtype IS INITIAL. "直接获取
* "清空所有变量 一定要清,不然可能会对自己的ALV展示会有影响
* cl_salv_bs_runtime_info=>clear_all( ).
* ASSIGN lcl_data->* TO <lt_data>.
* IF <lt_data> IS ASSIGNED.
* MOVE-CORRESPONDING <lt_data>[] TO gt_alv[] .
* ENDIF .
*
* ELSE. "参考逻辑
*
*
*
* ENDIF.
CLEAR : gt_alv[] , lt_alv[].
SELECT * INTO TABLE @DATA(lt_ztfiftpd) FROM ztfiftpd
WHERE cprog = 'ZFI021NA'
AND bukrs IN @s_bukrs
AND yyyymm = @gv_last_date(6) .
LOOP AT lt_ztfiftpd INTO DATA(ls_ztfiftpd) .
CALL TRANSFORMATION id SOURCE XML ls_ztfiftpd-zdata
RESULT zdata = lt_alv . " LS_ZRFCD
APPEND LINES OF lt_alv TO gt_alv .
ENDLOOP .
DELETE gt_alv WHERE vbeln IS INITIAL. "复制报表ZFI021NA,删除销售出库单为空的数据
SORT gt_alv BY vbeln posnr.
CLEAR: gs_output,gt_output[], gr_kostl[], gt_dn[], gt_zrate[].
LOOP AT gt_alv INTO gs_alv.
MOVE-CORRESPONDING gs_alv TO gs_output.
PERFORM frm_add_matn1_input(zmm012) USING gs_output-matnr.
*BAPI_BILLINGDOC_CREATEMULTIPLE
gs_output-hsly1 = gs_output-lgmngs * gs_output-netprs. "销售未税单价*未开票数量
gs_output-hsly2 = gs_output-lgmngs * ( 1 + gs_output-mwsbps ) * gs_output-netprs. "销售未税单价*(1+税率)*未开票数量
APPEND gs_output TO gt_output.
gs_dn-vbeln = gs_output-vbeln.
gs_dn-hsly1 = gs_output-hsly1.
gs_dn-hsly2 = gs_output-hsly2.
COLLECT gs_dn INTO gt_dn.
IF gs_output-waerk NE 'CNY'.
gs_zrate-waerk = gs_output-waerk.
COLLECT gs_zrate INTO gt_zrate.
ENDIF.
CLEAR: gs_dn, gs_zrate, gs_output.
ENDLOOP.
CLEAR: gt_alv.
IF gt_output[] IS INITIAL .
MESSAGE TEXT-m01 TYPE 'S' DISPLAY LIKE 'E'. " 无符合条件的数据!
EXIT.
ELSE.
SELECT vkorg, vtweg,matnr, ktgrm INTO TABLE @DATA(lt_mvke)
FROM mvke
FOR ALL ENTRIES IN @gt_output
WHERE vkorg = @gt_output-bukrs
AND vtweg = '00'
AND matnr = @gt_output-matnr
AND ktgrm NE ''.
IF sy-subrc EQ 0.
SORT lt_mvke BY vkorg matnr.
ENDIF.
SELECT * INTO TABLE @DATA(lt_c908)
FROM c908
WHERE kappl EQ 'VB'
AND ktopl EQ 'LY00'
AND vkorg EQ @s_bukrs-low.
IF sy-subrc EQ 0.
SORT lt_c908 BY vkorg ktgrm.
ENDIF.
SELECT * INTO TABLE @DATA(lt_c901)
FROM c901
WHERE kappl EQ 'V'
AND kschl EQ 'KOFI'
AND ktopl EQ 'LY00'
AND werks EQ @s_bukrs-low
AND kvsl1 EQ 'Z01'.
IF sy-subrc EQ 0.
SORT lt_c901 BY werks ktgrm.
ENDIF.
SELECT * INTO TABLE @DATA(lt_c003)
FROM c003
WHERE kappl EQ 'V'
AND kschl EQ 'KOFI'
AND ktopl EQ 'LY00'
AND vkorg EQ @s_bukrs-low
AND kvsl1 EQ 'Z01'.
IF sy-subrc EQ 0.
SORT lt_c003 BY vkorg ktgrm.
ENDIF.
ENDIF.
LOOP AT gt_zrate INTO gs_zrate.
num = sy-tabix.
CLEAR ls_exch_rate.
CALL FUNCTION 'BAPI_EXCHANGERATE_GETDETAIL'
EXPORTING
rate_type = 'M'
from_curr = gs_zrate-waerk
to_currncy = 'CNY'
"date = gt_vbap-audat
date = gv_last_date " s_date
IMPORTING
exch_rate = ls_exch_rate.
gs_zrate-zrate = ls_exch_rate-exch_rate.
MODIFY gt_zrate FROM gs_zrate INDEX num.
ENDLOOP.
num = 0.
SORT gt_dn BY vbeln.
SORT gt_zrate BY waerk.
SORT gt_output BY bukrs werks vbeln matnr.
CLEAR: ls_data, lt_data[], lv_vbeln.
LOOP AT gt_output INTO gs_output .
MOVE-CORRESPONDING gs_output TO ls_data.
ls_data-ryear = gs_output-gjahr.
ls_data-rpmax = gs_output-monat. "s_poper-low
ls_data-bukrs = gs_output-bukrs.
ls_data-racct = gs_output-hkont. "库存科目
** ls_data-txt50 = gs_output-txt50.
** ls_data-rcntr = gs_output-rcntr.
** ls_data-ktext = gs_output-ktext. "成本中心名称
ls_data-rbusa = gs_output-gsber . "业务范围
** ls_data-gtext = gs_output-gtext. "业务范围名称
** ls_data-rfarea = gs_output-rfarea. "功能范围
** ls_data-fkbtx = gs_output-fkbtx. "功能范围名称
** ls_data-prctr = gs_output-prctr. "利润中心
ls_data-rtcur = gs_output-waerk. "币别
ls_data-hsly1 = gs_output-hsly1 . "收入 销售未税单价*未开票数量
* ls_data-hsly2 = gs_output-hsly2. "本年累计货方(本币)
ls_data-hslz1 = gs_output-mwsbp_1 + gs_output-mwsbp_2 + gs_output-mwsbp_3. "成本、库存
ls_data-werks = gs_output-werks.
ls_data-matnr = gs_output-matnr.
ls_data-vbeln = gs_output-vbeln.
ls_data-posnr = gs_output-posnr.
ls_data-kunag = gs_output-kunag. "客户编码
ls_data-name_org1 = gs_output-name_org1. "客户名称
ls_data-kmein = gs_output-kmein.
ls_data-lgmngs = gs_output-lgmngs.
CLEAR gs_dn.
READ TABLE gt_dn INTO gs_dn WITH KEY vbeln = gs_output-vbeln BINARY SEARCH.
IF sy-subrc EQ 0.
ls_data-hsly2 = gs_dn-hsly2.
ls_data-hsly3 = gs_dn-hsly2 - gs_dn-hsly1.
ENDIF.
"公司名称
SELECT SINGLE butxt INTO ls_data-butxt
FROM t001 WHERE bukrs = ls_data-bukrs.
"科目名称
IF sy-langu EQ 'E'.
SELECT SINGLE skat~txt50 INTO ls_data-txt50 FROM skat
WHERE skat~saknr = ls_data-racct AND skat~ktopl = 'OCOA' AND skat~spras = sy-langu.
ELSE.
SELECT SINGLE skat~txt50 INTO ls_data-txt50 FROM skat
WHERE skat~saknr = ls_data-racct AND skat~ktopl = 'LY00' AND skat~spras = sy-langu.
ENDIF.
"1. 对方科目 / 对方科目名称
READ TABLE lt_mvke INTO DATA(ls_mvke) WITH KEY vkorg = gs_output-bukrs matnr = gs_output-matnr BINARY SEARCH.
IF sy-subrc EQ 0.
READ TABLE lt_c901 INTO DATA(ls_c901) WITH KEY werks = gs_output-werks ktgrm = ls_mvke-ktgrm BINARY SEARCH.
IF sy-subrc EQ 0."优先1在保税部分中查找:用工厂+科目设置组去识别收入科目
ls_data-saknr2 = ls_c901-sakn2.
* IF sy-langu EQ 'E'.
* SELECT SINGLE skat~txt50 INTO ls_data-txt50s FROM skat
* WHERE skat~saknr = ls_data-saknr AND skat~ktopl = 'OCOA' AND skat~spras = sy-langu.
* ELSE.
* SELECT SINGLE skat~txt50 INTO ls_data-txt50s FROM skat
* WHERE skat~saknr = ls_data-saknr AND skat~ktopl = 'LY00' AND skat~spras = sy-langu.
* ENDIF.
ELSE."优先2,在1中没找到就取找非保税的:用销售组织+科目设置组找收入科目
READ TABLE lt_c003 INTO DATA(ls_c003) WITH KEY vkorg = gs_output-bukrs ktgrm = ls_mvke-ktgrm BINARY SEARCH.
IF sy-subrc EQ 0.
ls_data-saknr2 = ls_c003-sakn2.
IF sy-langu EQ 'E'.
SELECT SINGLE skat~txt50 INTO ls_data-txt50s FROM skat
WHERE skat~saknr = ls_data-saknr AND skat~ktopl = 'OCOA' AND skat~spras = sy-langu.
ELSE.
SELECT SINGLE skat~txt50 INTO ls_data-txt50s FROM skat
WHERE skat~saknr = ls_data-saknr AND skat~ktopl = 'LY00' AND skat~spras = sy-langu.
ENDIF.
ENDIF.
ENDIF.
READ TABLE lt_c901 INTO ls_c901 WITH KEY werks = gs_output-werks ktgrm = ls_mvke-ktgrm BINARY SEARCH.
IF sy-subrc EQ 0."优先1在保税部分中查找:用工厂+科目设置组去识别收入科目
ls_data-saknr = ls_c901-sakn2.
* IF sy-langu EQ 'E'.
* SELECT SINGLE skat~txt50 INTO ls_data-txt50s FROM skat
* WHERE skat~saknr = ls_data-saknr AND skat~ktopl = 'OCOA' AND skat~spras = sy-langu.
* ELSE.
* SELECT SINGLE skat~txt50 INTO ls_data-txt50s FROM skat
* WHERE skat~saknr = ls_data-saknr AND skat~ktopl = 'LY00' AND skat~spras = sy-langu.
* ENDIF.
ELSE."优先2,在1中没找到就取找非保税的:用销售组织+科目设置组找收入科目
READ TABLE lt_c003 INTO ls_c003 WITH KEY vkorg = gs_output-bukrs ktgrm = ls_mvke-ktgrm BINARY SEARCH.
IF sy-subrc EQ 0.
ls_data-saknr = ls_c003-sakn2.
IF sy-langu EQ 'E'.
SELECT SINGLE skat~txt50 INTO ls_data-txt50s FROM skat
WHERE skat~saknr = ls_data-saknr AND skat~ktopl = 'OCOA' AND skat~spras = sy-langu.
ELSE.
SELECT SINGLE skat~txt50 INTO ls_data-txt50s FROM skat
WHERE skat~saknr = ls_data-saknr AND skat~ktopl = 'LY00' AND skat~spras = sy-langu.
ENDIF.
ENDIF.
ENDIF.
READ TABLE lt_c908 INTO DATA(ls_c908) WITH KEY vkorg = gs_output-bukrs ktgrm = ls_mvke-ktgrm BINARY SEARCH.
IF sy-subrc EQ 0."优先1取OV64根据物料主数据销售视图2中科目设置组+公司代码找对应的应收科目
ls_data-saknr1 = ls_c908-sakn1.
* ELSE."优先2根据销售出库单中的公司代码+客户统御取科目
ENDIF.
ENDIF.
CLEAR: ls_c003,ls_c908,ls_c901, ls_mvke.
"C908
IF ls_data-saknr1 IS INITIAL. "应收科目
ls_data-saknr1 = '1122010000'.
ENDIF.
IF ls_data-saknr3 IS INITIAL. "税金科目
ls_data-saknr3 = '2221000000'.
ENDIF.
"2. 分摊金额 业务范围
IF ls_data-rbusa IS INITIAL.
ls_data-rbusa = '9999'.
ENDIF.
"业务范围名称
SELECT SINGLE tgsbt~gtext INTO ls_data-gtext FROM tgsbt
WHERE tgsbt~gsber = gs_output-gsber AND tgsbt~spras = sy-langu.
"3. 汇率
IF ls_data-rtcur NE 'CNY'.
CLEAR gs_zrate.
READ TABLE gt_zrate INTO gs_zrate WITH KEY waerk = ls_data-rtcur BINARY SEARCH.
IF sy-subrc EQ 0.
ls_data-zrate = gs_zrate-zrate.
ls_data-hsly1 = ls_data-hsly1 * ls_data-zrate.
ls_data-hsly2 = ls_data-hsly2 * ls_data-zrate.
ls_data-hsly3 = ls_data-hsly3 * ls_data-zrate.
ls_data-hslz1 = ls_data-hslz1 * ls_data-zrate.
ENDIF.
ELSE.
ls_data-zrate = 1.
ENDIF.
IF lv_vbeln NE gs_output-vbeln.
num = num + 1.
lv_vbeln = gs_output-vbeln.
ENDIF.
IF ls_data-saknr IS INITIAL OR ls_data-saknr1 IS INITIAL
OR ls_data-saknr2 IS INITIAL OR ls_data-saknr3 IS INITIAL.
* num = num + 1.
ls_data-belnr1 = num.
ls_data-icon = gc_icon_red.
ls_data-message = '未获取到相应科目'.
APPEND ls_data TO lt_data.
ELSE.
IF ls_data-hsly2 <> 0.
* num = num + 1.
ls_data-belnr1 = num. "分录
APPEND ls_data TO lt_data.
ELSE.
* num = num + 1.
ls_data-belnr1 = num.
ls_data-icon = gc_icon_red.
ls_data-message = '未获取到应收金额'.
APPEND ls_data TO lt_data.
ENDIF.
ENDIF.
CLEAR ls_data.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOUBLE_CLICK 双击事件
*&---------------------------------------------------------------------*
FORM frm_double_click USING p_row_id TYPE lvc_s_row
p_column_i TYPE lvc_s_col.
IF p_column_i-fieldname EQ 'RFAREA'.
READ TABLE lt_data INTO ls_data INDEX p_row_id-index.
IF sy-subrc = 0 .
SET PARAMETER ID 'ACC' FIELD ls_data-racct.
SET PARAMETER ID 'BUK' FIELD ls_data-bukrs.
SET PARAMETER ID 'GJR' FIELD ls_data-ryear.
CALL TRANSACTION 'FAGLB03' AND SKIP FIRST SCREEN.
ENDIF.
ELSEIF p_column_i-fieldname EQ 'BELNR'.
READ TABLE lt_data INTO ls_data INDEX p_row_id-index.
IF sy-subrc = 0 AND ls_data-belnr IS NOT INITIAL.
SET PARAMETER ID 'BLN' FIELD ls_data-belnr.
SET PARAMETER ID 'BUK' FIELD ls_data-bukrs.
SET PARAMETER ID 'GJR' FIELD ls_data-ryear.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHANFWD_DATA
*&---------------------------------------------------------------------*
FORM frm_changed_data USING er_data_changed TYPE REF TO cl_alv_changed_data_protocol.
DATA: lt_data1 TYPE lvc_t_modi,
ls_data1 LIKE LINE OF lt_data1,
lv_saknr TYPE saknr,
lv_error TYPE char1.
lt_data1 = er_data_changed->mt_mod_cells.
LOOP AT lt_data1 INTO ls_data1.
IF ls_data1-fieldname+0(5) EQ 'SAKNR'.
CLEAR lv_saknr.
CALL METHOD er_data_changed->get_cell_value
EXPORTING
i_row_id = ls_data1-row_id
i_fieldname = ls_data1-fieldname
IMPORTING
e_value = lv_saknr.
IF sy-langu EQ 'E'.
SELECT SINGLE saknr INTO lv_saknr FROM skat
WHERE saknr = lv_saknr AND ktopl = 'OCOA' AND spras = sy-langu.
ELSE.
SELECT SINGLE saknr INTO lv_saknr FROM skat
WHERE skat~saknr = lv_saknr AND ktopl = 'LY00' AND spras = sy-langu.
ENDIF.
IF sy-subrc NE 0.
MESSAGE s002(zsys) WITH '输入的科目不正确,请检查确认!' DISPLAY LIKE 'E'.
ELSE.
READ TABLE lt_data ASSIGNING FIELD-SYMBOL(<fs_data>) INDEX ls_data1-row_id.
IF sy-subrc EQ 0.
ASSIGN COMPONENT ls_data1-fieldname OF STRUCTURE <fs_data> TO FIELD-SYMBOL(<fs_value>).
IF <fs_value> IS ASSIGNED.
<fs_value> = lv_saknr.
ENDIF.
UNASSIGN: <fs_value>, <fs_data>.
ENDIF.
ENDIF.
ENDIF.
CLEAR lv_error.
READ TABLE lt_data ASSIGNING <fs_data> INDEX ls_data1-row_id.
IF sy-subrc EQ 0.
IF <fs_data>-saknr IS INITIAL OR <fs_data>-saknr1 IS INITIAL
OR <fs_data>-saknr2 IS INITIAL OR <fs_data>-saknr3 IS INITIAL.
<fs_data>-icon = gc_icon_red.
<fs_data>-message = '未获取到相应科目'.
lv_error = 'X'.
ELSE.
IF <fs_data>-hsly2 EQ 0.
<fs_data>-icon = gc_icon_red.
<fs_data>-message = '未获取到应收金额'.
lv_error = 'X'.
ENDIF.
ENDIF.
IF lv_error IS INITIAL.
<fs_data>-icon = ''.
<fs_data>-message = ''.
ENDIF.
ENDIF.
UNASSIGN: <fs_data>.
ENDLOOP.
PERFORM refresh_alv USING go_grid_100.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DATA_CHANGED_FINISHED
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> ET_GOOD_CELLS
*&---------------------------------------------------------------------*
FORM frm_data_changed_finished USING et_good_cells TYPE lvc_t_modi.
CHECK et_good_cells[] IS NOT INITIAL.
DATA stbl TYPE lvc_s_stbl.
stbl-row = 'X'." 基于行的稳定刷新
stbl-col = 'X'." 基于列稳定刷新
CALL METHOD go_grid_100->refresh_table_display
EXPORTING
is_stable = stbl. "更改后数据刷新
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ONF4_HELP
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> E_FIELDNAME
*& --> ES_ROW_NO
*& --> ER_EVENT_DATA
*&---------------------------------------------------------------------*
FORM frm_onf4_help USING pv_fieldname pv_fieldvalue pv_row_no TYPE lvc_s_roid
pv_event_data TYPE REF TO cl_alv_event_data
pv_display.
DATA:lv_fieldname1 TYPE dfies-fieldname,
lv_fieldname2 TYPE help_info-dynprofld.
DATA:rs_selfield TYPE slis_selfield.
DATA:ref_grid TYPE REF TO cl_gui_alv_grid.
DATA:lt_return TYPE STANDARD TABLE OF ddshretval,
ls_return TYPE ddshretval.
DATA:BEGIN OF lt_saknr OCCURS 0,
saknr TYPE skat-saknr,
txt50 TYPE skat-txt50,
END OF lt_saknr.
DATA:ls_saknr LIKE lt_saknr.
REFRESH:lt_saknr.
IF sy-langu EQ 'E'.
SELECT skat~saknr skat~txt50 INTO TABLE lt_saknr FROM skat
WHERE skat~ktopl = 'OCOA' AND skat~spras = sy-langu.
ELSE.
SELECT skat~saknr skat~txt50 INTO TABLE lt_saknr FROM skat
WHERE skat~ktopl = 'LY00' AND skat~spras = sy-langu.
ENDIF.
lv_fieldname1 = pv_fieldname+0(5) ."搜索帮助的字段名
lv_fieldname2 = pv_fieldname+0(5) ."搜索帮助的字段名
CONDENSE lv_fieldname1 NO-GAPS.
CONDENSE lv_fieldname2 NO-GAPS.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = ref_grid. "获取全局变量
REFRESH:lt_return.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = lv_fieldname1
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = lv_fieldname2
value_org = 'S'
display = 'F'
TABLES
value_tab = lt_saknr
return_tab = lt_return
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
CLEAR:ls_data.
READ TABLE lt_data INTO ls_data INDEX pv_row_no-row_id.
IF sy-subrc = 0.
READ TABLE lt_return INTO ls_return INDEX 1.
IF sy-subrc = 0.
IF pv_fieldname EQ 'SAKNR'. ls_data-saknr = ls_return-fieldval. ENDIF.
IF pv_fieldname EQ 'SAKNR1'. ls_data-saknr1 = ls_return-fieldval. ENDIF.
IF pv_fieldname EQ 'SAKNR2'. ls_data-saknr2 = ls_return-fieldval. ENDIF.
IF pv_fieldname EQ 'SAKNR3'. ls_data-saknr3 = ls_return-fieldval. ENDIF.
ENDIF.
CLEAR:ls_data-icon,ls_data-message .
IF ls_data-saknr IS INITIAL OR ls_data-saknr1 IS INITIAL
OR ls_data-saknr2 IS INITIAL OR ls_data-saknr3 IS INITIAL.
ls_data-icon = gc_icon_red.
ls_data-message = '未获取到相应科目'.
ENDIF.
IF ls_data-hsly2 EQ 0.
ls_data-icon = gc_icon_red.
ls_data-message = '未获取到应收金额'.
ENDIF.
MODIFY lt_data FROM ls_data INDEX pv_row_no-row_id."更新ALV内表
ENDIF.
PERFORM refresh_alv USING go_grid_100.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CHECK_DATA_VF01
*&---------------------------------------------------------------------*
*& text 模拟 VF01 检查错误
*&---------------------------------------------------------------------*
*& <-- LV_SUBRC
*& <-- LV_STRING
*&---------------------------------------------------------------------*
FORM check_data_vf01 CHANGING pv_subrc TYPE sy-subrc
pv_msg TYPE string.
DATA: ls_bill TYPE bapivbrk,
lt_bill TYPE TABLE OF bapivbrk,
lt_return TYPE TABLE OF bapiret1,
ls_return TYPE bapiret1,
lt_success TYPE TABLE OF bapivbrksuccess.
CLEAR: lt_return[], lt_success[],lt_bill[],pv_subrc, pv_msg.
LOOP AT lt_vf01 INTO ls_data WHERE sel IS NOT INITIAL .
ls_bill-bill_date = gv_last_date.
ls_bill-ref_doc = ls_data-vbeln.
ls_bill-ref_item = ls_data-posnr.
ls_bill-req_qty = ls_data-lgmngs.
ls_bill-ref_doc_ca = 'J'.
APPEND ls_bill TO lt_bill.
ENDLOOP.
CALL FUNCTION 'BAPI_BILLINGDOC_CREATEMULTIPLE'
EXPORTING
* CREATORDATAIN =
testrun = 'X'
* POSTING =
TABLES
billingdatain = lt_bill
* CONDITIONDATAIN =
* CCARDDATAIN =
* TEXTDATAIN =
* ERRORS =
return = lt_return
success = lt_success
* NFMETALLITMS =
.
LOOP AT lt_return INTO ls_return WHERE type CA 'EA'.
pv_subrc = '1'.
pv_msg = pv_msg && ls_return-message.
ENDLOOP.
IF pv_subrc EQ 1.
ls_data-icon = gc_icon_red.
ls_data-message = pv_msg.
MODIFY lt_data FROM ls_data TRANSPORTING icon message WHERE vbeln = ls_data-vbeln .
PERFORM refresh_alv USING go_grid_100.
ENDIF.
ENDFORM.