Hoy estamos de celebración por varios motivos. Por un lado, empiezo las vacaciones después de un año de mucho trabajo y muchos cambios. Pero orgulloso del camino andado. Por otro lado, estamos de cumpleaños, pues este post cumple el número CIEN desde que en noviembre de 2010 empece con el blog Saptricks como un lugar de trabajo personal donde documentar tantas y tantas cosas de Sap imposibles de recordar en detalle sin mas y otros temas que tenía que investigar en un momento dado y de las que quería dejar constancia.
Y la vez que llegamos a la publicación cien, estamos a punto de llegar al millón de visitas (en unos días estaremos ahí), en el orden de 40 mil al mes. Toda una alegría y un reto, no es fácil dedicarle el tiempo que a uno le gustaría, a escribir cosas (tengo mil ideas en la cabeza), a contestar a todas vuestras preguntas. Se hace lo que se puede. Como os digo, todo un placer, gracias a los más de 1.100 seguidores por vuestro interés. Y lo más curioso, en mi vida profesional he conocido este año a unas cuantas personas que eran seguidores de mi blog, y nos hemos desvirtualizado.
En nuestro truco de hoy vamos a hablar de un problema frecuente que suele surgir en los proyectos de Sap: la numeración de documentos de factura por estándar es bastante limitada, tanto en la parte de compras (MIRO), como en la de ventas (VF01/VF04). Pero, al menos, Sap nos deja la puerta abierta con las exits para personalizar el sistema y adaptarlo a lo que nos pida nuestro cliente.
Numeración de facturas en Compras.
Por estándar, en el registro de facturas de compras solo podemos utilizar dos rangos de numeración. Uno para el registro de facturas manual (MIRO) y otro para el registro de facturas automático (que incluye la anulación de facturas, autofacturación, liquidación del plan de facturas o recepción de facturas por EDI).
La configuración de los rangos de números la realizamos en la transacción OMRJ. A continuación, asignamos los rangos por la actividad que hemos indicado (ruta de customizing Gestión de materiales –> Compras –> Verificación de facturas de logística –> Facturas recibida –> Asignación de números –> Asignación de números para documentos de logística –> Asignar rango de números a actividad).
Como veis, esto da pocas posiblidades para realizar, por ejemplo, una numeración por Sociedad (podría ser el criterio habitual más solicitado) o por tipo de factura (factura, abono, carga posterior o descargo posterior; o diferenciada por proceso).
Para solucionar esto, Sap nos deja la puerta abierta con la ampliación LMR1M003, que gestionaremos con un proyecto de ampliación de la forma habitual con la transacción CMOD. En este post anterior teneís un ejemplo de todos los pasos necesarios para crear un proyecto de ampliación por si los desconocéis.
La exit usa el módulo de función EXIT_SAPLMRME_003 y podemos incluir nuestro propio código en el include ZXM08U14. Tenemos disponibles la mayoría de campos de la cabecera de la factura para determinar nuestro lógica de numeración (Sociedad, Transacción, Operación, Fechas, Proveedor, etc), así como la información de las posiciones por si fuera necesario analizarlas.
La configuración sería la siguiente:
1) Habremos de definir los rangos de números a utilizar con la transacción OMRJ.
2) Posteriormente, en el código abap de la exit devolveremos en el parámetro E_NUMKR el rango de números a utilizar (de los que acabamos de definir).
En mi ejemplo, he creado una tabla Z donde el usuario asigna, por sociedad, el rango de números a utilizar. Posteriormente, en el código de la exit leemos la sociedad de a factura, recuperamos el rango de números. Requerimiento cumplido.
Como podéis ver, una forma sencilla de personalizar el comportamiento de la numeración. Tener en cuenta que la numeración afecta tanto a la grabación de las facturas, como las preliminares o los documentos retenidos.
El código Abap introducido en la exit sería el siguiente:
Numeración de facturas en Ventas.
En la numeración de las facturas de ventas nos ocurre algo parecido. Los rangos de números se definen con la transacción VN01. Posteriormente, estos rangos se asocian por Clase de Documento de Factura, parametrización que se realiza en la transacción VOFA.
En este caso, tenemos igualmente una puerta abierta para personalizar la numeración con la exits de ventas. Aquí no se utilizan los proyectos de ampliación, sino unos incudes estandar que Sap nos deja “preparados” para introducir nuestro código. Realmente son una modificación del estandar. En nuestro caso, usaremos el include RV60AFZZ, en el form USEREXIT_NUMBER_RANGE.
En este caso, la lógica a aplicar sería la misma. En primer lugar, crearíamos los rangos de números a utilizar de la forma usual, con la transacción VN01. A continuación, en la exit determinaríamos la programación para determinar el rango a utilizar según la información de la factura a crear (Sociedad, Organización de Ventas, etc), y devolveremos el valor del rango de números a utilizar en la variable US_RANGE_INTERN.
Es usual utilizar esta misma exit para realizar controles de la fecha de facturación. Por ejemplo, por temas legales, en España un número de factura no puede tener una fecha de factura anterior a una factura emitida previamente.
En la exit se podría controlar este aspecto y otros similares a través de tablas Z: una tabla Z para definir el rango de números a usar (por Sociedad, Organización de Ventas, o por el criterio deseado) y otra tabla Z donde ir guardándonos la fecha de la última factura por rango de numeración para ir realizando el control, generando un mensaje de error desde el mismo include.
TIP: podemos tener la misma problemática para la numeración de pedidos de ventas. En este caso, la asignación a las clases de documento se realiza con la transacción VOV8. Podemos personalizar igualmente su funcionamiento utilizando el include MV45AFZZ y el form USEREXIT_NUMBER_RANGE. Recordar que tanto los números de pedidos de ventas como de facturas comparten los rangos de números (que definimos como ya comentamos con la transacción VN01). Habremos de tener en cuenta este aspecto a la hora de definir los rangos y la disponibilidad de intervalos de cada uno de ellos.
¡¡¡Buen verano y feliz MILLON!!!