一、功能逻辑










二、功能界面


三、功能代码
*&———————————————————————*
*& 程序名: ZRPFI_IMPORT_ACC_DOCUMENT
*& 创建者(公司)/日期:
*& 程序描述:
*& 1. 会计凭证批量导入功能
*&———————————————————————*
*& 版本/修改者(公司)/日期//修改描述
*&
*&*&会计凭证批量导入功能增加字段FKBER职能范围-2022.5.7 ZHANGYJ
*&———————————————————————*
REPORT zrpfi_import_acc_document MESSAGE-ID 00.
************************************************************************
* INCLUDES
************************************************************************
INCLUDE zrpfi_import_acc_document_top.
INCLUDE zrpfi_import_acc_document_scr.
INCLUDE zrpfi_import_acc_document_f01.
INCLUDE zrpfi_import_acc_document_f02.
************************************************************************
* INITIALIZATION
************************************************************************
INITIALIZATION.
PERFORM frm_init_screen.
************************************************************************
* AT SELECTION-SCREEN on value-request
************************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fpath.
PERFORM frm_get_filepath CHANGING p_fpath.
************************************************************************
* AT SELECTION-SCREEN
************************************************************************
AT SELECTION-SCREEN.
CASE sscrfields-ucomm.
WHEN 'FC01'.
PERFORM frm_download_temp USING 'ZFICO_ACCDOC_IMPORT' TEXT-004.
ENDCASE.
************************************************************************
* START-OF-SELECTION
************************************************************************
START-OF-SELECTION.
*— Main process
“获取上传的数据—>
“检查 & 整合数据到ALV【红绿灯、勾选框】—>
“GUI添加按钮,过账—>
PERFORM frm_upload_file USING p_fpath.
CHECK flg_err IS INITIAL .
PERFORM frm_check_data.
PERFORM frm_dispaly_data.
*&———————————————————————*
*& 包含 ZRPFI_IMPORT_ACC_DOCUMENT_TOP
*&———————————————————————*
TYPE-POOLS icon.
TABLES sscrfields.
DATA: functxt TYPE smp_dyntxt.
DATA: BEGIN OF gt_file OCCURS 0, “仅用来存储上传内容,不做其他处理
str1 TYPE n LENGTH 4,
str2 TYPE bkpf-bukrs,
str3 TYPE bkpf-blart,
str4 TYPE bkpf-bldat,
str5 TYPE bkpf-budat,
str31 TYPE bkpf-monat,
str6 TYPE bkpf-waers,
str7 TYPE bkpf-kursf,
str8 TYPE bkpf-xblnr,
str9 TYPE bkpf-bktxt,
str10 TYPE bseg-bschl,
str11 TYPE bseg-hkont,
str12 TYPE lfa1-lifnr,
str13 TYPE kna1-kunnr,
str14 TYPE anla-anln1,
str15 TYPE bseg-anbwa,
str16 TYPE bseg-umskz,
str17 TYPE bseg-dmbtr,
str18 TYPE bseg-wrbtr,
str19 TYPE bseg-xnegp,
str20 TYPE bseg-prctr,
str21 TYPE cskt-kostl,
str22 TYPE aufk-aufnr,
str23 TYPE bseg-kidno,
str24 TYPE bseg-zterm,
str25 TYPE bseg-zfbdt,
str26 TYPE bseg-xref1,
str27 TYPE bseg-xref2,
str28 TYPE bseg-zuonr,
str29 TYPE bseg-sgtxt,
str30 TYPE bseg-rstgr,
str32 TYPE bseg-kkber,
str33 TYPE csks-func_area, ” 职能范围 “*—会计凭证批量导入功能增加字段FKBER职能范围-2022.5.7 ZHANGYJ
str34 TYPE char10,
str35 TYPE bseg-vbund,
str36 TYPE bseg-bewar,
END OF gt_file.
TYPES: BEGIN OF ty_alv,
box TYPE c, “勾选框
light TYPE c LENGTH 20, “红绿灯
zmes TYPE string, “消息
belnr TYPE bkpf-belnr, “会计凭证
gjahr TYPE bkpf-gjahr, “会计凭证
buzei TYPE bseg-buzei, “会计凭证行号
zid TYPE n LENGTH 4, “凭证组号
bukrs TYPE bkpf-bukrs, “公司代码
blart TYPE bkpf-blart, “凭证类型
bldat TYPE bkpf-bldat, “凭证日期
budat TYPE bkpf-budat, “过账日期
monat TYPE bkpf-monat, “过账期间
waers TYPE bkpf-waers, “币别
kursf TYPE bkpf-kursf, “汇率
k_sfcy TYPE c, “汇率是否参与BAPI【不显示】
xblnr TYPE bkpf-xblnr, “参照
bktxt TYPE bkpf-bktxt, “抬头文本
bschl TYPE bseg-bschl, “记账码
hkont TYPE bseg-hkont, “总账科目
txt20 TYPE skat-txt20, “总账科目描述
rstgr TYPE bseg-rstgr, “付款原因代码
lifnr TYPE bseg-lifnr, “供应商
lname TYPE lfa1-name1, “供应商名称
kunnr TYPE bseg-kunnr, “客户
kname TYPE kna1-name1, “客户名称
anln1 TYPE bseg-anln1, “资产
txt50 TYPE anla-txt50, “资产描述
anbwa TYPE bseg-anbwa, “资产业务类型
umskz TYPE bseg-umskz, “特别总账标识
shkzg TYPE bseg-shkzg, “借贷标志【不显示】
dmbtr TYPE bseg-dmbtr, “本位币金额
wrbtr TYPE bseg-wrbtr, “原币金额
xnegp TYPE bseg-xnegp, “反记账
prctr TYPE bseg-prctr, “利润中心
kostl TYPE bseg-kostl, “成本中心
ktext TYPE cskt-ktext, “成本中心描述
aufnr TYPE bseg-aufnr, “内部订单
atext TYPE aufk-ktext, “内部订单描述
kidno TYPE bseg-kidno, “付款参考
zterm TYPE bseg-zterm, “付款条件
zfbdt TYPE bseg-zfbdt, “基准日期
xref1 TYPE bseg-xref1, “参考代码1
xref2 TYPE bseg-xref2, “参考代码2
zuonr TYPE bseg-zuonr, “分配
sgtxt TYPE bseg-sgtxt, “行项目文本
kkber TYPE bseg-kkber, “信用控制范围
fkber_long TYPE bseg-fkber_long,
* FKBER TYPE CSKS-FUNC_AREA,” 职能范围 “*—会计凭证批量导入功能增加字段FKBER职能范围-2022.5.7 ZHANGYJ
field_style TYPE lvc_t_styl, “【控制单元格】
fund TYPE char10,
zsort TYPE i,
vbund TYPE bseg-vbund,
bewar TYPE bseg-bewar,
END OF ty_alv.
DATA: gs_alv TYPE ty_alv,
gt_alv TYPE TABLE OF ty_alv,
gs_alv_group TYPE ty_alv.
DATA: gt_fcat TYPE lvc_t_fcat,
gs_fcat TYPE lvc_s_fcat,
gs_layo TYPE lvc_s_layo,
gs_stylerow TYPE lvc_s_styl, “控制单元格style
gt_stylerow TYPE lvc_t_styl.
DATA:gt_log TYPE TABLE OF ztfi003_log .
DATA:flg_err TYPE c .
DEFINE set_field.
gs_fcat-fieldname = &1. “字段名
gs_fcat-scrtext_s = &2. “字段名文本
gs_fcat-scrtext_m = &2.
gs_fcat-scrtext_l = &2.
gs_fcat-outputlen = &3. “输出长度
* gs_fcat-no_zero = 'X'. “注释掉 20221012
* gs_fcat-just = 'C'. “i_just. “对齐方式
IF gs_fcat-fieldname = 'BOX'.
gs_fcat-checkbox = 'X'.
gs_fcat-edit = 'X'.
ENDIF.
IF gs_fcat-fieldname = 'LIGHT'.
gs_fcat-icon = 'X'.
ENDIF.
APPEND gs_fcat TO gt_fcat.
CLEAR gs_fcat.
END-OF-DEFINITION.
*&———————————————————————*
*& 包含 ZRPFI_IMPORT_ACC_DOCUMENT_SCR
*&———————————————————————*
SELECTION-SCREEN BEGIN OF BLOCK b_01 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_fpath TYPE rlgrap-filename. “string
* PARAMETERS: c_test TYPE c AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK b_01.
*—Active default function key1&2
SELECTION-SCREEN: FUNCTION KEY 1.
*&———————————————————————*
*& 包含 ZRPFI_IMPORT_ACC_DOCUMENT_F01
*&———————————————————————*
*&———————————————————————*
*& Form frm_init_screen
*&———————————————————————*
*& text
*&———————————————————————*
FORM frm_init_screen .
functxt-icon_id = icon_export.
functxt-icon_text = TEXT-002.
sscrfields-functxt_01 = functxt.
ENDFORM.
*&———————————————————————*
*& Form frm_get_filepath
*&———————————————————————*
*& text
*&———————————————————————*
*& <– P_FPATH
*&———————————————————————*
FORM frm_get_filepath CHANGING c_path.
FIELD-SYMBOLS: <fs_file_table> TYPE file_table.
DATA: lt_file_table TYPE filetable,
l_rc TYPE i.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
CHANGING
file_table = lt_file_table
rc = l_rc.
IF lt_file_table IS INITIAL.
MESSAGE s001 WITH TEXT-m01 DISPLAY LIKE 'E'.
RETURN.
ENDIF.
LOOP AT lt_file_table ASSIGNING <fs_file_table>.
CONCATENATE c_path <fs_file_table>-filename INTO c_path.
ENDLOOP.
ENDFORM.
*&———————————————————————*
*& Form frm_download_temp
*&———————————————————————*
*& text
*&———————————————————————*
*& –> P_
*& –> TEXT_004
*&———————————————————————*
FORM frm_download_temp USING p_template
p_text.
DATA: lv_fname TYPE string,
lv_title TYPE string,
lv_path TYPE string VALUE 'D:/',
lv_fpath TYPE string VALUE 'D:/',
lv_file TYPE rlgrap-filename.
DATA: ls_wdatb LIKE wwwdatatab.
DATA: lv_subrc TYPE sy-subrc.
lv_fname = p_text.
CONCATENATE p_text '下载' INTO lv_title.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = lv_title
default_extension = 'xls'
default_file_name = lv_fname
initial_directory = 'D:'
file_filter = 'Excel文件(*.xls)|*.xls|全部文件 (*.*)|*.*|'
prompt_on_overwrite = 'X'
CHANGING
filename = lv_fname
path = lv_path
fullpath = lv_fpath
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
SELECT SINGLE relid objid
FROM wwwdata
INTO CORRESPONDING FIELDS OF ls_wdatb
WHERE srtf2 = 0
AND relid = 'MI'
AND objid = p_template.
IF ls_wdatb IS INITIAL.
MESSAGE e398(00) WITH '模板文件不存在!'.
ELSE.
lv_file = lv_fpath.
IF lv_file IS NOT INITIAL.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = ls_wdatb
destination = lv_file
IMPORTING
rc = lv_subrc.
IF lv_subrc NE 0.
MESSAGE e398(00) WITH '模板下载失败!'.
ELSE.
MESSAGE s398(00) WITH '下载成功'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDFORM.
*&———————————————————————*
*& 包含 ZRPFI_IMPORT_ACC_DOCUMENT_F02
*&———————————————————————*
*&———————————————————————*
*& Form frm_upload_file
*&———————————————————————*
*& text
*&———————————————————————*
*& –> P_FPATH
*&———————————————————————*
FORM frm_upload_file USING i_file.
DATA: wa_raw TYPE truxs_t_text_data,
lv_str_file TYPE rlgrap-filename.
DATA: lc_str TYPE c LENGTH 10.
CLEAR flg_err .
CLEAR: lv_str_file.
lv_str_file = i_file.
IF i_file IS INITIAL.
MESSAGE s010(2b) WITH '请输入导入文件地址!' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
* CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
* EXPORTING
* i_line_header = 'X'
* i_tab_raw_data = wa_raw
* i_filename = lv_str_file
* TABLES
* i_tab_converted_data = gt_file
* EXCEPTIONS
* conversion_failed = 1
* OTHERS = 2.
* IF gt_file[] IS INITIAL.
* lc_str = '没有数据!请检查文件是否被打开。'.
* MESSAGE s398(00) WITH lc_str DISPLAY LIKE'E'.
* LEAVE LIST-PROCESSING.
* ENDIF.
DATA: lt_alsmex_tabline TYPE TABLE OF zalsmex_tabline.
CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = lv_str_file
i_begin_col = 1
i_begin_row = 3
i_end_col = 36 “列数,如果新增了字段,一定要加!!!
i_end_row = 9999
TABLES
intern = lt_alsmex_tabline
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc = 1.
* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
MESSAGE '数据读取异常,请联系管理员' TYPE 'E'.
ELSEIF sy-subrc = 2.
MESSAGE '打开文件出错,请检查文档' TYPE 'E'.
ELSEIF sy-subrc = 3.
MESSAGE '未知错误,请联系管理员' TYPE 'E'.
ENDIF.
IF lt_alsmex_tabline[] IS NOT INITIAL.
DATA: lv_lines TYPE i .
DATA: lo_root TYPE REF TO cx_root,
lv_result TYPE string,
lv_errtxt TYPE string.
CLEAR:lv_lines,lv_errtxt.
BREAK guoxiongjie .
TRY .
LOOP AT lt_alsmex_tabline INTO DATA(ls_alsmex_tabline).
AT NEW row.
CLEAR gt_file.
ENDAT.
CASE ls_alsmex_tabline-col.
WHEN '1'.
gt_file-str1 = ls_alsmex_tabline-value.
WHEN '2'.
gt_file-str2 = ls_alsmex_tabline-value.
WHEN '3'.
gt_file-str3 = ls_alsmex_tabline-value.
WHEN '4'.
gt_file-str4 = ls_alsmex_tabline-value.
WHEN '5'.
gt_file-str5 = ls_alsmex_tabline-value.
WHEN '6'.
gt_file-str31 = ls_alsmex_tabline-value.
WHEN '7'.
gt_file-str6 = ls_alsmex_tabline-value.
WHEN '8'.
gt_file-str7 = ls_alsmex_tabline-value.
WHEN '9'.
gt_file-str8 = ls_alsmex_tabline-value.
WHEN '10'.
gt_file-str9 = ls_alsmex_tabline-value.
WHEN '11'.
gt_file-str10 = ls_alsmex_tabline-value.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gt_file-str10
IMPORTING
output = gt_file-str10.
* gt_file-str11 = | { gt_file-str11 ALPHA = IN } |.
WHEN '12'.
gt_file-str11 = ls_alsmex_tabline-value.
* gt_file-str12 = | { gt_file-str12 ALPHA = IN } |.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gt_file-str11
IMPORTING
output = gt_file-str11.
WHEN '13'.
gt_file-str12 = ls_alsmex_tabline-value.
* gt_file-str13 = | { gt_file-str13 ALPHA = IN } |.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gt_file-str12
IMPORTING
output = gt_file-str12.
WHEN '14'.
gt_file-str13 = ls_alsmex_tabline-value.
* gt_file-str14 = | { gt_file-str14 ALPHA = IN } |.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gt_file-str13
IMPORTING
output = gt_file-str13.
WHEN '15'.
gt_file-str14 = ls_alsmex_tabline-value.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gt_file-str14
IMPORTING
output = gt_file-str14.
WHEN '16'.
gt_file-str15 = ls_alsmex_tabline-value.
WHEN '17'.
gt_file-str16 = ls_alsmex_tabline-value.
WHEN '18'.
gt_file-str17 = ls_alsmex_tabline-value.
WHEN '19'.
gt_file-str18 = ls_alsmex_tabline-value.
WHEN '20'.
CONDENSE ls_alsmex_tabline-value NO-GAPS .
gt_file-str19 = ls_alsmex_tabline-value.
WHEN '21'.
gt_file-str20 = ls_alsmex_tabline-value.
* gt_file-str21 = | { gt_file-str21 ALPHA = IN } |.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gt_file-str20
IMPORTING
output = gt_file-str20.
WHEN '22'.
gt_file-str21 = ls_alsmex_tabline-value.
* gt_file-str22 = | { gt_file-str22 ALPHA = IN } |.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gt_file-str21
IMPORTING
output = gt_file-str21.
WHEN '23'.
gt_file-str22 = ls_alsmex_tabline-value.
WHEN '24'.
gt_file-str23 = ls_alsmex_tabline-value.
WHEN '25'.
gt_file-str24 = ls_alsmex_tabline-value.
WHEN '26'.
gt_file-str25 = ls_alsmex_tabline-value.
WHEN '27'.
gt_file-str26 = ls_alsmex_tabline-value.
WHEN '28'.
gt_file-str27 = ls_alsmex_tabline-value.
WHEN '29'.
gt_file-str28 = ls_alsmex_tabline-value.
WHEN '30'.
gt_file-str29 = ls_alsmex_tabline-value.
WHEN '31'.
gt_file-str30 = ls_alsmex_tabline-value.
WHEN '32'.
gt_file-str32 = ls_alsmex_tabline-value.
*————————————————会计凭证批量导入功能增加字段FKBER职能范围-2022.5.7 ZHANGYJ
WHEN '33'.
gt_file-str33 = ls_alsmex_tabline-value.
*————————————————会计凭证批量导入功能增加字段FKBER职能范围-2022.5.7 ZHANGYJ
WHEN '34'.
gt_file-str34 = ls_alsmex_tabline-value.
WHEN '35'.
gt_file-str35 = ls_alsmex_tabline-value.
WHEN '36'.
gt_file-str36 = ls_alsmex_tabline-value.
ENDCASE.
AT END OF row.
APPEND gt_file.
ENDAT.
ENDLOOP.
CATCH cx_root INTO lo_root .
CALL METHOD lo_root->if_message~get_text
RECEIVING
result = lv_result.
“报错提示
WRITE:/ '导入文件出现错误:' .
WRITE:/ '内容行:' && ls_alsmex_tabline-row && ',' && lv_result && '请检查以下数据: '.
ULINE.
LOOP AT lt_alsmex_tabline INTO DATA(err_tabline) WHERE row = ls_alsmex_tabline-row .
WRITE: err_tabline-value .
ENDLOOP.
flg_err = 'X' .
ENDTRY.
ENDIF.
ENDFORM.
*&———————————————————————*
*& Form frm_check_data
*&———————————————————————*
*& text
*&———————————————————————*
*& –> p1 text
*& <– p2 text
*&———————————————————————*
FORM frm_check_data .
DATA: lt_file_temp LIKE TABLE OF gt_file WITH HEADER LINE .
DATA: lv_rate TYPE bapi1093_0,
lv_hkont TYPE bseg-hkont.
DATA:lv_kunnr TYPE kna1-kunnr.
DATA:lv_sort TYPE i.
IF gt_file[] IS NOT INITIAL.
“获取总账科目描述
SELECT saknr,txt20 FROM skat
FOR ALL ENTRIES IN @gt_file
WHERE spras = @sy-langu
AND ktopl = '1000'
AND saknr = @gt_file-str11
INTO TABLE @DATA(lt_skat).
“获取供应商名称
SELECT lifnr,name1 FROM lfa1
FOR ALL ENTRIES IN @gt_file
WHERE lifnr = @gt_file-str12
INTO TABLE @DATA(lt_lfa1).
“获取客户名称
SELECT kunnr,name1 FROM kna1
FOR ALL ENTRIES IN @gt_file
WHERE kunnr = @gt_file-str13
INTO TABLE @DATA(lt_kna1).
“获取资产描述
SELECT anln1,txt50 FROM anla
FOR ALL ENTRIES IN @gt_file
WHERE anln1 = @gt_file-str14
AND bukrs = @gt_file-str2
INTO TABLE @DATA(lt_anla).
“获取成本中心描述
SELECT kostl,ktext FROM cskt
FOR ALL ENTRIES IN @gt_file
WHERE spras = @sy-langu
AND kokrs = '1000'
AND kostl = @gt_file-str21
INTO TABLE @DATA(lt_cskt).
“获取内部订单描述
SELECT aufnr,ktext FROM aufk
FOR ALL ENTRIES IN @gt_file
WHERE aufnr = @gt_file-str22
INTO TABLE @DATA(lt_aufk).
SELECT bukrs,waers FROM t001
FOR ALL ENTRIES IN @gt_file
WHERE bukrs = @gt_file-str2
INTO TABLE @DATA(lt_t001).
SELECT partner FROM ukmbp_cms_sgm
FOR ALL ENTRIES IN @gt_file
WHERE partner = @gt_file-str13
INTO TABLE @DATA(lt_ukmbp).
SELECT kunnr,bukrs,akont FROM knb1
FOR ALL ENTRIES IN @gt_file
WHERE kunnr = @gt_file-str13
AND bukrs = @gt_file-str2
AND akont IN ( '1122010001','1122020001' )
INTO TABLE @DATA(lt_knb1).
“HUANGXIUTING 121.12.02->排除只能自动过账科目='X'的总账科目 (1405000001 例外)
SELECT bukrs, saknr
FROM skb1
FOR ALL ENTRIES IN @gt_file
WHERE bukrs = @gt_file-str2 AND xintb = 'X'
INTO TABLE @DATA(lt_skb1) .
DELETE lt_skb1 WHERE bukrs = '1000' AND ( saknr EQ '1405000001' OR saknr EQ '1404010001' ).
DATA:lv_item TYPE i .
DATA(lv_zid) = |{ sy-datum }-{ sy-uzeit }{ sy-uname }|.
MOVE-CORRESPONDING gt_file[] TO gt_log[] .
LOOP AT gt_log ASSIGNING FIELD-SYMBOL(<fs_log>).
ADD 1 TO lv_item .
<fs_log>-zid = lv_zid .
<fs_log>-serial = lv_item .
ENDLOOP.
ENDIF.
CLEAR:gs_alv,gt_alv[].
lt_file_temp[] = gt_file[].
SORT lt_file_temp BY str1.
DELETE ADJACENT DUPLICATES FROM lt_file_temp COMPARING str1.
DATA r_hkont TYPE RANGE OF bseg-hkont.
r_hkont = VALUE #( sign = 'I' option = 'EQ' ( low = '6401999999' high = '6401999999')
( low = '6402000003' high = '6402000003')
( low = '6402000004' high = '6402000004') ).
*******wanxiogjie begin 25.07.2023 10:56:51***********************
DATA: lv_waers_bb TYPE t001-waers.
*******wanxiogjie end 25.07.2023 10:56:51***********************
LOOP AT lt_file_temp.
“抬头数据处理
gs_alv-zid = lt_file_temp-str1.
gs_alv-bukrs = lt_file_temp-str2.
“权限检查
AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
ID 'BUKRS' FIELD gs_alv-bukrs.
IF sy-subrc <> 0.
gs_alv-light = icon_red_light.
gs_alv-zmes = '没有' && gs_alv-bukrs && '公司代码权限!'.
ENDIF.
gs_alv-blart = lt_file_temp-str3.
gs_alv-bldat = lt_file_temp-str4.
gs_alv-budat = lt_file_temp-str5.
* gs_alv-monat = sy-datum+4(2). “过账期间
gs_alv-monat = lt_file_temp-str31.
gs_alv-waers = lt_file_temp-str6.
gs_alv-kursf = lt_file_temp-str7.
*******wanxiogjie begin 11.07.2023 20:21:21***********************
* IF gs_alv-waers NE 'CNY' AND gs_alv-kursf = 1.
* gs_alv-light = icon_red_light.
* gs_alv-zmes = gs_alv-zmes && '币种不是CNY,汇率不能为1,'.
* ENDIF.
*******wanxiogjie end 11.07.2023 20:21:21***********************
IF gs_alv-kursf IS INITIAL.
“汇率如果模板里有值,则不变,参与BAPI过账;
“汇率如果模板里未填写,按照过账日期BUDAT查询汇率
gs_alv-k_sfcy = 'N'.
READ TABLE lt_t001 INTO DATA(ls_t001) WITH KEY bukrs = gs_alv-bukrs.
CLEAR:lv_rate.
CALL FUNCTION 'BAPI_EXCHANGERATE_GETDETAIL'
EXPORTING
rate_type = 'M'
from_curr = gs_alv-waers
to_currncy = ls_t001-waers
* TO_CURRNCY = 'CNY'
date = gs_alv-budat
IMPORTING
exch_rate = lv_rate.
gs_alv-kursf = lv_rate-exch_rate.
CLEAR:ls_t001.
ELSE.
gs_alv-k_sfcy = 'Y'.
ENDIF.
gs_alv-xblnr = lt_file_temp-str8.
gs_alv-bktxt = lt_file_temp-str9.
MOVE-CORRESPONDING gs_alv TO gs_alv_group.
“行项目数据处理
LOOP AT gt_file WHERE str1 = lt_file_temp-str1.
MOVE-CORRESPONDING gs_alv_group TO gs_alv.
gs_alv-rstgr = gt_file-str30.
gs_alv-bschl = gt_file-str10.
IF gs_alv-bschl = '40' OR gs_alv-bschl = '70'
OR gs_alv-bschl = '01' OR gs_alv-bschl = '21'
OR gs_alv-bschl = '09' OR gs_alv-bschl = '29'.
gs_alv-shkzg = 'S'.
ELSEIF gs_alv-bschl = '50' OR gs_alv-bschl = '75'
OR gs_alv-bschl = '11' OR gs_alv-bschl = '31'
OR gs_alv-bschl = '19' OR gs_alv-bschl = '39'.
gs_alv-shkzg = 'H'.
ENDIF.
“根据记账码来处理对应的科目、供应商、客户、资产
CASE gs_alv-bschl.
WHEN 40 OR 50.
gs_alv-hkont = gt_file-str11.
IF gs_alv-hkont IS INITIAL.
gs_alv-light = icon_red_light.
gs_alv-zmes = gs_alv-zmes && '40/50记账码对应的总账科目为空;'.
ELSE.
READ TABLE lt_skat INTO DATA(ls_skat) WITH KEY saknr = gs_alv-hkont.
IF sy-subrc = 0.
gs_alv-txt20 = ls_skat-txt20.
ENDIF.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input = gs_alv-hkont
IMPORTING
output = lv_hkont.
IF lv_hkont+0(4) = '1001' OR lv_hkont+0(4) = '1002' OR lv_hkont+0(4) = '1012'.
IF gs_alv-rstgr IS INITIAL.
gs_alv-light = icon_red_light.
gs_alv-zmes = gs_alv-zmes && '总账科目1001/1002/1012开头的原因代码为空;'.
ENDIF.
ENDIF.
IF ( lv_hkont+0(4) = '6001' OR lv_hkont+0(4) = '6051' OR lv_hkont+0(4) = '6401' OR lv_hkont+0(4) = '6402')
AND lv_hkont NOT IN r_hkont.
gs_alv-zuonr = gt_file-str28.
IF gs_alv-zuonr = ''.
gs_alv-light = icon_red_light.
gs_alv-zmes = gs_alv-zmes && '分配字段必须,请输入正确的客户编码!'.
ELSE.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_alv-zuonr
IMPORTING
output = lv_kunnr.
SELECT COUNT( * ) FROM kna1 WHERE kunnr = lv_kunnr.
IF sy-subrc NE 0.
gs_alv-light = icon_red_light.
gs_alv-zmes = gs_alv-zmes && '请输入正确的客户编码!'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
WHEN 21 OR 31 OR 29 OR 39.
gs_alv-lifnr = gt_file-str12.
IF gs_alv-lifnr IS INITIAL.
gs_alv-light = icon_red_light.
gs_alv-zmes = gs_alv-zmes && '21/31/29/39记账码对应的供应商为空;'.
ELSE.
READ TABLE lt_lfa1 INTO DATA(ls_lfa1) WITH KEY lifnr = gs_alv-lifnr.
IF sy-subrc = 0.
gs_alv-lname = ls_lfa1-name1.
ENDIF.
ENDIF.
IF gt_file-str11 IS NOT INITIAL.
gs_alv-hkont = gt_file-str11.
READ TABLE lt_skat INTO ls_skat WITH KEY saknr = gs_alv-hkont.
IF sy-subrc = 0.
gs_alv-txt20 = ls_skat-txt20.
ENDIF.
ENDIF.
WHEN 01 OR 11 OR 09 OR 19.
gs_alv-kunnr = gt_file-str13.
IF gs_alv-kunnr IS INITIAL.
gs_alv-light = icon_red_light.
gs_alv-zmes = gs_alv-zmes && '01/11/09/19记账码对应的客户为空;'.
ELSE.
READ TABLE lt_kna1 INTO DATA(ls_kna1) WITH KEY kunnr = gs_alv-kunnr.
IF sy-subrc = 0.
gs_alv-kname = ls_kna1-name1.
ENDIF.
ENDIF.
IF gt_file-str11 IS NOT INITIAL.
gs_alv-hkont = gt_file-str11.
READ TABLE lt_skat INTO ls_skat WITH KEY saknr = gs_alv-hkont.
IF sy-subrc = 0.
gs_alv-txt20 = ls_skat-txt20.
ENDIF.
ENDIF.
WHEN 70 OR 75.
gs_alv-anln1 = gt_file-str14.
gs_alv-anbwa = gt_file-str15.
IF gs_alv-anln1 IS INITIAL OR gs_alv-anbwa IS INITIAL.
IF gs_alv-anln1 IS INITIAL.
gs_alv-light = icon_red_light.
gs_alv-zmes = gs_alv-zmes && '70/75记账码对应的资产为空;'.
ENDIF.
IF gs_alv-anbwa IS INITIAL.
gs_alv-light = icon_red_light.
gs_alv-zmes = gs_alv-zmes && '70/75记账码对应的资产业务类型为空;'.
ENDIF.
ELSE.
READ TABLE lt_anla INTO DATA(ls_anla) WITH KEY anln1 = gs_alv-anln1.
IF sy-subrc = 0.
gs_alv-txt50 = ls_anla-txt50.
ENDIF.
ENDIF.
* gs_alv-hkont = gt_file-str11. “!!!!
SELECT SINGLE ktansw INTO @DATA(lv_ktansw)
FROM t095
INNER JOIN anla ON t095~ktogr = anla~anlkl
WHERE anla~bukrs = @gs_alv-bukrs
AND anla~anln1 = @gs_alv-anln1.
IF lv_ktansw IS NOT INITIAL.
gs_alv-hkont = lv_ktansw.
ELSE.
gs_alv-light = icon_red_light.
gs_alv-zmes = gs_alv-zmes && '未找到资产对应的科目;'.
ENDIF.
WHEN OTHERS.
gs_alv-light = icon_red_light.
gs_alv-zmes = gs_alv-zmes && gs_alv-bschl && '该记账码暂时无法通过批量方式导入;'.
ENDCASE.
“判断总账科目 “HUANGXIUTING 提出
READ TABLE lt_skb1 WITH KEY bukrs = lt_file_temp-str2 saknr = lt_file_temp-str11 TRANSPORTING NO FIELDS .
IF sy-subrc EQ 0.
gs_alv-light = icon_red_light.
gs_alv-zmes = '总账科目' && lt_file_temp-str11 && '不允许执导入;'.
ENDIF.
“判断本币-原币 “HUANGXIUTING 提出
IF gt_file-str19 IS NOT INITIAL AND gt_file-str19 NE 'X' .
gs_alv-light = icon_red_light.
gs_alv-zmes = '反记账标识' && lt_file_temp-str19 && '输入错误;'.
ENDIF.
*******wanxiogjie begin 25.07.2023 11:03:22***********************
CLEAR lv_waers_bb.
SELECT SINGLE waers FROM t001 WHERE bukrs = @gs_alv-bukrs INTO @lv_waers_bb.
*******wanxiogjie end 25.07.2023 11:03:22***********************
IF gt_file-str6 = lv_waers_bb.”'CNY'.
IF gt_file-str17 NE gt_file-str18 .
gs_alv-light = icon_red_light.
gs_alv-zmes = '本位币不等于原币金额;'.
ENDIF.
ELSE.
IF gt_file-str7 IS INITIAL.
gs_alv-light = icon_red_light.
gs_alv-zmes = '汇率为必输项;'.
ENDIF.
“begin 20231129 add by jc.zhou
“检查凭证货币WAERS≠公司代码货币(根据BUKRS查表T001,获取公司代码货币T001-WAERS)时,查表TCURF,
“根据TCURF-KURST=M,TCURF-FCURR=凭证货币WAERS,TCURF-TCURR=公司代码货币,
“获取TCURF-FFACT/TCURF-TFACT。校验输入的DMBTR(本位币)与WRBTR(原币)* KURSF(汇率)/(TCURF-FFACT/TCURF-TFACT)
“的值差异是否在0.5以内,若超过0.5,则报错:本位币不等于原币金额
CLEAR:lv_rate.
CALL FUNCTION 'BAPI_EXCHANGERATE_GETDETAIL'
EXPORTING
rate_type = 'M'
from_curr = gs_alv-waers
to_currncy = lv_waers_bb
* TO_CURRNCY = 'CNY'
date = gs_alv-budat
IMPORTING
exch_rate = lv_rate.
” GS_ALV-KURSF = LV_RATE-EXCH_RATE.
gs_alv-dmbtr = gt_file-str17. “本位币金额数值在BAPI的时候再处理
gs_alv-wrbtr = gt_file-str18. “原币金额数值在BAPI的时候再处理
DATA(lv_price) = CONV dmbtr( gs_alv-wrbtr * gs_alv-kursf / ( lv_rate-from_factor / lv_rate-to_factor ) ).
DATA(lv_cprice) = CONV dmbtr( '0.5' ).
IF abs( gs_alv-dmbtr – lv_price ) GT lv_cprice.
gs_alv-light = icon_red_light.
gs_alv-zmes = gs_alv-zmes && '本位币不等于原币金额;'.
ENDIF.
“end
**————————————-本位币不等于原币金额校验-ZHANGZG-2022.08.22
* IF GT_FILE-STR6 = 'JPY'.”本位币不等于原币金额
* GS_ALV-DMBTR = GT_FILE-STR17. “本位币金额数值在BAPI的时候再处理
* GS_ALV-WRBTR = GT_FILE-STR18. “原币金额数值在BAPI的时候再处理
* DATA(LV_PRICE) = CONV DMBTR( GS_ALV-WRBTR * GS_ALV-KURSF / 100 ).
* DATA(LV_CPRICE) = CONV DMBTR( '0.5' ).
* IF ABS( GS_ALV-DMBTR – LV_PRICE ) GT LV_CPRICE.
* GS_ALV-LIGHT = ICON_RED_LIGHT.
* GS_ALV-ZMES = GS_ALV-ZMES && '本位币不等于原币金额;'.
* ENDIF.
* ELSE.
**————————————-本位币不等于原币金额校验-ZHANGZG-2022.08.22
* DATA LV_TMP TYPE BSEG-DMBTR.
* DATA LV_JS(2) TYPE P DECIMALS 1 VALUE '0.5'.
* LV_TMP = GT_FILE-STR18 * GT_FILE-STR7 .
* IF LV_TMP NOT BETWEEN ( GT_FILE-STR17 – LV_JS ) AND ( GT_FILE-STR17 + LV_JS ).
* GS_ALV-LIGHT = ICON_RED_LIGHT.
* GS_ALV-ZMES = '本位币不等于原币金额;'.
* ENDIF.
* ENDIF.
ENDIF.
gs_alv-umskz = gt_file-str16.
gs_alv-dmbtr = gt_file-str17. “本位币金额数值在BAPI的时候再处理
gs_alv-wrbtr = gt_file-str18. “原币金额数值在BAPI的时候再处理
IF gs_alv-dmbtr IS INITIAL AND gs_alv-wrbtr IS INITIAL.
gs_alv-light = icon_red_light.
gs_alv-zmes = gs_alv-zmes && '本币金额&原币金额不可以都为空;'.
ELSE.
IF gs_alv-shkzg = 'H'.
gs_alv-dmbtr = 0 – abs( gs_alv-dmbtr ).
gs_alv-wrbtr = 0 – abs( gs_alv-wrbtr ).
ENDIF.
ENDIF.
gs_alv-xnegp = gt_file-str19.
gs_alv-prctr = gt_file-str20.
*————————————-增加利润中心校验-ZHANGZG-2022.07.06
SELECT SINGLE bukrs
FROM ztfi007
WHERE bukrs EQ @gs_alv-bukrs
INTO @DATA(lv_bukrs).
IF sy-subrc EQ 0 AND gs_alv-prctr IS INITIAL.
IF gt_file-str14 IS NOT INITIAL.
SELECT SINGLE c~prctr
INTO gs_alv-prctr
FROM csks AS c
INNER JOIN anlz AS a ON c~kostl EQ a~kostl
WHERE a~bukrs EQ gs_alv-bukrs
AND a~anln1 EQ gt_file-str14.
ENDIF.
IF gs_alv-prctr IS INITIAL AND gt_file-str21 IS NOT INITIAL.
SELECT SINGLE prctr
INTO gs_alv-prctr
FROM csks
WHERE kostl EQ gt_file-str21.
ENDIF.
IF gs_alv-prctr IS INITIAL.
gs_alv-light = icon_red_light.
gs_alv-zmes = '利润中心为空,请检查!'.
ENDIF.
ENDIF.
*————————————-增加利润中心校验-ZHANGZG-2022.07.06
*————————————-增加特别总账标识校验-ZHANGZG-2022.10.12
IF ( gs_alv-bschl EQ '09' OR gs_alv-bschl EQ '19' OR gs_alv-bschl EQ '29' OR gs_alv-bschl EQ '39' ) AND gs_alv-umskz IS INITIAL.
gs_alv-light = icon_red_light.
gs_alv-zmes = gs_alv-zmes && '特别总账标识不允许为空;'.
ENDIF.
*————————————-增加特别总账标识校验-ZHANGZG-2022.10.12
gs_alv-kostl = gt_file-str21.
READ TABLE lt_cskt INTO DATA(ls_cskt) WITH KEY kostl = gs_alv-kostl.
IF sy-subrc = 0.
gs_alv-ktext = ls_cskt-ktext.
ENDIF.
gs_alv-aufnr = gt_file-str22.
READ TABLE lt_aufk INTO DATA(ls_aufk) WITH KEY aufnr = gs_alv-aufnr.
IF sy-subrc = 0.
gs_alv-atext = ls_aufk-ktext.
ENDIF.
gs_alv-kidno = gt_file-str23.
gs_alv-zterm = gt_file-str24.
gs_alv-zfbdt = gt_file-str25.
gs_alv-xref1 = gt_file-str26.
gs_alv-xref2 = gt_file-str27.
gs_alv-zuonr = gt_file-str28.
gs_alv-sgtxt = gt_file-str29.
** ADDED 信用控制范围 KKBER检查>>
gs_alv-kkber = gt_file-str32.
*————————————————会计凭证批量导入功能增加字段FKBER职能范围-2022.5.7 ZHANGYJ
IF gt_file-str11+0(4) NE '5301'. “当导入科目为5301*时,不写入职能范围字段的值。
IF gt_file-str33 IS NOT INITIAL .
SELECT SINGLE func_area INTO @DATA(lv_fkber)
FROM csks
WHERE kostl = @gt_file-str21. “成本中心
IF gt_file-str33 EQ lv_fkber.
gs_alv-fkber_long = gt_file-str33.”职能范围
ELSE.
IF lv_fkber EQ 'F001'.
gs_alv-light = icon_red_light.
gs_alv-zmes = gs_alv-zmes && '输入的职能范围有误,请检查;'.
ELSE.
IF gt_file-str33 EQ 'F001'.
gs_alv-light = icon_red_light.
gs_alv-zmes = gs_alv-zmes && '输入的职能范围有误,请检查;'.
ELSE.
gs_alv-fkber_long = gt_file-str33.
ENDIF.
ENDIF.
ENDIF.
ELSE.
IF gt_file-str21 IS NOT INITIAL.
SELECT SINGLE func_area INTO @lv_fkber
FROM csks
WHERE kostl = @gt_file-str21. “成本中心
IF lv_fkber IS NOT INITIAL.
gs_alv-fkber_long = lv_fkber.
ENDIF.
ELSE .
gs_alv-fkber_long = gt_file-str33.
ENDIF.
ENDIF.
ENDIF.
*————————————————会计凭证批量导入功能增加字段FKBER职能范围-2022.5.7 ZHANGYJ
IF gs_alv-blart NE 'UE'. “UE凭证类型取消信贷检查
IF gs_alv-kunnr IS NOT INITIAL.
READ TABLE lt_ukmbp TRANSPORTING NO FIELDS WITH KEY partner = gs_alv-kunnr.
IF sy-subrc EQ 0.
IF gs_alv-umskz EQ 'A' AND gs_alv-kkber IS INITIAL.
gs_alv-light = icon_red_light.
gs_alv-zmes = gs_alv-zmes && '应收&预收信贷范围必输,请检查;'.
ENDIF.
IF gs_alv-umskz EQ ''.
READ TABLE lt_knb1 TRANSPORTING NO FIELDS WITH KEY kunnr = gs_alv-kunnr
bukrs = gs_alv-bukrs.
IF sy-subrc EQ 0 AND gs_alv-kkber IS INITIAL.
gs_alv-light = icon_red_light.
gs_alv-zmes = gs_alv-zmes && '应收&预收信贷范围必输,请检查;'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
** ADDED 信用控制范围 KKBER检查<<
*————————————-如果文件中没有付款条件走现有逻辑-ZHANGZG-2022.10.17
IF gs_alv-zterm IS NOT INITIAL AND ( gs_alv-bukrs EQ '8020' OR gs_alv-bukrs EQ '8060' OR gs_alv-bukrs EQ '8130' OR gs_alv-bukrs EQ '8150' ).
ELSE.
*————————————-如果文件中没有付款条件走现有逻辑-ZHANGZG-2022.10.17
“能否加个判断: 当供应商或客户列有值,把对应的付款条件带出。
* 供应商付款条件:LFB1-ZTERM
* 客户付款条件:KNB1-ZTERM
IF gs_alv-kunnr IS NOT INITIAL.
SELECT SINGLE zterm INTO gs_alv-zterm FROM knb1 WHERE kunnr = gs_alv-kunnr .
ENDIF.
IF gs_alv-lifnr IS NOT INITIAL.
SELECT SINGLE zterm INTO gs_alv-zterm FROM lfb1 WHERE lifnr = gs_alv-lifnr .
ENDIF.
ENDIF.
lv_sort = lv_sort + 1.
gs_alv-zsort = lv_sort.
*******wanxiogjie begin 30.06.2023 19:02:47***********************
PERFORM: frm_check_data_four
CHANGING
gs_alv.
*******wanxiogjie end 30.06.2023 19:02:47***********************
gs_alv-fund = gt_file-str34 .
gs_alv-vbund = gt_file-str35 .
gs_alv-bewar = gt_file-str36 .
APPEND gs_alv TO gt_alv.
CLEAR: gs_alv.
ENDLOOP.
CLEAR: gs_alv_group.
ENDLOOP.
*————————————-增加利润中心校验-ZHANGZG-2022.07.25
DATA:BEGIN OF ls_prctr,
prctr TYPE bseg-prctr,
wrbtr TYPE bseg-wrbtr,
END OF ls_prctr,
lt_prctr LIKE STANDARD TABLE OF ls_prctr.
CLEAR: gs_alv, ls_prctr, lt_prctr.
LOOP AT gt_alv INTO gs_alv GROUP BY ( zid = gs_alv-zid ).
SELECT SINGLE bukrs
FROM ztfi007
WHERE bukrs EQ @gs_alv-bukrs
INTO @lv_bukrs.
IF sy-subrc EQ 0.
CLEAR: ls_prctr, lt_prctr.
LOOP AT GROUP gs_alv INTO DATA(ls_temp).
CLEAR ls_prctr.
ls_prctr-prctr = ls_temp-prctr.
ls_prctr-wrbtr = ls_temp-wrbtr.
COLLECT ls_prctr INTO lt_prctr.
CLEAR: ls_temp, ls_prctr.
ENDLOOP.
LOOP AT lt_prctr INTO ls_prctr
WHERE wrbtr IS NOT INITIAL.
gs_alv-light = icon_red_light.
gs_alv-zmes = gs_alv-zmes && '利润中心借贷不平,请检查;'.
MODIFY gt_alv FROM gs_alv TRANSPORTING light zmes WHERE zid = gs_alv-zid.
EXIT.
ENDLOOP.
ENDIF.
CLEAR:gs_alv.
ENDLOOP.
*————————————-增加利润中心校验-ZHANGZG-2022.07.25
CLEAR: gs_alv.
“1.同一个凭证组号中出现红灯,则该凭证组号所有数据为红灯
“2.如果数据为红灯,该选择框不可以勾选
LOOP AT gt_alv INTO gs_alv GROUP BY ( zid = gs_alv-zid ).
READ TABLE gt_alv INTO gs_alv_group WITH KEY zid = gs_alv-zid
light = icon_red_light.
IF sy-subrc = 0.
gs_stylerow-fieldname = 'BOX'. ” 需要编辑的列名
gs_stylerow-style = cl_gui_alv_grid=>mc_style_disabled. “设置为不可编辑状态
APPEND gs_stylerow TO gs_alv-field_style.
CLEAR:gs_stylerow.
gs_alv-light = icon_red_light.
ELSE.
gs_alv-light = icon_yellow_light.
gs_alv-box = 'X'.
ENDIF.
MODIFY gt_alv FROM gs_alv TRANSPORTING box light field_style WHERE zid = gs_alv-zid.
CLEAR:gs_alv.
ENDLOOP.
SORT gt_alv BY zid zsort.
ENDFORM.
*&———————————————————————*
*& Form frm_dispaly_data
*&———————————————————————*
*& text
*&———————————————————————*
*& –> p1 text
*& <– p2 text
*&———————————————————————*
FORM frm_dispaly_data .
PERFORM frm_build_fieldcat.
gs_layo-cwidth_opt = 'X' .
gs_layo-zebra = 'X'.
gs_layo-stylefname = 'FIELD_STYLE'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = gs_layo
it_fieldcat_lvc = gt_fcat[]
i_callback_pf_status_set = 'FRM_PF_STATUS'
i_callback_user_command = 'FRM_USER_COMMAND'
i_save = 'A'
TABLES
t_outtab = gt_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE e000(00) WITH 'ALV显示异常'.
ENDIF.
ENDFORM.
*&———————————————————————*
*& Form frm_build_fieldcat
*&———————————————————————*
*& text
*&———————————————————————*
*& –> p1 text
*& <– p2 text
*&———————————————————————*
FORM frm_build_fieldcat .
set_field:
'BOX' TEXT-f01 2,
'LIGHT' TEXT-f02 5,
'ZMES' TEXT-f03 30,
'BELNR' TEXT-f04 10,
“'BUZEI' TEXT-f43 5,
'ZID' TEXT-f05 10,
'BUKRS' TEXT-f06 10,
'BLART' TEXT-f07 10,
'BLDAT' TEXT-f08 10,
'BUDAT' TEXT-f09 10,
'MONAT' TEXT-f10 10,
'WAERS' TEXT-f11 10,
'KURSF' TEXT-f12 10,
“'K_SFC' TEXT-f13 10,
'XBLNR' TEXT-f14 10,
'BKTXT' TEXT-f15 10,
'BSCHL' TEXT-f16 10,
'HKONT' TEXT-f17 10,
'TXT20' TEXT-f18 10,
'LIFNR' TEXT-f19 10,
'LNAME' TEXT-f20 10,
'KUNNR' TEXT-f21 10,
'KNAME' TEXT-f22 10,
'ANLN1' TEXT-f23 10,
'TXT50' TEXT-f24 10,
'ANBWA' TEXT-f25 10,
'UMSKZ' TEXT-f26 10,
“'SHKZG' TEXT-f27 10,
'DMBTR' TEXT-f28 10,
'WRBTR' TEXT-f29 10,
'XNEGP' TEXT-f30 10,
'PRCTR' TEXT-f31 10,
'KOSTL' TEXT-f32 10,
'KTEXT' TEXT-f33 10,
'AUFNR' TEXT-f34 10,
'ATEXT' TEXT-f35 10,
'KIDNO' TEXT-f36 10,
'ZTERM' TEXT-f37 10,
'ZFBDT' TEXT-f38 10,
'XREF1' TEXT-f39 10,
'XREF2' TEXT-f40 10,
'ZUONR' TEXT-f41 10,
'SGTXT' TEXT-f42 10,
'RSTGR' TEXT-f44 10,
'KKBER' TEXT-f45 10,
'FKBER_LONG' TEXT-f46 10,”*——会计凭证批量导入功能增加字段FKBER职能范围-2022.5.7 ZHANGYJ
'FUND' TEXT-f47 10,
'VBUND' TEXT-f48 10,
'BEWAR' TEXT-f49 10.
ENDFORM.
*&——————————————————————-
*& Form PF_STATUS
*&——————————————————————-
FORM frm_pf_status USING pt_exclude TYPE kkblo_t_extab.
* DATA:lt_exclude TYPE kkblo_t_extab WITH HEADER LINE.
*
* SET PF-STATUS 'ZMMR0044' EXCLUDING lt_exclude[].
SET PF-STATUS 'STATUS_9000'.
ENDFORM.
*&———————————————————————*
*& Form user_command
*&———————————————————————*
* 功能码的实现
*———————————————————————-*
* –>R_UCOMM text
* –>RS_SELFIELD text
*———————————————————————-*
FORM frm_user_command USING pv_ucomm LIKE sy-ucomm
ps_selfield TYPE slis_selfield.
DATA : lv_grid TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lv_grid.
* IF lv_grid IS NOT INITIAL.
* CALL METHOD lv_grid->check_changed_data .
* ENDIF.
CASE pv_ucomm.
WHEN 'ZALL'. “全选
gs_alv-box = 'X'.
MODIFY gt_alv FROM gs_alv TRANSPORTING box
WHERE light <> icon_red_light.
CLEAR: gs_alv.
WHEN 'ZSAL'. “全不选
gs_alv-box = ''.
MODIFY gt_alv FROM gs_alv TRANSPORTING box
WHERE light <> icon_red_light.
CLEAR: gs_alv.
WHEN 'ZCREATE'. “过账
“先检查同一凭证组号的是否都打勾了没
LOOP AT gt_alv INTO gs_alv GROUP BY ( zid = gs_alv-zid ).
READ TABLE gt_alv INTO gs_alv_group WITH KEY zid = gs_alv-zid
light = icon_yellow_light
box = 'X'. “只要有一条待过账的就都变为X,不然都为空;
IF sy-subrc = 0.
gs_alv-box = 'X'.
ELSE.
gs_alv-box = ''.
ENDIF.
MODIFY gt_alv FROM gs_alv TRANSPORTING box WHERE zid = gs_alv-zid.
CLEAR:gs_alv.
ENDLOOP.
READ TABLE gt_alv INTO gs_alv WITH KEY box = 'X'
light = icon_red_light.
IF sy-subrc EQ 0.
MESSAGE '勾选数据中有状态为红色的数据,不可以创建凭证' TYPE 'E'.
ELSE.
PERFORM frm_post_accdoc.
“写入日志
BREAK guoxiongjie .
LOOP AT gt_log ASSIGNING FIELD-SYMBOL(<fs_log>).
READ TABLE gt_alv INTO gs_alv WITH KEY zid = <fs_log>-str1 .
IF sy-subrc EQ 0.
<fs_log>-belnr = gs_alv-belnr .
<fs_log>-gjahr = gs_alv-gjahr .
ENDIF.
ENDLOOP.
MODIFY ztfi003_log FROM TABLE gt_log .
COMMIT WORK .
ENDIF.
ENDCASE.
CALL METHOD lv_grid->set_frontend_layout( EXPORTING is_layout = VALUE #( cwidth_opt = 'X' ) ).
CALL METHOD lv_grid->check_changed_data.
CALL METHOD lv_grid->refresh_table_display.
ps_selfield-refresh = 'X'.
ENDFORM.
*&———————————————————————*
*& Form frm_post_accdoc
*&———————————————————————*
*& text
*&———————————————————————*
*& –> p1 text
*& <– p2 text
*&———————————————————————*
FORM frm_post_accdoc .
DATA: ls_acc_extend TYPE zsfi_acc_extend.
DATA: lv_buzei TYPE bseg-buzei VALUE 1,
lv_amt_doccur TYPE bapiaccr09-amt_doccur.
DATA:BEGIN OF gt_updat OCCURS 0,
buzei TYPE bseg-buzei,
kidno TYPE bseg-kidno,
END OF gt_updat.
DATA: ls_docheader TYPE bapiache09,
lv_obj_type TYPE bapiache09-obj_type,
lv_obj_key TYPE bapiache09-obj_key,
lv_obj_sys TYPE bapiache09-obj_sys,
lt_accountgl LIKE TABLE OF bapiacgl09 WITH HEADER LINE, “总账科目
lt_accountreceivable LIKE TABLE OF bapiacar09 WITH HEADER LINE, “客户项目
lt_accountpayable LIKE TABLE OF bapiacap09 WITH HEADER LINE, “供应商项目
lt_currencyamount LIKE TABLE OF bapiaccr09 WITH HEADER LINE, “货币项目
lt_return LIKE TABLE OF bapiret2 WITH HEADER LINE,
lt_extension2 LIKE TABLE OF bapiparex WITH HEADER LINE, “增强
lt_contractitem LIKE TABLE OF bapiaccait WITH HEADER LINE. “*——会计凭证批量导入功能增加字段FKBER职能范围-2022.5.7 ZHANGYJ
“抬头
LOOP AT gt_alv INTO gs_alv WHERE box = 'X' GROUP BY ( zid = gs_alv-zid ).
ls_docheader-comp_code = gs_alv-bukrs.
ls_docheader-doc_type = gs_alv-blart.
ls_docheader-doc_date = gs_alv-bldat.
ls_docheader-pstng_date = gs_alv-budat.
ls_docheader-fis_period = gs_alv-monat.
ls_docheader-ref_doc_no = gs_alv-xblnr.
ls_docheader-header_txt = gs_alv-bktxt.
ls_docheader-username = sy-uname.
lv_buzei = 1.
SELECT SINGLE waers INTO @DATA(lv_waers) FROM t001 WHERE bukrs = @gs_alv-bukrs.
“行项目
LOOP AT GROUP gs_alv INTO gs_alv_group.
* “金额的处理——begin
* lt_currencyamount-itemno_acc = lv_buzei.
* lt_currencyamount-currency = gs_alv_group-waers.
* lt_currencyamount-exch_rate = gs_alv_group-kursf.
*
* IF gs_alv_group-wrbtr IS NOT INITIAL AND gs_alv_group-dmbtr IS NOT INITIAL.
* IF gs_alv_group-waers = 'CNY'.
* lt_currencyamount-curr_type = '10'.
* ELSE.
* lt_currencyamount-curr_type = '00'.
* ENDIF.
* ELSEIF gs_alv_group-wrbtr IS INITIAL AND gs_alv_group-dmbtr IS NOT INITIAL.
* IF gs_alv_group-waers = 'CNY'.
* lt_currencyamount-curr_type = '10'.
* ENDIF.
* ENDIF.
* IF gs_alv_group-waers = 'CNY'.
* lv_amt_doccur = gs_alv_group-dmbtr.
* ENDIF.
*
* IF gs_alv_group-shkzg = 'S'.
* lt_currencyamount-amt_doccur = lv_amt_doccur.
* ELSE.
* lt_currencyamount-amt_doccur = 0 – lv_amt_doccur.
* ENDIF.
*
* APPEND lt_currencyamount.
* “金额的处理——END
* lt_currencyamount-itemno_acc = lv_buzei.
* IF gs_alv_group-waers = 'CNY'.
* lv_amt_doccur = gs_alv_group-dmbtr.
* ELSE.
* lv_amt_doccur = gs_alv_group-wrbtr.
* ENDIF.
* lt_currencyamount-currency = gs_alv_group-waers.
* IF gs_alv_group-k_sfcy = 'Y'.
* lt_currencyamount-exch_rate = gs_alv_group-kursf.
* ENDIF.
*
* IF gs_alv_group-shkzg = 'S'.
* lt_currencyamount-amt_doccur = abs( lv_amt_doccur ) .
* ELSE.
* lt_currencyamount-amt_doccur = 0 – abs( lv_amt_doccur ) .
* ENDIF.
* lt_currencyamount-curr_type = '00'.
* lv_amt_doccur = lt_currencyamount-amt_doccur.
* APPEND lt_currencyamount.
* CLEAR: lt_currencyamount.
*
* lt_currencyamount-itemno_acc = lv_buzei.
* IF gs_alv_group-waers = 'CNY'.
* lt_currencyamount-amt_doccur = lv_amt_doccur.
* ELSE.
* IF gs_alv_group-shkzg = 'S'.
* lt_currencyamount-amt_doccur = abs( gs_alv_group-dmbtr ).
* ELSE.
* lt_currencyamount-amt_doccur = 0 – abs( gs_alv_group-dmbtr ).
* ENDIF.
* ENDIF.
* lt_currencyamount-curr_type = '10'.
* lt_currencyamount-currency = 'CNY'.
* APPEND lt_currencyamount.
* CLEAR: lt_currencyamount.
“00是凭证货币;10是公司代码货币
“1.判断凭证货币是否等于公司代码货币,
“是——只有一条数据就好;不是——一条凭证货币,一条公司代码货币
“2.是否本币、原币金额都有值
“是——汇率不参与计算;不是——判断汇率是否是输入的值还是标准算出来的
IF gs_alv-waers = lv_waers.
lt_currencyamount-itemno_acc = lv_buzei.
lt_currencyamount-curr_type = '00'.
lt_currencyamount-currency = gs_alv_group-waers.
IF gs_alv_group-dmbtr IS INITIAL.
gs_alv_group-dmbtr = gs_alv_group-wrbtr.
ENDIF.
IF gs_alv_group-shkzg = 'S'.
lt_currencyamount-amt_doccur = abs( gs_alv_group-dmbtr ).
ELSE.
lt_currencyamount-amt_doccur = 0 – abs( gs_alv_group-dmbtr ).
ENDIF.
APPEND lt_currencyamount.
CLEAR lt_currencyamount.
lt_currencyamount-itemno_acc = lv_buzei.
lt_currencyamount-curr_type = '10'.
lt_currencyamount-currency = gs_alv_group-waers.
IF gs_alv_group-dmbtr IS INITIAL.
gs_alv_group-dmbtr = gs_alv_group-wrbtr.
ENDIF.
IF gs_alv_group-shkzg = 'S'.
lt_currencyamount-amt_doccur = abs( gs_alv_group-dmbtr ).
ELSE.
lt_currencyamount-amt_doccur = 0 – abs( gs_alv_group-dmbtr ).
ENDIF.
APPEND lt_currencyamount.
CLEAR lt_currencyamount.
ELSE.
“凭证货币
lt_currencyamount-itemno_acc = lv_buzei.
lt_currencyamount-curr_type = '00'.
lt_currencyamount-currency = gs_alv_group-waers.
IF gs_alv_group-k_sfcy = 'Y'.
lt_currencyamount-exch_rate = gs_alv_group-kursf.
ENDIF.
IF gs_alv_group-wrbtr IS NOT INITIAL.
lt_currencyamount-amt_doccur = gs_alv_group-wrbtr.
ELSE.
lv_amt_doccur = gs_alv_group-dmbtr / gs_alv_group-kursf.
lt_currencyamount-amt_doccur = lv_amt_doccur.
ENDIF.
IF gs_alv_group-shkzg = 'S'.
lt_currencyamount-amt_doccur = abs( lt_currencyamount-amt_doccur ).
ELSE.
lt_currencyamount-amt_doccur = 0 – abs( lt_currencyamount-amt_doccur ).
ENDIF.
APPEND lt_currencyamount.
CLEAR: lt_currencyamount,lv_amt_doccur.
“公司代码货币
lt_currencyamount-itemno_acc = lv_buzei.
lt_currencyamount-curr_type = '10'.
lt_currencyamount-currency = lv_waers.
IF gs_alv_group-k_sfcy = 'Y'.
lt_currencyamount-exch_rate = gs_alv_group-kursf.
ENDIF.
IF gs_alv_group-dmbtr IS NOT INITIAL.
lt_currencyamount-amt_doccur = gs_alv_group-dmbtr.
ELSE.
lv_amt_doccur = gs_alv_group-wrbtr * gs_alv_group-kursf.
lt_currencyamount-amt_doccur = lv_amt_doccur.
ENDIF.
IF gs_alv_group-shkzg = 'S'.
lt_currencyamount-amt_doccur = abs( lt_currencyamount-amt_doccur ).
ELSE.
lt_currencyamount-amt_doccur = 0 – abs( lt_currencyamount-amt_doccur ).
ENDIF.
APPEND lt_currencyamount.
CLEAR: lt_currencyamount,lv_amt_doccur.
ENDIF.
CASE gs_alv_group-bschl.
WHEN 40 OR 50. “总账
lt_accountgl-itemno_acc = lv_buzei.
lt_accountgl-gl_account = gs_alv_group-hkont.
lt_accountgl-profit_ctr = gs_alv_group-prctr.
lt_accountgl-costcenter = gs_alv_group-kostl.
lt_accountgl-orderid = gs_alv_group-aufnr.
lt_accountgl-ref_key_1 = gs_alv_group-xref1.
lt_accountgl-ref_key_2 = gs_alv_group-xref2.
lt_accountgl-alloc_nmbr = gs_alv_group-zuonr.
lt_accountgl-item_text = gs_alv_group-sgtxt.
* lt_accountgl-func_area = gs_alv_group-fkber_long.”*——会计凭证批量导入功能增加字段FKBER职能范围-2022.5.7 ZHANGYJ
lt_accountgl-func_area_long = gs_alv_group-fkber_long.”*——会计凭证批量导入功能增加字段FKBER职能范围-2022.5.7 ZHANGYJ
lt_accountgl-fund = gs_alv_group-fund.
lt_accountgl-trade_id = gs_alv_group-vbund.
lt_accountgl-cs_trans_t = gs_alv_group-bewar.
APPEND lt_accountgl.
IF gs_alv_group-kidno <> ''.
gt_updat-buzei = lv_buzei.
gt_updat-kidno = gs_alv_group-kidno.
APPEND gt_updat.CLEAR gt_updat.
ENDIF.
WHEN 21 OR 31 OR 29 OR 39. “供应商
lt_accountpayable-itemno_acc = lv_buzei.
lt_accountpayable-vendor_no = gs_alv_group-lifnr.
lt_accountpayable-gl_account = gs_alv_group-hkont.
lt_accountpayable-sp_gl_ind = gs_alv_group-umskz.
lt_accountpayable-profit_ctr = gs_alv_group-prctr.
lt_accountpayable-paymt_ref = gs_alv_group-kidno.
lt_accountpayable-pmnttrms = gs_alv_group-zterm.
lt_accountpayable-bline_date = gs_alv_group-zfbdt.
lt_accountpayable-ref_key_1 = gs_alv_group-xref1.
lt_accountpayable-ref_key_2 = gs_alv_group-xref2.
lt_accountpayable-alloc_nmbr = gs_alv_group-zuonr.
lt_accountpayable-item_text = gs_alv_group-sgtxt.
lt_accountpayable-fund = gs_alv_group-fund.
APPEND lt_accountpayable.
WHEN 01 OR 11 OR 09 OR 19. “客户
lt_accountreceivable-itemno_acc = lv_buzei.
lt_accountreceivable-customer = gs_alv_group-kunnr.
lt_accountreceivable-gl_account = gs_alv_group-hkont.
lt_accountreceivable-c_ctr_area = gs_alv_group-kkber.
lt_accountreceivable-sp_gl_ind = gs_alv_group-umskz.
lt_accountreceivable-profit_ctr = gs_alv_group-prctr.
lt_accountreceivable-pmnttrms = gs_alv_group-zterm.
lt_accountreceivable-bline_date = gs_alv_group-zfbdt.
lt_accountreceivable-ref_key_1 = gs_alv_group-xref1.
lt_accountreceivable-ref_key_2 = gs_alv_group-xref2.
lt_accountreceivable-alloc_nmbr = gs_alv_group-zuonr.
lt_accountreceivable-item_text = gs_alv_group-sgtxt.
lt_accountreceivable-paymt_ref = gs_alv_group-kidno.
lt_accountreceivable-fund = gs_alv_group-fund.
APPEND lt_accountreceivable.
WHEN 70 OR 75. “资产
* ls_docheader-bus_act = 'RMWE'.
* ls_docheader-obj_type = 'BKPFF'.
lt_accountgl-itemno_acc = lv_buzei.
lt_accountgl-asset_no = gs_alv_group-anln1.
lt_accountgl-gl_account = gs_alv_group-hkont. “重要
lt_accountgl-profit_ctr = gs_alv_group-prctr.
lt_accountgl-costcenter = gs_alv_group-kostl.
lt_accountgl-orderid = gs_alv_group-aufnr.
lt_accountgl-ref_key_1 = gs_alv_group-xref1.
lt_accountgl-ref_key_2 = gs_alv_group-xref2.
lt_accountgl-alloc_nmbr = gs_alv_group-zuonr.
lt_accountgl-item_text = gs_alv_group-sgtxt.
lt_accountgl-acct_type = 'A'.
lt_accountgl-sub_number = '0000'.
lt_accountgl-trade_id = gs_alv_group-vbund.
lt_accountgl-cs_trans_t = gs_alv_group-bewar.
APPEND lt_accountgl.
lt_extension2-structure = 'ZSFI_ACC_EXTEND'.
ls_acc_extend-posnr = lv_buzei.
ls_acc_extend-bschl = gs_alv_group-bschl.
ls_acc_extend-anbwa = gs_alv_group-anbwa.
WHEN OTHERS.
ENDCASE.
IF gs_alv_group-xnegp IS NOT INITIAL.
lt_extension2-structure = 'ZSFI_ACC_EXTEND'.
ls_acc_extend-posnr = lv_buzei.
ls_acc_extend-xnegp = gs_alv_group-xnegp.
ENDIF.
IF gs_alv_group-rstgr IS NOT INITIAL.
lt_extension2-structure = 'ZSFI_ACC_EXTEND'.
ls_acc_extend-posnr = lv_buzei.
ls_acc_extend-rstgr = gs_alv_group-rstgr.
ENDIF.
* gs_alv_group-buzei = lv_buzei.
lv_buzei = lv_buzei + 1.
IF lt_extension2-structure IS NOT INITIAL.
ls_acc_extend-bschl = gs_alv_group-bschl.
lt_extension2-valuepart1 = ls_acc_extend.
APPEND lt_extension2.
CLEAR ls_acc_extend .
ENDIF.
* MODIFY gt_alv FROM gs_alv_group TRANSPORTING buzei INDEX 1.
CLEAR: lt_accountgl,lt_accountreceivable,lt_accountpayable,
lt_currencyamount,lt_extension2,gs_alv_group,lt_contractitem.
ENDLOOP.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = ls_docheader
IMPORTING
obj_type = lv_obj_type
obj_key = lv_obj_key
obj_sys = lv_obj_sys
TABLES
accountgl = lt_accountgl
accountreceivable = lt_accountreceivable
accountpayable = lt_accountpayable
currencyamount = lt_currencyamount
return = lt_return
extension2 = lt_extension2.
*————————————-返回消息优化:显示凭证过账成功消息-ZHANGZG-2022.07.07
* READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY
* type = 'S'
* id = 'RW'
* number = '605'.
READ TABLE lt_return WITH KEY
type = 'S'
id = 'RW'
number = '605'.
*————————————-返回消息优化:显示凭证过账成功消息-ZHANGZG-2022.07.07
IF sy-subrc = 0.
gs_alv-belnr = lv_obj_key+0(10).
gs_alv-gjahr = lv_obj_key+14(4).
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
gs_alv-zmes = lt_return-message.
gs_alv-light = icon_green_light.
gs_alv-box = ''.
gs_stylerow-style = cl_gui_alv_grid=>mc_style_disabled. “设置为不可编辑状态
APPEND gs_stylerow TO gs_alv-field_style.
CLEAR:gs_stylerow.
IF gt_updat[] IS NOT INITIAL.
LOOP AT gt_updat.
UPDATE bseg SET kidno = gt_updat-kidno WHERE bukrs = gs_alv-bukrs AND belnr = gs_alv-belnr
AND gjahr = gs_alv-gjahr AND buzei = gt_updat-buzei.
CLEAR gt_updat.
ENDLOOP.
ENDIF.
REFRESH gt_updat[].
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
LOOP AT lt_return WHERE type = 'E' OR type = 'X' OR type = 'A'.
gs_alv-zmes = gs_alv-zmes && lt_return-message && ';'.
ENDLOOP.
gs_alv-light = icon_red_light.
gs_alv-box = ''.
gs_stylerow-style = cl_gui_alv_grid=>mc_style_disabled. “设置为不可编辑状态
APPEND gs_stylerow TO gs_alv-field_style.
CLEAR:gs_stylerow.
ENDIF.
MODIFY gt_alv FROM gs_alv TRANSPORTING box zmes belnr light field_style gjahr
WHERE zid = gs_alv-zid.
CLEAR:gs_alv,ls_docheader,lv_obj_type,lv_obj_key,lv_obj_sys,
lt_accountgl,lt_accountreceivable,lt_accountpayable,lt_currencyamount,
lt_return,lt_extension2,lt_accountgl[],lt_accountreceivable[],
lt_accountpayable[],lt_currencyamount[],lt_return,lt_extension2[].
ENDLOOP.
ENDFORM.
*&———————————————————————*
*& Form frm_check_data_four
*&———————————————————————*
*& text
*&———————————————————————*
*& <– GS_ALV
*&———————————————————————*
FORM frm_check_data_four
CHANGING
cs_alv TYPE ty_alv.
DATA: lv_hkont TYPE bseg-hkont.
DATA: lv_lifnr TYPE lfa1-lifnr.
*20230531增加控制:
*科目等于6001*、6051*、2204*时,检查利润中心必须输入。
*即HKONT=6001*、6051*、2204*,检查PRCTR不为空
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input = cs_alv-hkont
IMPORTING
output = lv_hkont.
IF ( lv_hkont+0(4) = '6001' OR
lv_hkont+0(4) = '6051' OR
lv_hkont+0(4) = '2204' OR lv_hkont+0(4) = '6401' OR lv_hkont = '6402' ) AND cs_alv-prctr IS INITIAL.
cs_alv-light = icon_red_light.
cs_alv-zmes = cs_alv-zmes && '科目=6001*、6051*、2204*,6401*,6402* 利润中心不能为空;'.
ENDIF.
*20230531增加控制:
*当科目等于5301*时,检查成本中心必须输入。
*即当BUKRS=1000,HKONT=5301*,检查KOSTL不为空。
IF cs_alv-bukrs EQ '1000' AND lv_hkont+0(4) = '5301' AND cs_alv-kostl IS INITIAL.
cs_alv-light = icon_red_light.
cs_alv-zmes = gs_alv-zmes && '当科目=1000,科目=5301*成本中心不能为空;'.
ENDIF.
*20230531增加控制:
*当科目等于5301*时,检查内部订单必须输入。
*即当BUKRS=1000,HKONT=5301*,检查AUFNR不为空
IF cs_alv-bukrs EQ '1000' AND lv_hkont+0(4) = '5301' AND cs_alv-aufnr IS INITIAL.
cs_alv-light = icon_red_light.
cs_alv-zmes = gs_alv-zmes && '当公司代码=1000,科目=5301*内部订单不能为空;'.
ENDIF.
*当导入科目为暂估科目时,分配字段为必输,且必须输入供应商编号。
*即当RACCT为2204*时,分配字段ZUONR为必输,且输入内容后检查是否存在供应商主数据表LFA1,
*若不存在,刚提示“请输入正确的供应商编号”
IF cs_alv-hkont+0(4) EQ '2204' .
IF cs_alv-zuonr IS INITIAL.
cs_alv-light = icon_red_light.
cs_alv-zmes = gs_alv-zmes && '当科目=2204*分配字段不能为空;'.
ELSE.
lv_lifnr = cs_alv-zuonr.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = lv_lifnr
IMPORTING
output = lv_lifnr.
SELECT SINGLE * FROM lfa1 WHERE lifnr = @lv_lifnr INTO @DATA(ls_lfa1).
IF sy-subrc NE 0.
cs_alv-light = icon_red_light.
cs_alv-zmes = gs_alv-zmes && '当科目=2204*请输入正确的供应商编号'.
ENDIF.
ENDIF.
ENDIF.
*当输入科目为收入科目时,检查行项目文本必输。
*即当RACCT为6001*、6051*时,检查SGTXT不为空。
IF lv_hkont+0(4) EQ '6001' OR lv_hkont+0(4) EQ '6051' .
IF cs_alv-sgtxt IS INITIAL.
cs_alv-light = icon_red_light.
cs_alv-zmes = gs_alv-zmes && '当科目为6001*、6051*时,SGTXT不为空'.
ENDIF.
ENDIF.
*3、 当科目为800001*, 职能范围为必输,且校验值是否F001,不是F001, 不能导入。
*即当RACCT=800001*,职能范围必输,且校验值是否F001,不是F001, 不能导入
IF lv_hkont+0(6) EQ '800001' AND cs_alv-bukrs NE '8600' .
IF cs_alv-fkber_long IS INITIAL OR cs_alv-fkber_long NE 'F001'.
cs_alv-light = icon_red_light.
cs_alv-zmes = gs_alv-zmes && '当科目为800001*时,职能范围必输,且是F001'.
ENDIF.
ENDIF.
ENDFORM.