Agregar campos Z en transacciones de facturación MM – FI

BADI_FDCB_SUBBAS01
BADI_FDCB_SUBBAS02
BADI_FDCB_SUBBAS03
BADI_FDCB_SUBBAS04
BADI_FDCB_SUBBAS05

Estas  BADIs pueden ser usadas para ampliar las siguientes transacciones:

‘FB60’
‘FB65’
‘FB70’
‘FB75’
‘FV60’
‘FV65’
‘FV70’
‘FV75’
‘FV63’
‘MIRO’
‘MR8M’
‘MIRA’
‘MIR7’
‘MIR4’

Se puede utilizar cualquiera de las BADIs, pero hay 5 a modo de modularizar y no tener todo en una sola, ya que al pasar por todas estas transacciones nosotros deberemos mantener la lógica para ocultar los campos cuando no correspondan y puede ser algo complicado de seguir, en mi caso use la 04 ya que las otras 3 anteriores ya habían sido implementadas.

Luego de implementar la BADI hay que realizar los siguientes pasos :

  1. Extender estructuras standard con los campos Z.
  2. Crear un grupo de funciones
  3. Crear una dynpro (que tendrá los campos Z)
  4. Código fuente tanto en la dynpro como en la BADI.

1- Extender estructuras standard con los campos Z

Primero deberemos ampliar la estructura INVFO, por medio de APPEND para incorporar los campos nuevos que deseemos. En mi caso cree un campo ZZMOTIVO (que tiene un elemento de datos con valores fijos para que ya arme un search help de forma automática con los valores que puede tomar el campo).

image

Luego dependiendo de nuestro requerimiento, además de la INVFO hay que extender los campos de otras estructuras. Por ejemplo:

FI: Si deseamos que el cambio se vea reflejado en la tabla BKPF hay que ampliar tanto la BKPF como la VBKPF sino no funcioná.

MM: Si deseamos que el cambio se vea reflejado en la RBKP hay que ampliar la RBKP, RBKP_V y ACMM_VENDOR_COMP.

2- Crear un grupo de funciones

Creamos un grupo de funciones donde le agregaremos una DYNPRO.

3- Crear una dynpro (que tendrá los campos Z)

image

En mi caso agregué un text input read only, además del text input editable para mostrar la descripción del campo motivo (ya que era un código).

4- Código fuente tanto en la dynpro como en la BADI.

Lógica de proceso de la DYNPRO:

PROCESS BEFORE OUTPUT. 
* MODULE STATUS_0100. 
MODULE receive_data. 
* 
PROCESS AFTER INPUT. 
* get again actual data from main screen 
MODULE receive_actual_data. 
* 
* implement from here on customer coding 
* enumerate ALL fields on the screen because of field transportation 
* with or within a module 
FIELD: 
   invfo-ZZMOTIVO MODULE validation_motivo. 
* send data back to main screen 
MODULE USER_COMMAND_0100.
module RECEIVE_DATA output. 

IF sy-tcode = 'FB75'.
  IF o_badi_fdcb_subbas04 IS INITIAL.
    CALL METHOD cl_exithandler=>get_instance_for_subscreens
      CHANGING
        instance                      = o_badi_fdcb_subbas04
      EXCEPTIONS
        no_reference                  = 1
        no_interface_reference        = 2
        no_exit_interface             = 3
        data_incons_in_exit_managem   = 4
        class_not_implement_interface = 5
        OTHERS                        = 6.
    IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.
  ENDIF.
* object created  ?
  CHECK NOT o_badi_fdcb_subbas04 IS INITIAL.
* get data from main screen

  CALL METHOD o_badi_fdcb_subbas04->get_data_from_screen_object
    IMPORTING
      ex_invfo = invfo.

  DATA: T_DD07V TYPE TABLE OF DD07V WITH HEADER LINE.

  CALL FUNCTION 'GET_DOMAIN_VALUES'
    EXPORTING
      domname               = 'ZMOTIVO'
      TEXT                  = 'X'
    TABLES
      VALUES_TAB            = T_DD07V
    EXCEPTIONS
      NO_VALUES_FOUND       = 1
      OTHERS                = 2.

  READ TABLE T_DD07V WITH KEY DOMVALUE_L = invfo-ZZMOTIVO.
  IF sy-subrc = 0.
    ZMOTIVO = T_DD07V-DDTEXT.
  ELSE.
    CLEAR ZMOTIVO.
  ENDIF.

ELSE.
  LOOP AT SCREEN.
    IF SCREEN-NAME = 'INVFO-ZZMOTIVO' OR
       SCREEN-NAME = 'L_MOTIVO' OR
       SCREEN-NAME = 'ZMOTIVO'.
      screen-active = '0'.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.
ENDIF.
endmodule.                 " RECEIVE_DATA  OUTPUT
module RECEIVE_ACTUAL_DATA input.
*  object created  ?
  CHECK NOT o_badi_fdcb_subbas04 IS INITIAL.

  CONSTANTS: c_aktyp(17) TYPE c VALUE '(SAPLFDCB)G_AKTYP'.
  FIELD-SYMBOLS: <fs_aktyp> TYPE ANY.
  ASSIGN (c_aktyp) TO <fs_aktyp>.

  IF  <fs_aktyp> NE 'A'  "H(Create)/V(modify)/A(Display)
  AND <fs_aktyp> NE 'V'.
* get data from main screen

    CALL METHOD o_badi_fdcb_subbas04->get_data_from_screen_object
      IMPORTING
        ex_invfo  = invfo.
  ENDIF.
endmodule.                 " RECEIVE_ACTUAL_DATA  INPUT
module USER_COMMAND_0100 input.
 CHECK NOT o_badi_fdcb_subbas04 IS INITIAL.
* put data to main screen

  CALL METHOD o_badi_fdcb_subbas04->put_data_to_screen_object
    EXPORTING
      im_invfo  = invfo.

endmodule.                 " USER_COMMAND_0100  INPUT

Lógica de la BADI

Método PUT_DATA_TO_SCREEN_OBJECT

method IF_EX_BADI_FDCB_SUBBAS04~PUT_DATA_TO_SCREEN_OBJECT.
* fill interface attributes from importing paramters
  me->if_ex_badi_fdcb_subbas04~invfo  = im_invfo.
endmethod.

Método GET_DATA_FROM_SCREEN_OBJECT

method IF_EX_BADI_FDCB_SUBBAS04~GET_DATA_FROM_SCREEN_OBJECT.
* fill export parameters from interface attributes
  ex_invfo  = me->if_ex_badi_fdcb_subbas04~invfo.
endmethod.

El resultado es que luego de usar la FB75 en la BKPF se visualiza el valor grabado correctamente (ZZMOTIVO)

image

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: