Все просто, три шага:
1) Создать ФМ
2) Создать источник данных
3) Протестировать источник данных
Шаг 1. Создаем ФМ. Здесь все как обычно. Немного о его интерфейсах:
*"---------------------------------------------------------------------- *"*"Локальный интерфейс: *" IMPORTING *" REFERENCE(I_REQUNR) TYPE SRSC_S_IF_SIMPLE-REQUNR *" REFERENCE(I_DSOURCE) TYPE SRSC_S_IF_SIMPLE-DSOURCE OPTIONAL *" REFERENCE(I_MAXSIZE) TYPE SRSC_S_IF_SIMPLE-MAXSIZE OPTIONAL *" REFERENCE(I_INITFLAG) TYPE SRSC_S_IF_SIMPLE-INITFLAG OPTIONAL *" REFERENCE(I_READ_ONLY) TYPE SRSC_S_IF_SIMPLE-READONLY OPTIONAL *" REFERENCE(I_REMOTE_CALL) TYPE SBIWA_FLAG DEFAULT *" SBIWA_C_FLAG_OFF *" TABLES *" I_T_SELECT TYPE SRSC_S_IF_SIMPLE-T_SELECT OPTIONAL *" I_T_FIELDS TYPE SRSC_S_IF_SIMPLE-T_FIELDS OPTIONAL *" E_T_DATA STRUCTURE ZFC_LOADSTRU OPTIONAL *" EXCEPTIONS *" NO_MORE_DATA *" ERROR_PASSED_TO_MESS_HANDLER *"----------------------------------------------------------------------
параметры буфера обмена при экстракции
I_REQUNR — тестовый запуск, или запус экстракции. Система сама заполняет этот параметр. Параметр обязателен.
I_DSOURCE — Название источника данных, созданного в RSO2. При тесте через RSA3 или запуске экстракции заполняется системой. Параметр опционален.
I_MAXSIZE — максимальный размер передаваемого пакета данных. Устанавливается системой, по умолчанию = 100. Можно увеличить. Параметр опционален.
Остальные параметры
I_INITFLAG — Параметр опционален. = X по умолчанию. Заполняется системой.
I_REMOTE_CALL — Параметр обязателен. Обозначает вариант удаленного запуска (RFC)
I_READ_ONLY — Параметр опционален. Без комментариев =)
Таблицы:
На вход:
I_T_SELECT — Передаем (или уже в самом ФМ формируем) поля для условий (Where), эти поля для условий потом будут отражены в источнике данных создаваемом в RSO2.
I_T_FIELDS — Список полей для экстракции. Эти поля потом будут отражены в источнике данных создаваемом в RSO2, как поля для экстракции.
На выход:
E_T_DATA — таблица со структурой данных, подаваемых на выход. Типизация LIKE — структура. Сама структура должна быть строго типизированной (Не допускается типизация вида — «Тип ссылка на». Допускается только типизация «TYPE»).
Особые ситуации:
NO_MORE_DATA — обязательная особая ситуация, используется когда ведется работа с курсорами БД. Вызывается когда кончаются данные для выборки.
Полный исходный код ФМ:
FUNCTION Z_FI_EKPOUT. *"---------------------------------------------------------------------- *"*"Локальный интерфейс: *" IMPORTING *" REFERENCE(I_REQUNR) TYPE SRSC_S_IF_SIMPLE-REQUNR *" REFERENCE(I_DSOURCE) TYPE SRSC_S_IF_SIMPLE-DSOURCE OPTIONAL *" REFERENCE(I_MAXSIZE) TYPE SRSC_S_IF_SIMPLE-MAXSIZE OPTIONAL *" REFERENCE(I_INITFLAG) TYPE SRSC_S_IF_SIMPLE-INITFLAG OPTIONAL *" REFERENCE(I_READ_ONLY) TYPE SRSC_S_IF_SIMPLE-READONLY OPTIONAL *" REFERENCE(I_REMOTE_CALL) TYPE SBIWA_FLAG DEFAULT *" SBIWA_C_FLAG_OFF *" TABLES *" I_T_SELECT TYPE SRSC_S_IF_SIMPLE-T_SELECT OPTIONAL *" I_T_FIELDS TYPE SRSC_S_IF_SIMPLE-T_FIELDS OPTIONAL *" E_T_DATA STRUCTURE ZFC_LOADSTRU OPTIONAL *" EXCEPTIONS *" NO_MORE_DATA *" ERROR_PASSED_TO_MESS_HANDLER *"---------------------------------------------------------------------- RSAL_S_LOGPARMS LIKE RSLOGPARMS. DEFINE LOG_WRITE. RSAL_SAVE_SUBRC = SY-SUBRC. RSAL_S_LOGPARMS-MSGTY = &1. RSAL_S_LOGPARMS-MSGID = &2. RSAL_S_LOGPARMS-MSGNO = &3. RSAL_S_LOGPARMS-MSGV1 = &4. RSAL_S_LOGPARMS-MSGV2 = &5. CALL FUNCTION 'RSAL_LOG_WRITE' EXPORTING I_MSGTY = RSAL_S_LOGPARMS-MSGTY I_MSGID = RSAL_S_LOGPARMS-MSGID I_MSGNO = RSAL_S_LOGPARMS-MSGNO I_MSGV1 = RSAL_S_LOGPARMS-MSGV1 I_MSGV2 = RSAL_S_LOGPARMS-MSGV2. SY-SUBRC = RSAL_SAVE_SUBRC. * data: zfc_data like zekpout occurs 0 with header line. * * select * from zekpout into corresponding fields of table zfc_data. * Auxiliary Selection criteria structure * Maximum number of lines for DB table * counter S_COUNTER_DATAPAKID LIKE SY-TABIX, * cursor S_CURSOR TYPE CURSOR. * Select ranges L_R_D_CA FOR Zekpout-D_CA, L_R_D_RU FOR Zekpout-D_RU, L_R_D_CU FOR Zekpout-D_CU, L_R_D_DP FOR Zekpout-D_DP, L_R_D_AC FOR Zekpout-D_AC, L_R_D_PA FOR Zekpout-D_PA, L_R_D_FL FOR Zekpout-D_FL, L_R_D_DC FOR Zekpout-D_DC, L_R_D_CM FOR Zekpout-D_CM, L_R_D_CR FOR Zekpout-D_CR, L_R_D_FS FOR Zekpout-D_FS, L_R_D_CT FOR Zekpout-D_CT, L_R_P_AMOUNT FOR Zekpout-P_AMOUNT, L_R_P_COMMENT FOR Zekpout-P_COMMENT . * Initialization mode (first call by SAPI) or data transfer mode * (following calls) ? ************************************************************************ * Initialization: check input parameters * buffer input parameters * prepare data selection ************************************************************************ * Check DataSource validity * CASE I_DSOURCE. * WHEN 'ZGET_FC_DATA'. * WHEN OTHERS. * IF 1 = 2. MESSAGE E009(R3). ENDIF. ** this is a typical log call. Please write every error message like this * LOG_WRITE 'E' "message type * 'R3' "message class * '009' "message number * I_DSOURCE "message variable 1 * ' '. "message variable 2 * RAISE ERROR_PASSED_TO_MESS_HANDLER. * ENDCASE. * Fill parameter buffer for data extraction calls S_S_IF-REQUNR = I_REQUNR. S_S_IF-DSOURCE = I_DSOURCE. S_S_IF-MAXSIZE = I_MAXSIZE. * Fill field list table for an optimized select statement * (in case that there is no 1:1 relation between InfoSource fields * and database table fields this may be far from beeing trivial) ************************************************************************ * Data transfer: First Call OPEN CURSOR + FETCH * Following Calls FETCH only ************************************************************************ * First data package -> OPEN CURSOR * Fill range tables BW will only pass down simple selection criteria * of the type SIGN = 'I' and OPTION = 'EQ' or OPTION = 'BT'. APPEND L_R_D_CA. APPEND L_R_D_RU. APPEND L_R_D_CU. APPEND L_R_D_DP. APPEND L_R_D_AC. APPEND L_R_D_PA. APPEND L_R_D_FL. APPEND L_R_D_DC. APPEND L_R_D_CM. APPEND L_R_D_CR. APPEND L_R_D_FS. APPEND L_R_D_CT. APPEND L_R_P_AMOUNT. APPEND L_R_P_COMMENT. * Determine number of database records to be read per FETCH statement * from input parameter I_MAXSIZE. If there is a one to one relation * between DataSource table lines and database entries, this is trivial. * In other cases, it may be impossible and some estimated value has to * be determined. OPEN CURSOR WITH HOLD S_CURSOR FOR SELECT (S_S_IF-T_FIELDS) FROM Zekpout WHERE D_CA IN L_R_D_CA AND D_RU IN L_R_D_RU AND D_CU IN L_R_D_CU AND D_DP IN L_R_D_DP AND D_AC IN L_R_D_AC AND D_PA IN L_R_D_PA AND D_FL IN L_R_D_FL AND D_DC IN L_R_D_DC AND D_CM IN L_R_D_CM AND D_CR IN L_R_D_CR AND D_FS IN L_R_D_FS AND D_CT IN L_R_D_CT AND P_AMOUNT IN L_R_P_AMOUNT AND P_COMMENT IN L_R_P_COMMENT . * Fetch records into interface table. * named E_T_'Name of extract structure'. FETCH NEXT CURSOR S_CURSOR APPENDING CORRESPONDING FIELDS OF TABLE E_T_DATA PACKAGE SIZE S_S_IF-MAXSIZE. CLOSE CURSOR S_CURSOR. RAISE NO_MORE_DATA. S_COUNTER_DATAPAKID = S_COUNTER_DATAPAKID + 1.
Шаг 2. В транзакции RSO2 создать источник данных
Указываем раннее созданный ФМ а так же нашу выходную структуру данных.
Шаг 3. Протестировать экстрактор можно через транзакцию RSA3.
Данные для статьи. Исходный код модуля в частности, предоставлены — kenzhemax