Bloqueamos el guardado de un pedido

En este ejemplo, veremos cómo evitar guardar un pedido para un cliente insolvente. Dado que es un sistema muy drástico, dividiremos el procedimiento en dos scripts.

El primero alertará a la selección del cliente, mientras que el segundo no permitirá que se guarde el pedido si el cliente o la condición no pagada no cambia.

Grupo ScriptEvento
FichaValor cambiado

Como se dijo, el primer script servirá para informar al usuario que el cliente seleccionado para el pedido tiene un bloqueo y esto servirá para evitar crear el pedido completo y solo descubrir al final que no es posible guardarlo.

if datafield.name() == "gguid_customer" then
        t = database.getsql("SELECT insolvent FROM customers WHERE gguid='" .. datafield.getvalue()  .. "'")
        if t.countrows() > 0 then 
               rows = t.getrows()
               if  rows[1].getvalue("insolvent")  == 1 then
                       program.showerror("Attention the customer is insolvent. Could not save order!")
               end
        end
end

Interceptamos cuando cambia el campo gguid_customer. Este es el campo de servicio de la subtabla donde almacena el gguid de la selección realizada. Siempre es mejor usar el identificador único global gguid en lugar del nombre real del cliente, esto le permite rastrearlo incluso si se cambia el nombre.

Leemos el valor del campo Insolvent presente en la tabla de clientes (customers) y mostramos un mensaje de error si el valor es uno. Este campo seguramente será un check en la ficha del cliente.

Continuemos con el segundo script que bloqueará el guardado del pedido.

Grupo ScriptEvento
FichaPre Guardado
t = database.getsql("SELECT insolvent FROM customers WHERE gguid='" ..  dataview.getvalue("gguid_customer")  .. "'")
if t.countrows() > 0 then
        rows = t.getrows()
        if  rows[1].getvalue("insolvent") == 1 then
               errorn.errocode = "E1"
               errorn.errormessage ="Attention the customer is insolvent. Could not save order!"
               do return end
        end
end

Como puede ver, esto es prácticamente idéntico al primero, con la excepción del valor gguid que se recuperará de la dataview. El procedimiento es idéntico para permitir que el cliente pueda cambiar el estado impago. De hecho, podríamos abrir la última ficha y cambiar el valor al tiempo que mantenemos abierta la ficha de pedido.

La parte que cambia es la administración del objeto errorn. Su trabajo es comunicar errores al programa. En este caso, somos nosotros quienes forzamos un error al ingresar un código, un mensaje y forzar la salida del script.

Como se trata del pre guardado, el programa saldrá del procedimiento Guarda de la ficha. El código de error puede ser cualquiera, ya que nos sirve para identificar qué parte del script lo generó.