Eccoci nuovamente a parlare di QlikView e FileSystem… Questa volta cercheremo di sfruttare le potenzialità più “spinte” di accesso alle informazioni contenute nelle cartelle di un computer PC o Server che sia.
Cominciamo a costruire un semplice script, che permette di accedere ad una determinata cartella per ottenere la lista del suo contenuto, ipotizzando di aver salvato il path da cui partire dentro una variabile che chiamiamo “Root”:
Set Root = "C:\CartellaProva"; For each Cartella in dirlist(Root&'\*') //il senso di questo ciclo è di eseguire qualche tipo di operazione per ogni CARTELLA //che si trovi all'interno di C:\CartellaProva\ Next Cartella
A questo punto possiamo “farcire” questo ciclo con una funzione che lavora sui file JPEG contenuti in una cartella, ottenendo la reiterazione della funzione per tutte le cartelle individuate all’interno di C:\CartellaProva.
Un primo esempio di funzione che lavora sui file può essere questo:
sub DirFiles(Dir) for each varFileTrovato in filelist(Dir & '\*.jpg') //caricamento di una tabella con i dati relativi al File Load @1:n as NomeFile Inline "$(varFileTrovato)" (fix, no labels); next varFileTrovato end sub
A questo punto possiamo servirci delle funzionalità di QlikView per lavorare ad esempio sulle informazioni contenute nei MetaDati del file in questione, corredando la tabella creata di colonne dove poter leggere le caratteristiche dell’immagine caricata:
sub DirFiles(Dir) for each varFileTrovato in filelist(Dir & '\*.jpg') Load NomeFile, Attribute(NomeFile, 'Model') as MacchinaFotografica, Attribute(NomeFile, 'ExposureTime') as TempoEsposizione; //caricamento di una tabella con i dati relativi al File Load @1:n as FileLongName Inline "$(varFileTrovato)" (fix, no labels); next varFileTrovato end sub
A questo punto è sufficiente richiamare la funzione creata nel ciclo visto all’inizio:
Set Root = "C:\CartellaProva"; For each Cartella in dirlist(Root&'\*') Call DirFiles(Cartella) Next Cartella
Il risultato del codice scritto qui sopra è uno “scope” sul primo livello di cartelle a partire dalla C:\CartellaProva. Se invece si volesse eseguire un ciclo che possa analizzare tutti i sottolivelli della cartella di partenza, basterebbe servirsi di una funzione ricorsiva; in tal caso il codice completo sarebbe quello di seguito:
//FUNZIONE RICORSIVA sub DirFiles(Dir) for each varFileTrovato in filelist(Dir & '\*.jpg') Load NomeFile, Attribute(NomeFile, 'Model') as MacchinaFotografica, Attribute(NomeFile, 'ExposureTime') as TempoEsposizione; //caricamento di una tabella con i dati relativi al File Load @1:n as FileLongName Inline "$(varFileTrovato)" (fix, no labels); next varFileTrovato //PASSO DI RICORSIONE For each Cartella in dirlist(Dir&'\*') call DirFiles(Cartella); Next Cartella end sub Set Root = "C:\CartellaProva"; //START DELLA FUNZIONE A PARTIRE DALLA RADICE call DirFiles('$(Root)');
Naturalmente a questo esempio, necessario a mostrare anche la funzione “Attribute”, se ne può facilmente sovrapporre uno dove i file in questione siano degli XLS o dei TXT e le load carichino informazioni contenute in essi, un esempio di seguito:
//FUNZIONE RICORSIVA sub DirFiles(Dir) for each varFileTrovato in filelist(Dir & '\*.xls') Let FilePath = Dir & '\' & varFileTrovato; //caricamento di una tabella con i dati contenuti nel file Excel Load * From $(FilePath) (biff, embedded labels, table is [Foglio1$]); next varFileTrovato //PASSO DI RICORSIONE For each Cartella in dirlist(Dir&'\*') call DirFiles(Cartella); Next Cartella end sub Set Root = "C:\CartellaProva"; //START DELLA FUNZIONE A PARTIRE DALLA RADICE call DirFiles('$(Root)');