Espansione del segno $

Diverso tempo fa mi è capitato di dover usare una funzionalità poco nota delle variabili di QlikView… talmente poco nota, che nel giro di poco tempo ho dimenticato anche io!

Di recente però ho dovuto rispolverarne l’uso e mi sembra doveroso “fissare” la memoria di questo “stratagemma” per evitare che vada nuovamente smarrito e occultato. Si tratta di quello che nel manuale viene chiamato espansione del segno $ e rappresenta un modo efficace per rendere snello, leggibile e parametrico il codice ETL in alcune situazioni.

Immaginate di dover fare operazioni ripetitive su una serie di campi di una tabella da caricare: un esempio banale è una rappresentazione di valori numerici espressi (ad esempio in un file excel) come testo e con il punto “.” al posto della virgola come separatore decimale. Sanare tutti i campi numerici significa scrivere:

Load
Codice,
Descrizione,
Num(Replace(Campo1, '.', ',')) as Campo1,
Num(Replace(Campo2, '.', ',')) as Campo2,
Num(Replace(Campo3, '.', ',')) as Campo3,
Num(Replace(Campo4, '.', ',')) as Campo4,
....
From <file excel>;

Ma se per un qualsiasi motivo dovessimo poi cambiare la formula, per esempio per fare una “Round()” sui campi numerico, dovremmo, una ad una, cambiare le singole righe della Load scritta qui sopra. In situazioni come queste ci viene in aiuto l’espansione del $; il codice che segue rappresenta la versione “parametrica” di quello precedente:

SET myReplace = Num(Replace($1, '.', ','));
Load
Codice,
Descrizione,
$(myReplace(Campo1)) as Campo1,
$(myReplace(Campo2)) as Campo2,
$(myReplace(Campo3)) as Campo3,
$(myReplace(Campo4)) as Campo4,
...,
From <file excel>;

In poche parole definisco una “funzione” parametrica che posso riutilizzare nelle Load: si vede evidenziato nella “SET”, il parametro identificato con “$1″. Ovviamente si possono costruire “funzioni” con più parametri: è evidente che in uno scenario come quello descritto prima, se dovessi modificare le operazioni da fare sui campi numerici aggiungendo una “Round()”, sarebbe sufficiente modificare la “SET” iniziale in questo modo

SET myReplace = Round(Num(Replace($1, '.', ',')), 0.1);

per avere, in cascata, la modifica applicata a tutta la Load.

Sulla stessa falsariga, questo è un esempio a due parametri in cui fisso in una variabile il peso della Round():

SET peso = 0.01; SET myReplace = Round(Num(Replace($1, '.', ',')), $(#peso));