Автор Тема: Изменение функционала транзакции S_P99_41000062- Ведомость материалов  (Прочитано 10060 раз)

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

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Доброго времени суток уважаемые ММ-щики.

Вопрос такой: Отчёт, выдаваемый транзакцией S_P99_41000062 отображается только в валюте, которую выбирает пользователь на селекционном экране, т.е. либо 10-Валюта БЕ, либо 31-Валюта концерна, оценка концерна. Т.е. можно выбрать только одну валюту. Возникла необходимость отображения этого отчёта в обеих валютах, но на селекционном экране можно выбрать только одно из этих условий. Существует ли настройка изменения этой стандартной транзакции ? Можно конечно z-овский отчёт написать. но мне стало интересно можно ли изменить эту стандартную транзакцию ?

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Можно конечно z-овский отчёт написать. но мне стало интересно можно ли изменить эту стандартную транзакцию ?
Стандартно таких настроек нет, но сделать это используя технологию энхансментов можно.  Т.е. можно добавить параметр типа выбор второй валюты отчета, если он пустой, то работает чистый стандарт, если заполнен, то в районе кода RKKBMLMAT строка 594-597 система читает данные оценки и формирует выходную структуру данных E_T_OUT, в которую можно добавить дополнительные поля с оценкой во второй валюте и заполнить их данными по аналогии с тем как это делается для первой валюты.  Далее в строке 1104 формируется каталог полей для вывода, дописываем туда свои поля (ну если параметр второй валюты заполнен), чтобы лишнего не было  и имеем счастье увидеть в отчете вторую валюту. Неспешной работы на пару дней, ну и совместимость при разных обновлениях будет повыше чем писать свой Z-отчет.

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
В общем я не стал заморачиваться с энхансментами. Мне попалася под руки другая программа, где сделали  вызов одной программы из другой. Я по аналогии попытался сделать такой вызов из z селекционного экрана стандартной транзакции. Получилось что то типа
Код: You are not allowed to view links. Register or Login
submit rkkbmlmat with r_matnr in r_matnr with p_werks = p_werks with p_poper = p_poper
with p_bdatj = p_bdatj with p_curtp = '10 Валюта БЕ'
  exporting list to memory and return.


call function 'LIST_FROM_MEMORY'
  tables
    listobject = listtab
  exceptions
    not_found  = 1
    others     = 2.
if sy-subrc ne 0.
  message id sy-msgid type sy-msgty number sy-msgno
  with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.

call function 'LIST_TO_ASCI'
  tables
    listasci           = ascilistkzt
    listobject         = listtab
  exceptions
    empty_list         = 1
    list_index_invalid = 2
    others             = 3.
После обработки таблички ascilistkzt я опятьвызываю submit, но уже с второй валютой, валютой концерна. Возникла одна мелочь, которая мне не совсем понятна. Вроде бы банальный селект из физической таблички mara, но почему то селект проходит безрезультатно.
Код: You are not allowed to view links. Register or Login
*loop at itab.

  select single mtart from mara into  (itab-mtart) where matnr = itab-matnr.
  modify itab.
endloop.
Я не могу забрать из таблицы поле вид материала, оно вроде бы имеется в физической табличке, но почему то выборка не проходит. В отладчике смотрел поле внутренней таблички, в которой я собираю отчёт  itab-matnr заполняется, соответственно условие where должно срабатывать, но оно этого не делает. Вот мне и не понятно, то ли в таблице mara с этим полем что то не так и его просто так не забрать оттуда, либо я с абапом что то не так делаю. Может кто подскажет?
« Последнее редактирование: Апрель 24, 2017, 07:31:58 am от themax »

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Код: You are not allowed to view links. Register or Login
*loop at itab.
  select single mtart from mara into  (itab-mtart) where matnr = itab-matnr.
  modify itab.
endloop.
Я не могу забрать из таблицы поле вид материала, оно вроде бы имеется в физической табличке, но почему то выборка не проходит. В отладчике смотрел поле внутренней таблички, в которой я собираю отчёт  itab-matnr заполняется, соответственно условие where должно срабатывать, но оно этого не делает. Вот мне и не понятно, то ли в таблице mara с этим полем что то не так и его просто так не забрать оттуда, либо я с абапом что то не так делаю. Может кто подскажет?
Ну если запись с кодом материала есть, но не выбирается, тогда смотрите на значение в полях. Например если это цифровой код, то он должен быть дополнен нулями. Посмотрите в отладчике значение поля itab-matnr.

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
You are not allowed to view links. Register or Login
Ну если запись с кодом материала есть, но не выбирается, тогда смотрите на значение в полях. Например если это цифровой код, то он должен быть дополнен нулями. Посмотрите в отладчике значение поля itab-matnr.
А про нули то я совсем и забыл. Если в se11 смотреть табличку mara там к номеру материала добавляются нули, а в внутреннюю таблицу номер материала уже попадает без нулей. Спасибо, что напомнили про нули. Щас буду думать как с нулями с этими бороться.

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
В общем я сделал поле matnr типом n c количеством цифр таким же как и поле matnr в физической таблице mara. После этого выборка поля вида материала заработала, но появился ещё вопрос. В стандартной программе транзакции отчёт выходит в виде одного настроенного формата, который был установлен по умолчанию и отображается на селекционном экране. Теперь я пытаюсь сделать такой же формат у себя в транзакции, поставить его по умолчанию и передать в стандартную программу транзакции S_P99_41000062 через submit, но выходит как то не удобно, т.е. запускаю программу, заполняю поля на селекционном экране, но отчёт не запускается до тех пока я не выберу формат, при чём отчёт сразу запускается при выборе формата, т.е. без нажатия кнопочки часы и пока я не зайду в окно выбора формата и не выберу его отчёт не запускается. Толи я что то намудрил, толи лыжи не едут, чота не пойму как надо сделать правильно, чтобы отчёт просто запускался бы в формате, который используется и в стандартной программе транзакции S_P99_41000062. бы В общем часть кода, где срабатывает формат такая
Код: You are not allowed to view links. Register or Login
selection-screen skip 2.
select-options: r_matnr for  ckmlhd-matnr.

parameters:
            p_werks like mlkey-werks_ml_productive
                    obligatory
                    memory id wrk.

selection-screen skip 1.
** Periode
selection-screen begin of block parameter with frame title text-101.
parameters: p_poper like cki_doc_ml-sl_periode
                    memory id mlp,
            p_bdatj like ckmlrunplant-gjahr memory id mlj.
selection-screen end of block parameter.

parameters: p_alvdef like disvariant-variant.

" DATA: VARIANT like disvariant-variant.
  select single variant from ltdxd into p_alvdef where report = sy-cprog.
at selection-screen on value-request for p_alvdef.
  gs_alv_variant-report = sy-repid.
  call function 'REUSE_ALV_VARIANT_F4'
    exporting
      is_variant = gs_alv_variant
      i_save     = 'A'
    importing
      es_variant = gs_alv_variant
    exceptions
      not_found  = 2.
  if sy-subrc = 2.
    message id sy-msgid type 'S' number sy-msgno
            with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  else.
    p_alvdef = gs_alv_variant-variant.
  endif.
*
refresh listtab.
refresh listtabusd.
refresh ascilistkzt.
refresh ascilistusd.
submit rkkbmlmat with r_matnr in r_matnr with p_werks = p_werks with p_poper = p_poper
with p_bdatj = p_bdatj with p_curtp = '10 Валюта БЕ' with p_alvdef = p_alvdef
  exporting list to memory and return.



call function 'LIST_FROM_MEMORY'
  tables
    listobject = listtab
  exceptions
    not_found  = 1
    others     = 2.
if sy-subrc ne 0.
  message id sy-msgid type sy-msgty number sy-msgno
  with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.

call function 'LIST_TO_ASCI'
  tables
    listasci           = ascilistkzt
    listobject         = listtab
  exceptions
    empty_list         = 1
    list_index_invalid = 2
    others             = 3.
if sy-subrc <> 0.
  message id sy-msgid type sy-msgty number sy-msgno
  with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

endif.


Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
В общем я сделал поле matnr типом n c количеством цифр таким же как и поле matnr в физической таблице mara.
Это вы как-то хреново сделали, видимо про конвертацию/преобразование данных во внутреннее/внешнее представление, вы ничего не слышали, поэтому можете отгрести с таким решением дампов. В общем рекомендую только сегодня и только в нашем цирке, макрос
Код: You are not allowed to view links. Register or Login
DEFINE ext_to_int.
  call function 'CONVERSION_EXIT_ALPHA_INPUT'
    exporting
      input  = &1
    importing
      output = &2.
END-OF-DEFINITION.
Вызываете:
Код: You are not allowed to view links. Register or Login
ext_to_int: itab-matnr itab-matnr. И ваши программы станут белыми и пушистыми  8)

По поводу формата, может чуть позже посмотрю.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Ну такой код нормально отрабатывает без всяких вопросов, останавливается только на BREAK-POINT.
Код: You are not allowed to view links. Register or Login
REPORT z_submit_calls.
TABLES: ckmlhd, mlkey.
*--------------------------------------------------------------------------
*--------------------------------------------------------------------------
SELECT-OPTIONS: r_matnr FOR  ckmlhd-matnr.
PARAMETERS:     p_werks LIKE mlkey-werks_ml_productive OBLIGATORY MEMORY ID wrk,
                p_poper LIKE cki_doc_ml-sl_periode MEMORY ID mlp.


*--------------------------------------------------------------------------
*--------------------------------------------------------------------------
DATA: listtab     TYPE STANDARD TABLE OF abaplist,
      ascilistkzt TYPE STANDARD TABLE OF list_string_table.


*--------------------------------------------------------------------------
*--------------------------------------------------------------------------
SUBMIT rkkbmlmat WITH r_matnr IN r_matnr
                 WITH p_werks = p_werks
                 WITH p_poper = p_poper
                 WITH p_bdatj = sy-datum
                 WITH p_curtp = '10 Валюта БЕ'
                 EXPORTING LIST TO MEMORY AND RETURN.

REFRESH: listtab, ascilistkzt.

CALL FUNCTION 'LIST_FROM_MEMORY'
  TABLES
    listobject = listtab
  EXCEPTIONS
    not_found  = 1
    OTHERS     = 2.
IF sy-subrc NE 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

BREAK-POINT.

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
You are not allowed to view links. Register or Login
Ну такой код нормально отрабатывает без всяких вопросов, останавливается только на BREAK-POINT.
Код: You are not allowed to view links. Register or Login
REPORT z_submit_calls.
TABLES: ckmlhd, mlkey.
*--------------------------------------------------------------------------
*--------------------------------------------------------------------------
SELECT-OPTIONS: r_matnr FOR  ckmlhd-matnr.
PARAMETERS:     p_werks LIKE mlkey-werks_ml_productive OBLIGATORY MEMORY ID wrk,
                p_poper LIKE cki_doc_ml-sl_periode MEMORY ID mlp.


*--------------------------------------------------------------------------
*--------------------------------------------------------------------------
DATA: listtab     TYPE STANDARD TABLE OF abaplist,
      ascilistkzt TYPE STANDARD TABLE OF list_string_table.


*--------------------------------------------------------------------------
*--------------------------------------------------------------------------
SUBMIT rkkbmlmat WITH r_matnr IN r_matnr
                 WITH p_werks = p_werks
                 WITH p_poper = p_poper
                 WITH p_bdatj = sy-datum
                 WITH p_curtp = '10 Валюта БЕ'
                 EXPORTING LIST TO MEMORY AND RETURN.

REFRESH: listtab, ascilistkzt.

CALL FUNCTION 'LIST_FROM_MEMORY'
  TABLES
    listobject = listtab
  EXCEPTIONS
    not_found  = 1
    OTHERS     = 2.
IF sy-subrc NE 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

BREAK-POINT.
Без формата он у меня тоже отрабатывает нормально. Просто я хотел чтобы отрабатывался такой же формат, что и в стандартной транзакции. Там некоторые поля автосуммированы, сортировка. Хотел попробовать чтобы в поле формат z транзакции submit-ом потягивался формат из стандартной программы. Формат то подтягивается, но сам запуск отчёта происходит корявенько, только при выборе формата из диалогового окна, а это не есть правильно.

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Возник ещё один вопрос такой, как на селекционном экране parameters можно было бы автоматом проставить текущий период, т.е. месяц. С финансовым годом там вроде бы понятно, ставишь default sy-datum и он ставит по умолчанию на экран текущий год, а вот как быть с месяцем?

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
В общем сделал я следующее, объявил переменную datum (8) type d, затем переменной datum присвоил значение sy-datum. В общем как то так
Код: You are not allowed to view links. Register or Login
datum = sy-datum.
data: datum2(8) TYPE n,
      datum3(2) TYPE n.
CLEAR datum2.
move datum to datum2.
SHIFT datum2 RIGHT  by 2 PLACES.
SHIFT datum2 LEFT by 6 PLACES.
*condense datum2 no-gaps.
SHIFT datum2 RIGHT DELETING TRAILING space.

move datum2 to datum3.
В итоге у меня datum3 равен текущему периоду, но как мне передать его в parameters. Если бы это был select-options, то можно было бы через Inicialization, а там присвоить Period-low = ' ' и   period-high = ' ' значение поля datum3. А как быть с parameters в данном случае? Я пытаюсь передавать,

Код: You are not allowed to view links. Register or Login
parameters: p_poper like cki_doc_ml-sl_periode
                     obligatory DEFAULT datum3,

но ничего не передаётся. Как быть в данном случае?

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Хм...вроде бы разобрался. Надо было просто в блоке INITIALIZATION всё это дело сделать и передать в parameters, типа
Код: You are not allowed to view links. Register or Login
data: datum2(8) TYPE n,
      datum3(2) TYPE n.

selection-screen skip 2.
select-options: r_matnr for  ckmlhd-matnr obligatory,

                s_werks for  ekpo-werks
                    obligatory
                    memory id wrk.
*include rckm_par_bukrs_werks_ml_prod.
parameters:
            p_werks like mlkey-werks_ml_productive no-display.

selection-screen skip 1.
** Periode
selection-screen begin of block parameter with frame title text-101.
parameters: p_poper like cki_doc_ml-sl_periode
                     obligatory ,
*parameters: p_poper like cki_doc_ml-sl_periode
*                    memory id mlp obligatory DEFAULT datum2,
            p_bdatj like ckmlrunplant-gjahr memory id mlj obligatory default sy-datum.
selection-screen end of block parameter.

INITIALIZATION.
datum = sy-datum.

CLEAR datum2.
move datum to datum2.
SHIFT datum2 RIGHT  by 2 PLACES.
SHIFT datum2 LEFT by 6 PLACES.
*condense datum2 no-gaps.
SHIFT datum2 RIGHT DELETING TRAILING space.

move datum2 to datum3.
p_poper = datum3.
Я правда не знаю насколько я правильно тут написал, но период стал подтягиваться на селекционный экран.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Я просто фигею марь иванна, но таким извращенным образом я еще месяц из SY-DATUM не извлекал... В общем это

SY-DATUM(4) - Год
SY-DATUM+4(2) - Месяц
SY-DATUM6(2) - Число

В общем все уже придумали за нас, и гораздо проще.

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
You are not allowed to view links. Register or Login
Я просто фигею марь иванна, но таким извращенным образом я еще месяц из SY-DATUM не извлекал... В общем это

SY-DATUM(4) - Год
SY-DATUM+4(2) - Месяц
SY-DATUM6(2) - Число

В общем все уже придумали за нас, и гораздо проще.

Спасибо Uukrul. Буду в следующий раз пытаться обойтись без извращений.

Sapforum.Biz