Evaluate-Let 2.0

Deze keer een custom-functie: EvaluateLet() en deze kan worden gebruikt om een string variabelen (die er uitziet als: “$test=1;$naam=\”Piet\”” etc. )  in één keer om te zetten in tig-variabelen.

In de filemaker-help en in diverse artikelen op internet kan je info vinden over het in één set-variable scriptstap declareren van meerdere variabelen.

Evaluate ( “Let([” & parameter-string & “] ; 1 )” )

Ook op deze site vindt je daar een artikel over van Jos: Scriptparameters en results en gaat daar indirect ook over. Deze methode werkt ook perfect, maar heeft zo merkte ik ook een belangrijke beperking: het lukt niet om meer dan 1000 variabelen in één keer aan te maken.

Meer dan 1000 variabelen in één keer? Ik hoor het veel mensen bij wijze van spreken denken. Stel je voor een offerte met 100 items, die in subrecords zijn opgeslagen en die wil je dupliceren of promoveren naar een order. Je kan dan per (line) item gemakkelijk meer dan 10 eigenschappen hebben, die allemaal niet standaard zijn. Wanneer je niet per regel werkt, niet gaat importeren, maar simpelweg alle gegevens verzamelt (en intussen ook nog bewerkt) in één grote parameter, dan heb je die 100 stuks snel bereikt.

De oplossing is dan om de string in zulke delen op te delen, zodat deze altijd bestaan uit 1000 of minder variabelen …. Daar kan je een script voor gebruiken, maar ik gebruik zelf voor evaluate-let al een custom functie en deze lijkt enorm op wat je hierboven ziet, behalve dat er wat “idiot-proofing” aan is toegevoegd.

Deze custom-functie heb ik uitgebreid, zodat ik alle scripts waarin deze constructie wordt gebruikt ongemoeid kan laten en ook niet meer hoef na te denken of ik de 1000-variabelen grens al heb bereikt, de CF regelt dat zelf.

EvaluateLet ( parameterlist )

Let ( [
    // create one-line parameter
    param = Substitute ( TrimAll ( parameterlist ; 1 ; 1 ) ; [ “;¶$” ; “;$” ] ; [ “; $” ; “;$” ] ) ;
    // count the parameters
    n = ValueCount ( Substitute ( param ; [ “;$” ; “;¶$” ] ) ) ;
    // set the maximum number … the number * 10.000 is the maximum number of params
    // the max of maxn = 1000 (filemaker doesn’t allow a larger number to be evaluated
    // at one time); the purpose of the formula
    maxn = 250 ;
    // determine the total character-length of the last “maxn” of parameters:
    len = If ( n > maxn ; Length ( param )-
        Position ( param ; “;$” ; Length ( param ) ; -maxn ) + 1 ; Length ( param ) ) ;
    // set the last “maxn” of parameters to the current parameters to be evaluated
    this = Right ( param ; len ) ;
    // calculate the left-over portion of the initial parameter
    rest = Left ( param ; Length ( param )-len )
] ;
    // Store the “this”-paramater until end of function where no new parameters can be
    // stored and evaluate in LiFo-order
    Let ( [
        // remove first “;” if needed and calculate the position of the first character of
        // the parameter-string
        pos = Case( Left ( this ; 1 ) = “$” ; 1 ; Left ( this ; 2 ) = “;$” ; 2 ; 0 ) ;
        len = Length( this ) + 1 – pos ;
        par = Middle( this ; pos ; len )
    ] ;
        If ( pos > 0 ;
            // Call this function (recursive) until the “rest” parameter is empty;
            // then return the parameter-evaluation-result, effectively creating
            // the parameters in the order as they are entered in the initial string
            Evaluate (
            “Let( [ ” & par & ” ] ; ” & If ( Length ( rest ) > 0 ; EvaluateLet ( rest ) ; 1 ) & “)” ) ;
            Evaluate ( “Let( [ $param-error = 1 ] ; 1 )” )
        )
    )
)

Zoals je ziet is de functie recursief, dus kan deze alleen als CF worden gedefinieerd. De waarde maxn staat hier ingesteld op 250. Er wordt hier gebruik gemaakt van zg. kop-recursie, waardoor het maximum aantal iteraties op 10000 uitkomt en samen de de maxn levert dat een maximum van 2,5*10^6 ofwel 2,5 miljoen variabelen op. Voor de meeste toepassingen is dat voldoende en anders kan je maxn ophogen naar maximaal 1000, dan kan je er 10 miljoen, dus 4 keer zoveel, declareren (waarom je dat zou doen is natuurlijk weer een heel ander verhaal 😉 )

Mocht je het een en ander willen testen …. dan zal je tegen wat beperkingen van filemaker aanlopen: Je hebt een tekstvariabele nodig en die kan maximaal 2Gb bevatten, maar dat zijn volgens de Filemaker-help ongeveer 1Gb karakters, dus die 10 miljoen van hierboven ga je waarschijnlijk niet halen. Een ander issue is dat wanneer je de dataviewer gebruikt, dat je met kopiëren en plakken in een variabele, niet meer dan 30000 karakters kwijt kan. Je zult dus een scriptje moeten gebruiken je variabelen te vullen, als je grotere parameters wilt gebruiken.Het maximum aantal parameters van 2,5 tot 10*10^6 is dus ook zeer theoretisch en zal in de praktijk om diverse redenen dus niet haalbaar zijn …. het interne “filemaker native” maximum van 1000 is echter wel erg laag en daar is deze functie dan toch wel handig voor. 😛

In het demo-bestand tref je 3 knoppen aan:
1 ) Aanmaken van een lijst waarmee 2000 variabelen kunnen worden gemaakt.
2 ) Een knop de me standaard Evaluate-Let, als in de documentatie van FM
3 ) En een knop met Evaluate-Let 2.0

Dit is de demo: Evaluate-Let 2.0 Pas in de demo gerust de waarde 2000 in de exit-loop/verlaat-lus aan, door daar resp. 1000 en 1001 in te vullen en het veld “ParameterList” vervolgens opnieuw in te laten vullen. Test daarna met ieder van deze waarden wat er gebeurt met de standaard Evaluate-Let methode, dan krijg je de beperking(en) van FM zelf te zien.