SAP FICO会计凭证批量导入

内容分享2小时前发布
0 0 0

一、功能逻辑

SAP FICO会计凭证批量导入

SAP FICO会计凭证批量导入

SAP FICO会计凭证批量导入

SAP FICO会计凭证批量导入

SAP FICO会计凭证批量导入

SAP FICO会计凭证批量导入

SAP FICO会计凭证批量导入

SAP FICO会计凭证批量导入

SAP FICO会计凭证批量导入

SAP FICO会计凭证批量导入

二、功能界面

SAP FICO会计凭证批量导入

SAP FICO会计凭证批量导入

三、功能代码

*&———————————————————————*
*& 程序名: 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.

© 版权声明

相关文章

暂无评论

none
暂无评论...