miércoles, 4 de junio de 2014

Añadir pestañas a la transacción ME21N

Vamos a explicar como añadir pestañas a las transacciones de creación/modificación del pedidos de compra (ME21N, ME22N, ME23N).

Para implementar una nueva pestaña debemos de crearnos una copia del grupo de funciones  MEPOBADIEX. En el grupo de funciones que nos creemos debemos declarar la dynpro que vamos a utilizar para la nueva pestaña. Además utilizaremos las funciones de este grupo para introducir toda la lógica necesario para tratar los datos que se muevan en esta nueva pestaña.
La dynpro la debemos declarar como subscreen:
 
 
Además los campos que añadamos en la subscreen los tomaremos de la estructura que hemos utilizado para el APPEND a la tabla EKKO o EKPO.
Además deberemos implementar la BADI ME_GUI_PO_CUST. En los métodos de esta BADI definiremos la nueva pestaña y utilizaremos sus métodos para tratar el flujo de datos para la nueva pestaña.
A continuación se muestra un ejemplo del código utilizado en el grupo de funciones ZMEPOBADIEX.
-          ZMEPOBADIEX_GET_DATA
  CLEAR ex_data.

  
CHECK NOT im_ebeln IS INITIAL.

* Recuperamos los registros de la tabla EKKO
  
SELECT SINGLE zekko1 zekko2 zekko3 zekko4 zekko5   INTO CORRESPONDING FIELDS OF ex_data
  
FROM ekko
  
WHERE ebeln im_ebeln.

  
INSERT ex_data INTO TABLE gt_data.
-          ZMEPOBADIEX_INIT
CLEARgt_persistent_data[]gt_data[].
-          ZMEPOBADIEX _POP
* get dynpro data
  ex_dynp_data 
zekko.
-          ZMEPOBADIEX _POST
  DATAls_data LIKE LINE OF gt_data,
        lt_data_new 
TYPE STANDARD TABLE OF zekko,
        lt_data_old 
TYPE STANDARD TABLE OF zekko.

* prepare customers data for posting

  
CHECK NOT im_ebeln IS INITIAL.

  lt_data_new[] 
gt_data.
  lt_data_old[] 
gt_persistent_data.
-          ZMEPOBADIEX _ PUSH
zekko im_dynp_data.
A continuación se muestra un ejemplo del código utilizado la clase ZCL_IM_ME_GUI_PO_CUST. Se han modificado los siguientes métodos:
-          IF_EX_ME_GUI_PO_CUST~SUBSCRIBE

  DATAls_subscribe LIKE LINE OF re_subscribers.

  
CHECK im_application 'PO'.
  
CHECK im_element     'HEADER'.

  
CLEAR re_subscribers[].

  ls_subscribe
-name 'SCREEN_V'.
  ls_subscribe
-dynpro '0001'.
  ls_subscribe
-program 'SAPLZMEPOBADIEX'.
  ls_subscribe
-struct_name 'ZEKKO'.
  ls_subscribe
-label 'Nueva Pestaña'.
  ls_subscribe
-position 10.
  ls_subscribe
-height 7.
  
APPEND ls_subscribe TO re_subscribers.

-          IF_EX_ME_GUI_PO_CUST~MAP_DYNPRO_FIELDS

  FIELD-SYMBOLS<mapping> LIKE LINE OF ch_mapping.

  
LOOP AT ch_mapping ASSIGNING <mapping>.
    
CASE <mapping>-fieldname.
      
WHEN 'ZEKKO1'.
        <mapping>
-metafield 1.
      
WHEN 'ZEKKO2'.
        <mapping>
-metafield 2.
      
WHEN 'ZEKKO3'.
        <mapping>
-metafield 3.
      
WHEN 'ZEKKO4'.
        <mapping>
-metafield 4.
      
WHEN 'ZEKKO5'.
        <mapping>
-metafield 5.
    
ENDCASE.
  
ENDLOOP.
-          IF_EX_ME_GUI_PO_CUST~TRANSPORT_FROM_MODEL

  DATAl_item       TYPE REF TO if_purchase_order_item_mm,
        ls_mepoitem  
TYPE mepoitem,
        pedido 
TYPE ebeln,
        modelo 
TYPE REF TO cl_po_header_handle_mm,
        ex_data 
TYPE zekko.

  
FIELD-SYMBOLS<zekko1>   TYPE ekko-zekko1,
                 <zekko2>   
TYPE ekko-zekko2,
                 <zekko3>   
TYPE ekko-zekko3,
                 <zekko4>   
TYPE ekko-zekko4,
                 <zekko5>   
TYPE ekko-zekko5.

  
CASE im_name.

    
WHEN 'SCREEN_V'.

      modelo ?= im_model
.
      pedido 
modelo->po_number.

      
IF pedido IS NOT INITIAL AND dynp_data_pai IS INITIAL.

        
CALL FUNCTION 'ZMEPOBADIEX_GET_DATA'
          
EXPORTING
            im_ebeln 
pedido
          
IMPORTING
            ex_data  
ex_data.

        
MOVE-CORRESPONDING ex_data TO dynp_data_pbo.

      
ELSEIF dynp_data_pai IS NOT INITIAL.

        dynp_data_pbo 
dynp_data_pai.

      
ENDIF.

      
ASSIGN ('(SAPLMEPO)EKKO-ZEKKO1')  TO <zekko1>.
      
IF sy-subrc 0.
        <zekko1> 
dynp_data_pbo-zekko1.
      
ENDIF.
      
ASSIGN ('(SAPLMEPO)EKKO-ZEKKO2')  TO <zekko2>.
      
IF sy-subrc 0.
        <zekko2> 
dynp_data_pbo-zekko2.
      
ENDIF.
      
ASSIGN ('(SAPLMEPO)EKKO-ZEKKO3')  TO <zekko3>.
      
IF sy-subrc 0.
        <zekko3> 
dynp_data_pbo-zekko3.
      
ENDIF.
      
ASSIGN ('(SAPLMEPO)EKKO-ZEKKO4')  TO <zekko4>.
      
IF sy-subrc 0.
        <zekko4> 
dynp_data_pbo-zekko4.
      
ENDIF.
      
ASSIGN ('(SAPLMEPO)EKKO-ZEKKO5')  TO <zekko5>.
      
IF sy-subrc 0.
        <zekko5> 
dynp_data_pbo-zekko5.
      
ENDIF.

  
ENDCASE.
-          IF_EX_ME_GUI_PO_CUST~TRANSPORT_TO_DYNP

  CASE im_name.

    
WHEN 'SCREEN_V'.

      
CALL FUNCTION 'ZMEPOBADIEX_PUSH'
        
EXPORTING
          im_dynp_data 
dynp_data_pbo.

    
WHEN OTHERS.

  
ENDCASE.
-          IF_EX_ME_GUI_PO_CUST~TRANSPORT_FROM_DYNP
  FIELD-SYMBOLS<zekko1>   TYPE ekko-zekko1,
                 <zekko2>   
TYPE ekko-zekko2,
                 <zekko3>   
TYPE ekko-zekko3,
                 <zekko4>   
TYPE ekko-zekko4,
                 <zekko5>   
TYPE ekko-zekko5.

  
CASE im_name.

    
WHEN 'SCREEN_V'.

      
IF sy-ucomm 'MECHOB'.

        
CLEAR dynp_data_pai.

      
ELSE.

        
CALL FUNCTION 'ZMEPOBADIEX_POP'
          
IMPORTING
            ex_dynp_data 
dynp_data_pai.

        
IF dynp_data_pai NE dynp_data_pbo.
* something has changed therefor we have to notify the framework
* to transport data to the model
          re_changed 
mmpur_yes.

          
ASSIGN ('(SAPLMEPO)EKKO-ZEKKO1')  TO <zekko1>.
          
IF sy-subrc 0.
            <zekko1> 
dynp_data_pai-zekko1.
          
ENDIF.
          
ASSIGN ('(SAPLMEPO)EKKO-ZEKKO2')  TO <zekko2>.
          
IF sy-subrc 0.
            <zekko2> 
dynp_data_pai-zekko2.
          
ENDIF.
          
ASSIGN ('(SAPLMEPO)EKKO-ZEKKO3')  TO <zekko3>.
          
IF sy-subrc 0.
            <zekko3> 
dynp_data_pai-zekko3.
          
ENDIF.
          
ASSIGN ('(SAPLMEPO)EKKO-ZEKKO4')  TO <zekko4>.
          
IF sy-subrc 0.
            <zekko4> 
dynp_data_pai-zekko4.
          
ENDIF.
          
ASSIGN ('(SAPLMEPO)EKKO-ZEKKO5')  TO <zekko5>.
          
IF sy-subrc 0.
            <zekko5> 
dynp_data_pai-zekko5.
          
ENDIF.

        
ENDIF.

      
ENDIF.

  
ENDCASE.

Finalmente si ejecutamos alguna de las tres transacciones veremos que la nueva pestaña ya aparece.

No hay comentarios:

Publicar un comentario