上传数据到应用服务器。
FORM FRM_SEND_DATA_TO_APP_SERVER .
*2.准备传输数据。
DATA:LV_SERVER TYPE STRING .
DATA:LV_SERVER_FILE TYPE STRING .
DATA:LV_FILE_NAME TYPE STRING .
DATA:LV_MESS TYPE STRING .
DATA: LV_STRING_STR TYPE STRING .
FIELD-SYMBOLS:<FS_FIELDS> TYPE ABAP_COMPDESCR,
<FS_COMP> TYPE ANY.
DATA:CL_DESCR TYPE REF TO CL_ABAP_STRUCTDESCR .
CONSTANTS:
CNS_SEP TYPE CHAR01 VALUE '|',
CNS_FILENAME TYPE CHAR255 VALUE 'ZPP030 BOM infos.CSV'.
DATA:LV_CONT_STR TYPE STRING .
LV_SERVER = '/usr/sap/trans/' .
*文件名
LV_FILE_NAME = CNS_FILENAME .
*SAP应用服务器目录
CONCATENATE LV_SERVER LV_FILE_NAME INTO LV_SERVER_FILE.
*由于每次文件名字都一样,所以需要先删除应用服务器目录文件,然后写入。
DELETE DATASET LV_SERVER_FILE.
IF SY-SUBRC <> 0 .
ELSE .
CLOSE DATASET LV_SERVER_FILE .
ENDIF .
*开始写入文件
*文件换行符为WINDOWS换行符。
OPEN DATASET LV_SERVER_FILE FOR OUTPUT IN TEXT MODE ENCODING DEFAULT MESSAGE LV_MESS
WITH SMART LINEFEED .
LOOP AT GT_DATA INTO DATA(GS_RESULT_TAB) .
CLEAR LV_STRING_STR .
*fill data .
CL_DESCR ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( GS_RESULT_TAB ).
LOOP AT CL_DESCR->COMPONENTS ASSIGNING <FS_FIELDS>.
CLEAR LV_CONT_STR .
ASSIGN COMPONENT <FS_FIELDS>-NAME OF STRUCTURE GS_RESULT_TAB TO <FS_COMP>.
IF SY-SUBRC = 0 .
IF <FS_FIELDS>-TYPE_KIND EQ 'C'.
REPLACE ALL OCCURRENCES OF CNS_SEP IN <FS_COMP> WITH SPACE .
CONDENSE <FS_COMP> .
ENDIF.
LV_CONT_STR = <FS_COMP> .
CONDENSE LV_CONT_STR .
CONCATENATE LV_STRING_STR LV_CONT_STR INTO LV_STRING_STR SEPARATED BY CNS_SEP.
ENDIF.
ENDLOOP .
REPLACE FIRST OCCURRENCE OF CNS_SEP IN LV_STRING_STR WITH SPACE .
CONDENSE LV_STRING_STR .
TRANSFER LV_STRING_STR TO LV_SERVER_FILE .
ENDLOOP .
*关闭文件。
CLOSE DATASET LV_SERVER_FILE .
IF SY-SUBRC = 0 .
ENDIF .
ENDFORM.
从应用服务器下载文件到本地目录
*&---------------------------------------------------------------------*
*& Report ZPPR030A
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZPPR030A.
TABLES:SSCRFIELDS.
DATA FUNCTXT TYPE SMP_DYNTXT.
PARAMETERS:P_LINE TYPE INT4 DEFAULT 100000 OBLIGATORY .
SELECTION-SCREEN: FUNCTION KEY 1.
INITIALIZATION .
FUNCTXT-ICON_ID = ICON_EXPORT.
FUNCTXT-QUICKINFO = '删除应用服务器文件'.
FUNCTXT-ICON_TEXT = '删除应用服务器文件'.
SSCRFIELDS-FUNCTXT_01 = FUNCTXT.
AT SELECTION-SCREEN.
IF SSCRFIELDS-UCOMM = 'FC01'.
* PERFORM FRM_DOWNLOAD_DATA.
PERFORM FRM_DELETE_SERVER_FILE.
ENDIF .
START-OF-SELECTION .
PERFORM FRM_DOWNLOAD_DATA .
FORM FRM_DOWNLOAD_DATA .
CONSTANTS: LC_MAX_TRANSFER_LINES TYPE I VALUE 10000.
CONSTANTS: LC_FILEFORMAT_ASCII LIKE RLGRAP-FILETYPE
VALUE 'ASC'.
CONSTANTS: LC_FILEFORMAT_BINARY LIKE RLGRAP-FILETYPE
VALUE 'BIN',
CNS_FILENAME TYPE CHAR255 VALUE 'ZPP030 BOM infos.CSV'.
************************************************************************
* internal tables
************************************************************************
************************************************************************
* fields / variables
************************************************************************
DATA LG_MAX_LEN TYPE I VALUE 2550.
DATA:I_FILE_OVERWRITE TYPE ESP1_BOOLEAN .
DATA:I_FILE_APPL TYPE RCGFILETR-FTAPPL .
DATA:E_FLG_OPEN_ERROR TYPE ESP1_BOOLEAN.
DATA:E_OS_MESSAGE TYPE C .
*下载文件到本地。
* Local data ----------------------------------------------------------
DATA: L_FILELENGTH TYPE I.
DATA: L_DATA_TAB(2000) TYPE C OCCURS 1000000 WITH HEADER LINE.
DATA: L_FILENAME TYPE STRING.
DATA: L_AUTH_FILENAME LIKE AUTHB-FILENAME.
DATA: L_RETURN TYPE C.
DATA: L_FILE_EMPTY TYPE BOOLEAN.
DATA: L_MODE TYPE C.
DATA: L_LINES TYPE I.
DATA:LT_FILE_TABLE TYPE FILETABLE,
LS_FILE_TABLE TYPE FILE_TABLE.
DATA:LV_SELECTED_FOLDER TYPE STRING .
DATA:LV_RC TYPE INT4 .
DATA:
LV_FILENAME TYPE STRING,
LV_PATH TYPE STRING,
LV_FULLPATH TYPE STRING.
DATA:LV_INDEX TYPE INT4,
LV_INDEX_STR TYPE STRING.
DATA:LV_COUNT TYPE INT4 .
LV_INDEX = 1 .
*选取文件目录。
CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_BROWSE
* EXPORTING
* WINDOW_TITLE =
* INITIAL_FOLDER =
CHANGING
SELECTED_FOLDER = LV_SELECTED_FOLDER
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
NOT_SUPPORTED_BY_GUI = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
MESSAGE '请选择目录' TYPE 'S' DISPLAY LIKE 'E' .
LEAVE LIST-PROCESSING .
RETURN .
ENDIF.
**选择打开的文件。
* CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
* EXPORTING
** WINDOW_TITLE =
** DEFAULT_EXTENSION =
** DEFAULT_FILE_NAME =
** WITH_ENCODING =
** FILE_FILTER =
** INITIAL_DIRECTORY =
* PROMPT_ON_OVERWRITE = 'X'
* CHANGING
* FILENAME = LV_FILENAME
* PATH = LV_PATH
* FULLPATH = LV_FULLPATH
** USER_ACTION =
** FILE_ENCODING =
* EXCEPTIONS
* CNTL_ERROR = 1
* ERROR_NO_GUI = 2
* NOT_SUPPORTED_BY_GUI = 3
* INVALID_DEFAULT_FILE_NAME = 4
* OTHERS = 5.
* IF SY-SUBRC <> 0.
* RETURN .
* ENDIF.
* Function body -------------------------------------------------------
* init
E_FLG_OPEN_ERROR = SPACE.
CLEAR E_OS_MESSAGE.
L_FILENAME = LV_FULLPATH.
CONCATENATE '/usr/sap/trans/' CNS_FILENAME INTO I_FILE_APPL .
* check the authority to read the file from the application server
L_AUTH_FILENAME = I_FILE_APPL.
CALL FUNCTION 'AUTHORITY_CHECK_DATASET'
EXPORTING
* PROGRAM =
ACTIVITY = SABC_ACT_READ
FILENAME = L_AUTH_FILENAME
EXCEPTIONS
NO_AUTHORITY = 1
ACTIVITY_UNKNOWN = 2
OTHERS = 3.
IF NOT SY-SUBRC IS INITIAL.
CASE SY-SUBRC.
WHEN 1.
* no auhtority
RAISE AP_NO_AUTHORITY.
WHEN OTHERS.
RAISE AP_FILE_OPEN_ERROR.
ENDCASE.
ENDIF.
I_FILE_OVERWRITE = 'X'.
** check if the file on the front-end exists
* CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST
* EXPORTING
* FILE = L_FILENAME
* RECEIVING
* RESULT = L_RETURN
* EXCEPTIONS
* CNTL_ERROR = 1
* ERROR_NO_GUI = 2
* WRONG_PARAMETER = 3
* NOT_SUPPORTED_BY_GUI = 4
* OTHERS = 5.
*
* IF NOT SY-SUBRC IS INITIAL.
** RAISE FE_FILE_OPEN_ERROR.
* ELSE.
** if file exists continue only if parameter is specified
* IF L_RETURN = 'X' AND
* I_FILE_OVERWRITE = SPACE.
* RAISE FE_FILE_EXISTS.
* ENDIF.
* ENDIF. " not sy-subrc is initial.
* open the file on the application server
OPEN DATASET I_FILE_APPL FOR INPUT MESSAGE E_OS_MESSAGE
IN TEXT MODE ENCODING DEFAULT WITH SMART LINEFEED .
IF NOT SY-SUBRC IS INITIAL.
E_FLG_OPEN_ERROR = 'X'.
EXIT.
ENDIF. " not sy-subrc is initial
* write packages to the front-end
L_FILE_EMPTY = SPACE.
L_MODE = SPACE. " at first we write into the file
WHILE L_FILE_EMPTY = SPACE.
* read all lines from application server file
CLEAR L_DATA_TAB. REFRESH L_DATA_TAB.
L_LINES = 0.
WHILE L_FILE_EMPTY = SPACE .
READ DATASET I_FILE_APPL INTO L_DATA_TAB.
IF NOT SY-SUBRC IS INITIAL.
L_FILE_EMPTY = 'X'.
ELSE.
IF L_LINES NE P_LINE .
L_LINES = L_LINES + 1.
APPEND L_DATA_TAB.
ELSE .
CLEAR L_LINES .
CLEAR L_FILENAME .
*导出文件 。
LV_INDEX_STR = LV_INDEX .
CONDENSE LV_INDEX_STR .
CONCATENATE LV_SELECTED_FOLDER '\' 'BOM' LV_INDEX_STR '.CSV' INTO L_FILENAME .
* check if data table is empty
CLEAR LV_COUNT .
DESCRIBE TABLE L_DATA_TAB LINES LV_COUNT ..
IF LV_COUNT IS NOT INITIAL.
CALL FUNCTION 'C13Z_DOWNLOAD'
EXPORTING
* BIN_FILESIZE = ' '
CODEPAGE = 'UTF-8'
FILENAME = L_FILENAME
FILETYPE = LC_FILEFORMAT_ASCII
MODE = L_MODE
* WK1_N_FORMAT = ' '
* WK1_N_SIZE = ' '
* WK1_T_FORMAT = ' '
* WK1_T_SIZE = ' '
* COL_SELECT = ' '
* COL_SELECTMASK = ' '
IMPORTING
FILELENGTH = L_FILELENGTH
TABLES
DATA_TAB = L_DATA_TAB
* FIELDNAMES =
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_WRITE_ERROR = 2
INVALID_FILESIZE = 3
INVALID_TABLE_WIDTH = 4
INVALID_TYPE = 5
NO_BATCH = 6
UNKNOWN_ERROR = 7
OTHERS = 8.
IF NOT SY-SUBRC IS INITIAL.
CASE SY-SUBRC.
WHEN 2 .
CLOSE DATASET I_FILE_APPL.
RAISE FE_FILE_OPEN_ERROR.
WHEN OTHERS.
CLOSE DATASET I_FILE_APPL.
RAISE FE_FILE_WRITE_ERROR.
ENDCASE.
ENDIF. " not sy-subrc is initial
L_MODE = 'A'. " next lines we append
CLEAR L_DATA_TAB[] .
L_LINES = L_LINES + 1.
APPEND L_DATA_TAB.
LV_INDEX = LV_INDEX + 1 .
ELSE.
IF L_MODE IS INITIAL. " the first loop
* file on application server has no contents
CLOSE DATASET I_FILE_APPL.
RAISE AP_FILE_EMPTY.
ENDIF.
ENDIF. " sy-subrc is initial
ENDIF .
ENDIF .
ENDWHILE. " l_file_empty = SPACE.
ENDWHILE. " l_file_empty = SPACE and
* check if data table is empty
LV_INDEX_STR = LV_INDEX .
CONDENSE LV_INDEX_STR .
CONCATENATE LV_SELECTED_FOLDER '\' 'BOM' LV_INDEX_STR '.CSV' INTO L_FILENAME .
CLEAR LV_COUNT .
DESCRIBE TABLE L_DATA_TAB LINES LV_COUNT ..
IF LV_COUNT IS NOT INITIAL.
CALL FUNCTION 'C13Z_DOWNLOAD'
EXPORTING
* BIN_FILESIZE = ' '
CODEPAGE = 'UTF-8'
FILENAME = L_FILENAME
FILETYPE = LC_FILEFORMAT_ASCII
MODE = L_MODE
* WK1_N_FORMAT = ' '
* WK1_N_SIZE = ' '
* WK1_T_FORMAT = ' '
* WK1_T_SIZE = ' '
* COL_SELECT = ' '
* COL_SELECTMASK = ' '
IMPORTING
FILELENGTH = L_FILELENGTH
TABLES
DATA_TAB = L_DATA_TAB
* FIELDNAMES =
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_WRITE_ERROR = 2
INVALID_FILESIZE = 3
INVALID_TABLE_WIDTH = 4
INVALID_TYPE = 5
NO_BATCH = 6
UNKNOWN_ERROR = 7
OTHERS = 8.
IF NOT SY-SUBRC IS INITIAL.
CASE SY-SUBRC.
WHEN 2 .
CLOSE DATASET I_FILE_APPL.
RAISE FE_FILE_OPEN_ERROR.
WHEN OTHERS.
CLOSE DATASET I_FILE_APPL.
RAISE FE_FILE_WRITE_ERROR.
ENDCASE.
ENDIF. " not sy-subrc is initial
L_MODE = 'A'. " next lines we append
ELSE.
IF L_MODE IS INITIAL. " the first loop
* file on application server has no contents
CLOSE DATASET I_FILE_APPL.
RAISE AP_FILE_EMPTY.
ENDIF.
ENDIF. " sy-subrc is initial
* close the dataset
CLOSE DATASET I_FILE_APPL.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DELETE_SERVER_FILE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_DELETE_SERVER_FILE .
*2.准备传输数据。
DATA:LV_SERVER TYPE STRING .
DATA:LV_SERVER_FILE TYPE STRING .
DATA:LV_FILE_NAME TYPE STRING .
DATA:LV_MESS TYPE STRING .
DATA: LV_STRING_STR TYPE STRING .
FIELD-SYMBOLS:<FS_FIELDS> TYPE ABAP_COMPDESCR,
<FS_COMP> TYPE ANY.
DATA:CL_DESCR TYPE REF TO CL_ABAP_STRUCTDESCR .
CONSTANTS:
CNS_SEP TYPE CHAR01 VALUE '|',
CNS_FILENAME TYPE CHAR255 VALUE 'ZPP030 BOM infos.CSV'.
DATA:LV_CONT_STR TYPE STRING .
LV_SERVER = '/usr/sap/trans/' .
*文件名
LV_FILE_NAME = CNS_FILENAME .
*SAP应用服务器目录
CONCATENATE LV_SERVER LV_FILE_NAME INTO LV_SERVER_FILE.
*由于每次文件名字都一样,所以需要先删除应用服务器目录文件,然后写入。
DELETE DATASET LV_SERVER_FILE.
IF SY-SUBRC <> 0 .
ELSE .
CLOSE DATASET LV_SERVER_FILE .
MESSAGE '删除文件成功' TYPE 'S' .
ENDIF .
ENDFORM.