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 ScriptEvento
FichaValor 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.