会计凭证批导


模板见文件

*&---------------------------------------------------------------------*
*& Report ZFI001
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zfid003 .

TABLES sscrfields.
*&---------------------------------------------------------------------*
*& 会计凭证导入
*&---------------------------------------------------------------------*

TYPES: BEGIN OF ty_input,

         number         TYPE text20,                                      "
         comp_code      TYPE bapiache09-comp_code,                        " 公司代码
         pstng_date     TYPE bapiache09-pstng_date,                       " 过账日期
*         pstng_date TYPE CHAR10,                       " 过账日期
         doc_date       TYPE bapiache09-doc_date,                         " 凭证日期
*         doc_date   TYPE CHAR10,                         " 凭证日期
         doc_type       TYPE bapiache09-doc_type,                         " 凭证类型
*         monat      TYPE monat,                                       " 过账期间  bkpf-monat    "后台处理
         ref_doc_no     TYPE bapiache09-ref_doc_no,                       " 参考凭证号              “参照
         header_txt     TYPE bapiache09-header_txt,                       " 凭证抬头文本
         currency       TYPE bapiaccr09-currency ,                        " 货币码
*         exch_rate  TYPE bapiaccr09-exch_rate ,                       " 汇率
*         numpg      TYPE bkpf-numpg,                                  " 页数
*         posnr      TYPE zzs_fi_fb01_extension2-posnr,                " 行项目编号
*         bschl          TYPE tbsl-bschl,                                  " 记账码
         umskz          TYPE bseg-umskz ,                                 " 特别总账标识 bseg-umskz
         gl_account     TYPE bapiacap09-gl_account ,                      " 科目代码
         customer       TYPE bapiacar09-customer ,                        " 客户编号
         vendor_no      TYPE bapiacap09-vendor_no ,                       " 供应商
         amt_doccur(31) TYPE c ,                      " 交易货币金额
*         dmbtr      TYPE bseg-dmbtr ,                                 " 本位币金额 bseg-dmbtr    输入外币会带出    "
*         bus_area   TYPE bapiacgl09-bus_area ,                        " 业务范围
*         value_date TYPE bapiacgl09-value_date ,                      " 起息日
*         zterm      TYPE bseg-zterm ,                                 "付款条件BSEG-ZTERM
         zfbdt          TYPE bseg-zfbdt ,                                  " 基限日期(汇票到期日)
         costcenter     TYPE bapiacgl09-costcenter ,                      " 成本中心
         orderid        TYPE bapiacgl09-orderid ,                         " 统计型内部订单
         zuonr          TYPE bapiacgl09-alloc_nmbr,                            " 分配 bseg-zuonr
         item_text      TYPE bapiacgl09-item_text ,                       " 凭证行文本
         xnegp          TYPE bseg-xnegp ,                                  " 反记账 bseg-xnegp
*         rstgr      TYPE zzs_fi_fb01_extension2-rstgr ,               " 原因代码 bseg-rstgr
         xref1          TYPE bseg-xref1 ,                                 " 参考代码1 bseg-xref1
         xref2          TYPE bseg-xref2 ,                                 " 参考代码1 bseg-xref2
*         xref3      TYPE bseg-xref3 ,                                 " 参考代码1 bseg-xref3
         fkber          TYPE bseg-fkber, "功能范围
         vertn          TYPE bseg-vertn, "销售活动项目
         vertt          TYPE bseg-vertt, "回款类型
*         vertt      TYPE bseg-vertt, "合同类型
         kndnr          TYPE ce11000-kndnr, "  客户(获利能力分析)
         artnr          TYPE ce11000-artnr, "产品编号(获利能力分析)
         vkorg          TYPE ce11000-vkorg, "销售机构(获利能力分析)
         vtweg          TYPE ce11000-vtweg, "分销渠道(获利能力分析)
         spart          TYPE ce11000-spart, "品牌(获利能力分析)


*&-----用来显示消息的字段

         belnr          TYPE bseg-belnr,
         gjahr          TYPE bseg-gjahr,
         bukrs          TYPE bseg-bukrs,
         msg            TYPE string,
         light          TYPE c LENGTH 4,
         type           TYPE c LENGTH 1,
         slbox,
       END OF ty_input.

*TYPES: BEGIN OF ty_tbsl,
*         bschl TYPE tbsl-bschl,
*         shkzg TYPE tbsl-shkzg,
*       END OF ty_tbsl.

TYPES: BEGIN OF ty_output,
         number TYPE text20,                                         "
         belnr  TYPE bseg-belnr,
         gjahr  TYPE bseg-gjahr,
         bukrs  TYPE bseg-bukrs,
         msg    TYPE string,
         slbox,
       END OF ty_output.

*--------------------------------------------------------------------*
* DATA
*--------------------------------------------------------------------*

DATA: gt_input TYPE STANDARD TABLE OF ty_input.
FIELD-SYMBOLS: <gs_input> TYPE ty_input.

**记账码对应的正负
*DATA: gt_tbsl TYPE STANDARD TABLE OF ty_tbsl.
*FIELD-SYMBOLS: <gs_tbsl> TYPE ty_tbsl.

DATA: gt_output TYPE STANDARD TABLE OF ty_output.

*ALV
DATA: fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: gs_layout TYPE slis_layout_alv.

DATA functxt TYPE smp_dyntxt."下载模板按钮要用到的结构

*--------------------------------------------------------------------*
*
*--------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_file TYPE rlgrap-filename MEMORY ID m1.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN:FUNCTION KEY 1.

*--------------------------------------------------------------------*
*
*--------------------------------------------------------------------*
INITIALIZATION.
  functxt-icon_id   = icon_export.
  functxt-quickinfo = '模版下载'.
  functxt-icon_text = '模版下载'.
  sscrfields-functxt_01 = functxt.

*--------------------------------------------------------------------*
*
*--------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM f4_help_for_filename.

AT SELECTION-SCREEN.
  IF sscrfields-ucomm = 'FC01'.
    PERFORM frm_get_model USING 'ZFID003.XLS'.
  ENDIF.

START-OF-SELECTION.

*  PERFORM f_init.
  PERFORM check_filename.
  PERFORM get_data_from_file.    " 导入文件数据




END-OF-SELECTION.

  PERFORM f_alv_fieldcat.
  PERFORM f_layout.
  PERFORM f_display.




**&---------------------------------------------------------------------*
**&      FORM  F_INIT
**&---------------------------------------------------------------------*
**       TEXT
**----------------------------------------------------------------------*
**  -->  P1        TEXT
**  <--  P2        TEXT
**----------------------------------------------------------------------*
*FORM f_init .
*
*  FREE: gt_input,
*        gt_tbsl,
*        gt_output.
*
** 记账码对应的正负
*  SELECT  bschl
*          shkzg
*    INTO TABLE gt_tbsl
*    FROM tbsl.                "过帐码table
*
*ENDFORM.                    " F_INIT



*&---------------------------------------------------------------------*
*&      FORM  F4_HELP_FOR_FILENAME
*&---------------------------------------------------------------------*
*       针对文件的SEARCH HELP
*----------------------------------------------------------------------*
*      -->P_FILENAME  TEXT
*----------------------------------------------------------------------*
FORM f4_help_for_filename.

  DATA: l_file         TYPE string,
        l_file_import  TYPE string,
        l_path_initial TYPE string,
        lt_filetable   TYPE filetable,
        lw_filetable   LIKE LINE OF lt_filetable,
        l_rc           TYPE i.

*--------------------------------------------------------------------*
*
*--------------------------------------------------------------------*
  l_file = p_file.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      file_filter             = 'EXCEL 文件 (*.XLS;*.XLSX)|*.XLS;*.XLSX'
    CHANGING
      file_table              = lt_filetable
      rc                      = l_rc
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.
  IF sy-subrc <> 0.
  ENDIF.

  IF l_rc > 0.
    READ TABLE lt_filetable INTO lw_filetable INDEX 1.
    IF sy-subrc = 0.
      p_file = lw_filetable-filename.
    ENDIF.
  ENDIF.

ENDFORM.



*&---------------------------------------------------------------------*
*&      FORM  CHECK_FILENAME
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM check_filename .

  DATA: l_s1 TYPE string,
        l_s2 TYPE string.

*--------------------------------------------------------------------*
*
*--------------------------------------------------------------------*
  SPLIT p_file AT '.' INTO l_s1 l_s2.
  TRANSLATE l_s2 TO UPPER CASE.
  IF l_s2 <> 'XLS' AND l_s2 <> 'XLSX'.
    MESSAGE '文件格式不对!' TYPE 'E'.
    STOP.
  ENDIF.

ENDFORM. " CHECK_FILENAME



*&---------------------------------------------------------------------*
*&      FORM  GET_DATA_FROM_FILE
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*

FORM get_data_from_file .

  DATA: it_raw TYPE truxs_t_text_data,
        l_line TYPE i.

*--------------------------------------------------------------------*
*
*--------------------------------------------------------------------*
  CLEAR: gt_input.

  IF p_file IS INITIAL .
    MESSAGE '文件路径不存在' TYPE 'E'.
  ENDIF.

  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
      i_line_header        = 'X'       " NOT INCLUDE FILE HEADER
      i_tab_raw_data       = it_raw    " WORK TABLE
      i_filename           = p_file
    TABLES
      i_tab_converted_data = gt_input[]
    EXCEPTIONS
      conversion_failed    = 1
      OTHERS               = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  IF gt_input IS INITIAL.
    MESSAGE '上传文件不包含任何有效数据!' TYPE 'E'.
    STOP.
  ENDIF.


  LOOP AT gt_input ASSIGNING <gs_input>.

*    IF <gs_input>-vertn IS  INITIAL.
*      <gs_input>-vertt = ''.
*    ELSE.
*      <gs_input>-vertt = 'A'.
*    ENDIF.


    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = <gs_input>-gl_account
      IMPORTING
        output = <gs_input>-gl_account.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = <gs_input>-customer
      IMPORTING
        output = <gs_input>-customer.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = <gs_input>-vendor_no
      IMPORTING
        output = <gs_input>-vendor_no.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = <gs_input>-costcenter
      IMPORTING
        output = <gs_input>-costcenter.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = <gs_input>-orderid
      IMPORTING
        output = <gs_input>-orderid.

  ENDLOOP.

*  SORT gt_input BY number posnr.

ENDFORM. " GET_DATA_FROM_FILE



*&---------------------------------------------------------------------*
*&      FORM  CALL_BAPI
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM call_bapi .

  DATA: lv_index TYPE sy-tabix.
  DATA: ls_output TYPE ty_output.
  DATA l_num TYPE i VALUE 0.

  DATA: documentheader    TYPE bapiache09,
        accountgl         TYPE STANDARD TABLE OF bapiacgl09,      " 总账
        accountreceivable TYPE STANDARD TABLE OF bapiacar09,      " 客户
        accountpayable    TYPE STANDARD TABLE OF bapiacap09,      " 供应商
        currencyamount    TYPE STANDARD TABLE OF bapiaccr09,      " 金额
        extension2        TYPE STANDARD TABLE OF bapiparex,
        return            TYPE STANDARD TABLE OF bapiret2,
        criteria          TYPE STANDARD TABLE OF  bapiackec9.
*        LS_RETURN TYPE bapiret2.

  DATA: ls_accountgl         TYPE bapiacgl09,      " 总账
        ls_accountreceivable TYPE bapiacar09,      " 客户
        ls_accountpayable    TYPE bapiacap09,      " 供应商
        ls_currencyamount    TYPE bapiaccr09,      " 金额
        ls_criteria          TYPE bapiackec9,
        ls_extension2        TYPE bapiparex,
        ls_return            TYPE bapiret2.
  DATA ls_zexten LIKE zfid003_01.

  DATA l_umskz_flag TYPE flag."用来判断要创建的会计凭证是否有特别总账标识

*  DATA: ls_zzs_fi_fb01_extension2 TYPE zzs_fi_fb01_extension2.

*--------------------------------------------------------------------*
*
*--------------------------------------------------------------------*

  DATA: lt_knb1 TYPE TABLE OF knb1,
        ls_knb1 TYPE knb1.
  SELECT *
    INTO TABLE lt_knb1
    FROM knb1
     FOR ALL ENTRIES IN gt_input
   WHERE kunnr = gt_input-customer
     AND bukrs = gt_input-comp_code.
  SORT lt_knb1 BY kunnr bukrs.

  DATA: lt_lfb1 TYPE TABLE OF lfb1,
        ls_lfb1 TYPE lfb1.
  SELECT *
    INTO TABLE lt_lfb1
    FROM lfb1
     FOR ALL ENTRIES IN gt_input
   WHERE lifnr = gt_input-vendor_no
     AND bukrs = gt_input-comp_code.
  SORT lt_lfb1 BY lifnr bukrs.

  DATA: BEGIN OF ls_skb1,
          bukrs LIKE skb1-bukrs,
          saknr LIKE skb1-saknr,
          xintb LIKE skb1-xintb,
        END OF ls_skb1.
  DATA lt_skb1 LIKE TABLE OF ls_skb1 .

  SELECT bukrs
         saknr
         xintb
    INTO CORRESPONDING FIELDS OF TABLE lt_skb1
    FROM skb1
     FOR ALL ENTRIES IN gt_input
   WHERE saknr = gt_input-gl_account .
  SORT lt_skb1 BY bukrs saknr .

  LOOP AT gt_input ASSIGNING <gs_input>.

    l_num = l_num + 1.

    IF <gs_input>-umskz = 'U' OR
            <gs_input>-umskz = 'V' OR
           <gs_input>-umskz = 'W' OR
          <gs_input>-umskz = 'X' OR
           <gs_input>-umskz = 'Y' OR
          <gs_input>-umskz = 'Z' .
      l_umskz_flag = 'X'.
    ENDIF.


    AT NEW number.
      CLEAR: documentheader,
             ls_output.
      FREE: accountgl,
            accountreceivable,
            accountpayable,
            currencyamount,
            extension2,
            return.
      documentheader-comp_code  = <gs_input>-comp_code.       " 公司代码
      documentheader-doc_date   = <gs_input>-doc_date.        " 凭证日期
      documentheader-pstng_date = <gs_input>-pstng_date.      " 过账日期
      documentheader-doc_type   = <gs_input>-doc_type.        " 凭证类型
      documentheader-ref_doc_no = <gs_input>-ref_doc_no.      " 参考凭证号
      documentheader-header_txt = <gs_input>-header_txt.      " 凭证抬头文本
      documentheader-username   = sy-uname.                   "
    ENDAT.

    CLEAR: ls_accountgl,
           ls_accountreceivable,
           ls_accountpayable,
           ls_currencyamount,
           ls_extension2.
*           ls_zzs_fi_fb01_extension2.

    "增强中
*    ls_zzs_fi_fb01_extension2-posnr = <gs_input>-posnr.        " 行项目编号
*    ls_zzs_fi_fb01_extension2-bschl = <gs_input>-bschl.        " 记账码
*    ls_zzs_fi_fb01_extension2-umskz = <gs_input>-umskz.        " 特别总账标识
*    ls_zzs_fi_fb01_extension2-rstgr = <gs_input>-rstgr.        " 原因代码
*    ls_zzs_fi_fb01_extension2-xnegp = <gs_input>-xnegp.        " 反记账
*    ls_zzs_fi_fb01_extension2-zuonr = <gs_input>-zuonr.        " 分配

    CLEAR ls_zexten .
    ls_zexten-posnr = l_num.
    ls_zexten-xnegp = <gs_input>-xnegp.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = <gs_input>-vertn
      IMPORTING
        output = <gs_input>-vertn.
    ls_zexten-vertn = <gs_input>-vertn.

*    ls_zexten-umskz = <gs_input>-umskz.
    IF <gs_input>-vertn IS NOT INITIAL.
      ls_zexten-vertt = 'A'.
    ELSE.
*      ls_zexten-vertt = ''.
    ENDIF.
    "回款类型
    IF <gs_input>-vertt IS NOT INITIAL .
      ls_zexten-vertt = <gs_input>-vertt .
    ENDIF.

    IF ls_zexten-vertn IS INITIAL AND ls_zexten-vertt IS NOT INITIAL .
      <gs_input>-msg =  '回款类型不为空,请输入款项项目' .
      <gs_input>-type = 'E'.
      <gs_input>-light = '@5C@'.
      RETURN.
    ENDIF.

*    ls_zexten-kunnr  = <gs_input>-kndnr.
*    ls_zexten-artnr  = <gs_input>-artnr.
    ls_extension2-structure = 'ZFID003_01'.
    ls_extension2-valuepart1 = ls_zexten.
    APPEND ls_extension2 TO extension2.

    IF <gs_input>-kndnr IS NOT INITIAL.
      ls_criteria-itemno_acc = l_num.
      ls_criteria-fieldname = 'KNDNR'.
      ls_criteria-character = <gs_input>-kndnr.
      APPEND ls_criteria TO criteria.
    ENDIF.

    IF <gs_input>-artnr IS NOT INITIAL.
      ls_criteria-itemno_acc = l_num.
      ls_criteria-fieldname = 'ARTNR'.
      CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
        EXPORTING
          input        = <gs_input>-artnr
        IMPORTING
          output       = <gs_input>-artnr
        EXCEPTIONS
          length_error = 1
          OTHERS       = 2.
      ls_criteria-character = <gs_input>-artnr.
      APPEND ls_criteria TO criteria.
    ENDIF.

    IF <gs_input>-vkorg IS NOT INITIAL.
      ls_criteria-itemno_acc = l_num.
      ls_criteria-fieldname = 'VKORG'.
      ls_criteria-character = <gs_input>-vkorg.
      APPEND ls_criteria TO criteria.
    ENDIF.

    IF <gs_input>-vtweg IS NOT INITIAL.
      ls_criteria-itemno_acc = l_num.
      ls_criteria-fieldname = 'VTWEG'.
      ls_criteria-character = <gs_input>-vtweg.
      APPEND ls_criteria TO criteria.
    ENDIF.

    IF <gs_input>-spart IS NOT INITIAL.
      ls_criteria-itemno_acc = l_num.
      ls_criteria-fieldname = 'SPART'.
      ls_criteria-character = <gs_input>-spart.
      APPEND ls_criteria TO criteria.
    ENDIF.

    "当FS00的“创建/银行/利息” TAB页勾选了“只能自动过账” 时,对应的总账科目不能通过F-02做账,必须报错
    READ TABLE lt_skb1 INTO ls_skb1 WITH KEY bukrs = <gs_input>-comp_code
                                                   saknr = <gs_input>-gl_account BINARY SEARCH .
    IF sy-subrc = 0 .
      IF ls_skb1-xintb = 'X'.
        CONCATENATE '账户' <gs_input>-gl_account '只能内部记帐到公司代码' <gs_input>-comp_code '' INTO <gs_input>-msg .
        <gs_input>-type = 'E'.
        <gs_input>-light = '@5C@'.
        RETURN.
      ENDIF.
    ENDIF.
*
*    ls_extension2-structure = 'ZZS_FI_FB01_EXTENSION2'.
*    ls_extension2-valuepart1 = ls_zzs_fi_fb01_extension2.      " ZZS_FI_FB01_EXTENSION2超出240位就放VALUEPART2/3/4
*    APPEND ls_extension2 TO extension2.

    IF <gs_input>-customer IS NOT INITIAL.
      ls_accountreceivable-itemno_acc = l_num.                " 行项目编号
      ls_accountreceivable-customer = <gs_input>-customer.     " 客户

      IF <gs_input>-umskz IS NOT INITIAL .
        ls_accountreceivable-sp_gl_ind = <gs_input>-umskz.     " 特别总账标识
      ENDIF.

*      ls_accountreceivable-bus_area = <gs_input>-bus_area.     " 业务范围

*      IF <gs_input>-zterm IS INITIAL.
      READ TABLE lt_knb1 INTO ls_knb1 WITH KEY kunnr = <gs_input>-customer
                                               bukrs = <gs_input>-comp_code
                                               BINARY SEARCH.
      IF sy-subrc = 0.
        ls_accountreceivable-pmnttrms = ls_knb1-zterm   .        " 付款条件
      ENDIF.
*      ELSE.
*        ls_accountreceivable-pmnttrms = <gs_input>-zterm   .        " 付款条件
*      ENDIF.

      ls_accountreceivable-bline_date = <gs_input>-zfbdt. " 付款基准日期
      ls_accountreceivable-item_text = <gs_input>-item_text.   " 凭证行文本
      ls_accountreceivable-ref_key_1 = <gs_input>-xref1.        " 参考代码1
      ls_accountreceivable-ref_key_2 = <gs_input>-xref2.        " 参考代码2
      IF <gs_input>-zuonr IS NOT INITIAL.
        ls_accountreceivable-alloc_nmbr = <gs_input>-zuonr.            " 分配
      ENDIF.

      IF <gs_input>-gl_account IS NOT INITIAL.
        ls_accountreceivable-gl_account = <gs_input>-gl_account.         " 科目代码
      ENDIF.

      APPEND ls_accountreceivable TO accountreceivable.
    ELSEIF <gs_input>-vendor_no IS NOT INITIAL.
      ls_accountpayable-itemno_acc = l_num.                   " 行项目编号
      ls_accountpayable-vendor_no = <gs_input>-vendor_no.      " 供应商

      IF <gs_input>-umskz IS NOT INITIAL .
        ls_accountpayable-sp_gl_ind = <gs_input>-umskz.     " 特别总账标识
      ENDIF.
*      ls_accountpayable-bus_area = <gs_input>-bus_area.        " 业务范围

*      IF <gs_input>-zterm IS INITIAL.
      READ TABLE lt_lfb1 INTO ls_lfb1 WITH KEY lifnr = <gs_input>-vendor_no
                                               bukrs = <gs_input>-comp_code
                                               BINARY SEARCH.
      IF sy-subrc = 0.
        ls_accountpayable-pmnttrms = ls_lfb1-zterm   .        " 付款条件
      ENDIF.
*      ELSE.
*        ls_accountpayable-pmnttrms = <gs_input>-zterm   .        " 付款条件
*      ENDIF.

      ls_accountpayable-bline_date = <gs_input>-zfbdt.    " 付款基准日期
      ls_accountpayable-item_text = <gs_input>-item_text.      " 凭证行文本
      ls_accountpayable-ref_key_1 = <gs_input>-xref1.          " 参考代码1
      ls_accountpayable-ref_key_2 = <gs_input>-xref2.          " 参考代码2
      IF <gs_input>-zuonr IS NOT INITIAL.
        ls_accountpayable-alloc_nmbr = <gs_input>-zuonr.               " 分配
      ENDIF.

      IF <gs_input>-gl_account IS NOT INITIAL.
        ls_accountpayable-gl_account = <gs_input>-gl_account.         " 科目代码
      ENDIF.

      APPEND ls_accountpayable TO accountpayable.
    ELSE.
      ls_accountgl-itemno_acc = l_num.                      " 行项目编号
      ls_accountgl-gl_account = <gs_input>-gl_account.         " 科目代码
      ls_accountgl-salesorg = <gs_input>-vkorg.         " 销售机构
      ls_accountgl-distr_chan = <gs_input>-vtweg.         " 分销渠道
      ls_accountgl-division = <gs_input>-spart.         " 品牌
*      ls_accountgl-bus_area = <gs_input>-bus_area.             " 业务范围
*      ls_accountgl-value_date = <gs_input>-value_date.         " 起息日
      ls_accountgl-costcenter = <gs_input>-costcenter.         " 成本中心
      ls_accountgl-orderid = <gs_input>-orderid.               " 统计型内部订单
      ls_accountgl-item_text = <gs_input>-item_text.           " 凭证行文本
      ls_accountgl-ref_key_1 = <gs_input>-xref1.               " 参考代码1
      ls_accountgl-ref_key_2 = <gs_input>-xref2.               " 参考代码2
*      ls_accountgl-ref_key_3 = <gs_input>-xref3.               " 参考代码2
      IF <gs_input>-zuonr IS NOT INITIAL.
        ls_accountgl-alloc_nmbr = <gs_input>-zuonr.                  " 分配
      ENDIF.
      ls_accountgl-func_area = <gs_input>-fkber.               " 功能范围
*      ls_accountgl-customer = <gs_input>-kndnr.               "客户编号

      APPEND ls_accountgl TO accountgl.
    ENDIF.

*    READ TABLE gt_tbsl ASSIGNING <gs_tbsl> WITH KEY bschl = <gs_input>-bschl.
*    IF sy-subrc = 0.
    ls_currencyamount-itemno_acc = l_num.         " 行项目编号
    ls_currencyamount-currency   = <gs_input>-currency.        " 货币码
    ls_currencyamount-curr_type  = '00'.                      "凭证中输入的币别类型
    ls_currencyamount-amt_doccur = <gs_input>-amt_doccur.    " 交易货币金额
*      ls_currencyamount-exch_rate  = <gs_input>-exch_rate.    " 汇率
*    IF <gs_tbsl>-shkzg = 'H'.
*      ls_currencyamount-amt_doccur = - ls_currencyamount-amt_doccur.
*    ENDIF.
    APPEND ls_currencyamount TO currencyamount.

    SELECT SINGLE waers INTO @DATA(lv_waers)
                    FROM t001 WHERE bukrs = '1100'.
    IF <gs_input>-currency <> lv_waers.             "输入货币与公司1100币别不一样,即不是CNY
      CLEAR: ls_currencyamount.
*        IF ls_currencyamount-exch_rate IS NOT INITIAL OR <gs_input>-dmbtr IS NOT INITIAL.

      ls_currencyamount-itemno_acc = l_num.         " 行项目编号
*        ls_currencyamount-currency   = <gs_input>-currency.      " 货币码
      ls_currencyamount-currency   = lv_waers.                  " 货币码
      ls_currencyamount-curr_type  = '10'.                     "本位币类型
*        ls_currencyamount-amt_doccur = <gs_input>-dmbtr.         " 本位币金额
*          ls_currencyamount-exch_rate  = <gs_input>-exch_rate.    " 汇率
*        ELSEIF ls_currencyamount-exch_rate IS NOT INITIAL.
*          ls_currencyamount-amt_doccur = <gs_input>-amt_doccur * ls_currencyamount-exch_rate.
*        ENDIF.

*      IF <gs_tbsl>-shkzg = 'H'.
*        ls_currencyamount-amt_doccur = - ls_currencyamount-amt_doccur.
*      ENDIF.
      ls_currencyamount-amt_doccur = - ls_currencyamount-amt_doccur.
      APPEND ls_currencyamount TO currencyamount.
    ENDIF.
*    ENDIF.

    AT END OF number.
      CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
        EXPORTING
          documentheader    = documentheader
        TABLES
          accountgl         = accountgl
          accountreceivable = accountreceivable
          accountpayable    = accountpayable
          currencyamount    = currencyamount
          criteria          = criteria
          return            = return
          extension2        = extension2.
      SORT return BY type.
      READ TABLE return WITH KEY type = 'E' TRANSPORTING NO FIELDS.
      IF sy-subrc = 0.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        LOOP AT return INTO ls_return FROM sy-tabix.
          IF ls_return-type = 'E'.
            CONCATENATE <gs_input>-msg ls_return-message INTO <gs_input>-msg.
          ELSE.
            EXIT.
          ENDIF.
        ENDLOOP.
        <gs_input>-type = 'E'.
        <gs_input>-light = '@5C@'.
        RETURN.
      ELSE.
        READ TABLE return WITH KEY type = 'A'  TRANSPORTING NO FIELDS.
        IF sy-subrc = 0.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
          LOOP AT return INTO ls_return FROM sy-tabix.
            IF ls_return-type = 'A'.
              CONCATENATE <gs_input>-msg ls_return-message INTO <gs_input>-msg.
            ELSE.
              EXIT.
            ENDIF.
          ENDLOOP.
          <gs_input>-type = 'A'.
          <gs_input>-light = '@5C@'.
          RETURN.
        ELSE.
        ENDIF.
      ENDIF.

      REFRESH return.
      CLEAR ls_return.




*      READ TABLE return INTO ls_return WITH KEY type = 'E' .
*      IF sy-subrc = 0.
*        LOOP AT return INTO ls_return WHERE type = 'E'.
*          IF ls_output-msg IS INITIAL.
**            ls_output-msg = ls_return-message.
*            <gs_input>-msg = ls_return-message.
*          ELSE.
*            CONCATENATE ls_output-msg ls_return-message INTO ls_output-msg SEPARATED BY '/'.
*          ENDIF.
*          <gs_input>-type = 'E'.
*        ENDLOOP.
*        RETURN.
*      ELSE.
*        CLEAR ls_return.
*        READ TABLE return INTO ls_return WITH KEY type = 'A' .
*        IF sy-subrc = 0.
*
*        ENDIF.
*      ENDIF.



      CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
        EXPORTING
          documentheader    = documentheader
        TABLES
          accountgl         = accountgl                "总账
          accountreceivable = accountreceivable        "应收
          accountpayable    = accountpayable           "应付
          currencyamount    = currencyamount           "金额
          criteria          = criteria
          extension2        = extension2               "扩展
          return            = return.
*      READ TABLE return INTO ls_return WITH KEY type = 'E' .
*      IF sy-subrc = 0.
*        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
*        <gs_input>-type = ls_return-type.
*        <gs_input>-light = '@5C@'.
*        <gs_input>-msg = ls_return-message.
*        RETURN.
*      ELSE.
*        READ TABLE return INTO ls_return WITH KEY type = 'A' .
*        IF sy-subrc = 0.
*          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
*          <gs_input>-type = ls_return-type.
*          <gs_input>-light = '@5C@'.
*          <gs_input>-msg = ls_return-message.
*          RETURN.
*        ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.

      READ TABLE return INTO ls_return WITH KEY id = 'RW' number = '605'.
      IF sy-subrc = 0.
        <gs_input>-type = 'S'.
        <gs_input>-light = '@5B@'.
        <gs_input>-msg = ls_return-message.

        <gs_input>-belnr = ls_return-message_v2+0(10).
        <gs_input>-bukrs = ls_return-message_v2+10(4).
        <gs_input>-gjahr = ls_return-message_v2+14(4).
      ENDIF.
*        ENDIF.
*      ENDIF.

      CLEAR:documentheader.
      REFRESH:accountgl      ,
              accountreceivable,
              accountpayable   ,
              currencyamount   ,
              criteria,
              extension2     ,
              return.
      CLEAR ls_return.

      CLEAR l_num.

*      IF <gs_input>-type IS NOT INITIAL.
*        CASE <gs_input>-type.
*          WHEN 'S'.
*            <gs_input>-light = '@5B@'.    "绿灯
*            <gs_input>-msg = '会计凭证创建成功'.
*          WHEN 'E'.
*            <gs_input>-light = '@5C@'.    "红灯
*          WHEN 'W'.
*            <gs_input>-light = '@5D@'.    "黄灯
*        ENDCASE.
*      ENDIF.

*      ls_output-number = <gs_input>-number.
*      APPEND ls_output TO gt_output.
    ENDAT.



  ENDLOOP.

ENDFORM.                    " CALL_BAPI




*&---------------------------------------------------------------------*
*&      FORM  F_ALV_FIELDCAT
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM f_alv_fieldcat .
  CLEAR: fieldcatalog.
  DEFINE build_fieldcat.
    fieldcatalog-fieldname = &1.
    fieldcatalog-seltext_m = &2.
    fieldcatalog-outputlen = &3.

    IF fieldcatalog-fieldname = 'MSG'.

      fieldcatalog-key  = 'X'.
    ENDIF.
    IF fieldcatalog-fieldname = 'GL_ACCOUNT' OR
       fieldcatalog-fieldname = 'CUSTOMER' OR
       fieldcatalog-fieldname = 'VENDOR_NO' OR
       fieldcatalog-fieldname = 'ORDERID' .
       fieldcatalog-no_zero = 'X'.
      ENDIF.
    IF fieldcatalog-fieldname = 'MSG' OR
         fieldcatalog-fieldname = 'LIGHT' OR
        fieldcatalog-fieldname = 'TYPE' .
      fieldcatalog-key  = 'X'.
    ENDIF.
    APPEND fieldcatalog TO fieldcatalog.
    CLEAR fieldcatalog.
  END-OF-DEFINITION.

  build_fieldcat 'NUMBER' '序号' 3.
  build_fieldcat 'COMP_CODE' '公司代码' 10.
  build_fieldcat 'PSTNG_DATE' '过账日期' 10.
  build_fieldcat 'DOC_DATE' '凭证日期' 10.
  build_fieldcat 'DOC_TYPE' '凭证类型' 10.

*  build_fieldcat 'MONAT' '过账期间' 10.
  build_fieldcat 'REF_DOC_NO' '参考凭证号' 10.
  build_fieldcat 'HEADER_TXT' '抬头文本' 10.
  build_fieldcat 'CURRENCY' '货币码' 10.
*  build_fieldcat 'EXCH_RATE' '汇率' 10.
*
*  build_fieldcat 'NUMPG' '页数' 10.
*  build_fieldcat 'BSCHL' '记账代码' 10.
  build_fieldcat 'UMSKZ' '特别总账标识' 10.
  build_fieldcat 'GL_ACCOUNT' '科目编码' 10.
  build_fieldcat 'CUSTOMER' '客户编号' 10.
  build_fieldcat 'VENDOR_NO' '供应商' 10.
  build_fieldcat 'AMT_DOCCUR' '交易货币金额' 10.

*  build_fieldcat 'DMBTR' '本位币金额' 10.
*  build_fieldcat 'BUS_AREA' '业务范围' 10.
*  build_fieldcat 'VALUE_DATE' '起息日' 10.
*  build_fieldcat 'ZTERM' '付款条件' 10.
  build_fieldcat 'ZFBDT' '基限日期' 10.

  build_fieldcat 'COSTCENTER' '成本中心' 10.
  build_fieldcat 'ORDERID' '统计型内部订单' 10.
  build_fieldcat 'ZUONR' '分配' 10.
  build_fieldcat 'ITEM_TEXT' '凭证行文本' 10.
  build_fieldcat 'XNEGP' '反记账标识' 10.
  build_fieldcat 'XREF1' '参考代码1(制单人)' 10.
  build_fieldcat 'XREF2' '参考代码2' 10.
*  build_fieldcat 'XREF3' '参考代码3' 10.
  build_fieldcat 'FKBER' '功能范围' 10.
  build_fieldcat 'VERTN' '款项项目' 10.
  build_fieldcat 'VERTT' '回款类型' 10.
  build_fieldcat 'KNDNR' '客户' 10.
  build_fieldcat 'ARTNR' '产品编号' 10.
  build_fieldcat 'VKORG' '销售机构' 10.
  build_fieldcat 'VTWEG' '分销渠道' 10.
  build_fieldcat 'SPART' '品牌' 10.

  build_fieldcat 'BELNR' '会计凭证号码' 10.
  build_fieldcat 'GJAHR' '财年' 10.
  build_fieldcat 'BUKRS' '公司代码' 10.
  build_fieldcat 'MSG' '消息' 10.
  build_fieldcat 'TYPE' '结果' 10.
  build_fieldcat 'LIGHT' '执行结果' 8.

ENDFORM.                    " F_ALV_FIELDCAT



*&---------------------------------------------------------------------*
*&      FORM  F_LAYOUT
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
FORM f_layout .
  gs_layout-zebra = 'X'.
  gs_layout-colwidth_optimize = 'X'.
  gs_layout-box_fieldname = 'SLBOX'.
ENDFORM.                    " F_LAYOUT



*&---------------------------------------------------------------------*
*&      FORM  F_DISPLAY
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
FORM f_display .

*  可以保存格式
  DATA:gs_variant   TYPE disvariant.
  gs_variant-report = sy-repid.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = sy-repid
      i_save                   = 'A'         "可以保存格式
      is_variant               = gs_variant  "LAYOUT参数 可以保存格式
      is_layout                = gs_layout
      it_fieldcat              = fieldcatalog[]
      i_callback_pf_status_set = 'FRM_SET_STATUS'  "状态栏
      i_callback_user_command  = 'FRM_USER_COMMAND' "按钮处理
    TABLES
      t_outtab                 = gt_input
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
  ENDIF.

ENDFORM.                    "F_DISPLAY



FORM frm_set_status USING pt_extab TYPE slis_t_extab .
  SET PF-STATUS 'STANDARD'.
ENDFORM. "Frm_SET_STATUS


FORM frm_user_command USING r_ucomm LIKE sy-ucomm
                         rs_selfield TYPE slis_selfield.

  DATA: l_grid  TYPE REF TO cl_gui_alv_grid,
        l_subrc TYPE sy-subrc.

  CASE r_ucomm.
    WHEN 'SAVE'.
*&--------------调用BAPI
      PERFORM call_bapi.
      rs_selfield-refresh = 'X'.
    WHEN OTHERS.
  ENDCASE.


ENDFORM. "user_command
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_MODEL
*&---------------------------------------------------------------------*
*       下载模板
*----------------------------------------------------------------------*
*      -->P_0146   text
*----------------------------------------------------------------------*
FORM frm_get_model  USING    p_objid TYPE wwwdata-objid.
  DATA: l_objdata     LIKE wwwdatatab,
        l_destination LIKE rlgrap-filename,
        l_rc          LIKE sy-subrc,
        l_errtxt      TYPE string.
  DATA: l_fullpath  TYPE string,
        l_extension TYPE string,
        l_fname     LIKE rlgrap-filename,
        l_formkey   LIKE  wwwdatatab.

  l_extension = p_objid.
  PERFORM get_file_name USING '.xls'
                              'Excel|*.xls;'
                     CHANGING l_fullpath.
  IF l_fullpath = space.
    MESSAGE '请选择下载文件名' TYPE 'E'.
  ELSE.
    CONCATENATE l_fullpath '' INTO l_fname.
    SELECT SINGLE relid objid
      FROM wwwdata
      INTO CORRESPONDING FIELDS OF l_objdata
      WHERE relid = 'MI'
        AND objid = p_objid .

    IF sy-subrc NE 0 OR l_objdata-objid = space.
      MESSAGE e001(00) WITH '文件不存在!'.
    ELSE.
      CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
        EXPORTING
          key         = l_objdata
          destination = l_fname
        IMPORTING
          rc          = l_rc
        CHANGING
          temp        = l_fname.
      IF l_rc NE 0.
        MESSAGE e001(00) WITH '文件下载失败!'.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  GET_FILE_NAME
*&---------------------------------------------------------------------*
*       获取要下载的文件名字
*----------------------------------------------------------------------*
*      -->P_0274   text
*      -->P_0275   text
*      <--P_L_FULLPATH  text
*----------------------------------------------------------------------*
FORM get_file_name  USING p_extension
                         p_file_filter
                CHANGING p_fullpath.
  DATA: l_filename TYPE string,
        l_path     TYPE string,
        l_fullpath TYPE string,
        l_titile   TYPE string,
        l_init_dir TYPE string.

  CLEAR p_fullpath.
  l_titile    = TEXT-t04.
  l_init_dir  = TEXT-t03.
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title         = l_titile
      default_extension    = '.xls'
      initial_directory    = l_init_dir
      prompt_on_overwrite  = 'X'
      file_filter          = p_file_filter
    CHANGING
      filename             = l_filename
      path                 = l_path
      fullpath             = l_fullpath
    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.
  ENDIF.
  p_fullpath = l_fullpath.
ENDFORM.


*Messages
*----------------------------------------------------------
*
* Message class: Hard coded
*   文件格式不对!

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM