Utiliser un lecteur à code barres dans un document de Windows

Dans cet exemple on voit comment remplir les lignes d’un document automatiquement en utilisant un lecteur à code barres usb. Cet exemple pour des raisons évidentes n’est pas utilisable sur les appareils mobiles.

Groupe ScriptÉvénement
FicheValeur en modification

Un lecteur à code barres n’est rien d’autre qu’un émulateur de clavier. En pratique il lit le code, le transforme en texte et l’insère à l’endroit où se trouve le curseur à ce moment-là, comme s’il était écrit avec le clavier.

Une fois récupéré notre lecteur, on va créer au dedans un champ dur le document qu’on va utiliser comme contenant pour récupérer la lecture. Ce champ n’enregistrera rien en réalité, mail il est nécessaire pour lancer la procédure.

Le script sera lié à l’événement qui intercepte la modification du champ. Créons-le et commençons à saisir les lignes suivantes.

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

Les premières lignes du script servent pour comprendre si le champ en modification est celui qu’on utilise pour la lecture du code à barres. C’est parce que le script est exécuté sur le changement de tous les champs de la fiche.

La première condition vérifie que le champ soit correct, et la deuxième sert pour vérifier que l’insertion a été faite par le lecteur de code à barres avec une petite astuce.

Puisque le script est lancé à chaque modification, il faut éviter qu’une recherche soit faite sur les articles pour chaque caractère écrit. Vu que le lecteur est comme un clavier, il va littéralement écrire notre code de caractère par caractère.

Une caractéristique des lecteurs donc a été exploitée, celle de pouvoir ajouter un caractère spécial à la fin de la lecture. Cela est possible en programmant le lecteur grâce à ses procédures spécifiques qui peuvent varier de l’un à l’autre. Ce faisant, jusqu’à ce que le script lise le caractère spécial comme dernier caractère, ne poursuivra pas l’élaboration.

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

Une fois confirmé que le champ est le bon et qu’il a une lecture complète donnée par le caractère spécial, nous créons la chaîne s pour avoir le code en supprimant le dernier caractère, celui de fin de lecture. Après nous supprimons celui qui actuellement est écrit dans le champ pour procéder à la prochaine lecture.

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

Vu que sûrement il est possible de lire plusieurs fois le même code avant de le saisir dans la facture, il est nécessaire de vérifier qu’il n’y en a pas déjà une. Si elle existe, nous augmenterons la quantité, sinon nous créerons la nouvelle ligne. Nous récupérons donc le tableau, les lignes et le nombre de lignes.

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

Dans ce cycle, nous tournons les lignes pour voir s’il y en a une avec le même code lu. Si on la trouve, nous augmentons la quantité demandée et nous bloquons l’exécution du script parce que il a terminé sa tâche.

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

Si on est arrivé à ce point (champ correct, code lu, code non présent dans les ligne) nous commençons à voir si le code lu correspond à notre article présent dans la base de données, donc nous procédons à créer le tableau en interrogeant la base de données.

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 je trouve l’article avec le code lu, je crée la nouvelle ligne et je saisis les données essentielles (le code et son gguid) et tous ceux que je pense être utiles pour compléter la ligne.

Pour terminer nous forçons la mise à jour avec une actualisation pour informer le logiciel de recalculer les expressions éventuelles.