En esta entrada veremos cómo nos ayuda el patrón de estrategia en nuestros desarrollos.
Este patrón nos permite cambiar el algoritmo dependiendo del cliente.
Veamos primero el problema, después atacaremos la solución desde un punto de vista "tradicional" y después usaremos el patrón para dar la solución.
Enunciado del problema
En la contabilidad electrónica en México, se guarda la información del número único de la factura (UUID) en los textos de los documentos de finanzas. Como es un texto, esta información no se muestra en los reportes estándares de los documentos financieros, como son FBL1N (facturas de proveedores) y FBL5N (Facturas de clientes).
Una opción para suplir esto, es usar la BAdI FI_ITEMS_CH_DATA, que implementa la interfaz IF_FI_ITEMS_CH_DATA y el método "change_items".
Ésta BAdI, pasa por todos los procesos que llenan los reportes estándares de FI, en particular, en la ejecución de las transacciones FBLxN.
Necesitamos además, extender, la estructura que usa el método (pero será material para otra entrada), para nuestro caso, vamos a asumir, que ya tenemos la estructura extendida con el campo UUID (ZZUUID - char de longitud 36).
Dependiendo de si la factura es de proveedor (FBL1N) o si es de cliente (FBL5N) la forma de obtener el UUID es diferente:
-
En el caso de proveedores:
-
Leemos el texto de la factura (id = YUUD; object = BELEG; name = bukrs&&belnr&&gjahr)
-
Si no encontramos, leer de RBKP con belnr = awkey(10) ghajr = awkey+10(4)
-
En el caso de clientes:
-
Leemos el texto de la factura de SD (id = YUUD; object = VBBK; name = akkey(10))
-
Si no encuentra datos, leemos el texto de la factura FI (id = YUUD; object = BELEG; name = bukrs&&belnr&&gjahr)
Análisis del problema
Necesitamos un algoritmo que se comporte de forma diferente, dependiendo de la transacción que se esté ejecutando.
Una forma sería, de la forma tradicional, crear un método por cada caso, y usarlos en el método de la BAdI, haciendo el despliegue de las diferentes opciones, y llamar al método correcto en cada caso.
Solución sin patrón estrategia
Crearíamos los métodos en la misma clase de implementación (como privados).
CLASS zim_if_items_ch_data DEFINITION.
...