模板見文件
*&---------------------------------------------------------------------* *& 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 * 文件格式不對!