…to explore strange new worlds…

Nella prima parte di questo articolo dedicato all'utilizzo avanzato dei campi multipli - se non lo hai ancora letto lo trovi qui - abbiamo esplorato le basi di uso dei campi multipli.

L’inserimento calcolato delle singole lettere di un testo in ciascuna ripetizione ci ha portato all’essenziale concetto di base che il motore di calcolo di FileMaker valuta il calcolo in maniera diversa per ogni singola ripetizione di un campo multiplo, pur all’interno di uno stesso campo

A questo punto, i più smaliziati avranno capito che se possiamo inserire in ciascuna ripetizione le singole lettere di un testo, nulla ci impedisce di inserire anche i singoli valori di una lista.

Questo tipo di approccio - se utilizzato in combinazione con altre funzioni di FileMaker, come i campi globali, e le funzioni EseguiSQL e codifica/decodifica in Base64, permette di raggiungere risultati davvero interessanti.

È questo il metodo più veloce per inserire dei dati in un portale (purché siano un numero gestibile e/o finito) provenienti da una terza tabella, anche non correlata alla tabella visualizzata nel portale: ci basta ricavare la lista delle voci e creare una campo multiplo in cui sistemarle.

Gestire i taglie e colori grazie ai campi multipli

Partiamo da un esempio di base. Dobbiamo gestire i modelli di abito di un negozio di abbigliamento.

Ciascun modello ha le stesse taglie, ma diversi colori. Per ciascun colore ci sono più taglie, quindi in sostanza ci sono tre tabelle: modello, colore e capo.

Nella tabella capo sono riportati i singoli capi, ovvero tutte le combinazioni di modello, colore e taglia presenti in negozio.

L’inizio è molto semplice: associamo i modelli ai colori mediante una semplice relazione (modello::ID = colore::ID_modello) e creiamo un portale in cui mostrare tutti i colori del modello esaminato.

La complessità nasce quando si vuole mostrare l’elenco delle taglie (e le relative quantità) in orizzontale per ciascun colore, dato che non si può inserire un portale nel portale.

In questo caso la via più semplice è creare due campi multipli (con il numero di ripetizioni uguale al numero massimo previsto di taglie per modello) e gestire i dati mediante calcolo.

Vediamo come: assumendo che le taglie di un modello siano inserite in maniera ordinata (ad esempio in un campo e separate da un trattino, stile XS-S-M-L-XL-XXL-XXXL, per prima cosa ricaviamo in un campo calcolato (che chiamiamo taglie_lista) una lista con un semplice:

CercaeSost (campo_taglie;"-";¶)

passiamo quindi a creare un campo multiplo (che chiameremo taglie_descrizione) per gestire le singole taglie con un semplice calcolo:

CercaeSost (ValoriinMezzo (Espanso(taglie_lista) ; Get(NumeroRipetizioneCalcolo) ; 1 );¶; "")

A questo punto possiamo anche effettuare calcoli. Utilizzando la funzione EseguiSQL possiamo ad esempio controllare la quantità di ciascuna taglia inserita nella tabella capo:

If(EVuoto(taglie_descrizione); "";

EseguiSQL ( "SELECT SUM(qta) FROM capo WHERE taglia=? AND id_modello=?" ; "" ; ""  ; taglie_descrizione; Espanso(ID) )

)

Questo calcolo - in se' semplicissimo -  si basa sul concetto con cui abbiamo iniziato questo articolo: il contenuto del campo viene valutato separatamente per ogni ripetizione (grazie al parametro taglie_descrizione che per ogni ripetizione riporta automaticamente la corrispondente ripetizione del campo) ma con una formula identica, con grande risparmio di tempo.

Nel caso la ripetizione sia vuota, la funzione If() iniziale evita che il calcolo sia valutato, e restituisce la casella vuota, perché in quel caso le taglie per il modello sono meno delle ripetizioni del campo multiplo.

Inoltre questo calcolo è indipendente dal contesto: possiamo riprenderlo in altre tabelle con il minimo dello sforzo.

Abbiamo infatti risolto il problema del modello, ma dobbiamo valutare ancora le quantità per i singoli colori. Nella tabella colori andiamo a creare un campo calcolato molto simile:

If(EVuoto(modello::taglie_descrizione); "";

EseguiSQL ( "SELECT SUM(qta) FROM capo WHERE taglia=? AND id_modello=? AND id_colore=?" ; "" ; ""  ; modello::taglie_descrizione; Espanso(ID_modello ); Espanso(ID) )

)

Il calcolo si basa sul campo che abbiamo creato nella tabella modelli (grazie alla relazione); l’unica modifica che è necessario fare è l’aggiunta di un parametro di ricerca relativo al colore specifico.

Infatti, la tecnica utilizza la funzione EseguiSQL che non si basa sulle relazioni o sui foundset ma opera su tutti i dati presenti nella tabella scelta.

That’s All, Folks! (cit. Looney Tunes)

Con esattamente TRE calcoli di poche righe abbiamo realizzato una reportistica di grande utilità.

…to seek out new life; new civilizations…

Questa tecnica  apre la strada a molte possibilità, soprattutto a proposito di interfaccia, calcoli e refresh: e qui apriamo una bella parentesi graffa.

FileMaker gestisce in maniera dinamica il data broadcasting.

Questo significa che i campi calcolati (che in realtà non dovrebbero nemmeno essere chiamati campi, ma questa è un’altra storia…) e i portali visualizzati sul formato vengono ricalcolati ogni volta che si effettuano cambiamenti nei dati afferenti, da parte di qualunque utente della soluzione.

In sostanza i campi calcolati e i portali vengono riproposti all’utente ogni volta che il client scambia i dati con il server, scaricando la cache e aggiornando il formato.

Finché si lavora in monoutenza, i problemi si limitano alla perdita di fuoco se si opera su più di un portale e un tot di refresh ogni tanto.

In multiutenza, il refresh o la perdita di fuoco possono rendere la soluzione poco usabile e molto molto lenta.

Ci sono casi quindi in cui la cosa migliore è proprio abbracciare l’eresia, e sostituire i portali o i campi correlati con campi multipli.

Saremo cosparsi di pece e piume e poi messi al rogo?

No, se c’è una finalità specifica e il tipo di dati lo consente.

Nulla ci impedisce, ad esempio, di impostare un multiplo con 50 ripetizioni che prenda dinamicamente i valori da una tabella correlata e che useremo unicamente per consultazione: utilizzando la funzione Lista() è possibile infatti impostare le ripetizioni di un campo multiplo con i valori dei record correlati visualizzati in un portale:.

Possiamo utilizzare questo metodo sia come campo calcolato (più lento, ma automatico) oppure in un campo normale popolato via script (più veloce, ma con una procedura dedicata e possibili problemi di record locking).

Quando il modo più sbagliato possibile diventa il più corretto

Lo svantaggio principale dell’utilizzo dei campi multipli è dato dalla loro arcaicità: in molti casi possono avere dei risultati imprevisti se usati in combinazione con le features implementate nelle versioni più recenti di FileMaker.

Il contenuto dei campi multipli è ad esempio totalmente impermeabile alla funzione EseguiSQL,  che riporterà sempre e comunque la prima ripetizione del campo.

Anche la nuova funzione Nascondi se interpreta il campo multiplo come un unico oggetto, se inserito nel formato come blocco di ripetizioni. Inserire le ripetizioni, associare a ciascuna separatamente lo stesso script con relativo parametro e le impostazioni di formato aumenta decisamente il carico di lavoro.

File di esempio

Compilando il form qui sotto è possibile ricevere direttamente in mail il file di esempio che ho preparato:

 

Nel prossimo articolo sull'argomento vedremo come utilizzare i campi multipli per modificare e gestire i dati a livello di interfaccia… sempre evitando i buchi neri!

LASCIA UN COMMENTO

Please enter your comment!
Please enter your name here