Tuesday, August 23, 2016

BADI - Adding a Tab in ME21N

Introduction:  
The requirement is to add below screen fields in the ME21N, ME22N, ME23N (Header Section) …New tab called “Other Data” using a BADI.  
 
Step by step procedure:  
First, add the new fields required in the extension structure for EKKO table (CI_EKKODB). These fields will reflect in the new tab which we are going create in the ME21N screen.  
Now, Implement the 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.
Here, parameter ‘im_element’ is defined as ‘HEADER’ as we are adding new tab in header section of PO.  
Define a function group and take the main program and define it in ls_subscriber-program.
Also define a sub screen with the required fields and assign it to the parameter 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.  
Then we have to implement one more BADI to display the tab and update the values.
Implement the BADI ME_PROCESS_PO_CUST. This cannot be used multiple times.  
In this, we have methods (PROCESS_HEADER,PROCESS_ITEM).if we need to any validations for the fields we can write the logic here in this methods. In my case I need to check for the document type which I implemented in the method (PROCESS_HEADER).  
FIELDSELECTION_HEADER: I have implemented this method as my requirement is to show the fields for particular document types only.  
Final output:  

1 comment:

  1. hi,may i know how you have declared "subscreen1" in ls_subsciber?
    the name is a unique identifier for the subscreen and defined in this class definition
    ls_subscriber-name = subscreen1.

    ReplyDelete