Utilizzare un lettore a codice a barre dentro a un documento di Windows

In questo esempio vedremo di compilare le righe di un documento in automatico utilizzando un lettore a codice a barre usb. Questo esempio per ovvi motivi non è utilizzabile sui dispositivi mobile.

Gruppo ScriptEvento
SchedaValore in modifica

Un lettore a codice a barre non è altro che un emulatore di tastiera. In pratica legge il codice, lo trasforma in testo e lo inserisce nel punto in cui si trova il cursore in quel momento, come se fosse scritto con la tastiera.

Recuperato il nostro lettore, creeremo all’interno un campo sul documento che utilizzeremo come contenitore per recuperare la lettura. Questo campo non salverà niente in realtà, ma è necessario per poter lanciare la procedura.

Lo script sarà collegato all’evento che intercetta la modifica del campo. Creiamolo e iniziamo a inserire le seguenti righe.

if datafield.name() ~= "codice_a_barre" then
        do return end
end
if string.sub(datafield.getvalue(),-1) ~= "£" then
        do return end 
end 

Le prime righe dello script servono per capire se il campo in modifica è quello che utilizzeremo per la lettura del codice a barre. Questo serve perché lo script viene eseguito sul cambiamento di tutti i campi della scheda.

La prima condizione controlla che il campo sia quello corretto, mentre la seconda serve per verificare che l’inserimento sia stato fatto attraverso il lettore a codice a barre con un piccolo trucco.

Poiché lo script è lanciato a ogni singola modifica, occorre evitare che venga fatta una ricerca sugli articoli per ogni carattere scritto. Visto che il lettore è come una tastiera, letteralmente scriverà il nostro codice carattere per carattere.

È stata dunque sfruttata una caratteristica dei lettori, quella di poter aggiungere un carattere speciale in fondo alla lettura. Questo è possibile programmando il lettore grazie a sue procedure specifiche che possono variare da uno all’altro. Così facendo, finché lo script non legge come ultimo carattere quello speciale, non proseguirà con l’elaborazione.

s = string.sub(datafield.getvalue(),1,string.len(datafield.getvalue())-1)
datafield.setvalue(""

Una volta confermato che il campo sia quello giusto e che abbia una lettura completa data dal carattere speciale, creiamo la stringa s per avere il codice togliendo l’ultimo carattere, quello di fine lettura. Cancelliamo poi quello che attualmente è scritto nel campo per poter procedere alla prossima lettura.

tabellarighe = dataview.getatable("fatture_rows")
nrighe       = tabellarighe.countrows()
righe        = tabellarighe.getrows()

Visto che sicuramente è possibile leggere più volte lo stesso codice prima di inserirlo nella fattura, è necessario controllare che non ne esista già una. Se esiste aumenteremo la quantità, altrimenti creeremo la nuova riga. Recuperiamo quindi la tabella, le righe e il numero di righe.

for i = 1,nrighe do
        codice = righe[i].getvalue("codice")
        if codice == s then
               --aumento la quantità
               q = righe[i].getvalue("qta")
               q = q + 1
               righe[i].setvalue("qta",q)
               tabellarighe.update()
               do return end  
        end
end

In questo ciclo giriamo le righe per vedere se ne esiste una con lo stesso codice letto. Se la troviamo aumentiamo la quantità richiesta e blocchiamo l’esecuzione dello script poiché ha terminato il suo compito.

tabellaarticolo = database.getsql("SELECT * FROM
articoli WHERE codice='"
.. s .. "'")

Se siamo arrivati a questo punto (campo corretto, codice letto, codice non presente nelle righe) iniziamo a vedere se il codice letto corrisponde a un nostro articolo presente nel database, quindi procedo a creare la tabella interrogando il database.

if tabellaarticolo.countrows() > 0 then
        righe = tabellaarticolo.getrows()
        riga  = tabellarighe.adddatarow()
        riga.setvalue("codice",s)
        riga.setvalue("gguid_codice",righe[1].getvalue("gguid"))
        riga.setvalue("descrizione",righe[1].getvalue("descrizione"))
        riga.setvalue("um",righe[1].getvalue("um"))
        riga.setvalue("prezzo_iniziale",righe[1].getvalue("prezzo"))
        riga.setvalue("qta",1)
        tabellarighe.update()
else
        --se devo gestire la creazione
end

Se trovo l’articolo con il codice letto, procedo a creare la nuova riga e inserisco i dati essenziali (il codice e il suo gguid) e tutti quelli che ritengo mi siano utili per completare la riga.

Per finire forziamo l’aggiornamento con un update per informare il programma di ricalcolare le eventuali espressioni.