Actualizar el nombre del cliente dentro de los documentos
En este ejemplo, veremos cómo en pocas líneas se pueden actualizar rápidamente los datos dentro de nuestra base de datos.
Grupo Script
Programa
Evento
Acción Programa
Como sabéis, las tablas están vinculadas entre ellas a través del campo especial Subtabla, esto permite seleccionar una línea de valores de una tabla distinta de la administrada por la ficha actual. La elección de esta línea permite completar automáticamente los campos deseados. Como se trata de una copia de los datos y no de un enlace, si, por ejemplo, se cambió el nombre del cliente de su ficha, el antiguo permanecería dentro de los documentos donde se recupera. Gracias a este script podremos realinear los nombres dentro del documento.
Para usar este script es necesario tratarlo como una acción en el programa, lo que nos permite lanzarlo directamente cuando queramos.
table_rows = database.getsql("SELECT * FROM names")
nrows = table_rows.countrows()
rows = table_rows.getrows()
Primero creamos la tabla names donde se ingresan nuestros clientes recuperando las líneas y sus números.
for i = 1,nrows do
gguid = rows[i].getvalue("gguid")
name = rows[i].getvalue("name")
database.setsql("UPDATE invoices set customer='" .. name .. "' WHERE gguid_name='" .. gguid .. "'")
end
En este ciclo recuperamos el gguid del nombre y su nombre para poder volver a ingresarlo dentro de las facturas que lo usan, para que se actualice.
El sistema es ciertamente muy rápido, pero tiene algunos problemas.
El primer es que, al escribir la consulta sql de esta manera, si el nombre del cliente tuviera una comilla dentro, generaría un error. Para gestionarlo, recordamos que es suficiente duplicarlos o usar la función convap como en este ejemplo:
"update invoices set customers='" ... utility.convap(name) .. "' where ...."
El segundo problema es que si se tratara de una base de datos en la nube, los cambios realizados no se sincronizarían. La sincronización se basa de hecho en otros valores y funciones.
Si se quisiera realizar la sincronización, este sistema aún estaría equivocado porque después de actualizar los datos ya no sería posible verificar cuáles han cambiado. Esto significaría enviar a todos los clientes de vuelta al servidor a pesar de que no se hayan realizado cambios.
Si se requiere la sincronización de datos, siempre hay dos pasos a realizar a través de scripts.
database.setsql("UPDATE invoices SET tid=" .. tostring(utility.tid()) .. " WHERE gguid_name='" .. gname .. "'")
Primero se debe actualizar el tid con la fecha actual porque es el registro temporal de la línea de datos.
Durante la fase de sincronización, el programa verifica qué líneas se han actualizado desde la última vez y envía solo esas.
table_rows = database.getsql("SELECT * FROM invoices WHERE gguid_name=' " .. gname .. "'")
nrows = table_rows.countrows()
rows = table_rows.getrows()
for i = 1,nrows do
database.addsyncbox("invoices",rows[i].getvalue("gguid"))
end
La segunda operación en realidad solo se realiza si el script también debe usarse en dispositivos móviles. Estos, de hecho, tienen un sistema de sincronización que clasifica los datos que se enviarán de una manera ligeramente diferente.
En esta parte del script, se recuperan todas las líneas de factura que utiliza nuestro cliente y se marcan para ser enviadas para su sincronización con el comando addsyncbox.
Última nota: recuerdáis que, como filtro, siempre es una buena regla agregar "and eli=0" para evitar recuperar los datos que actualmente están en la basura.