Usar un lector de código de barras dentro de un documento de Windows
En este ejemplo, vamos a ver de completar automáticamente las líneas de un documento utilizando un lector de código de barras USB. Este ejemplo no se puede usar en dispositivos móviles por razones obvias.
Grupo Script
Ficha
Evento
Valor en modificación
Un lector de código de barras no es más que un emulador de teclado. En la práctica, lee el código, lo transforma en texto y lo inserta en el punto donde está el cursor en ese momento, como si estuviera escrito con el teclado.
Una vez recuperado nuestro lector, crearemos un campo dentro del documento que usaremos como contenedor para recuperar la lectura. Este campo no guardará nada en realidad, pero es necesario para iniciar el procedimiento.
El script se vinculará al evento que intercepta la modificación del campo. Vamos a crearlo y comenzar a insertar las siguientes líneas.
if datafield.name() ~= "barcode" then
do return end
end
if string.sub(datafield.getvalue(),-1) ~= "£" then
do return end
end
Las primeras líneas del script se usan para comprender si el campo que se está editando es el que usaremos para leer el código de barras. Esto se debe a que el script se ejecuta al cambiar todos los campos en la ficha.
La primera condición verifica que el campo sea el correcto, mientras que la segunda sirve para verificar que la inserción se haya realizado a través del lector de código de barras con un pequeño truco.
Dado que el script se inicia con cada modificación, es necesario evitar buscar productos para cada carácter escrito. Como el lector es como un teclado, literalmente escribirá nuestro código de carácter por carácter.
Por lo tanto, se aprovechó una característica de los lectores, la de poder agregar un carácter especial al final de la lectura. Esto es posible programando al lector gracias a sus procedimientos específicos que pueden variar de uno a otro. Al hacerlo, hasta que el script lea el carácter especial como el último carácter, no continuará con el procesamiento.
s = string.sub(datafield.getvalue(),1,string.len(datafield.getvalue())-1)
datafield.setvalue("")
Una vez confirmado que el campo es el correcto y que tiene una lectura completa dada por el carácter especial, creamos la cadena s para tener el código eliminando el último carácter, el que está al final de la lectura. Luego eliminamos lo que está escrito actualmente en el campo para pasar a la siguiente lectura.
table_rows = dataview.getatable("invoice_rows")
nrows = table_rows.countrows()
rows = table_rows.getrows()
Como ciertamente es posible leer el mismo código varias veces antes de insertarlo en la factura, es necesario verificar que no exista uno. Si existe, aumentaremos la cantidad, de lo contrario crearemos la nueva línea. Luego recuperamos la tabla, las líneas y el número de líneas.
for i = 1,nrows do
code = rows[i].getvalue("code")
if code == s then
--Increase the quantity
q = rows[i].getvalue("qty")
q = q + 1
rows[i].setvalue("qty",q)
table_rows.update()
do return end
end
end
En este ciclo giramos las líneas para ver si hay una con el mismo código leído. Si lo encontramos, aumentamos la cantidad requerida y bloqueamos la ejecución del script porque ha terminado su tarea.
table_item = database.getsql("SELECT * FROM items WHERE code='" .. s .. "'")
Si hemos llegado a este punto (campo correcto, código leído, código no presente en las líneas) comenzamos a ver si el código leído corresponde a uno de nuestros productos presentes en la base de datos, luego procedo a crear la tabla consultando la base de datos.
if table_item.countrows() > 0 then
rows = table_item.getrows()
row = table_rows.adddatarow()
row.setvalue("code",s)
row.setvalue("gguid_code",rows[1].getvalue("gguid"))
row.setvalue("description",rows[1].getvalue("description"))
row.setvalue("um",rows[1].getvalue("um"))
row.setvalue("initial_price",rows[1].getvalue("price"))
row.setvalue("qty",1)
table_rows.update()
else
--if I have to manage the creation
end
Si encuentro el producto con el código leído, procedo a crear la nueva línea e inserto los datos esenciales (el código y su gguid) y todos los que creo que son útiles para completar la línea.
Finalmente, forzamos la actualización con una actualización para informar al programa que recalcule cualquier expresión.