Utilizarea unui cititor de cod de bare in cadrul unui document Windows

In acest exemplu vom vedea cum se completeaza automat liniile unui document utilizand un cititor de coduri de bare USB. Acest exemplu nu poate fi folosit pe dispozitive mobile din motive evidente.

Grup ScriptEveniment
FisaValoare in modificare

Un cititor de coduri de bare nu este altceva decat un copiator de tastatura. In practica, citeste codul, il transforma in text si il introduce in punctul in care se afla cursorul in acel moment ca si cum ar fi scris cu tastatura.

Dupa ce ne-am recuperat cititorul, vom crea un camp in cadrul documentului pe care il vom folosi ca si container pentru a prelua citirea. Acest camp nu va salva nimic in realitate, dar este necesar pentru a lansa procedura.

Script-ul va fi legat de evenimentul care intercepteaza modificarea campului. Il cream si incepem sa introducem urmatoarele randuri.

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

Primele randuri ale script-ului sunt utilizate pentru a intelege daca, campul care este modificat este cel pe care il vom folosi pentru citirea codului de bare. Acest lucru este necesar, deoarece script-ul este executat la modificarea tuturor campurilor fisei.

Prima conditie verifica daca, campul este cel corect, in timp ce a doua serveste pentru a verifica daca introducerea a fost facuta cu ajutorul cititorului de coduri de bare cu un mic truc.

Deoarece script-ul este lansat la fiecare modificare, este necesar sa se evite efectuarea unei cautari in articole pentru fiecare caracter scris. Intrucat cititorul este ca o tastatura, ne va scrie codul literal, caracter dupa caracter.

Prin urmare, o caracteristica a cititorilor a fost exploatata, aceea de a putea adauga un caracter special la sfarsitul citirii. Acest lucru este posibil prin programarea cititorului datorita procedurilor sale specifice care pot varia de la unul la altul. Facand acest lucru, pana cand scriptul nu il va citi ca ultim caracter pe cel special, nu va continua cu procesarea.

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

Odata confirmat ca, campul este cel corect si ca are o citire completa data de caracterul special, cream sirul s pentru a avea codul eliminand ultimul caracter, cel de la sfarsitul citirii. Stergem apoi ceea ce este scris in prezent in camp pentru a putea trece la urmatoarea citire.

table_rows = dataview.getatable("invoice_rows")
nrows = table_rows.countrows()
rows = table_rows.getrows()

Intrucat este cu siguranta posibila citirea aceluiasi cod de mai multe ori inainte de a-l introduce pe factura, este necesar de verificat daca nu exista deja unul. Daca exista, vom creste cantitatea altfel vom crea noul rand. Recuperam apoi tabelul, randurile si numarul de randuri.

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

In acest ciclu controlam liniile pentru a vedea daca exista una cu acelasi cod citit. Daca o gasim, crestem cantitatea necesara si blocam executia script-ului, deoarece acesta si-a incheiat sarcina.

table_item = database.getsql("SELECT * FROM
items WHERE code='"
.. s .. "'")

Daca am ajuns la acest punct (camp exact, cod citit, cod ce nu este prezent in randuri) incepem sa observam daca, codul citit corespunde unuia dintre articolele noastre din baza de date apoi, procedam la crearea tabelului prin interogarea bazei de date.

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

Daca articolul cu codul citit este gasit, se trece la crearea noului rand si introducerea datelor esentiale (codul si GGUID-ul sau) si toate celelalte date considerate utile pentru completarea randului.

Pentru a finaliza, trebuie fortata actualizarea cu un update pentru a informa programul sa recalculeze eventualele expresii.