Sapforum.Biz
Инструменты => ABAP - Инструментальные средства => SE38 - ABAP Редактор => Тема начата: Uukrul от Сентябрь 30, 2013, 02:08:20 pm
-
Во время разработки собственных программ, часто можно решать поставленную задачу используя стандартные отчеты системы, т.е. наша задача значительно упрощается и заключается только в том, чтобы сформировать правильный вызов стандартной программы/отчета и получить результаты. Кстати, часто 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.
-
Uukrul, добрый день!
А поясните, пожалуйста:
* ну это надо смотреть что предлагает отчет
Имеется ввиду, надо смотреть какую структуру имеет отчет?
И почему lt_out_ono описывается как fiaa_salvtab_rabest?
-
А поясните, пожалуйста:Имеется ввиду, надо смотреть какую структуру имеет отчет?
Да, на самом деле я просто зашел в отладку отчета, обычно SAP использует переменную DYN_SEL в своих отчетах. А дальше в отладке без проблем смотрим на структуру. К сожалению в разных отчетах эта структура может называться по разному, но на закладке глобальных переменных, ее можно довольно быстро отыскать, рисунок DYN_SEL-CLAUSES.png
И почему lt_out_ono описывается как fiaa_salvtab_rabest?
Ну потому что отчет RABEST_ALV01 при передаче параметра WITH p_table = 'X', возвращает свой результат в структуру FIAA_SALVTAB_RABEST, ну это из исходного кода видно.
-
Спасибо за разъяснения :)
-
Пытаюсь применить вызов программы из примера на практике. При вызове отчета RABEST_ALV01 внутренние таблицы в нем заполняются и submit отрабатывает успешно. А вот импорт данных осуществить не получается... Валюсь в дамп:
An exception occurred that is explained in detail below.
The exception, which is assigned to class 'CX_SY_IMPORT_MISMATCH_ERROR', was not caught and
therefore caused a runtime error.
The reason for the exception is:
When importing the object "TABLE", the component 1 in the dataset had a different length from the corresponding component of the target object in the program.
The length is 8 in the dataset, but 80 in the program.
Не очень понимаю о каком несоответствии идет речь...
-
Можно код привести вызова и импорта?
-
Все как в примере, за исключением динамических переменных.
DATA: ls_out_ono TYPE fiaa_salvtab_rabest,
lt_out_ono TYPE TABLE OF fiaa_salvtab_rabest.
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.
rspar_tab естественно своими данными заполняю.
-
rspar_tab естественно своими данными заполняю.
Есть у меня одно предположение, там есть такая вложенная структура CI_REPRABEST она у вас скорее всего пустая. Если это так дополните ее одним полем например ZZ_CHAR TYPE CHAR1 и перегенерируйте все.
-
Uukrul, добрый день!
Вы правы - структура CI_REPRABEST у меня была пустой. Но после добавления в нее поля, ошибка осталась.
Но теперь система говорит:
The length is 2 in the dataset, but 80 in the program.
Почему CI_REPRABEST не должна быть пустой? Пробовала задавать полю разные типы, но результат один.
-
Но теперь система говорит:Почему CI_REPRABEST не должна быть пустой? Пробовала задавать полю разные типы, но результат один.
Ну смотрим дальше, какой уровень стоит для SAP_BASIS, у меня версия 701 уровень 0013, на системе где это работает. По некоторым признакам, в более ранних версиях может не работать. Причина похоже в том, что внутри именно этой программы RABEST_ALV01, структура возврата параметров типа fiaa_salvtab_rabest, генерируется динамически. И похоже структура созданная динамически по типу fiaa_salvtab_rabest и переменная объявленная как TYPE fiaa_salvtab_rabest, получаются немного разными. Ключ игнорирования границ BOUNDARIES видно в более ранних версиях почему-то не помогает. Мне просто кто-то кажется уже рассказывал про такую же проблему. Причем если ключ убрать, то ошибка будет что-то типа проблема после 25 параметра, фактически это получается что первый инклуд в структуру уже не правильно конвертируется. В общем посмотрите на свой уровень базиса и если не сложно напишите.
-
Версия 731, уровень 0007
-
Версия 731, уровень 0007
Прикольно. А попробуйте с ключами команды IMPORT поиграться?
-
Ну как бы по теме Note 448075 - Call of Asset Accounting reports with output in table
А вдруг?
-
Ну как бы по теме Note 448075 - Call of Asset Accounting reports with output in table
Для базиса от 7.0 и выше не катит, там даже текст другой уже, так что эту ноту применить не выйдет в данном случае.
-
Для базиса от 7.0 и выше не катит, там даже текст другой уже, так что эту ноту применить не выйдет в данном случае.
Не понял при чем здесь уровень базиса? Там же ясным по темному написано:
SAP_APPL 600 600 600
SAP_APPL 602 602 602
SAP_APPL 603 603 603
SAP_APPL 604 604 604
SAP_APPL 605 605 605
SAP_APPL 606 606 606
SAP_APPL 616 616 616
И?..... Да и нота свежая - valid since 07.05.2013
И пакетами это "счастье" не поставляется
-
И пакетами это "счастье" не поставляется
Протупил, однако... извините :-\ как-то базис с апликейшеном перепутал. Но теперь что касается этой ноты, то еще она меня сбила с толку, так как я в коде у себя ковырялся и берем например первый модуль для корректировки: FUNCTION FIAA_ALV_DISPLAY, рекомендуется сделать следующее:
FUNCTION fiaa_alv_display.
*"----------------------------------------------------------------------
*"*"Globale Schnittstelle:
*" IMPORTING
*" VALUE(I_FIELDCAT) TYPE SLIS_T_FIELDCAT_ALV OPTIONAL
*" VALUE(VARIANTE) TYPE DISVARIANT-VARIANT
*" VALUE(ITAB_SORT) TYPE SLIS_T_SORTINFO_ALV OPTIONAL
*" VALUE(ITAB_LAYOUT) TYPE SLIS_LAYOUT_ALV OPTIONAL
*" VALUE(ITAB_EVENTS) TYPE SLIS_T_EVENT OPTIONAL
*" VALUE(TABNAME_HEADER) TYPE SLIS_TABNAME
*" VALUE(TABNAME_ITEM) TYPE SLIS_TABNAME DEFAULT SPACE
*" VALUE(HIERARCHICAL) TYPE XFELD DEFAULT SPACE
*" VALUE(SUMMEN_BERICHT)
*" VALUE(GITTERBERICHT) DEFAULT SPACE
*" VALUE(X_T086) TYPE T086
*" REFERENCE(EXPAND) TYPE XFELD DEFAULT SPACE
*" REFERENCE(USE_ALV_GRID) TYPE XFELD DEFAULT SPACE
*" REFERENCE(TCOLLECT) TYPE FIAA_SALVCOLLECT OPTIONAL
*" TABLES
*" ITAB_HEADER
*" ITAB_ITEM OPTIONAL
*" BUKRS
*" SORTFELD STRUCTURE FIAA_SALVSORT_FELDER
*" ITAB_SUBSORT TYPE SLIS_T_SORTINFO_ALV OPTIONAL
*" EXCEPTIONS
*" MISSING_PARAMETER
*"----------------------------------------------------------------------
Delete Block
<ничего>
Insert Block
* only output to table?
if not tcollect-x_table_out is initial.
export table from itab_header to memory id sy-cprog.
exit.
endif.
Но у меня этот блок уже выглядит вот так:
function fiaa_alv_display.
*"----------------------------------------------------------------------
*"*"Globale Schnittstelle:
*" IMPORTING
*" VALUE(I_FIELDCAT) TYPE SLIS_T_FIELDCAT_ALV OPTIONAL
*" VALUE(VARIANTE) TYPE DISVARIANT-VARIANT
*" VALUE(ITAB_SORT) TYPE SLIS_T_SORTINFO_ALV OPTIONAL
*" VALUE(ITAB_LAYOUT) TYPE SLIS_LAYOUT_ALV OPTIONAL
*" VALUE(ITAB_EVENTS) TYPE SLIS_T_EVENT OPTIONAL
*" VALUE(TABNAME_HEADER) TYPE SLIS_TABNAME
*" VALUE(TABNAME_ITEM) TYPE SLIS_TABNAME DEFAULT SPACE
*" VALUE(HIERARCHICAL) TYPE XFELD DEFAULT SPACE
*" VALUE(SUMMEN_BERICHT)
*" VALUE(GITTERBERICHT) DEFAULT SPACE
*" VALUE(X_T086) TYPE T086
*" REFERENCE(EXPAND) TYPE XFELD DEFAULT SPACE
*" REFERENCE(USE_ALV_GRID) TYPE XFELD DEFAULT SPACE
*" REFERENCE(TCOLLECT) TYPE FIAA_SALVCOLLECT OPTIONAL
*" TABLES
*" ITAB_HEADER
*" ITAB_ITEM OPTIONAL
*" BUKRS
*" SORTFELD STRUCTURE FIAA_SALVSORT_FELDER
*" ITAB_SUBSORT TYPE SLIS_T_SORTINFO_ALV OPTIONAL
*" ITAB_ERRORS STRUCTURE ANFM OPTIONAL
*" EXCEPTIONS
*" MISSING_PARAMETER
*"----------------------------------------------------------------------
********** function module revised with note 1002552 **********
data: lt_event_exit type slis_t_event_exit.
data: ls_event_exit type slis_event_exit.
data: ld_mem_id type sy-cprog. "> 875231
data: function_name(30) type c.
data: spos type i. "no 311512
field-symbols: <lfs_fieldcat> type slis_fieldcat_alv. "> 1002552
* Grid standardmässig nicht benutzt.
clear grid_used.
* only output to table?
if not tcollect-x_table_out is initial.
if hierarchical is initial. "> 875231
* standard lists are exported in one table
export table from itab_header to memory id sy-cprog.
else.
* hierarchichal lists are exported in two tables
concatenate sy-cprog '_HEADER' into ld_mem_id.
export table from itab_header to memory id ld_mem_id.
concatenate sy-cprog '_ITEM' into ld_mem_id.
export table from itab_item to memory id ld_mem_id.
endif. "> 875231
return.
endif.
т.е. как видим я вообще не могу вставить себе этот кусок кода:
* only output to table?
if not tcollect-x_table_out is initial.
export table from itab_header to memory id sy-cprog.
exit.
endif.
так как у меня там уже и так написано, но по другому.. а удалять типа нечего. Вот меня и перемкнуло, так как я в этом ФМ ковырялся когда дампы словил на передаче параметров. Ну и остальные корректуры у меня уже как бы или есть или снова не в тему получаются.
-
Версия 731, уровень 0007
Вышел новый пакет обновления: Support Package SAPK-60420INCCEE, поставили, проблема вроде как исправлена одной из нот в рамках этого пакета.