Function Module to Upload and Download files from and to Application Server
Summary
This function module can be used to Upload and Download files from/to application server. It must have field separator to be specified while doing the Upload/Download operations. This function module can be easily enhanced or modularized for other file operations like moving files, deleting files etc
Function Module Importing parameters
Parameter | Typing | Associated type | Description | Optional |
IM_PATH | TYPE | LOCALFILE | File path for Upload/Download | No |
IM_OPERATION | TYPE | ABAP_CHAR1 | File Operation Upload/Download | No |
IM_CODEPAGE | TYPE | CPCODEPAGE | SAP Character Set ID | Yes |
IM_SEPARATOR | TYPE | ABAP_CHAR1 | Field Separator | No |
IM_APPEND | TYPE | ABAP_CHAR1 | Dataset append mode | Yes |
IM_AUTHORITY_CHECK | TYPE | ABAP_CHAR1 | Authority check | Yes |
Tables parameters
Parameter | Typing | Associated type | Description |
IT_DATA |
|
| Table with data |
Exceptions
Exception | Short text |
INVALID_INPUT | Invalid Inputs |
FILE_OPERATION | File Operation |
DYNAMIC_TABLE_GENERATION | Dynamic table Creation |
Top Include
Error rendering macro 'code': Invalid value specified for parameter 'com.atlassian.confluence.ext.code.render.InvalidValueException'TYPE-POOLS:ABAP.
CONSTANTS:C_UPLOAD TYPE ABAP_CHAR1 VALUE 'U',
C_DOWNLOAD TYPE ABAP_CHAR1 VALUE 'D',
C_ACTIVITY_READ TYPE CHAR04 VALUE 'READ',
C_ACTIVITY_WRITE TYPE CHAR05 VALUE 'WRITE'.
DATA:I_TAB TYPE TABLE OF STRING,
I_COMP TYPE CL_ABAP_STRUCTDESCR=>COMPONENT_TABLE.
DATA:WF_STRING TYPE STRING,
WF_OBJ TYPE REF TO CX_SY_FILE_OPEN,
WF_CX TYPE REF TO CX_ROOT,
WF_LTYPE TYPE C,
WI_INDEX TYPE I,
WF_LENGTH TYPE I,
WF_FILENAME TYPE FILEEXTERN,
WF_MAXIMUM TYPE I,
WI_COUNT TYPE I,
WF_TOTAL_FIELDS TYPE I,
WF_INFILE TYPE REF TO DATA,
WF_TYPE_STRUCT TYPE REF TO CL_ABAP_STRUCTDESCR,
WF_TYPE_TABLE TYPE REF TO CL_ABAP_TABLEDESCR,
WF_DATA_TAB TYPE REF TO DATA,
WF_DATA_STR TYPE REF TO DATA.
DATA:WA_COMP LIKE LINE OF I_COMP,
WA_FIELDS TYPE ABAP_COMPDESCR.
FIELD-SYMBOLS:
<FS_LINE> TYPE ANY,
<FS_FIELD_S> TYPE ANY,
<FS_FIELD_T> TYPE ANY,
<FS_TABLE> TYPE STANDARD TABLE,
<FS_WA> TYPE ANY.Source Code
Error rendering macro 'code': Invalid value specified for parameter 'com.atlassian.confluence.ext.code.render.InvalidValueException' FUNCTION Z_FILE_UPLOAD_DOWNLOAD.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(IM_PATH) TYPE LOCALFILE
*" VALUE(IM_OPERATION) TYPE ABAP_CHAR1
*" VALUE(IM_CODEPAGE) TYPE CPCODEPAGE
*" VALUE(IM_SEPARATOR) TYPE ABAP_CHAR1
*" VALUE(IM_APPEND) TYPE ABAP_CHAR1 OPTIONAL
*" VALUE(IM_AUTHORITY_CHECK) TYPE ABAP_CHAR1 OPTIONAL
*" TABLES
*" IT_DATA
*" EXCEPTIONS
*" INVALID_INPUT
*" FILE_OPERATION
*" DYNAMIC_TABLE_GENERATION
*"----------------------------------------------------------------------
CLEAR :WF_STRING,I_TAB[].
IF IM_APPEND = ABAP_TRUE AND IM_OPERATION = C_UPLOAD.
MESSAGE E904 WITH 'Append mode with upload not allowed'(001)
RAISING INVALID_INPUT.
ENDIF.
IF IM_OPERATION = C_UPLOAD.
CLEAR IT_DATA[].
ENDIF.
IF IT_DATA[] IS INITIAL AND IM_OPERATION = C_DOWNLOAD.
MESSAGE E904 WITH 'No data Provided to Download'(001)
RAISING INVALID_INPUT.
ENDIF.
IF IM_OPERATION NE C_UPLOAD AND
IM_OPERATION NE C_DOWNLOAD.
MESSAGE E904 WITH 'Invalid Operation'(002)
RAISING INVALID_INPUT.
ENDIF.
IF IM_AUTHORITY_CHECK = ABAP_TRUE.
WF_FILENAME = IM_PATH.
IF IM_OPERATION = C_UPLOAD.
WF_STRING = 'No Authorization to Read'(006).
PERFORM CHECK_AUTHORITY USING C_ACTIVITY_READ
WF_FILENAME.
ELSEIF IM_OPERATION = C_DOWNLOAD.
WF_STRING = 'No Authorization to Write'(007).
PERFORM CHECK_AUTHORITY USING C_ACTIVITY_WRITE
WF_FILENAME.
ENDIF.
IF SY-SUBRC <> 0.
MESSAGE E904 WITH WF_STRING RAISING FILE_OPERATION.
ELSE.
CLEAR WF_STRING.
ENDIF.
ENDIF.
TRY.
IF IM_OPERATION = C_UPLOAD.
IF IM_CODEPAGE = '4110'.
OPEN DATASET IM_PATH FOR INPUT IN TEXT MODE
ENCODING DEFAULT
IGNORING CONVERSION ERRORS.
ELSE.
OPEN DATASET IM_PATH FOR INPUT IN LEGACY TEXT MODE
CODE PAGE IM_CODEPAGE
IGNORING CONVERSION ERRORS.
ENDIF.
ELSEIF IM_OPERATION = C_DOWNLOAD.
IF IM_CODEPAGE = '4110'.
IF IM_APPEND = ABAP_TRUE.
OPEN DATASET IM_PATH FOR APPENDING IN TEXT MODE
ENCODING DEFAULT
IGNORING CONVERSION ERRORS.
ELSE.
OPEN DATASET IM_PATH FOR OUTPUT IN TEXT MODE
ENCODING DEFAULT
IGNORING CONVERSION ERRORS.
ENDIF.
ELSE.
IF IM_APPEND = ABAP_TRUE.
OPEN DATASET IM_PATH FOR APPENDING IN LEGACY TEXT MODE
CODE PAGE IM_CODEPAGE
IGNORING CONVERSION ERRORS.
ELSE.
OPEN DATASET IM_PATH FOR OUTPUT IN LEGACY TEXT MODE
CODE PAGE IM_CODEPAGE
IGNORING CONVERSION ERRORS.
ENDIF.
ENDIF.
ENDIF.
CATCH CX_SY_FILE_OPEN INTO WF_OBJ.
PERFORM EXP_TXT USING WF_OBJ.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
RAISING FILE_OPERATION.
ENDTRY.
CREATE DATA WF_INFILE LIKE LINE OF IT_DATA.
ASSIGN WF_INFILE->* TO <FS_LINE>.
CLEAR:WF_LTYPE,WI_COUNT.
DESCRIBE FIELD <FS_LINE> TYPE WF_LTYPE
COMPONENTS WI_COUNT.
WF_MAXIMUM = 0.
WF_TOTAL_FIELDS = WI_COUNT.
WHILE WI_COUNT GT 0.
WI_INDEX = SY-INDEX.
ASSIGN COMPONENT WI_INDEX OF STRUCTURE <FS_LINE> TO <FS_FIELD_S>.
IF SY-SUBRC EQ 0.
DESCRIBE FIELD <FS_FIELD_S> TYPE WF_LTYPE
OUTPUT-LENGTH WF_LENGTH.
IF WF_MAXIMUM LT WF_LENGTH.
WF_MAXIMUM = WF_LENGTH.
ENDIF.
ENDIF.
WI_COUNT = WI_COUNT - 1.
ENDWHILE.
CLEAR:WA_COMP,I_COMP[].
WA_COMP-NAME = 'FIELD'(005).
WA_COMP-TYPE ?= CL_ABAP_ELEMDESCR=>GET_C( WF_MAXIMUM ).
APPEND WA_COMP TO I_COMP.
TRY.
WF_TYPE_STRUCT = CL_ABAP_STRUCTDESCR=>CREATE( P_COMPONENTS = I_COMP ).
CATCH CX_SY_STRUCT_CREATION INTO WF_CX.
PERFORM EXP_TXT USING WF_CX.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
RAISING DYNAMIC_TABLE_GENERATION.
ENDTRY.
TRY.
WF_TYPE_TABLE = CL_ABAP_TABLEDESCR=>CREATE( WF_TYPE_STRUCT ).
CATCH CX_SY_TABLE_CREATION INTO WF_CX.
PERFORM EXP_TXT USING WF_CX.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
RAISING DYNAMIC_TABLE_GENERATION.
ENDTRY.
CREATE DATA: WF_DATA_TAB TYPE HANDLE WF_TYPE_TABLE,
WF_DATA_STR TYPE HANDLE WF_TYPE_STRUCT.
ASSIGN: WF_DATA_TAB->* TO <FS_TABLE>,
WF_DATA_STR->* TO <FS_WA>.
CLEAR WF_STRING.
IF IM_OPERATION = C_UPLOAD.
DO.
READ DATASET IM_PATH INTO WF_STRING.
IF SY-SUBRC NE 0.
IF SY-INDEX EQ 1.
MESSAGE E904 WITH 'No data in the file'(003)
RAISING FILE_OPERATION.
ELSE.
CLOSE DATASET IM_PATH.
EXIT.
ENDIF.
ENDIF.
CLEAR <FS_TABLE>[].
SPLIT WF_STRING AT IM_SEPARATOR INTO TABLE <FS_TABLE>.
LOOP AT <FS_TABLE> ASSIGNING <FS_WA>.
WI_INDEX = SY-TABIX.
ASSIGN COMPONENT 'FIELD' OF STRUCTURE <FS_WA> TO <FS_FIELD_S>.
IF SY-SUBRC = 0.
ASSIGN COMPONENT WI_INDEX OF STRUCTURE <FS_LINE> TO <FS_FIELD_T>.
IF SY-SUBRC = 0.
TRY.
<FS_FIELD_T> = <FS_FIELD_S>.
CATCH CX_SY_CONVERSION_NO_NUMBER.
ENDTRY.
ENDIF.
ENDIF.
ENDLOOP.
APPEND <FS_LINE> TO IT_DATA.
CLEAR <FS_LINE>.
ENDDO.
ELSE.
LOOP AT IT_DATA ASSIGNING <FS_LINE>.
WI_INDEX = 0.
DO.
WI_INDEX = SY-INDEX.
ASSIGN COMPONENT WI_INDEX OF STRUCTURE <FS_LINE> TO <FS_FIELD_S>.
IF SY-SUBRC = 0.
ASSIGN COMPONENT 'FIELD' OF STRUCTURE <FS_WA> TO <FS_FIELD_T>.
TRY.
<FS_FIELD_T> = <FS_FIELD_S>.
CATCH CX_SY_CONVERSION_NO_NUMBER.
ENDTRY.
CONDENSE <FS_FIELD_T>.
IF WI_INDEX = 1.
WF_STRING = <FS_FIELD_T>.
ELSE.
CONCATENATE WF_STRING <FS_FIELD_T> INTO WF_STRING
SEPARATED BY IM_SEPARATOR.
ENDIF.
ENDIF.
IF WI_INDEX = WF_TOTAL_FIELDS.
CONDENSE WF_STRING.
TRANSFER WF_STRING TO IM_PATH.
CLEAR WF_STRING.
EXIT.
ENDIF.
ENDDO.
ENDLOOP.
CLOSE DATASET IM_PATH.
ENDIF.
ENDFUNCTION.Subroutines
Error rendering macro 'code': Invalid value specified for parameter 'com.atlassian.confluence.ext.code.render.InvalidValueException'* SUBROUTINES
*&---------------------------------------------------------------------*
*& Form CHECK_AUTHORITY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_C_ACTIVITY_READ text
* -->P_WF_FILENAME text
*----------------------------------------------------------------------*
FORM CHECK_AUTHORITY USING PU_ACTIVITY TYPE ANY
PU_FILENAME TYPE FILEEXTERN.
CALL FUNCTION 'AUTHORITY_CHECK_DATASET'
EXPORTING
ACTIVITY = PU_ACTIVITY
FILENAME = PU_FILENAME
EXCEPTIONS
ERROR_MESSAGE = 1
OTHERS = 2.
ENDFORM. " CHECK_AUTHORITY
*&---------------------------------------------------------------------*
*& Form EXP_TXT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_WF_OBJ text
*----------------------------------------------------------------------*
FORM EXP_TXT USING PU_OBJ TYPE ANY.
CALL FUNCTION 'RSAN_MDL_EXCEPTION_TO_SYMSG'
EXPORTING
IR_EXCEPTION = PU_OBJ
I_MSGTY = 'E'.
ENDFORM. " EXP_TXTTesting functionality
Demo Program
Error rendering macro 'code': Invalid value specified for parameter 'com.atlassian.confluence.ext.code.render.InvalidValueException'REPORT YUPLOAD_DOWNLOAD.
INCLUDE ZMM3X006.
DATA:I_MARD TYPE TABLE OF MARD.
DATA:WF_ALV TYPE REF TO CL_SALV_TABLE.
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
PARAMETER : P_CPAGE TYPE ZCACODEP-CPCODEPAGE OBLIGATORY DEFAULT '4110'.
SELECTION-SCREEN END OF BLOCK B1.
PARAMETERS DIR1 TYPE LOCALFILE .
PARAMETERS DIR2 TYPE LOCALFILE .
AT SELECTION-SCREEN ON P_CPAGE.
PERFORM VALIDATE_CPAGE USING P_CPAGE.
START-OF-SELECTION.
IF P_DIR IS NOT INITIAL.
SELECT * FROM MARD INTO TABLE I_MARD UP TO 100 ROWS.
CALL FUNCTION 'Z_FILE_UPLOAD_DOWNLOAD'
EXPORTING
IM_PATH = DIR1
IM_OPERATION = 'D' "Download
IM_CODEPAGE = P_CPAGE
IM_SEPARATOR = CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB
* IM_APPEND =
* IM_AUTHORITY_CHECK =
TABLES
IT_DATA = I_MARD
EXCEPTIONS
ERROR_FOUND = 1
FILE_OPERATION = 2
DYNAMIC_TABLE_GENERATION = 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.
ELSE.
CLEAR I_MARD[].
CALL FUNCTION 'Z_FILE_UPLOAD_DOWNLOAD'
EXPORTING
IM_PATH = DIR2
IM_OPERATION = 'U' "Upload
IM_CODEPAGE = P_CPAGE
IM_SEPARATOR = CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB
* IM_APPEND =
* IM_AUTHORITY_CHECK =
TABLES
IT_DATA = I_MARD
EXCEPTIONS
ERROR_FOUND = 1
FILE_OPERATION = 2
DYNAMIC_TABLE_GENERATION = 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.
TRY.
CL_SALV_TABLE=>FACTORY( IMPORTING R_SALV_TABLE = WF_ALV
CHANGING T_TABLE = I_MARD ).
CATCH CX_SALV_MSG. "#EC NO_HANDLER
ENDTRY.
WF_ALV->DISPLAY( ).
ENDIF.


No comments:
Post a Comment
Note: only a member of this blog may post a comment.