Le funzioni personalizzate di FileMaker: oggi ne creiamo insieme due!
Partendo dai risultati raggiunti con i primi articoli di questa serie, oggi ci dedicheremo a creare due nuove funzioni personalizzate realmente utili ed utilizzabili.
Tutti conoscono le due funzioni di testo native di FileMaker:
Filter ( ) e FilterValues ( )
Ma noi vogliamo ottenere i rispettivi risultati opposti e lo faremo con:
ContraFilter ( ) e ContraFilterValues ( )[divider]
Filter ( textToFilter ; filterText ) dà come risultato un testo che contiene SOLO i caratteri del primo parametro che sono presenti ANCHE nel secondo parametro della funzione, per cui:
Filter ( “abc” ; “abd” ) restituisce “ab”
ContraFilter ( textToFilter ; filterText ) dovrà invece restituire un testo che contenga SOLO i caratteri del primo parametro che NON sono presenti nel secondo parametro della funzione, per cui:
ContraFilter ( “abc” ; “abd” ) dovrà restituire “c”
La funzione personalizzata, con i relativi commenti, è:
// ContraFilter ( textToFilter ; filterText ) CF ricorsiva
[divider]
Let(
$cfContraFilter = $cfContraFilter + 1 ;//definiamo una variabile locale come contatore
Case (
$cfContraFilter ≤ Length ( filterText ) ;//finchè la variabile locale è minore od uguale al numero dei caratteri del filtro
ContraFilter ( Substitute ( textToFilter ; Middle ( filterText ; $cfContraFilter ; 1 ) ; "" ) ; filterText ) ;//ripeti eliminando dal testo originale il carattere n-contatore del filtro
Let( $cfContraFilter = "" ; textToFilter )//altrimenti annulla la variabile locale e scrivi il testo ottenuto
)
)
FilterValues ( textToFilter ; filterValues ) dà come risultato un testo che contiene SOLO i valori del primo parametro che sono presenti ANCHE nel secondo parametro della funzione, per cui:
FilterValues ( “a¶b¶c” ; “a¶b¶d” ) restituisce “a¶b”
ContraFilterValues ( textToFilter ; filter Values ) dovrà invece restituire un testo che contenga SOLO i valori del primo parametro che NON sono presenti nel secondo parametro della funzione, per cui:
ContraFilter ( “a¶b¶c” ; “a¶b¶d” ) dovrà restituire “c”
La funzione personalizzata, con i relativi commenti, è:
// ContraFilterValues ( textToFilter ; filter Values ) CF ricorsiva
[divider]
Let([
count = ValueCount ( textToFilter ) ;
value = GetValue ( textToFilter ; 1 ) ;
$cfContraFilterValues = If ( not PatternCount ( ¶ & filter Values & ¶ ; ¶ & value & ¶ ) ; List ( $cfContraFilterValues ; value ) ; $cfContraFilterValues ) ;//definiamo una variabile locale che conterrà il testo finale
NewList = If ( count > 1 ; RightValues ( textToFilter ; count - 1 ) ) ;//definiamo una nuova lista che escluda il primo valore
result = If ( ValueCount ( NewList ) ; ContraFilterValues ( NewList ; filter Values ) ; $cfContraFilterValues ) ;//finchè la nuova lista conterrà un valore, ripeti, altrimenti fermati e dai come risultato il contenuto della variabile locale
$cfContraFilterValues = ""//azzera la variabile locale
];
result
)
Come considerazione finale, ci tengo a far notare come – e soprattutto, quando – è stata azzerata la variabile locale $cfContraFilterValues.
Attendo i vostri commenti!
[download id=”605″]