+ Sapforum.Biz » Инструменты » ABAP - Инструментальные средства » SE38 - ABAP Редактор (Модератор: Dmitriy)Тема:
|- SUBMIT и использование динамических критериев выбора




Автор Тема: SUBMIT и использование динамических критериев выбора  (Прочитано 21371 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 656
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Во время разработки собственных программ, часто можно решать поставленную задачу используя стандартные отчеты системы, т.е. наша задача значительно упрощается и заключается только в том, чтобы сформировать правильный вызов стандартной программы/отчета и получить результаты. Кстати, часто SAP сам использует такие механизмы, например много отчетов или выборок по запасам тех же ОС, вызывают стандартную программу/отчет RABEST_ALV01 - Запаси. В данной программе для получения данных исползуется специальных флаг/параметр P_TABLE - который если передать при вызове то отчет вернет результат через память в вызываемую программу. Вызвать отчеты через SUBMIT не проблема, но в данном отчете используются динамические критерии, рисунок RABEST_ALV01.png, которые так просто не передать в программу. Правда разные индусы рекомендуют передавать эти параметры аналогично выведенным на экране отчета, т.е. что-то типа: WITH %%DYN001-LOW = <значение>, интересно, те кто там советует сами пробовали? Похоже что вряд ли так как такой вызов не будет отработан правильно, для этого нужно использовать совсем другое расширение ключей команды SUBMIT, ну и немного пошаманить со структурами перед формированием вызова. В общем как говорил Паганель, чтобы не забыть, завяжу узелок на память, а то снова пришлось долго вспоминать как и где это делать. Поэтому в качестве небольшого примера:
Код: You are not allowed to view links. Register or Login
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.

Оффлайн Lyubov

  • Newbie
  • *
  • Сообщений: 6
  • Reputation Power: 0
  • Lyubov has no influence.
  • YearsYearsYearsYearsYears
Uukrul, добрый день!
А поясните, пожалуйста:
You are not allowed to view links. Register or Login
* ну это надо смотреть что предлагает отчет
Имеется ввиду, надо смотреть какую структуру имеет отчет?
И почему lt_out_ono описывается как fiaa_salvtab_rabest?

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 656
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
А поясните, пожалуйста:Имеется ввиду, надо смотреть какую структуру имеет отчет?
Да, на самом деле я просто зашел в отладку отчета, обычно SAP использует переменную DYN_SEL в своих отчетах. А дальше в отладке без проблем смотрим на структуру. К сожалению в разных отчетах эта структура может называться по разному, но на закладке глобальных переменных, ее можно довольно быстро отыскать, рисунок DYN_SEL-CLAUSES.png

You are not allowed to view links. Register or Login
И почему lt_out_ono описывается как fiaa_salvtab_rabest?
Ну потому что отчет RABEST_ALV01 при передаче параметра  WITH  p_table   = 'X', возвращает свой результат в структуру FIAA_SALVTAB_RABEST, ну это из исходного кода видно.

Оффлайн Lyubov

  • Newbie
  • *
  • Сообщений: 6
  • Reputation Power: 0
  • Lyubov has no influence.
  • YearsYearsYearsYearsYears
Спасибо за разъяснения :)

Оффлайн Lyubov

  • Newbie
  • *
  • Сообщений: 6
  • Reputation Power: 0
  • Lyubov has no influence.
  • YearsYearsYearsYearsYears
Пытаюсь применить вызов программы из примера на практике. При вызове отчета 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.
Не очень понимаю о каком несоответствии идет речь...

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 656
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Можно код привести вызова и импорта?

Оффлайн Lyubov

  • Newbie
  • *
  • Сообщений: 6
  • Reputation Power: 0
  • Lyubov has no influence.
  • YearsYearsYearsYearsYears
Все как в примере, за исключением динамических переменных.
Код: You are not allowed to view links. Register or Login
DATA: ls_out_ono TYPE fiaa_salvtab_rabest,
      lt_out_ono TYPE TABLE OF fiaa_salvtab_rabest.
Код: You are not allowed to view links. Register or Login
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 естественно своими данными заполняю.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 656
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
rspar_tab естественно своими данными заполняю.
Есть у меня одно предположение, там есть такая вложенная структура CI_REPRABEST она у вас скорее всего пустая. Если это так дополните ее одним полем например ZZ_CHAR TYPE CHAR1 и перегенерируйте все.

Оффлайн Lyubov

  • Newbie
  • *
  • Сообщений: 6
  • Reputation Power: 0
  • Lyubov has no influence.
  • YearsYearsYearsYearsYears
Uukrul, добрый день!
Вы правы - структура CI_REPRABEST у меня была пустой. Но после добавления в нее поля, ошибка осталась.
Но теперь система говорит:
Цитировать
The length is 2 in the dataset, but 80 in the program.
Почему CI_REPRABEST не должна быть пустой? Пробовала задавать полю разные типы, но результат один.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 656
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Но теперь система говорит:Почему CI_REPRABEST не должна быть пустой? Пробовала задавать полю разные типы, но результат один.
Ну смотрим дальше, какой уровень стоит для SAP_BASIS, у меня версия 701 уровень 0013, на системе где это работает. По некоторым признакам, в более ранних версиях может не работать. Причина похоже в том, что внутри именно этой программы RABEST_ALV01, структура возврата параметров типа fiaa_salvtab_rabest, генерируется динамически. И похоже структура созданная динамически по типу fiaa_salvtab_rabest и переменная объявленная как TYPE fiaa_salvtab_rabest, получаются немного разными. Ключ игнорирования границ BOUNDARIES видно в более ранних версиях почему-то не помогает. Мне просто кто-то кажется уже рассказывал про такую же проблему. Причем если ключ убрать, то ошибка будет что-то типа проблема после 25 параметра, фактически это получается что первый инклуд в структуру уже не правильно конвертируется. В общем посмотрите на свой уровень базиса и если не сложно напишите.


Оффлайн Lyubov

  • Newbie
  • *
  • Сообщений: 6
  • Reputation Power: 0
  • Lyubov has no influence.
  • YearsYearsYearsYearsYears
Версия 731, уровень 0007

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 656
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Версия 731, уровень 0007
Прикольно.  А попробуйте с ключами команды IMPORT поиграться?

Оффлайн №1

  • Administrator
  • Jr. Member
  • *****
  • Сообщений: 632
  • Reputation Power: 1
  • №1 has no influence.
  • Пол: Мужской
  • Судьбы я вызов принимаю прямым пожатием руки
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Ну как бы по теме Note 448075 - Call of Asset Accounting reports with output in table
А вдруг?
Мой You are not allowed to view links. Register or Login

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 656
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Ну как бы по теме Note 448075 - Call of Asset Accounting reports with output in table
Для базиса от 7.0 и выше не катит, там даже текст другой уже, так что эту ноту применить не выйдет в данном случае.

Оффлайн №1

  • Administrator
  • Jr. Member
  • *****
  • Сообщений: 632
  • Reputation Power: 1
  • №1 has no influence.
  • Пол: Мужской
  • Судьбы я вызов принимаю прямым пожатием руки
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
You are not allowed to view links. Register or Login
Для базиса от 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
И пакетами это "счастье" не поставляется
« Последнее редактирование: Октябрь 02, 2013, 10:26:00 pm от №1 »
Мой You are not allowed to view links. Register or Login

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 656
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
И пакетами это "счастье" не поставляется
Протупил, однако... извините  :-\ как-то базис с апликейшеном перепутал. Но теперь что касается этой ноты, то еще она меня сбила с толку, так как я в коде у себя ковырялся и берем например первый модуль для корректировки: FUNCTION FIAA_ALV_DISPLAY, рекомендуется сделать следующее:
Код: You are not allowed to view links. Register or Login
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.

Но у меня этот блок уже выглядит вот так:
Код: You are not allowed to view links. Register or Login
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.
т.е. как видим я вообще не могу вставить себе этот кусок кода:
Код: You are not allowed to view links. Register or Login
* only output to table?
  if not tcollect-x_table_out is initial.
    export table from itab_header to memory id sy-cprog.
    exit.
  endif.
так как у меня там уже и так написано, но по другому.. а удалять типа нечего. Вот меня и перемкнуло, так как я в этом ФМ ковырялся когда дампы словил на передаче параметров. Ну и остальные корректуры у меня уже как бы или есть или снова не в тему получаются.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 656
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Версия 731, уровень 0007
Вышел новый пакет обновления: Support Package SAPK-60420INCCEE, поставили, проблема вроде как исправлена одной из нот в рамках этого пакета.