Chi si occupa di programmazione conosce bene il concetto di Array, ovvero di variabili che contengono una lista di valori che può essere manipolata in vari modi.
Invece in Filemaker è un tipo di logica per i dati strutturati che non è messa in risalto, anche se a volte è di estrema utilità.
Un Array (ad una dimensione, ci sono anche quelli a più dimensioni ma in Filemaker in questo caso conviene usare le funzioni JSON) è la soluzione per quando occorre gestire un numero qualsiasi di valori con un’unica variabile.
Ad esempio, un Array tipico è:
var auto = [“Saab”,”Volvo”,”BMW”]
Viene definita la variabile “auto” in cui l’elemento 1 contiene la stringa “Saab”, il secondo “Volvo” e così via.
In Filemaker, tanto per cambiare, la struttura di un Array è diversa e in pratica è stata utilizzata quella delle liste; ovvero:
Saab
Volvo
BMW
Gli elementi sono separati dal Ritorno a Capo, ovvero ¶, che di solito è un carattere nascosto ma di cui dobbiamo tenere conto quando operiamo sulle liste/array.
Loop fra i record
In Filemaker spesso la soluzione più semplice, nei casi in cui occorre gestire campi su record diversi nello stesso script è di fare un loop che gira fra i record della tabella e su ogni record compie le operazioni desiderate, utilizzando gli stessi passi dello script ogni volta, fino ad arrivare all’ultimo record da cui il loop esce.
Un esempio può essere la fatturazione che ogni mese va fatta ad un gruppo di clienti, per cui avremo uno script di questo tipo:
Come si vede vi sono solo i passaggi fondamentali che generano i nuovi record già correlati e non altro, che al momento non riguarda quello che stiamo valutando.
Il concetto è chiaro: muovendomi fra le due tabelle mi porto la variabile $idClienti che cambia ad ogni ciclo del loop. Potrei anche generare direttamente il record in FATTURE se l’opzione di creazione record tramite relazione è attivata. In questo caso potrebbe essere la soluzione più “economica” come numero di step, ma quello che vorrei mostrare è appunto l’alternativa basata su una variabile che contiene molti valori, utile in molte altre situazioni.
Liste e loro manipolazione
Ci sono diverse funzioni disponibili che agiscono sulle liste, fondamentalmente per crearle e quindi per ricavarne i dati inseriti. La prima funzione, quella che la genera è:
Lista ( campo {; campo…} )
La lista viene ricavata dal contesto del campo indicato: se si tratta di un campo multiplo viene restituita la lista dei valori del campo multiplo del record su cui ci si trova. Di uso relativo, dato che il campo multiplo sarebbe meglio non utilizzarlo mai.
Se sono indicati più campi, la lista riporta il contenuto dei vari campi, sempre del record su cui ci si trova, anche questa situazione è abbastanza raro che sia necessaria.
Di ben maggiore utilità: se viene indicato un campo correlato la lista riporterà tutti i valori di quel campo dei record correlati, nell’ordine in cui sono stati generati, quindi non ordinati.
Ed infine, quello che è la soluzione definitiva in molti casi: se si imposta un campo riassunto con opzione Lista di avremo la lista dei valori del campo dei record trovati ed ordinati, che è quello che ci serve per i nostri Array.
Facciamo un esempio molto semplice. Nella tabella abbiamo 4 record con il solo _ID_clienti e il flag fatturazione.
Senza fare altro nel campo riassunto, in giallo, abbiamo già la nostra lista/array che riporta i 4 _ID_clienti.
Dopo aver fatto la ricerca di fatturazione la lista del campo riassunto riporta i 3 _ID_clienti relativi ai record trovati.
Dopo aver ordinato per ordine discendente di _ID_clienti anche la lista riporta i record così come effettivamente vengono mostrati. Mica male, vero?
A questo punto basta impostare una variabile o un campo globale e abbiamo a disposizione il nostro Array.
La fase successiva è estrarre i dati per utilizzarli: la funzione che permette di ricavare il valore nella posizione indicata è
RicavaValore ( listaValori ; NumeroValore )
Se dobbiamo estrarre un valore di cui sappiamo la posizione nella lista è banale. Se invece dobbiamo fare la rotazione dei valori come con il loop precedente, allora lo script è questo di seguito, partendo da CLIENTI dopo aver fatto ricerca e ordinamento voluti:
In pratica la funzione RicavaValore tramite la variabile $posizione, che si incrementa di 1 per ogni giro del loop, prende il valore relativo in $array e lo imposta nel nuovo record, senza spostarci più fra le tabelle.
Altri dettagli sulle liste
Da Filemaker 16 abbiamo a disposizione una funzione che è fondamentale per la manipolazione degli array, ed è:
UniqueValues ( valori {; tipo dati ; locale } )
Questa funzione permette di ricavare i valori unici della lista, cosa che prima si poteva fare o con funzioni personalizzate o con loop attraverso i record abbastanza impegnativi. Il parametro tipo dati determina se i valori vanno considerati come testo, numero, data etc, mentre locale indica la lingua da considerare.
Nell’Help sotto la funzione
SortValues ( valori {; tipo dati ; locale } ),
anche questa molto utile per la manipolazione delle nostre liste/array, si trovano le informazioni di riferimento.
Altra funzione relativa alle liste è
ValoriFiltro ( testoDaFiltrare ; ValoriFiltro )
che ci permette di sapere se uno o più valori sono presenti nella lista indicata.
Il suo utilizzo non è intuitivo. Dà come risultato i valori così come li abbiamo impostati in ValoriFiltro se presenti nella lista, altrimenti restituisce un valore vuoto.
Ma è utile usare liste come Array?
Per concludere: utilizzare le liste come Array non è fondamentale. Filemaker è comunque molto intuitivo e offre diverse strade per arrivare al risultato, ma usarli rende Filemaker un po’ più flessibile e professionale.