Sapforum.Biz
Логистика => Управление материальными потоками (MM) => Тема начата: themax от Апрель 20, 2017, 08:22:38 am
-
Доброго времени суток уважаемые ММ-щики.
Вопрос такой: Отчёт, выдаваемый транзакцией S_P99_41000062 отображается только в валюте, которую выбирает пользователь на селекционном экране, т.е. либо 10-Валюта БЕ, либо 31-Валюта концерна, оценка концерна. Т.е. можно выбрать только одну валюту. Возникла необходимость отображения этого отчёта в обеих валютах, но на селекционном экране можно выбрать только одно из этих условий. Существует ли настройка изменения этой стандартной транзакции ? Можно конечно z-овский отчёт написать. но мне стало интересно можно ли изменить эту стандартную транзакцию ?
-
Можно конечно z-овский отчёт написать. но мне стало интересно можно ли изменить эту стандартную транзакцию ?
Стандартно таких настроек нет, но сделать это используя технологию энхансментов можно. Т.е. можно добавить параметр типа выбор второй валюты отчета, если он пустой, то работает чистый стандарт, если заполнен, то в районе кода RKKBMLMAT строка 594-597 система читает данные оценки и формирует выходную структуру данных E_T_OUT, в которую можно добавить дополнительные поля с оценкой во второй валюте и заполнить их данными по аналогии с тем как это делается для первой валюты. Далее в строке 1104 формируется каталог полей для вывода, дописываем туда свои поля (ну если параметр второй валюты заполнен), чтобы лишнего не было и имеем счастье увидеть в отчете вторую валюту. Неспешной работы на пару дней, ну и совместимость при разных обновлениях будет повыше чем писать свой Z-отчет.
-
В общем я не стал заморачиваться с энхансментами. Мне попалася под руки другая программа, где сделали вызов одной программы из другой. Я по аналогии попытался сделать такой вызов из z селекционного экрана стандартной транзакции. Получилось что то типа
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, но почему то селект проходит безрезультатно. *loop at itab.
select single mtart from mara into (itab-mtart) where matnr = itab-matnr.
modify itab.
endloop.
Я не могу забрать из таблицы поле вид материала, оно вроде бы имеется в физической табличке, но почему то выборка не проходит. В отладчике смотрел поле внутренней таблички, в которой я собираю отчёт itab-matnr заполняется, соответственно условие where должно срабатывать, но оно этого не делает. Вот мне и не понятно, то ли в таблице mara с этим полем что то не так и его просто так не забрать оттуда, либо я с абапом что то не так делаю. Может кто подскажет?
-
*loop at itab.
select single mtart from mara into (itab-mtart) where matnr = itab-matnr.
modify itab.
endloop.
Я не могу забрать из таблицы поле вид материала, оно вроде бы имеется в физической табличке, но почему то выборка не проходит. В отладчике смотрел поле внутренней таблички, в которой я собираю отчёт itab-matnr заполняется, соответственно условие where должно срабатывать, но оно этого не делает. Вот мне и не понятно, то ли в таблице mara с этим полем что то не так и его просто так не забрать оттуда, либо я с абапом что то не так делаю. Может кто подскажет?
Ну если запись с кодом материала есть, но не выбирается, тогда смотрите на значение в полях. Например если это цифровой код, то он должен быть дополнен нулями. Посмотрите в отладчике значение поля itab-matnr.
-
Ну если запись с кодом материала есть, но не выбирается, тогда смотрите на значение в полях. Например если это цифровой код, то он должен быть дополнен нулями. Посмотрите в отладчике значение поля itab-matnr.
А про нули то я совсем и забыл. Если в se11 смотреть табличку mara там к номеру материала добавляются нули, а в внутреннюю таблицу номер материала уже попадает без нулей. Спасибо, что напомнили про нули. Щас буду думать как с нулями с этими бороться.
-
В общем я сделал поле matnr типом n c количеством цифр таким же как и поле matnr в физической таблице mara. После этого выборка поля вида материала заработала, но появился ещё вопрос. В стандартной программе транзакции отчёт выходит в виде одного настроенного формата, который был установлен по умолчанию и отображается на селекционном экране. Теперь я пытаюсь сделать такой же формат у себя в транзакции, поставить его по умолчанию и передать в стандартную программу транзакции S_P99_41000062 через submit, но выходит как то не удобно, т.е. запускаю программу, заполняю поля на селекционном экране, но отчёт не запускается до тех пока я не выберу формат, при чём отчёт сразу запускается при выборе формата, т.е. без нажатия кнопочки часы и пока я не зайду в окно выбора формата и не выберу его отчёт не запускается. Толи я что то намудрил, толи лыжи не едут, чота не пойму как надо сделать правильно, чтобы отчёт просто запускался бы в формате, который используется и в стандартной программе транзакции S_P99_41000062. бы В общем часть кода, где срабатывает формат такая
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.
-
В общем я сделал поле matnr типом n c количеством цифр таким же как и поле matnr в физической таблице mara.
Это вы как-то хреново сделали, видимо про конвертацию/преобразование данных во внутреннее/внешнее представление, вы ничего не слышали, поэтому можете отгрести с таким решением дампов. В общем рекомендую только сегодня и только в нашем цирке, макрос
DEFINE ext_to_int.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input = &1
importing
output = &2.
END-OF-DEFINITION.
Вызываете:
ext_to_int: itab-matnr itab-matnr.
И ваши программы станут белыми и пушистыми 8)
По поводу формата, может чуть позже посмотрю.
-
Ну такой код нормально отрабатывает без всяких вопросов, останавливается только на BREAK-POINT.
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.
-
Ну такой код нормально отрабатывает без всяких вопросов, останавливается только на BREAK-POINT.
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-ом потягивался формат из стандартной программы. Формат то подтягивается, но сам запуск отчёта происходит корявенько, только при выборе формата из диалогового окна, а это не есть правильно.
-
Возник ещё один вопрос такой, как на селекционном экране parameters можно было бы автоматом проставить текущий период, т.е. месяц. С финансовым годом там вроде бы понятно, ставишь default sy-datum и он ставит по умолчанию на экран текущий год, а вот как быть с месяцем?
-
В общем сделал я следующее, объявил переменную datum (8) type d, затем переменной datum присвоил значение sy-datum. В общем как то так
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 в данном случае? Я пытаюсь передавать,
parameters: p_poper like cki_doc_ml-sl_periode
obligatory DEFAULT datum3,
но ничего не передаётся. Как быть в данном случае?
-
Хм...вроде бы разобрался. Надо было просто в блоке INITIALIZATION всё это дело сделать и передать в parameters, типа
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.
Я правда не знаю насколько я правильно тут написал, но период стал подтягиваться на селекционный экран.
-
Я просто фигею марь иванна, но таким извращенным образом я еще месяц из SY-DATUM не извлекал... В общем это
SY-DATUM(4) - Год
SY-DATUM+4(2) - Месяц
SY-DATUM6(2) - Число
В общем все уже придумали за нас, и гораздо проще.
-
Я просто фигею марь иванна, но таким извращенным образом я еще месяц из SY-DATUM не извлекал... В общем это
SY-DATUM(4) - Год
SY-DATUM+4(2) - Месяц
SY-DATUM6(2) - Число
В общем все уже придумали за нас, и гораздо проще.
Спасибо Uukrul. Буду в следующий раз пытаться обойтись без извращений.