Функция чтения с сервера приложений файла в формате "с разделителем":
Code:
FUNCTION z_read_data_from_srvr.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" REFERENCE(IM_FILENAME) TYPE STRING
*" REFERENCE(IM_HAS_FIELD_SEPARATOR) TYPE CHAR1 DEFAULT SPACE
*" REFERENCE(IM_DAT_MODE) TYPE CHAR1 DEFAULT SPACE
*" EXPORTING
*" REFERENCE(EX_IT_DATA) TYPE STANDARD TABLE
*" EXCEPTIONS
*" FILE_NOT_OPENED
*"----------------------------------------------------------------------
DATA
: wa TYPE string
, strdecimal TYPE c
, npacked TYPE p DECIMALS 2 VALUE 0
, strtemp(10) TYPE c
, strdatformat(10) TYPE c
, ddate TYPE d VALUE '11112233'
, strfield(10) TYPE c
, noffset TYPE i
.
* Определяем десятичный разделитель
CLEAR strtemp.
WRITE npacked TO strtemp(10).
SEARCH strtemp FOR ','.
IF sy-subrc EQ 0.
strdecimal = ','.
ELSE.
strdecimal = '.'.
ENDIF.
* Определяем формат даты
WRITE ddate TO strfield DD/MM/YYYY.
IF strfield CS '33'.
ENDIF.
noffset = sy-fdpos.
CASE noffset.
WHEN 0.
strdatformat = 'DD.MM.YYYY'.
WHEN 3.
strdatformat = 'MM/DD/YYYY'.
WHEN 8.
strdatformat = 'YYYY/MM/DD'.
ENDCASE.
* Открываем файл
OPEN DATASET im_filename FOR INPUT IN TEXT MODE ENCODING DEFAULT.
IF sy-subrc <> 0.
RAISE file_not_opened.
ELSE.
DO.
* Читаем построчно
READ DATASET im_filename INTO wa.
IF sy-subrc = 0.
* Раскладываем строку с разделителем (символ табуляции) по полям внутренней таблицы
PERFORM write_line_to_data_tab(saplsfes)
TABLES
ex_it_data "par_data_tab
USING
im_has_field_separator "par_has_field_separator
strdecimal "par_Decimal
strdatformat "par_DatFormat
im_dat_mode "par_dat_mode
CHANGING
wa "par_dest_buffer
.
ELSE.
EXIT.
ENDIF.
ENDDO.
* Закрываем файл
CLOSE DATASET im_filename.
ENDIF.
ENDFUNCTION.
Функция записи на сервер приложений файла в формате "с разделителем" (и не только):
Code:
FUNCTION z_write_data_to_srvr.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" REFERENCE(IM_FILENAME) TYPE STRING
*" REFERENCE(IM_IT_DATA) TYPE STANDARD TABLE
*" REFERENCE(IM_IGNORE_CERR) TYPE CHAR1 DEFAULT 'X'
*" REFERENCE(IM_REPLACEMENT_CHAR) TYPE CHAR1 DEFAULT '#'
*" REFERENCE(IM_WRITE_FIELD_SEPARATOR) TYPE CHAR1 DEFAULT SPACE
*" REFERENCE(IM_TRUNC_TRAILING_BLANKS) TYPE CHAR1 DEFAULT SPACE
*" REFERENCE(IM_COL_SELECT) TYPE CHAR1 DEFAULT SPACE
*" REFERENCE(IM_COL_SELECT_MASK) TYPE CHAR255 DEFAULT SPACE
*" REFERENCE(IM_WRITE_LF) TYPE CHAR1 DEFAULT 'X'
*" REFERENCE(IM_DAT_MODE) TYPE CHAR1 DEFAULT SPACE
*" REFERENCE(IM_TRUNC_TRAILING_BLANKS_EOL) TYPE CHAR1 DEFAULT 'X'
*" EXCEPTIONS
*" FILE_NOT_CREATED
*" UNKNOWN_ERROR
*"----------------------------------------------------------------------
TYPE-POOLS
: abap
.
FIELD-SYMBOLS
: <wa_data> TYPE ANY
.
DATA
: wa TYPE string
, strdecimal TYPE c
, npacked TYPE p DECIMALS 2 VALUE 0
, strtemp(10) TYPE c
, strdatformat(10) TYPE c
, ddate TYPE d VALUE '11112233'
, strfield(10) TYPE c
, noffset TYPE i
, converter TYPE REF TO cl_abap_conv_obj
, codepage(4) TYPE n
, cp(4) TYPE c
, prc_miss TYPE c
, prc_broken TYPE c
, prc_encoded_crlf TYPE xstring
, prc_encoded_string TYPE xstring
.
* Определяем десятичный разделитель
CLEAR strtemp.
WRITE npacked TO strtemp(10).
SEARCH strtemp FOR ','.
IF sy-subrc EQ 0.
strdecimal = ','.
ELSE.
strdecimal = '.'.
ENDIF.
* Определяем формат даты
WRITE ddate TO strfield DD/MM/YYYY.
IF strfield CS '33'.
ENDIF.
noffset = sy-fdpos.
CASE noffset.
WHEN 0.
strdatformat = 'DD.MM.YYYY'.
WHEN 3.
strdatformat = 'MM/DD/YYYY'.
WHEN 8.
strdatformat = 'YYYY/MM/DD'.
ENDCASE.
* Определяем кодовую страницу
CALL 'CUR_LCL' ID 'GUICP' FIELD cp.
codepage = cp.
IF im_ignore_cerr = abap_true.
prc_miss = 'S'.
prc_broken = 'M'.
ELSE.
prc_miss = '.'.
prc_broken = '.'.
ENDIF.
*########################################################
* Convert par_replacement_char into ABAP character number
*########################################################
DATA: prc_conv TYPE REF TO cl_abap_conv_out_ce,
prc_xstr_no TYPE xstring,
prc_i_no TYPE i,
prc_sapno TYPE cpcharno.
TRY.
CALL METHOD cl_abap_conv_out_ce=>create
EXPORTING
encoding = '4000'
RECEIVING
conv = prc_conv.
CATCH cx_parameter_invalid_range .
MESSAGE ID 'FES' TYPE 'E' NUMBER '023' RAISING unknown_error.
CATCH cx_sy_codepage_converter_init .
MESSAGE ID 'FES' TYPE 'E' NUMBER '024' RAISING unknown_error.
ENDTRY.
TRY.
CALL METHOD prc_conv->write
EXPORTING
data = im_replacement_char.
CATCH cx_sy_codepage_converter_init.
MESSAGE ID 'FES' TYPE 'E' NUMBER '024' RAISING unknown_error.
CATCH cx_sy_conversion_codepage.
MESSAGE ID 'FES' TYPE 'E' NUMBER '026' RAISING unknown_error.
CATCH cx_parameter_invalid_type.
MESSAGE ID 'FES' TYPE 'E' NUMBER '023' RAISING unknown_error.
CATCH cx_parameter_invalid_range.
MESSAGE ID 'FES' TYPE 'E' NUMBER '023' RAISING unknown_error.
ENDTRY.
TRY.
CALL METHOD prc_conv->get_buffer
RECEIVING
buffer = prc_xstr_no.
ENDTRY.
prc_i_no = prc_xstr_no.
prc_sapno = prc_i_no.
* Создаем конвертер кодовой страницы
CREATE OBJECT converter
EXPORTING
outcode = codepage
miss = prc_miss
broken = prc_broken
use_f1 = 'X'
substc = prc_sapno
EXCEPTIONS
invalid_codepage = 1
internal_error = 2.
IF sy-subrc <> 0.
CASE sy-subrc.
WHEN 1.
MESSAGE ID 'FES' TYPE 'E' NUMBER '023' RAISING unknown_error.
WHEN 2.
MESSAGE ID 'FES' TYPE 'E' NUMBER '024' RAISING unknown_error.
ENDCASE.
ENDIF.
CALL METHOD converter->convert
EXPORTING
inbuff = cl_abap_char_utilities=>cr_lf
inbufflg = 0
outbufflg = 0
IMPORTING
outbuff = prc_encoded_crlf
* INUSED =
* OUTUSED = par_filesize
* SUBSTED =
* INPUT_ENDS_IN_CHAR =
EXCEPTIONS
internal_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
CASE sy-subrc.
WHEN 1.
MESSAGE ID 'FES' TYPE 'E' NUMBER '024' RAISING unknown_error.
WHEN 2.
MESSAGE ID 'FES' TYPE 'E' NUMBER '024' RAISING unknown_error.
ENDCASE.
ENDIF.
* Открываем файл
OPEN DATASET im_filename FOR OUTPUT IN BINARY MODE.
IF sy-subrc <> 0.
RAISE file_not_created.
ELSE.
LOOP AT im_it_data ASSIGNING <wa_data>.
PERFORM put_char_linebuffer(saplsfes) USING <wa_data>
im_write_field_separator
im_trunc_trailing_blanks
im_col_select
im_col_select_mask
im_write_lf
strdecimal
strdatformat
im_dat_mode
im_trunc_trailing_blanks_eol
CHANGING converter
prc_encoded_string.
IF im_write_lf IS NOT INITIAL.
* Add CR to line.
CONCATENATE prc_encoded_string prc_encoded_crlf
INTO prc_encoded_string IN BYTE MODE.
ENDIF.
ENDLOOP.
* Пишем в файл
TRANSFER prc_encoded_string TO im_filename.
* Закрываем файл
CLOSE DATASET im_filename.
ENDIF.
ENDFUNCTION.
В IM_WRITE_FIELD_SEPARATOR и в IM_DAT_MODE передай 'X'