Estoy escribiendo esta publicación de blog para demostrar cómo podemos estructurar un informe ABAP de manera orientada a objetos que nos ayude a resolver un problema de la vida real. Quiero afirmar en primer lugar que no creo que mi ejemplo abarque todas las mejores prácticas de POO, pero es un intento honesto de un ABAPer procedural de hacer la transición al mundo orientado a objetos.
La solicitud fue crear un informe que ayudara a conciliar partidas abiertas de un socio comercial entre sí. El socio comercial estaba configurado en el sistema con los roles de Cliente y Proveedor. Entonces, el propósito de nuestro programa es encontrar si se han generado entradas contables para un socio comercial tanto como cliente como proveedor y si el monto total de estas entradas es cero. Por lo tanto, puedes entender que si encontramos tales entradas, debemos conciliarlas ejecutando el código de transacción FB05.
Las entradas contables debían conciliarse de acuerdo con uno de los siguientes criterios:
-
ZUONR - Asignación
-
XREF2 - Clave de referencia 2
-
XBLNR - Referencia
La imagen a continuación muestra la pantalla de selección de nuestro programa personalizado:
He organizado mi código de una manera similar al Patrón de Objeto MCV y digo similar, porque mis tres clases no hacen exactamente lo que se supone que deben hacer si seguimos estrictamente este patrón.
Así que he creado estas tres clases para ayudar con la lógica del programa:
-
lcl_read_data
--> Lee partidas abiertas para los proveedores y clientes y guarda los datos leídos en los atributos de instancia
mt_bsik
(Proveedores) y
mt_bsid
(Clientes)
-
lcl_process_data
--> Utiliza la clase anterior como un atributo de instancia para tener acceso a los datos de cliente y proveedor. La clase luego combina los datos de estas dos fuentes e identifica qué líneas se pueden conciliar entre sí. Por último, si el usuario no ha ejecutado una prueba, se borran estos elementos identificados a través del código de transacción FB05. Después de todo el procesamiento, los datos se guardan en el atributo de instancia
mt_total
.
-
lcl_display_data
--> Utiliza la clase lcl_process_data como un atributo de instancia para tener acceso a los datos procesados y mostrarlos en un ALV.
He creado el objeto principal ZFI_PAREGGIO_CLNT_FORN y algunos Includes para modularizar el programa. A continuación, el código de este objeto:
&----------------------------------------------------------------------*
REPORT zfi_pareggio_clnt_forn.
INCLUDE zfi_pareggio_clnt_forn_top.
INCLUDE zfi_pareggio_clnt_forn_sel.
INCLUDE zfi_pareggio_clnt_forn_def.
INCLUDE zfi_pareggio_clnt_forn_imp.
INCLUDE zfi_pareggio_clnt_forn_form.
INITIALIZATION.
DATA(gt_list) = VALUE vrm_values(
( key = 'ZUONR' text = TEXT-t01