Sapforum.Biz
Инструменты => ABAP - Инструментальные средства => SE37 - Построитель функций => Тема начата: N7 от Декабрь 05, 2008, 02:40:31 pm
-
Для работы с файлами на Presentation Server используются методы класса CL_GUI_FRONTEND_SERVICES.
Через SE80 можно посмотреть все методы этого класса.
В качестве примера метод GUI_DOWNLOAD для выгрузки данных из внутренней таблицы в текстовый файл:
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
codepage = '1503'
filename = filename
filetype = 'DAT'
IMPORTING
filelength = flength
TABLES
data_tab = itab
EXCEPTIONS
file_open_error = 1
file_write_error = 2
invalid_filesize = 3
invalid_table_width = 4
invalid_type = 5.
/code
-
Оно то конечно так... только вот к сожалению эта функция, которая кстати использует класс CL_GUI_FRONTEND_SERVICES из всего разнообразия форматов знает только два:
* Filetype parameter valid ?
CASE filetype.
WHEN 'BIN' OR 'ASC'.
WHEN OTHERS.
RAISE INVALID_TYPE.
ENDCASE.
Кстати формата DAT, типа разделитель табуляция она таки не знает и вываливает ошибку. Так что я по старой традиции и для 6.0 использую, объявленный старым функциональный модуль WS_DOWNLOAD у которого с форматами чуток по лучше.
* filetype parameter gќltig ?
CASE FILETYPE.
WHEN 'BIN' OR 'DAT' OR 'ASC' OR 'VSS' OR 'IBM' OR 'WK1' OR 'DBF'
OR 'HQX'.
WHEN OTHERS.
MESSAGE I132 RAISING INVALID_TYPE.
ENDCASE.
Хотя конечно класс CL_GUI_FRONTEND_SERVICES использовать не только можно, но и нужно, так как имеет он много полезного + методы классовые или как там правильно оно называется, но короче методы можно вызвать без создания экземппяра класса. Может чуток подробнее как нить распишу атрибуты и методы.
-
"Кстати формата DAT, типа разделитель табуляция она таки не знает и вываливает ошибку"...
хм, а у меня не вываливает ошибку и нормально выгружает...
система SAP ECC 6.0.
-
"Кстати формата DAT, типа разделитель табуляция она таки не знает и вываливает ошибку"...
хм, а у меня не вываливает ошибку и нормально выгружает...
система SAP ECC 6.0.
OK, надо посмотреть.. в 4.6 точно нет... остальные гляну отдельно... но если уже выгружает, значит подчинили.
-
Ну как минимум в ECC 6.0 таки подправили эту функцию:
* Filetype parameter valid ?
case prc_filetype.
when 'BIN' or 'ASC' or 'DAT' or 'DBF' or 'WK1' or 'VSS'. "--- New: VSS Format (JB/07-2006)
when 'IBM'.
prc_filetype = 'ASC'.
prc_codepage = '1103'.
when others.
message id 'FES' type 'E' number '004' raising invalid_type.
endcase.
К сожалению 4.7 и 5 под рукой нет, так что если кто является обладателем таких систем, посмотрите у себя на предмет наличия списка выгружаемых форматов у модуля GUI_DOWNLOAD.
-
У меня:
* Filetype parameter valid ?
CASE prc_filetype.
WHEN 'BIN' OR 'ASC' OR 'DAT' OR 'DBF' OR 'WK1' OR 'VSS'. "--- New: VSS Format (JB/07-2006)
WHEN 'IBM'.
prc_filetype = 'ASC'.
prc_codepage = '1103'.
WHEN OTHERS.
MESSAGE ID 'FES' TYPE 'E' NUMBER '004' RAISING INVALID_TYPE.
ENDCASE.
Только как точно определить какая у меня система?
-
FILE_READ_AND_CONVERT_SAP_DATA - В общем таки универсальная функция, которая позволяет читать файлы как с сервера так и апликейшен сервера, причем как говорится шампунь и кондиционер в одном наборе, что очень удобно... Пример использования типа такой:
TYPE-POOLS: truxs.
CONSTANTS: c_application_server TYPE truxs_server VALUE 'APP',
c_presentation_server TYPE truxs_server VALUE 'PRS',
c_ole2_server TYPE truxs_server VALUE 'OLE2'.
DATA : l_bin_filelength LIKE sy-tabix,
* ASC = Flat ASCII
* CSV = Comma Separated Values
* TXT = TXT Format (Notepad)
* HTM = Hypertext Markup Language
* HTML = Hypertext Markup Language
l_file_format TYPE truxs_fileformat VALUE 'ASC'.
DATA: BEGIN OF lt_sernr OCCURS 1,
sernr LIKE equi-sernr,
END OF lt_sernr.
CALL FUNCTION 'FILE_READ_AND_CONVERT_SAP_DATA'
EXPORTING
i_filename = 'C:\Sermark.txt'
i_servertyp = c_presentation_server
i_fileformat = l_file_format
* I_FIELD_SEPERATOR =
* I_LINE_HEADER =
IMPORTING
e_bin_filelength = l_bin_filelength
TABLES
i_tab_receiver = lt_sernr
EXCEPTIONS
file_not_found = 1
close_failed = 2
authorization_failed = 3
open_failed = 4
conversion_failed = 5
OTHERS = 6.
IF sy-subrc <> 0.
* Тут типа ошибка чтения файла данных
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
LOOP AT lt_sernr.
WRITE: / lt_sernr-sernr.
ENDLOOP.
Формат файла был типа такой:
350689203872413
350689203872414
350991204175661
350991204175745
350991204175844
Как видим варианты размещения файла могут быть такие:
APP - Апликейшен сервер, в общем для тех кто в танке, это иногда (если сервер совмещен), то это та система где стоит сам SAP :D
PRS - Сервер презентаций, таки это ваша локальная станция, само собой обработка может быть только в диалоге.
OLE2 - Где эта Оля 2, не знаю, не пробовал.
Форматы файла могут быть типа такие:
* ASC = Flat ASCII
* CSV = Comma Separated Values
* TXT = TXT Format (Notepad)
* HTM = Hypertext Markup Language
* HTML = Hypertext Markup Language
Реально же есть еще два формата
* BIN = Двоичные данные
* XML = Данные в формате XML
При загрузке в диалоге с локальной станции, функция выводит индикатор обработки, плюс к этому умеет выполнять преобразование кодировки для читаемых данных, при этом стоит учесть что кусок выполняющий преобразование кодировки выглядит так:
IF i_fileformat <> c_file_type_binary AND
i_fileformat <> c_file_type_xml.
IF l_lan_cp <> l_sys_cp.
data: ld_lan_cp type abap_encod.
ld_lan_cp = l_lan_cp.
CALL FUNCTION 'TRANSLATE_CODEPAGE_IN'
EXPORTING
CODEPAGE_FROM = ld_lan_cp
TABLES
T_DATA = <fs_itab>
EXCEPTIONS
OTHERS = 0.
ENDIF.
ENDIF.