Во время разработки собственных программ, часто можно решать поставленную задачу используя стандартные отчеты системы, т.е. наша задача значительно упрощается и заключается только в том, чтобы сформировать правильный вызов стандартной программы/отчета и получить результаты. Кстати, часто SAP сам использует такие механизмы, например много отчетов или выборок по запасам тех же ОС, вызывают стандартную программу/отчет RABEST_ALV01 - Запаси. В данной программе для получения данных исползуется специальных флаг/параметр P_TABLE - который если передать при вызове то отчет вернет результат через память в вызываемую программу. Вызвать отчеты через SUBMIT не проблема, но в данном отчете используются динамические критерии, рисунок RABEST_ALV01.png, которые так просто не передать в программу. Правда разные индусы рекомендуют передавать эти параметры аналогично выведенным на экране отчета, т.е. что-то типа: WITH %%DYN001-LOW = <значение>, интересно, те кто там советует сами пробовали? Похоже что вряд ли так как такой вызов не будет отработан правильно, для этого нужно использовать совсем другое расширение ключей команды SUBMIT, ну и немного пошаманить со структурами перед формированием вызова. В общем как говорил Паганель, чтобы не забыть, завяжу узелок на память, а то снова пришлось долго вспоминать как и где это делать. Поэтому в качестве небольшого примера:
REPORT ztmp_test_dynamic_select.
* Пул типов, для работы с динамическими критериями выбора отчетов
TYPE-POOLS: rsds.
* Переменные для работы со стандартными критериями выбора на экране отчета
DATA: rspar_tab TYPE TABLE OF rsparams WITH HEADER LINE,
last_day_in_mnth LIKE anlz-adatu,
rdeftx TYPE t093-afaber.
* Переменные для работы с динамическими критериями выбора отчета
DATA: lt_texpr TYPE rsds_texpr,
lt_rsds_selop LIKE rsdsselopt OCCURS 10 WITH HEADER LINE,
lt_rsds_frange TYPE rsds_frange OCCURS 10 WITH HEADER LINE,
lt_rsds_range TYPE rsds_range OCCURS 10 WITH HEADER LINE.
* Реультирующая таблица, с данными отчета
DATA: ls_out_ono TYPE fiaa_salvtab_rabest,
lt_out_ono TYPE TABLE OF fiaa_salvtab_rabest.
*-----------------------------------------------------------------------
* Динамические переменные DYN_SELECTION, формирование структур
* Стандартные переменные типа SELECT-OPTIONS = 'S'
rspar_tab-selname = 'BUKRS'. rspar_tab-kind = 'S'. rspar_tab-sign = 'I'. rspar_tab-option = 'EQ'. rspar_tab-low = '9000'. APPEND rspar_tab.
rspar_tab-selname = 'ANLAGE'. rspar_tab-kind = 'S'. rspar_tab-sign = 'I'. rspar_tab-option = 'EQ'. rspar_tab-low = '910300000040'. APPEND rspar_tab.
rspar_tab-selname = 'UNTNR'. rspar_tab-kind = 'S'. rspar_tab-sign = 'I'. rspar_tab-option = 'EQ'. rspar_tab-low = '0000'. APPEND rspar_tab.
* Стандартные переменные типа PARAMETERS
last_day_in_mnth = '20131231'.
rdeftx = '01'.
*-----------------------------------------------------------------------
* Динамические переменные DYN_SELECTION, формирование структур
* Значение переменной и опции выбобра
lt_rsds_selop-sign = 'I'.
lt_rsds_selop-option = 'NE'.
lt_rsds_selop-low = '00000000'.
APPEND lt_rsds_selop.
* Имя перменной + опции выбора из предыдущей стркутуры
lt_rsds_frange-fieldname = 'GPLAB'.
lt_rsds_frange-selopt_t[] = lt_rsds_selop[].
APPEND lt_rsds_frange.
* Стркутура динанамических критериев, в данном случае 'ANLAV', смотреть в отладке отчета
lt_rsds_range-tablename = 'ANLAV'.
lt_rsds_range-frange_t[] = lt_rsds_frange[].
APPEND lt_rsds_range.
* Конвертация во внутренней представление
CALL FUNCTION 'FREE_SELECTIONS_RANGE_2_EX'
EXPORTING
field_ranges = lt_rsds_range[]
IMPORTING
expressions = lt_texpr.
*-----------------------------------------------------------------------
* Вызов отчета
SUBMIT rabest_alv01 AND RETURN
WITH SELECTION-TABLE rspar_tab
WITH berdatum = last_day_in_mnth
WITH bereich1 = rdeftx
WITH p_table = 'X'
WITH FREE SELECTIONS lt_texpr.
*-----------------------------------------------------------------------
* Получение результатов, ну это надо смотреть что предлагает отчет
IMPORT table TO lt_out_ono FROM MEMORY ID 'RABEST_ALV01' IGNORING STRUCTURE BOUNDARIES.
* Не забываем освободить память.
FREE MEMORY ID 'RABEST_ALV01'.
*-----------------------------------------------------------------------
* Обработка результатов
LOOP AT lt_out_ono INTO ls_out_ono.
WRITE: / ls_out_ono-s1.
ENDLOOP.