ZCL_IM_VENDOR_ADD_DATA_CS
Implementaremos las badis:VENDOR_ADD_DATA
VENDOR_ADD_DATA_CS
Para ello ir a la transacción SE19 y crear la implementación.
La creación de grupo de imágenes se crea en este punto de customizing:
Logística general
En ZVENDOR_ADD_DATA en el método:
CHECK_ADD_ON_ACTIVE
Si estamos en el grupo de subscreen creado para esta ampliación (ZN) entonces
e_add_on_active = 'X'.
Crearemos un programa ZVENDOR_ADD_DATA_CS y en el crearemos la dynpro 9000
(Expedientes) 9001 (Homologación proveedores).
Engancharemos la ampliación ZVENDOR_ADD_DATA_CS al grupo de imágenes que hemos
creado en customizing.
En el método GET_TAXI_SCREEN, llamaremos al programa y la dynpro que hemos
creado.
CASE i_taxi_fcode.
WHEN 'ZVENDOR'.
e_screen = '9000'.
e_program = 'ZVENDOR_ADD_DATA_CS'.
e_headerscreen_layout = 'B'.
WHEN 'ZHOMOLO'.
e_screen = '9001'.
e_program = 'ZVENDOR_ADD_DATA_CS'.
e_headerscreen_layout = 'B'.
WHEN OTHERS.
ENDCASE.
En el método IF_EX_VENDOR_ADD_DATA_CS~SET_DATA, recuperaremos los datos de
homologación de proveedores de la tabla ZMMT021 donde ZMMT021-LIFNR = LFB1-LIFNR
y ZMMT021-BUKRS = LIFNR-BUKRS. Moveremos el contenido cargado de la tabla
ZMMT021 a la tabla control de la dynpro 9001.
Recuperamos los datos de expedientes de la tabla ZMMT024, y los mostramos en la tabla
control de la dynpro 9000.
En el método IF_EX_VENDOR_ADD_DATA_CS~GET_DATA, envía los datos de la tabla de
control que el usuario ha podido modificar a una tabla interna, la cual finalmente
utilizaremos para actualizar la tabla ZMMT021.
Envía los datos de la tabla control de expedientes a una tabla interna para finalmente
actualizar la tabla ZMMT024.
En el método IF_EX_VENDOR_ADD_DATA_CS~SET_FCODE, si el usuario está grabando
I_FCODE = UPDA, actualizaremos la tabla de sistemas ZMMT021 y ZMMT024.
Cada proveedor solo tendrá un registro de homologación por tipo de material, si hubiera
modificaciones para un proveedor y un tipo de material se actualizaría el existente o se
añadirá en caso de que no exista.
Implementando la BADI, para nueva funcionalidad
Creamos un nuevo punto de ampliacion en el customizing.
Se crea la ampliacion ZN.
Y dentro de este las distintas pestañas que vamos a incorporar al programa de proveedores.
El programa donde se crean las dynpro sería el programa para la badi de la ampliacion que vamos a
usar.
En la badi implementada ya anteriormente para otras funcionalidades ahora vamos a introducir el
código referente a nuestra dynpro y nuevas funcionalidades.
Es aquí donde le indicamos a la badi la dynpro y el programa de control para la nueva pestaña en la
FK03.
METHOD if_ex_vendor_add_data_cs~get_taxi_screen.
IF sy-ucomm EQ 'T_EXPEDIENTES_DELE' OR
sy-ucomm EQ 'T_HOMOLOGACION_DELE'.
CLEAR sy-ucomm.
ENDIF.
CASE i_taxi_fcode.
* Gestión de expedientes
WHEN 'ZVENDOR'.
e_screen = '9000'.
e_program = 'SAPLZMM02'.
e_headerscreen_layout = 'B'.
* Homologación de proveedores
WHEN 'ZHOMOLO'.
e_screen = '9001'.
e_program = 'SAPLZMM02'.
e_headerscreen_layout = 'B'.
* Datos Emasesa
WHEN 'ZEMASESA'.
e_screen = '9002'.
e_program = 'SAPLZMM02'.
e_headerscreen_layout = 'B'.
when 'ZBANCO1'. " ----------------> Nueva pestaña
e_screen = '9003'.
e_program = 'SAPLZMM02'.
e_headerscreen_layout = 'B'.
WHEN OTHERS.
ENDCASE.
ENDMETHOD.
Quedando la FK03 tal como:
Ahora necesitamos implementar los métodos que nos traeran los datos a la pantalla y que nos
actualizaran la tabla de la base de datos ZFI001.
Para el PBO de la pantalla 9003.
MODULE status_9003 OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
DATA : ti_lfbk TYPE STANDARD TABLE OF flfbk.
DATA: obj_class TYPE REF TO zcl_im_vendor_add_data_cs.
DATA: s_lfb1 TYPE lfb1.
* data: t_lfbk LIKE lfbk.
CREATE OBJECT obj_class.
LOOP AT SCREEN.
IF screen-group1 EQ 'BOT' OR
screen-group1 EQ 'TAB'.
IF g_lifnr IS NOT INITIAL.
IF gv_activity EQ 'V' OR gv_activity EQ 'H' .
IF screen-name EQ 'I_ZFI001-PRIORIDAD'.
screen-input = 1.
ELSE.
screen-input = 0.
ENDIF.
ELSEIF gv_activity EQ 'A'.
screen-input = 0.
ENDIF.
ELSE.
screen-input = 0.
MESSAGE i023. "No pueden añadirse datos hasta que el acreedor no tenga número asignado.
ENDIF.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
Para el PAI, tendremos que:
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9003 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9003 INPUT.
CASE: sy-ucomm.
WHEN 'UPDA'.
PERFORM grabar_tabla_zfi001 TABLES i_zfi001.
ENDCASE.
ENDMODULE. " USER_COMMAND_9003 INPUT
*&---------------------------------------------------------------------*
*& Form GRABAR_TABLA_ZFI001
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_I_ZFI001 text
*----------------------------------------------------------------------*
FORM grabar_tabla_zfi001 TABLES i_zfi001 STRUCTURE i_zfi001.
i_zfi001-bukrs = g_bukrs.
i_zfi001-lifnr = g_lifnr.
DATA i_zfi001_aux LIKE zfi001 OCCURS 0 WITH HEADER LINE.
LOOP AT i_zfi001.
i_zfi001_aux-bukrs = i_zfi001-bukrs.
i_zfi001_aux-lifnr = i_zfi001-lifnr.
i_zfi001_aux-banks = i_zfi001-banks.
i_zfi001_aux-bankl = i_zfi001-bankl.
i_zfi001_aux-bankn = i_zfi001-bankn .
i_zfi001_aux-prioridad = i_zfi001-prioridad.
APPEND i_zfi001_aux.
ENDLOOP.
LOOP AT i_zfi001_aux INTO wa_zfi001_aux WHERE prioridad = 0.
DELETE i_zfi001_aux INDEX sy-tabix.
DELETE zfi001 from wa_zfi001_aux.
ENDLOOP.
MODIFY zfi001 FROM TABLE i_zfi001_aux.
COMMIT WORK.
ENDFORM.
También debemos adaptar nuestra badi a la nueva funcionalidad que le vamos a implementar.
En resumen debemos introducimos un nuevo atributo el T_ZFI001 para que sea visible por la clase
y la dynpro, y modificamos los métodos GET_DATA y SET_DATA, para que nos traiga los datos
de la base de datos y los lleve a nuestra pantalla y para que luego se graben los cambios en la base
de datos.
Para ello creamos dos funciones que llamaremos en los metodos anteriormente mencionados, y que
estarán dentro del módulo de funciones que estamos usando para las dynpros de las pestañas
añadidas a la FK03.
FUNCTION z_fi_lfbk_get_data.
*"----------------------------------------------------------------------
*"*"Interfase local
*" IMPORTING
*" REFERENCE(I_BUKRS) TYPE BUKRS
*" TABLES
*" IT_ZFI001 STRUCTURE ZFI001
*" IT_LFBK STRUCTURE LFBK
*"----------------------------------------------------------------------
REFRESH: i_zfi001, it_zfi001.
LOOP AT it_lfbk.
it_zfi001-lifnr = it_lfbk-lifnr .
it_zfi001-bukrs = i_bukrs.
it_zfi001-banks = it_lfbk-banks.
it_zfi001-bankl = it_lfbk-bankl.
it_zfi001-bankn = it_lfbk-bankn.
* it_zfi001-PRIORIDAD =
it_zfi001-descrip = it_lfbk-koinh.
APPEND it_zfi001.
ENDLOOP.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE t_zfi001_aux
FROM zfi001
FOR ALL ENTRIES IN it_lfbk
WHERE lifnr = it_lfbk-lifnr
AND bukrs = i_bukrs
AND banks = it_lfbk-banks
AND bankl = it_lfbk-bankl
AND bankn = it_lfbk-bankn.
IF sy-subrc IS INITIAL.
LOOP AT it_zfi001 INTO wa_zfi001.
READ TABLE t_zfi001_aux
INTO wa_zfi001_aux
WITH KEY lifnr = wa_zfi001-lifnr bukrs = wa_zfi001-bukrs
BINARY SEARCH.
it_zfi001-prioridad = wa_zfi001_aux-prioridad.
it_zfi001-bukrs = i_bukrs.
MODIFY it_zfi001 TRANSPORTING prioridad.
i_zfi001-lifnr = it_zfi001-lifnr .
i_zfi001-bukrs = i_bukrs.
i_zfi001-banks = it_zfi001-banks.
i_zfi001-bankl = it_zfi001-bankl.
i_zfi001-bankn = it_zfi001-bankn.
i_zfi001-prioridad = it_zfi001-prioridad.
i_zfi001-descrip = it_zfi001-descrip.
APPEND i_zfi001.
ENDLOOP.
ELSE.
LOOP AT it_zfi001.
i_zfi001-lifnr = it_zfi001-lifnr .
i_zfi001-bukrs = i_bukrs.
i_zfi001-banks = it_zfi001-banks.
i_zfi001-bankl = it_zfi001-bankl.
i_zfi001-bankn = it_zfi001-bankn.
i_zfi001-prioridad = it_zfi001-prioridad.
i_zfi001-descrip = it_zfi001-descrip.
APPEND i_zfi001.
ENDLOOP.
ENDIF.
ENDFUNCTION.
FUNCTION z_fi_lfbk_set_data.
*"----------------------------------------------------------------------
*"*"Interfase local
*" TABLES
*" IT_ZFI001 STRUCTURE ZFI001
*"----------------------------------------------------------------------
REFRESH: it_zfi001.
*Pasamos de las tablas del table control a las tablas de la clase
IF i_zfi001 IS INITIAL.
APPEND i_zfi001.
ELSE.
LOOP AT i_zfi001.
MOVE-CORRESPONDING i_zfi001 TO it_zfi001.
APPEND it_zfi001.
ENDLOOP.
ENDIF.
ENDFUNCTION.
Quedando los metodos modificados para la nueva funcionalidad con las nuevas fuciones creadas
anteriormente.
METHOD if_ex_vendor_add_data_cs~get_data.
CALL FUNCTION 'Z_MM_LFA1_SET_DATA'
IMPORTING
pi_zzute = s_lfa1-zzute
TABLES
it_zmmt021 = t_zmmt021
it_zmmt024 = t_zmmt024.
CALL FUNCTION 'Z_FI_LFBK_SET_DATA'
TABLES
it_zfi001 = t_zfi001.
ENDMETHOD.
METHOD if_ex_vendor_add_data_cs~set_data.
DATA: t_zfi001_aux LIKE t_zfi001,
wa_zfi001 LIKE LINE OF t_zfi001,
wa_zfi001_aux LIKE LINE OF t_zfi001.
i_lifnr = i_lfb1-lifnr.
i_bukrs = i_lfb1-bukrs.
i_zzute = i_lfa1-zzute.
* Pestañas homologación y expedientes.
CALL FUNCTION 'Z_MM_LFA1_GET_DATA'
EXPORTING
pi_activity = i_activity
pi_lfb1 = i_lfb1
pi_zzute = i_zzute
* pi_initial = i_initial
TABLES
it_zmmt021 = t_zmmt021
it_zmmt024 = t_zmmt024.
* Pestaña bancos
REFRESH t_zfi001.
CALL FUNCTION 'Z_FI_LFBK_GET_DATA'
EXPORTING
i_bukrs = i_bukrs
tables
it_zfi001 = t_zfi001
it_lfbk = t_lfbk.
ENDMETHOD.
Dando el resultado esperado:
Ahora podremos modificar la prioridad y luego grabar para así modificar la tabla ZFI001, teniendo
en cuenta que las lineas de esta que no tengan prioridad no se grabaran en la base de datos osea en
la ZFI001.
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.