會計憑證批導


模板見文件

*&---------------------------------------------------------------------*
*& 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