Field Level script & function getFieldNamed

Tap Forms – Organizer Database App for Mac, iPhone, and iPad Forums Script Talk Field Level script & function getFieldNamed

Viewing 7 reply threads
  • Author
    Posts
  • June 19, 2024 at 3:35 PM #50818

    John Hamill
    Participant
    A javascript runs correctly with a “hard coded” field_ID. It fails however if the field_ID is retrieved using the functions ‘form.getFieldNamed(‘field_name’)’ and ‘object.getId()’.
    Can anyone see why this might not work? I intend to use this function in ALL of my forms. Hence the need to source the field_ID from its ‘field name”.
    Thanks for any help.
    The code is quite straightforward (you can substitute any field id below to test it). If the user enters “XXYY” in the field, it should set that field to ‘null’:
    function Script() {
    // ***** OPERATES CORRECTLY *****:
    // the following two lines of code work correctly (when the field id
    // hardcoded).
    var analysis_g2_fld_id = ‘fld-37435e1d73024374b4700105e49993c9’;
    var analysis_g2_value = record.getFieldValue(‘fld-37435e1d73024374b4700105e49993c9’);
    // ***** FAILS *****:
    // the following three lines of code do NOT work
    // (ie. when the field ID is sourced via functions). If the three
    // lines of code below are executed in a “form level script”, it does
    // work. It is only when in a “field level script” that it fails.
    // analysis_g2_obj = form.getFieldNamed(‘Analysis_G2’);
    // var analysis_g2_fld_id = analysis_g2_obj.getId();
    // var analysis_g2_value = record.getFieldValue(analysis_g2_fld_id);
    if (analysis_g2_value == “XXYY”)
    record.setFieldValue(analysis_g2_fld_id, null);
            return 0;
    }
    Script();
    form.saveAllChanges();
    June 20, 2024 at 9:42 PM #50824

    Brendan
    Keymaster

    The issue is that my Objective-C code scans your source code to determine which fields you’re referencing in the script by looking for the text .getFieldValue('fld-.....'). Or when using a variable instead of ('fld-....'). But it doesn’t execute your code before your function is run to determine what the field ID is for getFieldNamed('Analysis_G2') so that it can trigger the script when that value in that field changes.

    It works as a Form script because you’re manually executing the script when you want. But a Field script relies on monitoring the fields in the form to see what’s changed and then it runs the script if the script has a reference to one of those fields with the hard coded field ID.

    After you save your script, check the Fields list to see if you see a checkmark next to any of the fields. If so, those are the fields Tap Forms will monitor for changes. If you don’t see any, the script won’t be triggered automatically.

    June 23, 2024 at 3:05 PM #50833

    John Hamill
    Participant

    So if I am understanding this correctly, that function (getFieldNamed) is effectively disabled within a field level script.

    The script text MUST (at the outset) contain the fld_ID of a field that will “change value”.

    So any function that returns the fld_ID will be ineffective in a field level script (unless the script already contains a fld_ID). Perhaps getFieldNamed is the only function that does that?

    I cannot think of a workaround as you are very much limited when using a field level script.

    Is this correct?

    Thanks for help.

    June 23, 2024 at 6:49 PM #50834

    Brendan
    Keymaster

    The getFieldNamed() function is not disabled. It just doesn’t cause the field script to be executed when you enter a value into that field in the record. If there was another field that’s referenced with the field ID directly, then that will trigger the script to run.

    The trigger is specifically on the getFieldValue() function.

    June 25, 2024 at 4:42 AM #50840

    John Hamill
    Participant

    Thanks for the reply, Brendan.

    I believe your statement (that the getFieldNamed function is not disabled) is somewhat semantic. Maybe I am wrong, but my understanding of what you are saying is that the following process occurs in a field level script:

    Prerequisites for execution of a field level script:

    1. The function ‘getFieldValue’ MUST be present.
    2. A valid fld_ID value MUST be present. This value can be explicit or the value can be contained within a variable.

    Process:
    1. Tapform’s Objective-C code scans the source code in my script.
    2. It finds the function ‘getFieldValue’.
    3. It fails to find a valid fld_ID as the code (within the field level script) has yet to be executed as a Javascript.
    4. As the prerequisites have not been satisfied, no script execution actually takes place.

    What I am saying is that the ‘getFieldNamed’ function and its use within a field level script are basically incompatible as (at the Objective-C code scan stage), there will NEVER be a fld_ID to satisfy the second prerequisite stated above.

    That effectively makes useless any inclusion of ‘getFieldNamed’ in a field level script (for its primary function of retrieving a fld_ID). I agree that the function is not disabled, but it is inoperable (useless) within a field level script.

    That is my reading of it, but perhaps my understanding of the process above is wrong?

    June 26, 2024 at 12:35 AM #50845

    Brendan
    Keymaster

    Everything you’ve described is correct and is exactly how Field scripts behave.

    You’ll need to be explicit about which fields you’re referencing in the getFieldValue('fld-...') function so that Tap Forms knows which fields to monitor. I’m sorry that it doesn’t work the way you want it to. But that’s another level of abstraction that Tap Forms doesn’t know how to deal with. And  there could be unintended consequences if I evaluate your JavaScript code just to find out what the Field IDs are when using getFieldNamed() so I can monitor those fields.

    June 26, 2024 at 2:06 AM #50846

    John Hamill
    Participant

    Thanks Brendan. AI (of course) will have solved all of these types of problem in a few years   :)

    June 26, 2024 at 8:35 AM #50847

    Daniel Leu
    Participant

    I run into this the other day as well. The solution was just to add a dummy field id definition: const field_id = 'fld-xxx';. This was all TapForms 5 needed to detect the field dependency and trigger the execution of my field script.

    Maybe the API could be enhanced to add a trigger parameter to the field script object that the user can set if needed.

Viewing 7 reply threads

You must be logged in to reply to this topic.