*&---------------------------------------------------------------------*
*& Include ZBCC0005
* upload/download xml file form server
*&---------------------------------------------------------------------*
*
DATA: %t_files LIKE STANDARD TABLE OF eps2fili WITH HEADER LINE.
DATA: %t_xml_file TYPE TABLE OF string.
DATA: %g_xml_error_msg LIKE bapiret2-message.
DATA: %g_upload_file TYPE string.
DATA: %g_filename TYPE string. "EIP欄位名稱
************************
*&---------------------------------------------------------------------*
*& Form UPLOAD_XML_FROM_SERVER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM upload_xml_from_server TABLES ft_tab
USING f_path
f_msg.
DATA: l_file LIKE LINE OF %t_xml_file.
DATA: l_string TYPE string.
DATA: l_xml TYPE REF TO cl_xml_document.
DATA: l_subrc TYPE sysubrc.
*****
REFRESH: %t_xml_file, ft_tab.
CLEAR: f_msg, %g_upload_file.
OPEN DATASET f_path
FOR INPUT
IN TEXT MODE ENCODING DEFAULT.
IF sy-subrc <> 0.
f_msg = 'Open file Error!'.
RETURN.
ENDIF.
DO.
READ DATASET f_path INTO l_file.
IF sy-subrc = 0.
APPEND l_file TO %t_xml_file.
IF l_string IS INITIAL.
l_string = l_file.
ELSE.
l_string = l_string && l_file.
ENDIF.
ELSE.
EXIT.
ENDIF.
ENDDO.
CLOSE DATASET f_path.
%g_upload_file = f_path.
CREATE OBJECT l_xml.
* CALL METHOD l_xml->parse_table
* EXPORTING
* table = %t_xml_file
** size = 0
* RECEIVING
* retcode = l_subrc.
CALL METHOD l_xml->parse_string
EXPORTING
stream = l_string
RECEIVING
retcode = l_subrc.
* Convert XLM to Internal table
CALL METHOD l_xml->get_data
" EXPORTING
" NAME = 'DATA'
IMPORTING
retcode = l_subrc
CHANGING
dataobject = ft_tab[].
IF l_subrc <> 0.
f_msg = 'Convert XML Error!'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form UPLOAD_XML_FROM_SERVER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM open_dataset USING f_path
f_msg.
OPEN DATASET f_path
FOR INPUT
IN TEXT MODE ENCODING DEFAULT.
IF sy-subrc <> 0.
f_msg = 'Open file Error!'.
RETURN.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form UPLOAD_XML_FROM_SERVER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM convert_xml TABLES ft_tab
USING f_path
f_msg.
DATA: l_file LIKE LINE OF %t_xml_file.
DATA: l_string TYPE string.
DATA: l_xml TYPE REF TO cl_xml_document.
DATA: l_subrc TYPE sysubrc.
*****
REFRESH: %t_xml_file, ft_tab.
CLEAR: f_msg, %g_upload_file.
DO.
READ DATASET f_path INTO l_file.
IF sy-subrc = 0.
APPEND l_file TO %t_xml_file.
IF l_string IS INITIAL.
l_string = l_file.
ELSE.
l_string = l_string && l_file.
ENDIF.
ELSE.
EXIT.
ENDIF.
ENDDO.
CLOSE DATASET f_path.
%g_upload_file = f_path.
CREATE OBJECT l_xml.
* CALL METHOD l_xml->parse_table
* EXPORTING
* table = %t_xml_file
** size = 0
* RECEIVING
* retcode = l_subrc.
CALL METHOD l_xml->parse_string
EXPORTING
stream = l_string
RECEIVING
retcode = l_subrc.
* Convert XLM to Internal table
CALL METHOD l_xml->get_data
" EXPORTING
" NAME = 'DATA'
IMPORTING
retcode = l_subrc
CHANGING
dataobject = ft_tab[].
IF l_subrc <> 0.
f_msg = 'Convert XML Error!'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form OUTBOUND_BY_FOLDER_XML
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM outbound_by_folder_xml TABLES ft_data
USING f_target_file
f_code
f_msg.
DATA: l_xml TYPE REF TO cl_xml_document.
DATA: l_retcode TYPE sysubrc,
l_stream TYPE xstring,
l_size TYPE sytabix.
*********************************
CHECK ft_data[] IS NOT INITIAL.
CREATE OBJECT l_xml.
CALL METHOD l_xml->create_with_data( dataobject = ft_data[] ).
* SET ENCODING
CALL METHOD l_xml->set_encoding
EXPORTING
charset = f_code. "'UTF-8'.
CALL METHOD l_xml->render_2_xstring
EXPORTING
pretty_print = 'X'
IMPORTING
retcode = l_retcode
stream = l_stream
size = l_size.
****** 將資料搬到 folder
PERFORM move_xstring_to_folder USING l_stream
f_target_file
f_msg.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form MOVE_XML_TO_FOLDER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_
*&---------------------------------------------------------------------*
FORM move_xml_to_folder USING f_target_file
f_msg.
DATA: l_file LIKE LINE OF %t_xml_file.
*****************************************
OPEN DATASET f_target_file
FOR OUTPUT
IN TEXT MODE ENCODING DEFAULT
.
IF sy-subrc <> 0.
f_msg = 'Open file Error!'.
RETURN.
ENDIF.
LOOP AT %t_xml_file INTO l_file.
TRANSFER l_file TO f_target_file.
ENDLOOP."LOOP AT %t_xml_file
CLOSE DATASET f_target_file.
IF %g_upload_file IS NOT INITIAL.
DELETE DATASET %g_upload_file.
ENDIF.
CLEAR: %g_upload_file.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_FILE_LIST_FROM_SERVER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> T_LIST
*& --> P_UPLOAD
*&---------------------------------------------------------------------*
FORM get_file_list_from_server TABLES ft_list
USING f_folder_path.
DATA: l_dir_name TYPE eps2filnam.
DATA: lt_files_import TYPE edocl_dirlist_tab .
l_dir_name = f_folder_path.
CALL FUNCTION 'EDOCL_GET_DIR_FILELIST'
EXPORTING
dirname = l_dir_name
filenm = ''
pattern = ''
IMPORTING
file_list = lt_files_import
EXCEPTIONS
access_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
LOOP AT lt_files_import INTO DATA(lw).
IF lw-name = '.' OR lw-name = '..' OR lw-name = 'BACKUP' OR lw-name = 'ERROR' .
CONTINUE.
ENDIF.
MOVE-CORRESPONDING lw TO ft_list.
APPEND ft_list.
CLEAR lw.
ENDLOOP.
"" 下列Funtion有多個權限檢查
* CALL FUNCTION 'EPS2_GET_DIRECTORY_LISTING'
* EXPORTING
* iv_dir_name = l_dir_name
** FILE_MASK = ' '
** IMPORTING
** DIR_NAME =
** FILE_COUNTER =
** ERROR_COUNTER =
* TABLES
* dir_list = ft_list
* EXCEPTIONS
* invalid_eps_subdir = 1
* sapgparam_failed = 2
* build_directory_failed = 3
* no_authorization = 4
* read_directory_failed = 5
* too_many_read_errors = 6
* empty_directory_list = 7
* OTHERS = 8.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form MOVE_XSTRING_TO_FOLDER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM move_xstring_to_folder USING f_xstring
f_target_file
f_msg.
OPEN DATASET f_target_file
FOR OUTPUT
IN BINARY MODE.
IF sy-subrc <> 0.
f_msg = 'Open file Error!'.
RETURN.
ENDIF.
TRANSFER f_xstring TO f_target_file.
CLOSE DATASET f_target_file.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form MOVE_TEXT_TO_FOLDER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM move_text_to_folder TABLES pt_txt
USING f_target_file
f_msg.
OPEN DATASET f_target_file
FOR OUTPUT
IN TEXT MODE ENCODING DEFAULT
* IN TEXT MODE ENCODING UTF-8
.
IF sy-subrc <> 0.
f_msg = 'Open file Error!'.
RETURN.
ENDIF.
LOOP AT pt_txt.
TRANSFER pt_txt TO f_target_file.
ENDLOOP.
CLOSE DATASET f_target_file.
ENDFORM.