Você está na página 1de 4

Guia passo a passo sobre como adicionar uma nova guia em ME21N

usando um BADI
Por Krishna Chaitanya Gogineni, Deloitte Consulting

Introdução:  

A exigência é a de adicionar campos abaixo tela no ME21N, ME22N, ME23N (cabeçalho da seção) ...
nova guia chamada "Outros Dados", usando uma BADI.  

Procedimento passo a passo:  

Primeiro, adicione os novos campos necessários na estrutura de extensão para EKKO tabela
(CI_EKKODB). Estes campos se refletem na nova aba que vamos criar na tela ME21N.  

Agora, implementar a BADI (ME_GUI_PO_CUST).  

First method: SUBSCRIBE  

DATA: ls_subscriber LIKE LINE OF re_subscribers.


* we want to add a customer subscreen on the Header tab
CHECK im_application = 'PO'.
CHECK im_element = 'HEADER'.
* each line in re_subscribers generates a subscreen. We add one subscreen in this example
CLEAR re_subscribers[].
* the name is a unique identifier for the subscreen and defined in this class definition
ls_subscriber-name = subscreen1.
* the dynpro number to use
ls_subscriber-dynpro = '0001'.
* the program where the dynpro can be found
ls_subscriber-program = 'SAPLZKMMM_KAU86037'.
* each subscreen needs his own DDIC-Structure
ls_subscriber-struct_name = 'CI_EKKODB'.
* a label can be defined
ls_subscriber-label = text-001.
* the position within the tabstrib can be defined
ls_subscriber-position = 13.
* the height of the screen can be defined here. Currently we suport two screen sizes:
* value <= 7 a sevel line subscreen
* value > 7 a 16 line subscreen
ls_subscriber-height = 7.
APPEND ls_subscriber TO re_subscribers.

Aqui, 'im_element "parâmetro é definido como" cabeçalho "pois estamos adicionando nova aba na

secção de cabeçalho do PO.  

Definir um grupo de funções e assumir o programa principal e defini-la no programa ls_subscriber.

Também definir um ecrã secundário com os campos obrigatórios e atribuí-lo ao parâmetro ls_subscriber
dynpro.  

Then method MAP_DYNPRO_FIELDS  

FIELD-SYMBOLS: <mapping> LIKE LINE OF ch_mapping.


LOOP AT ch_mapping ASSIGNING <mapping>.
CASE <mapping>-fieldname.
WHEN 'ZZPAYMENT_AGRE'. <mapping>-metafield = mmmfd_cust_03.
WHEN 'ZZPROJECT'. <mapping>-metafield = mmmfd_cust_04.
ENDCASE.
ENDLOOP.  

TRANSPORT_FROM_MODEL:

DATA: l_header TYPE REF TO if_purchase_order_mm,


ls_mepoheader TYPE mepoheader,
ls_customer TYPE CI_EKKODB.
*--------------------------------------------------------------------*
* system asks to transport data from the business logic into the view
*--------------------------------------------------------------------*
CASE im_name.
WHEN subscreen1.
* is it an Header? im_model can be header or item.
mmpur_dynamic_cast l_header im_model.
CHECK NOT l_header IS INITIAL.
* transport standard fields
ls_mepoheader = l_header->get_data( ).
* store info for later use
MOVE-CORRESPONDING ls_mepoheader TO dynp_data_pbo.
WHEN OTHERS.
* ...
ENDCASE.    

TRANSPORT_TO_DYNP:

Define a FM 'ZK_KAU86037_PUSH' to push the values.


CASE im_name.
WHEN subscreen1.
CALL FUNCTION 'ZK_KAU86037_PUSH'
EXPORTING
im_dynp_data = dynp_data_pbo.
WHEN OTHERS.
ENDCASE.    

TRANSPORT_FROM_DYNP:

Define another FM 'ZK_KAU86037_POP'.


CASE im_name.
WHEN subscreen1.
CALL FUNCTION 'ZK_KAU86037_POP'
IMPORTING
ex_dynp_data = dynp_data_pai.
IF dynp_data_pai NE dynp_data_pbo.
* something has changed therefore we have to notify the framework
* to transport data to the model
re_changed = mmpur_yes.
ENDIF.
WHEN OTHERS.
ENDCASE.  

TRANSPORT_TO_MODEL:

DATA: l_header TYPE REF TO if_purchase_order_mm,


ls_mepoheader TYPE mepoheader,
ls_customer TYPE CI_EKKODB,
l_po_header_handle TYPE REF TO cl_po_header_handle_mm.
*--------------------------------------------------------------------*
* data have to be transported to business logic
*--------------------------------------------------------------------*
CASE im_name.
WHEN subscreen1.
* is it an item? im_model can be header or item.
mmpur_dynamic_cast l_header im_model.
CHECK NOT l_header IS INITIAL.
ls_mepoheader = l_header->get_data( ).
* standard fields changed?
IF dynp_data_pbo-zzpayment_agre NE dynp_data_pai-zzpayment_agre
OR dynp_data_pbo-zzproject NE dynp_data_pai-zzproject.
* update standard fields
ls_mepoheader-zzpayment_agre = dynp_data_pai-zzpayment_agre.
ls_mepoheader-zzproject = dynp_data_pai-zzproject.
CALL METHOD l_header->set_data
EXPORTING
im_data = ls_mepoheader.
ENDIF.
WHEN OTHERS.
ENDCASE.  

Depois, temos de implementar mais um BADI para exibir a guia e atualizar os valores.

Implementar o BADI ME_PROCESS_PO_CUST. Este não pode ser utilizado várias vezes puder.  

Neste, temos os métodos (PROCESS_HEADER, PROCESS_ITEM). Se nós precisamos de qualquer


validação para os campos, podemos escrever a lógica aqui neste métodos. No meu caso eu preciso
verificar o tipo de documento que eu implementada no método (PROCESS_HEADER).  
FIELDSELECTION_HEADER: eu implementei esse método como a minha obrigação é mostrar os
campos para os tipos de documento em particular.  

Resultado final:  

Você também pode gostar