Sapforum.Biz
Инструменты => SE38 - ABAP Редактор => ABAP - Инструментальные средства => Технологии написания программ на ABAP => Тема начата: Uukrul от Май 20, 2011, 01:46:30 pm
-
В общем в различных отчетах приходится иногда давать пользователю возможность перейти к просмотру документа стандартной транзакцией, например для документа материала это будет или MB03 или MIGO в режиме просмотра. Тут предлагается выложить варианты перехода к просмотру, так как не всегда это бывает очевидно, особенно в энжой-транзакциях.
Документ материала, транзакция MIGO. Переход к просмотру документа:
CALL FUNCTION 'MIGO_DIALOG'
EXPORTING
i_mblnr = mblnr "Номер документа
i_mjahr = mjahr "Год документа
EXCEPTIONS
illegal_combination = 1
OTHERS = 2.
Просмотр документа FI
SET PARAMETER ID 'BLN' FIELD belnr. "Номер документа
SET PARAMETER ID 'BUK' FIELD bukrs. "Код БЕ
SET PARAMETER ID 'GJR' FIELD gjahr. "Год документа
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
Просмотр документа отпуска на основные средства, если есть документ движения материала
DATA: ls_anla LIKE anla,
l_aworg LIKE anek-aworg.
ls_anla-anln1 = '*'.
l_aworg = mjahr. "Год документа движения материала
CALL FUNCTION 'AM_SHOW_DOCUMENT'
EXPORTING
i_anla = ls_anla
i_gjahr = '0000'
i_awtyp = 'MKPF'
i_awsys = ps_matnr-awsys
i_aworg = l_aworg
i_belnr = mblnr "Номер документа движения материала
EXCEPTIONS
not_found = 01.
Документ управления бюджета FM
DATA: ls_control_data TYPE fmfi_control_data.
CALL FUNCTION 'FMCA_GET_INIT_INFO'
EXPORTING
i_bukrs = bukrs_fb "Код БЕ для которой будет выполнен просмотр
CHANGING
c_f_control_data = ls_control_data.
SET PARAMETER ID 'FIK' FIELD ls_control_data-fikrs.
SET PARAMETER ID 'FMB' FIELD belnr_fb. "Номер документа FM
CALL TRANSACTION 'FM03' AND SKIP FIRST SCREEN.
Просмотр документа СО
SET PARAMETER ID 'BLN' FIELD belnr_co. "Номер документа СО
SET PARAMETER ID 'CAC' FIELD bukrs_co. "БЕ документа СО
SET PARAMETER ID 'TPB' FIELD '0'.
CALL TRANSACTION 'KSB5' AND SKIP FIRST SCREEN.
-
*Для входящей поставки
SET PARAMETER ID 'VLM' FIELD vbeln.
CALL TRANSACTION 'VL33N' AND SKIP FIRST SCREEN.
*Для исходящей
SET PARAMETER ID 'VL' FIELD vbeln.
CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN.
* Для заказа
SET PARAMETER ID 'BES' FIELD ebeln.
CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.
Общий принцип заходим в тр смотрим, какие параметры просит для просмотра документа (f1 на поле и название "ID SET/GET Parametr") и пишем их
-
Общий принцип заходим в тр смотрим, какие параметры просит для просмотра документа (f1 на поле и название "ID SET/GET Parametr") и пишем их
Ну общий принцип к сожалению не всегда срабатывает сейчас, так что опыт приветствуется.
-
*&---------------------------------------------------------------------*
*& Form ALV_HOTSPOT_CLICK
*&---------------------------------------------------------------------*
FORM alv_hotspot_click USING p_row_id TYPE lvc_s_row
p_col_id TYPE lvc_s_col.
DATA: ls TYPE t_main.
READ TABLE gt_main INTO ls INDEX p_row_id-index.
CHECK sy-subrc = 0.
CASE p_col_id-fieldname.
WHEN 'VBELN_VA'. " заказ
CHECK ls-vbeln_va IS NOT INITIAL.
CASE ls-vgtyp.
WHEN 'V'. " PO
SET PARAMETER ID 'BES' FIELD ls-vbeln_va.
CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.
WHEN OTHERS. " SO
SET PARAMETER ID 'AUN' FIELD ls-vbeln_va.
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
ENDCASE.
WHEN 'VBELN_VL'. " поставка
CHECK ls-vbeln_vl IS NOT INITIAL.
CASE ls-abfer.
WHEN '2'. " входящая
SET PARAMETER ID 'VLM' FIELD ls-vbeln_vl. " or 'VLG'
CALL TRANSACTION 'VL33N' AND SKIP FIRST SCREEN.
WHEN OTHERS. " исходящая
SET PARAMETER ID 'VL' FIELD ls-vbeln_vl.
CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN.
ENDCASE.
WHEN 'TKNUM'. " транспортировка
CHECK ls-tknum IS NOT INITIAL.
SET PARAMETER ID 'TNR' FIELD ls-tknum.
CALL TRANSACTION 'VT03N' AND SKIP FIRST SCREEN.
WHEN 'VBELN_VF'. " фактура
CHECK ls-vbeln_vf IS NOT INITIAL.
CASE ls-abfer.
WHEN '2'. " входящая
CHECK ls-gjahr IS NOT INITIAL.
SET PARAMETER ID 'RBN' FIELD ls-vbeln_vf.
SET PARAMETER ID 'GJR' FIELD ls-gjahr.
CALL TRANSACTION 'MIR4' AND SKIP FIRST SCREEN.
WHEN OTHERS. " исходящая
SET PARAMETER ID 'VF' FIELD ls-vbeln_vf.
CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN.
ENDCASE.
WHEN 'BELNR'. " FI-документ (фактура)
CHECK ls-bukrs IS NOT INITIAL
AND ls-belnr IS NOT INITIAL
AND ls-gjahr IS NOT INITIAL.
SET PARAMETER ID 'BUK' FIELD ls-bukrs.
SET PARAMETER ID 'BLN' FIELD ls-belnr.
SET PARAMETER ID 'GJR' FIELD ls-gjahr.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
WHEN 'SUBMI'. " групповой №
CHECK ls-submi IS NOT INITIAL.
SET PARAMETER ID 'BES' FIELD ls-submi.
CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.
ENDCASE.
ENDFORM. " ALV_HOTSPOT_CLICK
-
SET PARAMETER ID 'BES' FIELD ls-submi.
CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.
Для заказа ММ внутри SAP делает чуть более кошерный вызов заказа ММ, типа так:
SET PARAMETER ID 'BES' FIELD hidk-ebeln.
CALL FUNCTION 'ME_DISPLAY_PURCHASE_DOCUMENT'
EXPORTING
i_ebeln = hidk-ebeln
i_ebelp = hidp-ebelp
i_enjoy = 'X'
EXCEPTIONS
OTHERS = 1.
* Если таки ошибка.. то вывести ее так...
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
Данный вызов, сразу позволяет открыть для просмотра не только заказ, но и требуемую позицию заказа в нижней закладке подробно.
-
EBELP ;)
Ну тогда дожму... для просмотра заявок на закупку, использовать следующий код:
CALL FUNCTION 'MMPUR_REQUISITION_DISPLAY'
EXPORTING
im_banfn = eban-banfn
im_bnfpo = eban-bnfpo
im_display_only = 'X'
EXCEPTIONS
no_authority = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
Заметь табличку заявок не я так назвал ::)
-
Да, норм., лучше ещё в минимакрос обернуть вот это:
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
-
Т.е. создать ряд постоянных процедур в своём INCLUDE. И юзать постоянно их... ;)
-
Просмотр документа резервирования материала. Просмотреть сам документ резервирования довольно просто.
SET PARAMETER ID 'RES' FIELD x-rsnum.
CALL TRANSACTION 'MB23' AND SKIP FIRST SCREEN.
Более сложная задача оказалась, когда потребовалось при просмотре перейти с детальному экрану позиции резервирования. При просмотре экрана оказалось оказалось что поле ввода позиции присутствует и есть параметр для задания номера просматриваемой позиции - RPO.
SET PARAMETER ID 'RES' FIELD x-rsnum..
SET PARAMETER ID 'RPO' FIELD x-rspos.
CALL TRANSACTION 'MB23' AND SKIP FIRST SCREEN.
В довесок походив по коду, обнаружил интересную вещь, оказалось можно задать просмотр например группы позиций, причем последовательность может включать в себя как позиции одного резервирования так и позиции разных резервирований. При этом на экране просмотра появляются стрелки навигации по позициям. Для этого необходимо заполнить специальную структуру документов и позиций и передать ее через специальный параметр.
DATA: BEGIN OF seltab1 OCCURS 0,
rsnum LIKE rkpf-rsnum,
rspos LIKE resb-rspos,
rsart LIKE resb-rsart,
xexpl,
END OF seltab1.
* Позиции документов для просмотра подробно
CLEAR: seltab1[].
seltab1-rsnum = <документ>.
seltab1-rspos = <позиция документа>.
APPEND seltab1.
seltab1-rsnum = <документ>.
seltab1-rspos = <позиция документа>.
APPEND seltab1.
* Передать список позиций в память.
EXPORT seltab1 TO MEMORY ID 'MB23_SELTAB'.
* Задать первую позицию, которая будет показана при вызове
SET PARAMETER ID 'RES' FIELD x-rsnum.
SET PARAMETER ID 'RPO' FIELD x-rspos.
CALL TRANSACTION 'MB23' AND SKIP FIRST SCREEN.
При таком вызове на экране, в строке статуса, будут выведены кнопки навигации, рисунок MB23LIST.png
(http://sapforum.biz/index.php?action=dlattach;topic=1664.0;attach=3878;image)
-
Просмотр технологических заказов. Казалось бы все очень просто, есть поле, есть параметр, пример на картинке COR3.png и все работает. А оказалось не все так просто. Не знаю с какого бодуна, но разработчикам было глубоко пофигу что там за код параметра указан в поле. Мы типа и сами знаем что и как надо, поэтому в PBO-коде экрана 5110, неведомые пацаны абаперы добавили такой вот код
* Lesen GET_PARAMETER von Einsatzplanung (Читайте GET_PARAMETER календарного планирования)
module get_parameter.
Поэтому внутри такое:
if caufvd-aufnr is initial.
get parameter id 'BR1' field *caufvd-aufnr.
if not *caufvd-aufnr is initial.
caufvd-aufnr = *caufvd-aufnr.
endif.
endif.
Так что правильный вызов просмотра технологического заказа будет такой:
SET PARAMETER ID 'BR1' FIELD l_aufnr.
CALL TRANSACTION 'COR3' AND SKIP FIRST SCREEN.
Не ну нам, приближенным к абаперам, то в принципе не сложно посмотреть что читать надо "GET_PARAMETER календарного планирования", но другим то что делать? Шалуны однако эти абаперы.
-
Вобщем - понадобилось мне однажды сделать из Z-отчета проваливание в CO документ (тот что в табл. COBK/COEP).
Посмотрел как реализовано проваливание в него стандартом, и заодно нарыл интересный ФМ.
CALL FUNCTION 'DRB_OBJECT_DISPLAY'
EXPORTING
i_boridein = z_borident
TABLES
t_messages = t_messages.
i_boridein - запись, содержит 2 поля - ключ i_boridein-objkey и тип объекта i_boridein-objtype.
Для CO документа было так
i_boridein-objkey = KOKRS + BELNR
i_boridein-objtype = 'BUS2072'.
Но вот что интересно - если поставить другой тип объекта и его ключ - все равно будет работать.
Проверил на заказе на поставку BUS2012, материале BUS1001 - работает.
На других не пробовал, но предполагаю что сработает :)
Единственное но - несмотря на то что t_messages не обязательна, при неуказании этого параметра почему то происходит выбивание текущего режима :(
-
Business Object смотреть в SWO4.
В ключ вставлять значения во внутреннем формате полей ключа.
-
Хорошая штука DRB_OBJECT_DISPLAY оказалась.
Отображает все логистические документы, которые мне нужно было вывести.
Ну и не только логистические.
-
Просмотр ракурса закупки для основной записи материала 'MMPUR_MATERIAL_DISPLAY
CALL FUNCTION 'MMPUR_MATERIAL_DISPLAY'
EXPORTING
im_matnr = cs_appref-mm_matnr
im_werks = cs_appref-mm_werks
im_lgort = cs_appref-mm_lgort.
По параметрам все вроде как просто, передали код ОЗМ, завод и склад, последние два параметра не обязательны и система перейдет к просмотру карточки ОЗМ, ракурс закупки, по факту будет вызвана MM03 с предварительной проверкой полномочий.
-
Документ счет-факутура логистики, транзакции MIRO и MIR4, доступны два варианта.
Вывод через вызов CALL TRANSACTION
SET PARAMETER ID 'RBN' FIELD ls_data_miro-belnr. "Номер документа счета логистки
SET PARAMETER ID 'GJR' FIELD ls_data_miro-gjahr. "Год документа счета логистики
CALL TRANSACTION 'MIR4' AND SKIP FIRST SCREEN.
И второй вариант через функциональный модуль DRB_OBJECT_DISPLAY, таки нужно передавать тип объекта, так как без этого, только ключа не достаточно
DATA: z_borident TYPE BORIDENT.
z_borident-OBJTYPE = 'BUS2081'.
CONCATENATE ls_data_miro-belnr ls_data_miro-gjahr INTO z_borident-OBJKEY.
CALL FUNCTION 'DRB_OBJECT_DISPLAY'
EXPORTING
i_boridein = z_borident
TABLES
t_messages = t_messages.
-
Вроде не было еще:
Понадобилось провалиться сразу в строку FI документа, подобно как в транзакции FBL5N
set parameter id:
'BLN' field belnr, "Номер документа
'BUK' field bukrs, "Номер документа
'GJR' field gjahr, "Год документа
'BUZ' field buzei. "Позиция документа
call transaction 'FB09D' and skip first screen.
-
Просмотр документа резервирования средств FM
CALL FUNCTION 'FMFR_RESERVATION_TRANSACTION'
EXPORTING
i_activity = '03'
i_belnr = l_belnr
EXCEPTIONS
doctype_not_found = 1
activity_not_found = 2
document_not_found = 3
OTHERS = 4.
Полезный модуль, можно как просмотреть документ так его отредактировать или создать. Управляет этим делом параметр I_ACTIVITY, в общем то, стандартный набор 01 - создать, 02 - изменить, тогда надо заполнить номер документа и 03 - просмотреть. Самое интересное что стандартно через CALL TRANSACTION для транзакции FMX3 - просмотр, работать не будет. Они внутри кода глубоко забили на SET/GET параметры номера документа.
-
Просмотр документа DMS (транзакции CV01N / CV02N / CV03N). В общем-то как говорит SAP, данный модуль типа не очень актуален, но как по мне, вполне еще живой, вот пришлось тут на днях рисовать такой переход:
SET PARAMETER ID 'CV1' FIELD ls_ekko-doknr. "Тип документа
SET PARAMETER ID 'CV2' FIELD ls_ekko-dokar. "Номер документа
SET PARAMETER ID 'CV3' FIELD ls_ekko-dokvr. "Версія документа
SET PARAMETER ID 'CV4' FIELD ls_ekko-doktl. "Часть документа
CALL TRANSACTION 'CV03N' AND SKIP FIRST SCREEN.
-
Хорошая штука DRB_OBJECT_DISPLAY оказалась.
В общем просмотр некоторых документов используя данную функцию, действительно вещь полезная 8):
Документы поставки сбыта
ls_borident-objtype = 'LIKP'.
ls_borident-objkey = ls_data-vbeln.
CALL FUNCTION 'DRB_OBJECT_DISPLAY'
EXPORTING
i_borident = ls_borident
TABLES
t_messages = lt_messages.
Контролинговые CO-заказы
ls_borident-objtype = 'BUS2075'.
ls_borident-objkey = ls_data-aufnr.
CALL FUNCTION 'DRB_OBJECT_DISPLAY'
EXPORTING
i_borident = ls_borident
TABLES
t_messages = lt_messages.
Заказы сбыта
ext_to_int: ls_data-vgbel ls_data-vgbel.
ls_borident-objtype = 'BUS2032'.
ls_borident-objkey = ls_data-vgbel.
CALL FUNCTION 'DRB_OBJECT_DISPLAY'
EXPORTING
i_borident = ls_borident
TABLES
t_messages = lt_messages.
-
Подогнали пример работы с бизнес-партнером, еслни нужно вызвать транзакцию «BP» с определенной балансовой единицей, как это сделать? Чтобы решить вопрос, нужно использовать класс CL_BUPA_DIALOG_JOEL и его метод START_WITH_NAVIGATION. Ниже приведен код, как это сделать.
CONSTANTS:
gc_activity_create TYPE bu_aktyp VALUE '01',
gc_activity_change TYPE bu_aktyp VALUE '02',
gc_activity_display TYPE bu_aktyp VALUE '03'.
PARAMETERS: p_bp TYPE bu_partner.
PARAMETERS: p_cc TYPE bukrs.
START-OF-SELECTION.
PERFORM open_bp USING p_bp p_cc gc_activity_change.
FORM open_bp
USING
iv_bp TYPE bu_partner
iv_cc TYPE bukrs
iv_activity TYPE bu_aktyp.
DATA:
ls_role TYPE bus_roles.
" need to set it as a parameter
" so that it's read in the Company Code subscreen
SET PARAMETER ID 'BUK' FIELD iv_cc.
" create new request
DATA(lo_request) = NEW cl_bupa_navigation_request( ).
" open request with selected partner number
lo_request->set_partner_number( iv_bp ).
" set the activity you want the user to start the maintenance with
lo_request->set_bupa_activity( iv_activity ). " 01 - Create, 02 - Change, 03 - Display
" change the role of the BP to the desired one
" together with the sub header id
ls_role-role = 'FS0000'.
lo_request->set_bupa_partner_role( ls_role ).
lo_request->set_bupa_sub_header_id( 'FS0001' ).
" display general data by default
lo_request->set_maintenance_id( 'B' ). " B - Partner
" set start-up options
DATA(lo_options) = NEW cl_bupa_dialog_joel_options( ).
" start the transaction with an invisible locator
lo_options->set_locator_visible( space ).
" open New BDT Instance for display of selected partner
CALL METHOD cl_bupa_dialog_joel=>start_with_navigation
EXPORTING
iv_request = lo_request
iv_options = lo_options
iv_in_new_internal_mode = abap_true
EXCEPTIONS
already_started = 1
not_allowed = 2
OTHERS = 3.
ENDFORM.
Оригинал примера взят отсюда: https://answers.sap.com/questions/13048785/call-transaction-bp-with-specific-customer-code.html