Algunas funciones internas de Sales Header y Sales Line

Una de las tablas con las que seguramente más trabajamos es la tabla 36 (Sales Header) y la tabla 37 (Sales Line). Como ya sabemos en ellas empiezan muchos de los procesos de venta pues es ahí donde los usuarios crearan los documentos de venta que posteriormente generaran albaranes, facturas, etc.

Es habitual por lo tanto que tengamos que trabajar continuamente sobre ellas por ejemplo, automatizando procesos que crean cabeceras, líneas o que modifican su información.

Hay unas cuantas funciones que por las prisas del día a día no siempre nos detenemos a observar, pero que es muy interesante conocer y analizar cómo funciona:

SuspendStatusCheck:
Esta función se encuentra en la tabla 37. Su funcionamiento es muy sencillo ya que lo único que nos permite es modificar el valor de una variable global de la tabla. La gracia está en que esa variable condiciona muchos de los controles que se ejecutan con las distintas reglas de negocio. Por lo tanto podemos entender que es como dar un pase VIP a las validaciones que hagamos sobre ese registro desde ese momento en adelante.

SetHideValidationDialog:
Esta función se encuentra en la tabla 36. Su funcionamiento es muy parecido a la función que acabamos de ver, solo que en este caso nos permite pasar por encima de muchos CONFIRM que podemos encontrar en el código. Es muy común utilizarla en procesos que tienen que generar varios documentos de venta de forma automática ya que a través de esta llamada se consigue que el proceso no se pare por un mensaje de confirmación al usuario.

GetSalesHeader/SetSalesHeader:
Por desgracia, estas dos funciones son las grandes desconocidas para muchos y son muy importantes. Se encuentran dentro de la tabla 37 y sirven para situar la variable global SalesHeader en la cabecera relacionada a la línea en la que estamos. Os animo a que busquéis en toda la tabla 37 una sola línea de código que diga SalesHeader.GET. Encontrareis muy pocas o ninguna en una base de datos limpia y en cambio veréis que hay varios montones en bases de datos muy desarrolladas. Ahora os animo a que busquéis GetSalesHeader… hay muchísimas… ¿El motivo? Principalmente hay dos:

  • La función esta optimizada para que solo se haga el GET si es necesario. Si tenemos a la variable colocada sobre la cabecera que toca, ¿para qué volver a hacer el GET? Menos accesos a disco, mayor rendimiento.
  • La función se basa en la colocación de la variable SalesHeader y eso muy bueno cuando la misma variable puede venir referenciada por SetSalesHeader puesto que puede tratarse, por ejemplo de una variable TEMPORAL.
GetSalesHeder y SetSalesHeader
GetSalesHeder y SetSalesHeader

Todo esto de poder jugar a hacer GET de un registro que no existe está muy bien y funciona de maravilla hasta que alguien viene e incrusta su primer SalesHeader.GET en alguno de los disparadores de la tabla 37. A partir de ese momento, nada de todo esto funciona.

Si queréis un ejemplo de todo esto pensad es que tenéis que hacer un simulador de precios en el que tienen que intervenir todas las reglas de negocio que se deberían de aplicar en la confección de un pedido. Podéis empezar creando una cabecera Temporal. En esta cabecera, podéis validar varios campos llamando al inicio a SetHideValidationDialog para ahorrar al usuario el tener que ir interviniendo. Luego podríamos pasar a las líneas que, llamando previamente a SetSalesHeader no tendrían problema en encontrar la cabecera aunque esta no se encuentre realmente en la base de datos. Si además utilizamos SuspendStatusCheck, seguramente también nos ahorraremos algún que otro control que se haga durante la inserción de las líneas.