La cosa, tutto sommato, non è sotto le luci della ribalta e, anche se qualcuno (forse molti) già conosce e usa questo “trucco”, spenderci due righe può aiutare a diffondere una comoda funzionalità che in molti casi risolve problemi apparentemente complessi: le funzioni VBscript (o JScript), definite nell’ambiente di gestione delle macro di QlikView, possono essere invocate all’interno del codice di ETL, estendendo di fatto il corredo di metodi a disposizione quando si progetta l’estrazione e la manipolazione delle fonti dati.
Un caso pratico “di vita vissuta” riguarda la necessità di analizzare un campo testuale con le “Regular Expression”, che si sa non sono uno strumento nativo del linguaggio di ETL: per non invischiarmi in una noiosa descrizione del problema reale, che presupporrebbe di spiegare il processo di business a monte della soluzione adottata, risolviamo ipotizzando che lo scopo sia genericamente quello di validare un campo testuale che contiene un indirizzo email.
Cominciamo scrivendo la macro che si occupi della validazione, servendosi delle RegExp di VBscript:
function check_mail(email)
Set re = New RegExp
‘prima della chiocciola
re.Pattern = “^[A-Za-z0-9][A-Za-z0-9\.\-_]*[A-Za-z0-9]*$”
left_string = Left(email, (InStr(email, “@”) – 1))
Set matches = re.Execute(left_string)
If matches.Count > 0 Then
‘dopo la chiocciola
right_string = Right(email, (Len(email) – InStr(email, “@”)))
re.Pattern = “^[A-Za-z0-9][A-Za-z0-9\.\-_]*[\.][A-Za-z]+$”
Set matches = re.Execute(right_string)
If matches.Count > 0 Then
check_mail = “1”
Else
check_mail = “0”
End If
Else
check_mail = “0”
End If
End function
Chiedo fin da subito indulgenza sulla perfezione (o meno) dell’algoritmo di controllo in se, fatto al volo come caso di esempio, e passo invece a come usare questa macro all’interno dello script di ETL. Per semplicità immaginiamo di avere un collegamento ODBC ad una tabella DB che contiene delle anagrafiche con un campo “email_utente” da controllare:
SET ThousandSep='.';
SET DecimalSep=',';
SET MoneyThousandSep='.';
SET MoneyDecimalSep=',';
SET MoneyFormat='€ #.##0,00;-€ #.##0,00';
SET TimeFormat='hh:mm:ss';
SET DateFormat='DD/MM/YYYY';
SET TimestampFormat='DD/MM/YYYY hh:mm:ss[.fff]';
SET MonthNames='gen;feb;mar;apr;mag;giu;lug;ago;set;ott;nov;dic';
SET DayNames='lun;mar;mer;gio;ven;sab;dom';
ODBC CONNECT TO DB_TEST;
Load
nome,
cognome,
check_mail(email_utente) as validazione_email,
email_utente,
nazione;
SELECT * FROM tabella_utenti;
Come si vede la funzione VB viene utilizzata come una normale funzione disponibile da script e l’unica controindicazione è, ovviamente, legata al lieve rallentamento che viene introdotto nella procedura di caricamento.
Naturalmente ci sono delle limitazioni all’uso di questa tecnica, oltre alla familiarità con il linguaggio di scripting, per esempio non è possibile scrivere macro che contengano dei cicli (while, for, for each…); l’elenco completo delle funzionalità supportate può essere trovato nella guida e/o sul manuale utente.