AVETE DAVVERO BISOGNO DI UN OCX PER LO SCANNER TWAIN IN ACCESS?

no ocx

Si, il titolo è abbastanza provocatorio. E’ certamente possibile trovare sul mercato varie librerie ed estensioni ActiveX (OCX) per implementare funzionalità non supportate nativamente da MS-Access. Normalmente il supporto di queste applicazioni è fantastico (sulla carta) ma il prezzo pare segua invariabilmente la stessa pendenza della qualità del prodotto offerto, arrivando anche a 1.000 euro per installazione.

Dunque, mi sono detto, miriamo al ribasso.

In fin dei conti un buono scanner è dotato di una buona interfaccia di scansione. Il mio Epson GT-2500, ad esempio, fornisce un’interfaccia fantastica, semplice e completamente configurabile.

La premessa di questo articolo, dunque, è di EVITARE l’uso di librerie specializzate. I costi sono troppo altri e chissà poi la distribuzione dell’applicazione che sorprese riserverà.

La logica che ho utilizzato è banale ma può essere che non vi sia (ancora) venuta in mente. D’altro canto è normale “pretendere il massimo” dalle applicazioni che costruiamo. Tuttavia non sempre è strettamente necessario: vediamo come.

Attraverso l’interfaccia TWAIN di uno scanner “fatto bene” è possibile impostare vari parametri. A parte i più ovvi (metodo, risoluzione ecc.) è quasi sempre possibile selezionare una cartella di default, un prefisso predefinito per il nome, il tipo di file che si intende produrre (PDF, JPG ecc.).

Dunque in  pratica abbiamo la possibilità di automatizzare a costo zero le scansioni: Accediamo il programma, scansioniamo ed il file è stato inserito nella cartella di destinazione con tanto di nome e ora automatici.

Tramite VBA è possibile richiamare il programma di scansione. Gli scanner Epson, ad esempio, utilizzano una comoda interfaccia definita “Epson Scan” che è in sostanza un piccolo programma che si trova nel seguente percorso:

C:\Windows\twain_32\escndv\escndv.exe

Ottimo! dunque nella mia Form di inserimento dati, posso prevedere l’apertura di questo programma, istruendo un pulsante con la seguente routine:

 Sub ChiamaScanner()

Dim x As Variant
Dim Path As String
Path = “C:\Windows\twain_32\escndv\escndv.exe”

x = Shell(Path, vbNormalFocus)

End Sub

A questo punto, ultimata la scansione del file (PDF, ad esempio) la piccola applicazione avrà creato nella cartella che avrò precedentemente impostato (per esempio c:\immagini) un file col prefisso da me impostato (per esempio IMG) seguito da un progressivo automatico che il programma è in grado di assegnare.

Dunque mi ritrovo nella cartella c:\immagini il file IMG001.PDF

Ce ne saranno altri, certo! La peculiarità del file appena creato, però, è che è stato, appunto, APPENA creato e dunque la data e l’ora (un metadato tipico di ogni file) saranno ESATTAMENTE quelli della scansione.

Questo dato è utilissimo!

Posso in effetti creare una procedura in grado di utilizzare questo metadato (data e ora) per selezionare, fra gli altri, il file giusto (il più recente!) da allegare alla registrazione. Ecco la procedura:

Decidiamo di rendere esplicita e permanente (oppure la recuperiamo da una tabella “sistema” del DB) la path in cui vengono versate le scansioni.

Nel secondo caso, data una tabella di un’unica riga chiamata “sistema” in cui è presente, oltre agli altri, un campo  “percorso”, recuperiamo tramite Dlookup la path:

Sub AssegnaPercorso()

PerC = DLookup(“[Percorso]”, “Sistema”, “[ID_Sistema] = 1”)

End Sub

Dunque la path sarà contenuta nella variabile PerC

Nella stessa tabella di sistema, ho previsto altri due campi che serviranno a memorizzare nome e data dell’ultimo file. Ovviamente questa operazione non è automatica ma dovrà essere attivata in fase di inserimento dei dati relativi al documento nel database.

Detto in parole più povere lo scenario è:

  1. apro la maschera per inserire i dati del documento da scansionare
  2. premo il pulsante di scansione, mi si apre l’interfaccia TWAIN, faccio la scansione e chiudo (il file verrà salvato nella cartella predefinita)
  3. inserisco qualche dato.
  4. In un campo a mia scelta, tramite l’evento AFTER UPDATE (dopo aggiornamento) avvio la procedura di ricerca dell’ultimo file presente nella cartella predefinita
  5. Trovato il file più recente, avvio la valorizzazione automatica del campo che contiene il nome del file completo di path
  6. Aggiorno la tabella di sistema con questi dati (data e nome del fire più recente)

A questo punto il gioco è fatto. Programmazione a parte, le operazioni manuali di inserimento da parte dell’utente sono le stesse (o forse inferiori) a quelle necessarie per ottenere l’identico risultato con un OCX.

Dal punto di vista del codice:

Con il codice seguente faccio gran parte del lavoro. Ho commentato le singole istruzioni:

Sub LookForNew()

Dim n As String, msg As String, StrSQL As String, d As Date
Dim Drecente As Date, Nrecente As String
Call AssegnaPercorso ‘ richiamo l’istruzione di lookup vista prima per memorizzare in PerC il percorso

‘creo un oggetto di sistema per poter leggere il contenuto della cartella PerC

Set fso = CreateObject(“Scripting.FileSystemObject”)
Set fils = fso.GetFolder(PerC).Files

‘leggo i singoli file e li sottopongo al confronto con il precedente.

 ‘dal momento che se count=1 d e n non hanno precedenti, assumo il valore attuale

For Each fil In fils
Count = Count + 1
If Count = 1 Then Nrecente = fil.Name
If Count = 1 Then Drecente = fil.DateCreated

n = fil.Name
d = fil.DateCreated

‘se il valore di data del precedente è inferiore all’attuale, prende per buono l’attuale
If Drecente < d Then Nrecente = n
If Drecente < d Then Drecente = d
Next fil

‘aggiorna la tabella sistema coi nuovi dati Data e nome file
StrSQL = “UPDATE sistema SET DataUltimoDoc = ” & “#” & Drecente & “#” & ” WHERE [ID_sistema] = 1″
DoCmd.RunSQL StrSQL
StrSQL = “UPDATE sistema SET NomeUltimoDoc = ” & Chr$(34) & Nrecente & Chr$(34) & ” WHERE [ID_sistema] = 1″
DoCmd.RunSQL StrSQL
Set fso = Nothing
End Sub

Questa procedura, insomma, fa il lavoro di trovare data e nome del file più recente nella cartella predefinita e ne informa il database.

A questo punto è possibile, su un qualunque evento della maschera (come ad esempio l’aggiornamento di un campo obbligatorio), far partire la procedura che riporterà sulla form, nel campo “nome file”, il nome del file appena scansionato completo di percorso.

E’ ovvio che questa operazione deve essere fatta SOLO se il campo risulta vuoto. Nel caso fosse pieno significa che il record che state visualizzando è magari una vecchia registrazione e non è il caso di cambiare  il nome del file! 

Private Sub id_tipologia_AfterUpdate()

‘avvia la procedura di ricerca del nuovo file e di memorizzazione di data e nome nella tabella sistema

Call LookForNew
‘crea il nome del file completo di path da inserire nel campo nome file della form
nomefile = DLookup(“[NomeUltimoDoc]”, “Sistema”, “[ID_Sistema] = 1”)
nometemp = PerC & “\” & nomefile

‘aggiorna il campo nome_file SOLO se è vuoto
If Me.nome_file.Value = “” Or IsNull(Me.nome_file.Value) = True Then Me.nome_file.Value = nometemp
End Sub

Lo so, non è semplicissimo.

A presto!

m@u

No thoughts on “AVETE DAVVERO BISOGNO DI UN OCX PER LO SCANNER TWAIN IN ACCESS?”