En ocasiones, necesitamos añadir campos adicionales en la determinación de precios, tanto en Compras (MM) o en Ventas (SD). Estos campos pueden ser campos de cliente añadidos en las transacciones estándar (utilizando las exits o badis disponibles) o simplemente campos estándar que Sap no ha puesto como disponibles en el esquema de cálculo y que por tanto no son relevantes para poder definir condiciones de precio utilizandolos.
Si tenemos esta necesidad, es sencillo habilitar que estos campos estén disponibles para ser utilizados en tablas de condición.
Las siguientes estructuras de comunicación son relevantes en la determinación del precio:
-
- KOMK (determinación del precio cabecera de la comunicación)
-
- KOMP (determinación del precio posición de la comunicación)
-
- KOMG (campos permitidos para estructuras de condición)
Por razones técnicas se utiliza la estructura de comunicación KOMG que representa la suma de KOMK y KOMP y que contiene todos los campos que se emplean principalmente para la determinación del precio. Con la inclusión de nuevos campos en KOMK o KOMP se incorporan automáticamente los campos en KOMG.
Para añadir los campos deseados en estas estructuras, utilizaremos los siguientes INCLUDES:
-
- datos de cabecera en la estructura KOMKAZ (INCLUDE disponible en KOMK o KOMG)
-
- datos de posición en la estructura KOMPAZ (INCLUDE en KOMP o en KOMG)
Las estructuras KOMK y KOMP son compartidas tanto en ventas como en compras.
Adicionalmente, tendremos que realizar dos acciones para dejar configurado el sistema:
- Habilitar los nuevos campos para poder ser utilizados en tablas de condición: para ello accederemos mediante el customizing a la ruta Gestión de materiales –> Compras –> Condiciones –> Fijar determinación de precio –> Ampliar catálogo de campo para tablas de condición en la parte de compras. Para la parte de ventas, utilizaremos la ruta Comercial –> Funciones básicas –> Determinación de precio –> Control de la determinación de precio –> Definir tablas de condiciones –> Condiciones: Campos permitidos.
- Implementar las correspondientes exits para llenar de valor los nuevos campos de las estructuras de intercambio: los nuevos campos añadidos no tendrán valores informados en los esquemas de cálculo. Habrá que llenarlos de valor en las correspondientes exits, que son:
- Compras: realizaremos la implementación de las ampliaciones LMEKO001 (cabecera) y LMEKO002 (posiciones), a través de la SMOD. En estas exit llenaremos de valor los campos modificando las estructuras E_KOMK o E_KOMP. También se puede realiza la modificación utilizando la badi
ME_PO_PRICING_CUST (métodos PROCESS_KOMK o PROCESS_KOMP).
- Compras: realizaremos la implementación de las ampliaciones LMEKO001 (cabecera) y LMEKO002 (posiciones), a través de la SMOD. En estas exit llenaremos de valor los campos modificando las estructuras E_KOMK o E_KOMP. También se puede realiza la modificación utilizando la badi
- Ventas (pedidos): las rutinas se encuentra en el include MV45AFZZ. Realizaremos la asignación de los campos en las estructuras TKOMK o TKOMZ usando los correspondientes form:
- USEREXIT_PRICING_PREPARE_TKOMK (campos de cabecera)
- USEREXIT_PRICING_PREPARE_TKOMP (campos de posición)
- Ventas (facturas): las rutinas se encuentra en el include RV60AFZZ. Las rutinas para el aprovisionamiento de los nuevos campos en la facturación se encuentran en el elemento RV60AFZZ. Utilizaremos los form:
-
- USEREXIT_PRICING_PREPARE_TKOMK (campos de cabecera)
-
- USEREXIT_PRICING_PREPARE_TKOMP (campos de posición)
La parte importante que quiero tratar en este post tiene que ver en como se comporta el sistema respecto al precio cuando cambiamos el valor de estos campos que hemos definido como “relevantes” para el calculo de precio u otras condiciones (descuentos, recuerdos, costes indirectos, gastos de transporte, etc).
En condiciones normales, un cambio en un valor de estos campos, no va a ser relevante para el precio y este no se va a volver a “calcular” de forma automática. Tendremos que ser nosotros, quienes, de forma manual, accedamos a la pestaña condiciones del documento (posición) y forcemos el recálculo del precio para que sean relevantes los cambios en los campos añadidos en el esquema.
Pero existe una forma de automatizar esta acción y que las modificaciones en los campos sean relevantes de forma automática y el sistema recalcule el precio. Para ello, podremos utilizar las siguientes exits o badis:
- Compras: implementaremos la badi ME_DEFINE_CALCTYPE.
- Ventas: implementaremos la exit MV45AFZB, en el FORM USEREXIT_NEW_PRICING_VBAP.
En ambos casos tenemos los valores anteriores de los campos y los valores nuevos (por ejemplo, en ventas tenemos en VBAP los valores actuales y en *VBAP los valores anteriores, pudiendo detectar cambios que hagan relevante un recalculo del precio). A la vuelta de las exits devolveremos el valor para el recalculo de precio oportuno, como si estuvieramos recalculando el precio del documento de forma manual (por ejemplo, el valor B para efectuar una determinación de precio completa o C para recalcular solo las condiciones que no se hayan introducido de forma manual).
Ejemplo practico: Campo almacén relevante para precio en los pedidos de ventas.
En primer lugar añadiremos el campo a la estructura KOMP (include KOMPAZ), utilizando la transacción SE11. Usaremos un APPEND para que no sea una modificación del estandar :
A continuación llenaremos de valor el campo para que este disponible en el esquema de cálculo (includes MV45AFZZ y RV60AFZZ, form USEREXIT_PRICING_PREPARE_TKOMP).
Habilitaremos el campo para ser usado en tablas de condición (en la ruta de parametrización Comercial –> Funciones básicas –> Determinación de precio –> Control de la determinación de precio –> Definir tablas de condiciones –> Condiciones: Campos permitidos.
Crearemos nuestras propias tablas de condición utilizando el nuevo campo y las asignaremos a la secuencia de acceso de alguna clase de condición (en nuestro ejemplo, para el precio, condición PR00) para poder definir condiciones de precio a ese nivel.
Implementaremos la exit para determinar como se recalcula el precio cuando haya modificaciones en los campos añadidos. Para ello, implementaremos la exit MV45AFZB, en el FORM USEREXIT_NEW_PRICING_VBAP. Si el campo almacén cambia, se efectuara una nueva determinación de precio.
En nuestro ejemplo tenemos un precio distinto según el almacén en el que se realice la venta. Aquí podemos ver las condiciones de precio que hemos definido para el ejemplo:
Al crear o modificar un documento de ventas, cuando se cambie el almacén el sistema buscará de nuevo condiciones relevante para el precio y habremos conseguido nuestro objetivo. Para el almacén 0001, el precio son 20 euros.
Al cambiar el almacén, el sistema automáticamente nos ha cambiado el precio a 25 (sin necesidad de recalcular el precio para las posiciones).
¡¡¡¡Feliz verano a todos!!!!