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
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
)
)
[divider]
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
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
)
[divider]

Come considerazione finale, ci tengo a far notare come – e soprattutto, quando – è stata azzerata la variabile locale $cfContraFilterValues.

Attendo i vostri commenti!

Clicca qui per scaricare il file con le funzioni

2 Commenti

  1. Ciao Daniele,
    hai definito la funzione ContaRicorrenze così: ( ¶ & filter Values & ¶ ; ¶ & value & ¶ )
    L'aggiunta degli "¶" evita il rischio di conteggiare ad es. il 2 nel 12, 22 etc..? Giusto?

    Grazie
    Mikhail

LASCIA UN COMMENTO

Please enter your comment!
Please enter your name here