Загрузку файлов с фронтенда рекомендуется делать с помощью статического метода: cl_gui_frontend_services=>gui_upload. Данный метод имеет множество параметров, описание которых я приведу далее.
FILENAME — собственно имя файла из которого хотим считать информацию.
FILETYPE — Тип файла, может принимать значения BIN, ASC, DAT. BIN — используется при считывании файла в байтовую последовательность. ASC — считывание как из текстового файла, DAT — тоже самое что и ASC, но при этом параметры has_field_separator, dat_mode выставляются в ‘X’.
HAS_FIELD_SEPARATOR — Параметр отвечает за разделение между строками текстового файла. Например если файл имеет следующую структуру и значение параметра ‘X’:
1 2 3 (tab) 4 5 6
1 2 3 4 5 6
то дойдя до символа табуляции (cl_abap_char_utilities=>horizontal_tab) программа решит что это конец строки и начнет считывать следующую строку. Если параметр пустой строка будет считана полностью пока не встретит разделителя строки (cl_abap_char_utilities=>cr_lf), либо пока размер строки не превысит максимальный размер строки в таблице в которую происходит считывание — параметр DATA_TAB. Актуально для режимов ASC и DAT.
HEADER_LENGTH — используется при бинарном считывании файла, указывает количество байтов заголовка файла, для его пропуска. Сам заголовок будет находится в параметре HEADER. Актуально для режима BIN.
READ_BY_LINE — параметр ‘X’ указывает на то что считывание происходит построчно, т.е. не в структуру. Таблица в которую считываем файл должна состоять из одного компонента (например char255). Актуально для режимов ASC и DAT.
CODEPAGE — параметр указывает на то какую кодовую страницу необходимо использовать при считывании файла, если параметр пустой кодовая страница берется по умолчанию та в которой вошел пользователь — CL_GUI_FRONTEND_SERVICES=>GET_SAPLOGON_ENCODING. Например для считывания файла в кодировке UTF-8 (Без BOM) необходимо использовать кодовую страницу ‘4110’. Актуально для режимов ASC и DAT.
DAT_MODE — отвечает за считывание из файла компонентов структуры с типом D. В случае когда один компонентов имеет тип D необходимо выставлять параметр в ‘X’. Актуально для режимов ASC и DAT.
IGNORE_CERR — В случае когда ‘X’ ошибки связанные с конвертацией кодировки игнорируются. Актуально для режимов ASC и DAT.
REPLACEMENT — Символ в который преобразуются символы которые не получилось преобразовать при перекодировании. Актуально для режимов ASC и DAT.
VIRUS_SCAN_PROFILE — Указывает на профиль сканирования на вирусы, подробнее о сканировании на вирусы см в соответствующем разделе справки SAP.
FILELENGTH — Передает размер файла в байтах.
HEADER — см. параметр HEADER_LENGTH выше.
DATA_TAB — собственно таблица в которую будут попадать считываемые данные из файла. Структура таблицы определяется в зависимости от структуры файла или задачи.
Помните! Данный метод нельзя использовать в фоновом режиме. Ну и напоследок пример с которым все это дело проверялось:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
REPORT ztest. PARAMETER p_file TYPE STRING LOWER CASE OBLIGATORY DEFAULT 'C:TempDemo.txt'. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file. cl_salv_test_data=>select_file( IMPORTING filename = p_file ). START-OF-SELECTION. TYPES: BEGIN OF ty_tab, col1 TYPE char1, col2 TYPE D, END OF ty_tab. DATA: lt_tab TYPE STANDARD TABLE OF ty_tab, lv_length TYPE I, lv_header TYPE XSTRING. FIELD-SYMBOLS: <fs> TYPE ty_tab. cl_gui_frontend_services=>gui_upload( EXPORTING filename = p_file filetype = 'ASC' codepage = '4110' dat_mode = 'X' IMPORTING filelength = lv_length header = lv_header CHANGING data_tab = lt_tab EXCEPTIONS OTHERS = 99 ). IF sy-subrc <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. WRITE: / 'Размер файла: ', lv_length,' Содержимое файла:'. LOOP AT lt_tab ASSIGNING <fs>. WRITE: / sy-tabix,':', 'Col1:', <fs>-col1,' Col2:', <fs>-col2 MMDDYY. ENDLOOP. |
Содержимое файла:
А16.12.1986
В16.12.1986
Пример считывания файла в RAW, последовательность байтов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
DATA: l_filename TYPE STRING, l_rawtab TYPE STANDARD TABLE OF raw255, l_len TYPE I. MOVE p_filename TO l_filename. CALL METHOD cl_gui_frontend_services=>gui_upload EXPORTING filename = l_filename filetype = 'BIN' IMPORTING filelength = l_len CHANGING data_tab = l_rawtab EXCEPTIONS OTHERS = 99. |
Плохо, что в SAP нет возможности читать файлы частями…
Например, читать длинный файл в цикле кусками по 1024 байта (1. первый кусок 0..1023; 2. с 1024 по 2047; etc.).
Есть ли какое-то решение?
Увы стандартных решений я не знаю, есть вариант расширения GUI клиента или вызова WinAPI, но это думаю того не стоит.
Скорее всего появится, когда в SAP расширят модель работы с потоками на уровне файлов.