FUNCTION ZKJ_SAP_CONVERT_TO_CSV_FORMAT1.
*"----------------------------------------------------------------------
*"*"ローカルインタフェース:
*" IMPORTING
*" VALUE(I_FIELD_SEPERATOR) TYPE CHAR03 OPTIONAL
*" VALUE(I_LINE_HEADER) TYPE CHAR01 OPTIONAL
*" VALUE(I_FILENAME) LIKE RLGRAP-FILENAME OPTIONAL
*" VALUE(I_APPL_KEEP) TYPE CHAR01 DEFAULT SPACE
*" TABLES
*" I_TAB_SAP_DATA TYPE STANDARD TABLE
*" CHANGING
*" VALUE(I_TAB_CONVERTED_DATA) TYPE TRUXS_T_TEXT_DATA OPTIONAL
*" EXCEPTIONS
*" CONVERSION_FAILED
*"----------------------------------------------------------------------
" CONSTANTS: C_FIELD_SEPARATOR VALUE ';'.
DATA:c_field_separator(003) .
IF i_field_seperator IS INITIAL .
c_field_separator = '","'.
ELSE.
c_field_separator = i_field_seperator.
ENDIF.
DATA:
l_start_string LIKE sy-fdpos,
l_end_string LIKE sy-fdpos,
l_len_string(6) TYPE n,
l_eol_string LIKE sy-fdpos,
l_start_target_string LIKE sy-fdpos,
l_end_target_string LIKE sy-fdpos,
l_len_target_string(6) TYPE n,
l_eol_target_string LIKE sy-fdpos,
l_conv_data TYPE LINE OF truxs_t_text_data,
l_csv_data TYPE LINE OF truxs_t_text_data.
CALL FUNCTION 'ZKJ_SAP_CONVERT_TO_TEX_FORMAT'
EXPORTING
i_field_seperator = c_field_separator
i_line_header = i_line_header
i_filename = i_filename
TABLES
i_tab_sap_data = i_tab_sap_data
CHANGING
i_tab_converted_data = i_tab_converted_data
EXCEPTIONS
conversion_failed = 4.
CHECK sy-subrc <> 0.
* if sy-subrc <> c_rc0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING conversion_failed.
* endif.
DESCRIBE FIELD l_csv_data LENGTH l_len_target_string
IN CHARACTER MODE.
DESCRIBE FIELD l_conv_data LENGTH l_eol_string
IN CHARACTER MODE.
LOOP AT i_tab_converted_data INTO l_conv_data.
l_start_string = 1.
CLEAR: l_csv_data,
l_start_target_string,
l_end_target_string.
DO.
SEARCH l_conv_data FOR c_field_separator STARTING AT
l_start_string
ENDING AT
l_eol_string.
IF sy-subrc <> 0.
EXIT.
ENDIF.
IF sy-subrc = 0.
l_end_string = l_start_string + sy-fdpos.
l_len_string = l_end_string - l_start_string + 1.
l_start_string = l_start_string - 1.
l_end_target_string = l_end_target_string + l_len_string + 4.
IF l_end_target_string < l_len_target_string.
l_csv_data+l_start_target_string(3) = '"""'.
l_start_target_string = l_start_target_string + 3.
l_csv_data+l_start_target_string(l_len_string) =
l_conv_data+l_start_string.
l_start_target_string = l_start_target_string + l_len_string
- 1.
l_csv_data+l_start_target_string(1) = '"'.
l_start_target_string = l_start_target_string + 1.
l_csv_data+l_start_target_string(1) = ';'.
l_end_target_string = strlen( l_csv_data ).
l_start_target_string = l_end_target_string.
l_start_string = l_end_string + 1.
ELSE.
EXIT.
ENDIF.
ENDIF.
ENDDO.
MODIFY i_tab_converted_data FROM l_csv_data.
ENDLOOP.
ENDFUNCTION.
附属函数:ZKJ_SAP_CONVERT_TO_TEX_FORMAT
FUNCTION ZKJ_SAP_CONVERT_TO_TEX_FORMAT.
*"----------------------------------------------------------------------
*"*"ローカルインタフェース:
*" IMPORTING
*" VALUE(I_FIELD_SEPERATOR) TYPE CHAR03
*" VALUE(I_LINE_HEADER) TYPE CHAR01 OPTIONAL
*" VALUE(I_FILENAME) LIKE RLGRAP-FILENAME OPTIONAL
*" VALUE(I_APPL_KEEP) TYPE CHAR01 DEFAULT SPACE
*" TABLES
*" I_TAB_SAP_DATA TYPE STANDARD TABLE
*" CHANGING
*" VALUE(I_TAB_CONVERTED_DATA) TYPE TRUXS_T_TEXT_DATA OPTIONAL
*" EXCEPTIONS
*" CONVERSION_FAILED
*"----------------------------------------------------------------------
FIELD-SYMBOLS: <F_SOURCE>.
DATA:
L_PERCENTAGE(4) TYPE C,
L_TEXT80(80),
L_TEXT6(6),
L_ITAB_ENTRIES LIKE SY-TABIX,
L_TABIX LIKE SY-TABIX,
L_HELP_ID LIKE TLINE-TDLINE,
L_STRUC_RAW_DATA LIKE LINE OF I_TAB_CONVERTED_DATA,
L_STRUC_COL_NAMES LIKE LINE OF I_TAB_CONVERTED_DATA,
L_MAX_FIELD LIKE L_STRUC_RAW_DATA,
L_DATE_EXTERN(30) TYPE C,
L_TYPE,
L_EDIT_MASK(10) TYPE C,
L_LEN_STRING TYPE I,
L_LEN_COL_STRING TYPE I,
L_LEN_FIELD_SEP TYPE I,
L_START_STRING TYPE I,
L_START_COL_STRING TYPE I,
L_END_STRING TYPE I,
L_END_COL_STRING TYPE I,
L_EOL_STRING TYPE I,
L_STRUC_INDEX LIKE SY-INDEX.
CLEAR I_LINE_HEADER. " is not supported yet.
CLEAR: I_TAB_CONVERTED_DATA.
REFRESH: I_TAB_CONVERTED_DATA.
DESCRIBE FIELD L_STRUC_RAW_DATA LENGTH L_EOL_STRING
in character mode.
L_LEN_FIELD_SEP = STRLEN( I_FIELD_SEPERATOR ).
DESCRIBE TABLE I_TAB_SAP_DATA LINES L_ITAB_ENTRIES.
LOOP AT I_TAB_SAP_DATA.
L_TABIX = SY-TABIX.
CLEAR: L_STRUC_INDEX, L_STRUC_RAW_DATA, L_START_STRING,
L_START_COL_STRING.
IF SY-BATCH IS INITIAL.
L_PERCENTAGE = L_TABIX / L_ITAB_ENTRIES * 100.
L_TEXT6 = L_TABIX.
CONDENSE L_TEXT6 NO-GAPS.
L_TEXT80 = TEXT-KON.
REPLACE '&&&&&&' WITH L_TEXT6 INTO L_TEXT80.
L_TEXT6 = L_ITAB_ENTRIES.
REPLACE '&&&&&&' WITH L_TEXT6 INTO L_TEXT80.
CONDENSE L_TEXT80.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = L_PERCENTAGE
TEXT = L_TEXT80.
ENDIF.
DO.
L_STRUC_INDEX = L_STRUC_INDEX + 1.
CLEAR L_LEN_STRING.
ASSIGN COMPONENT L_STRUC_INDEX OF
STRUCTURE I_TAB_SAP_DATA TO <F_SOURCE>.
IF SY-SUBRC <> 0.
EXIT.
ELSE.
* header line versorgen
IF L_TABIX = 1 AND NOT I_LINE_HEADER IS INITIAL.
ASSIGN COMPONENT L_STRUC_INDEX OF
STRUCTURE I_TAB_SAP_DATA TO <F_SOURCE>.
DESCRIBE FIELD <F_SOURCE> HELP-ID L_HELP_ID.
CONDENSE L_HELP_ID.
L_LEN_COL_STRING = STRLEN( L_HELP_ID ).
IF L_LEN_COL_STRING <> 0.
IF L_STRUC_INDEX <> 1.
L_STRUC_COL_NAMES+L_START_COL_STRING(L_LEN_COL_STRING) =
I_FIELD_SEPERATOR.
L_LEN_COL_STRING = L_LEN_FIELD_SEP.
ENDIF.
L_END_COL_STRING = L_START_COL_STRING + L_LEN_COL_STRING.
IF L_END_COL_STRING > L_EOL_STRING.
MESSAGE ID 'UX' TYPE 'E' NUMBER 898
WITH L_TABIX L_STRUC_INDEX
RAISING CONVERSION_FAILED.
ENDIF.
L_STRUC_COL_NAMES+L_START_COL_STRING(L_LEN_COL_STRING) =
L_HELP_ID.
L_START_COL_STRING = L_START_COL_STRING + L_LEN_COL_STRING.
ENDIF.
ENDIF.
* Special processing when field is type DATA
DESCRIBE FIELD <F_SOURCE> TYPE L_TYPE.
CASE L_TYPE.
WHEN 'P'.
WRITE <F_SOURCE> TO L_DATE_EXTERN.
CATCH SYSTEM-EXCEPTIONS CONVERSION_ERRORS = 4.
IF SY-SUBRC <> 0.
MESSAGE E899(UX) WITH L_TYPE <F_SOURCE> L_HELP_ID
L_TABIX RAISING CONVERSION_FAILED.
ENDIF.
ENDCATCH.
ASSIGN L_DATE_EXTERN TO <F_SOURCE>.
WHEN 'X'.
ASSIGN COMPONENT L_STRUC_INDEX OF
STRUCTURE I_TAB_SAP_DATA TO <F_SOURCE> TYPE 'C'.
WRITE <F_SOURCE> TO L_DATE_EXTERN.
ASSIGN L_DATE_EXTERN TO <F_SOURCE>.
WHEN 'T'.
CLEAR L_DATE_EXTERN.
L_DATE_EXTERN(2) = <F_SOURCE>(2).
L_DATE_EXTERN+2(1) = ':'.
L_DATE_EXTERN+3(2) = <F_SOURCE>+2(2).
L_DATE_EXTERN+5(1) = ':'.
L_DATE_EXTERN+6(2) = <F_SOURCE>+4(2).
ASSIGN L_DATE_EXTERN TO <F_SOURCE>.
WHEN 'D'.
CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'
EXPORTING
DATE_INTERNAL = <F_SOURCE>
IMPORTING
DATE_EXTERNAL = L_DATE_EXTERN
EXCEPTIONS
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
RAISING CONVERSION_FAILED.
ELSE.
ASSIGN L_DATE_EXTERN TO <F_SOURCE>.
ENDIF.
WHEN 'F'.
CALL FUNCTION 'FLTP_CHAR_CONVERSION'
EXPORTING
INPUT = <F_SOURCE>
IMPORTING
FLSTR = L_DATE_EXTERN
EXCEPTIONS
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
RAISING CONVERSION_FAILED.
ELSE.
ASSIGN L_DATE_EXTERN TO <F_SOURCE>.
ENDIF.
WHEN OTHERS.
ENDCASE.
* remember der seperation character!
IF L_STRUC_INDEX <> 1.
L_MAX_FIELD+L_LEN_STRING(L_LEN_FIELD_SEP) = I_FIELD_SEPERATOR.
L_LEN_STRING = L_LEN_FIELD_SEP.
ENDIF.
IF <F_SOURCE> CO '1234567890'.
CONDENSE <F_SOURCE> NO-GAPS.
ELSE.
CONDENSE <F_SOURCE>.
ENDIF.
L_MAX_FIELD+L_LEN_STRING = <F_SOURCE>.
* check the remaining space of target structure
L_LEN_STRING = STRLEN( L_MAX_FIELD ).
CHECK L_LEN_STRING <> 0.
L_END_STRING = L_START_STRING + L_LEN_STRING.
IF L_END_STRING > L_EOL_STRING.
MESSAGE ID 'UX' TYPE 'E' NUMBER 898
WITH L_TABIX L_STRUC_INDEX
RAISING CONVERSION_FAILED.
ENDIF.
L_STRUC_RAW_DATA+L_START_STRING(L_LEN_STRING) = L_MAX_FIELD.
L_START_STRING = L_START_STRING + L_LEN_STRING.
ENDIF.
ENDDO.
IF L_TABIX = 1 AND NOT L_STRUC_COL_NAMES IS INITIAL.
APPEND L_STRUC_COL_NAMES TO I_TAB_CONVERTED_DATA.
CLEAR L_STRUC_COL_NAMES.
ENDIF.
IF NOT L_STRUC_RAW_DATA IS INITIAL.
APPEND L_STRUC_RAW_DATA TO I_TAB_CONVERTED_DATA.
ENDIF.
ENDLOOP.
ENDFUNCTION.