Name Lookup

Viewing 16 reply threads
  • Author
    Posts
  • April 15, 2023 at 12:04 PM #49338

    Chris Jordan
    Participant

    Hi,
    I have two Forms. One called Donations and the other called People. In the Donations form I have the script below where I’m attempting to look up the name of a person by Envelope number. I double-clicked the “Child records loop” Snippet with the People – Envelope field highlighted.

    For some reason I’m not getting any records (people.length = 0) even though there are 26 Records in the People Form. I am running the script in the Editor and length prints out 0. I must be doing something wrong. Can someone please give me some guidance.

    Thanks,
    Chris

    function Script() {
    
    	function recordsLoop() {
    	
    		var people_id = 'fld-16486faf17c94f779b495e39db0d2a51';
    		var envelope_id = 'fld-86ff175986c74617a1c71822bf7e9f2c';
    		var people = record.getFieldValue(people_id);
    	
    		console.log(people.length);
    		
    		for (var index = 0, count = people.length; index < count; index++){
    	     	var envelope = people[index].getFieldValue(envelope_id);
    	     	console.log(envelope);
    	     	
    	     	if (envelope) {
    				// do something
    				console.log(envelope);
    			}
    		}
    		return;
    	}
    	
    	recordsLoop();
    
    }
    
    Script();
    • This topic was modified 1 year, 8 months ago by Brendan. Reason: added back ticks around script code
    April 15, 2023 at 12:48 PM #49340

    Brendan
    Keymaster

    Maybe the function definition within a function definition is messing things up.

    Remove the outer function declaration and see if that solves the issue.

    April 15, 2023 at 1:07 PM #49341

    Chris Jordan
    Participant

    Thanks Brendan, I tried your suggestion. I’ve reduced it to this and I get “undefined” about 15 times which is the number of records in the Donation form.

    function recordsLoop() {
    
    	var people_id = 'fld-042db77a64be4be0a8f041e927d5ff24';
    	var envelope_id = 'fld-86ff175986c74617a1c71822bf7e9f2c';
    	var people = record.getFieldValue(people_id);
    
    	var cnt = people.length;	
            console.log(cnt);
        
    	for (var index = 0, count = people.length; index < count; index++){
         	var envelope = people[index].getFieldValue(envelope_id);
         	
         	console.log(index);
         	
    		if (envelope) {
    			// do something
    		}
    	}
    	return envelope;
    }
    
    recordsLoop();
    • This reply was modified 1 year, 8 months ago by Brendan. Reason: Added back ticks to format code
    April 15, 2023 at 8:34 PM #49343

    Brendan
    Keymaster

    Hi Chris,

    FYI, I keep adding back-ticks to your posts so the code gets formatted properly. Just add a back tick character on the first line of your code at the begging and at the end of the last line of your code.

    I don’t see anything wrong with your code.

    Can you post your form template?

    April 16, 2023 at 5:01 AM #49344

    Chris Jordan
    Participant

    Yes, here is my form template.

    Thanks for your help,

    Chris

    Attachments:
    You must be logged in to view attached files.
    April 17, 2023 at 8:56 PM #49347

    Brendan
    Keymaster

    Hi Chris,

    Ok, so your form is setup with People as the parent and Donations as the child.

    Your script is in your Donations form. Your script is attempting to loop through the parent People record. However, it’s not an array because it’s just one object. A Donation record has only a single People parent record. So you can just get the People record, then ask it for one of the fields.

    Since your script is called Firstname, I’m assuming you’re trying to get the People record’s First Name field.

    So all you need to do is first get the parent People record, then ask that record for the value from the First Name field.

    Here’s code to do that:

    function firstName() {
    	var people = record.getFieldValue('fld-042db77a64be4be0a8f041e927d5ff24');
    	var first_name = people.getFieldValue('fld-8c3880a29ec949e0a8ff1d502b527ae7');
    	return first_name;
    }
    
    firstName();

    That’ll do it. Hopefully that’s what you’re looking to do.

    April 17, 2023 at 8:58 PM #49348

    Brendan
    Keymaster

    By the way, to write that code, all I had to do was double-click on the People field on the left side of the Script Edit window. Then double click on the First Name field. Then all I typed was the return first_name and I wrapped it into a function structure.

    April 18, 2023 at 7:04 AM #49349

    Chris Jordan
    Participant

    Hi Brendan,

    Yes that is exactly what I wanted! I was confused because I thought the Child Records Loop snippet was giving me the right code. But, I was wrong in my thinking. So in the People Form the field Donations, which is a Link to a Form datatype, is what establishes the Parent (People) / Child (Donations) relationship? Also, I am used to thinking in SQL, so are forms the same as tables? And documents the same as databases?

    I really appreciate your prompt replies and excellent explanations. Great product too!

    Thanks,

    Chris

    April 18, 2023 at 11:59 AM #49350

    Chris Jordan
    Participant

    Hello again Brendan,

    I guess what I was originally trying to do, was write a script that:

    1. Automatically connected each donation to its parent record based on Envelope number.
    2. Automatically fill in the name field based on the Envelope number found in the parent record.

    Number two is what you just helped me with, however I had to manually select the parent record in the Inverse Relationship field, by looking up and connecting the correct Envelope number for the person. I know you have removed the SQL language, however now I have to understand the inner modeling of the application in order to write Javascript to pull the data.

    Still learning,

    Chris

    April 18, 2023 at 12:47 PM #49351

    Brendan
    Keymaster

    hi Chris,

    The Child Records Loop snippet is designed to fetch the child records, not the parent record. So in your case, the People form is the parent and the Donations form is the child. So if you wanted to put a field on the People form that say, concatenated all of the donations for that People record together, that’s when you would use the Child Records Loop.

    Yes, Documents are like Databases. Logically and technically as each .tapforms document is actually a folder that contains within it its own SQLite database.

    And yes, Forms are like tables precisely. Records are of course like SQL records and fields are like Table Columns in SQL.

    If you want to automatically connect your forms together based upon some key field, then you would need to use the Join Link Type on your Link to Form field and set the common fields up. Then Tap Forms will auto-join for you.

    But that does in fact change the JavaScript code you would need to get the name values. Because with a Join Link Type, that is in fact the same as an automatic Many to Many relationship. That is, for each Donation record, there technically could be many People records and for each People record there could be many Donation records.

    So now when you get the value of the People field from the record, you’ll get an array instead of just the one object like in my code example. In this case, the Child Records Loop would work as expected.

    Hope that makes sense.

    Thanks,

    Brendan

    April 18, 2023 at 4:01 PM #49352

    Chris Jordan
    Participant

    Hi Brendan,

    Well thanks for your explanations! Now that I understand how TapForms works I was able to achieve what I wanted by making the Parent/Child relationship Many-to-Many. This gave me access to all the records and I was able to automatically lookup the name by envelope number. Here is my resulting code. Thanks again for your help!!

    Chris

    function Name() {
    
    	// Get the Donation record data
    	var envelope_donation_id = 'fld-99a449db91cc4bd9ace9a8c92e9e47b9';
    	var envelope_donation = record.getFieldValue(envelope_donation_id);
    
    	// Get the People record data
    	var people_id = 'fld-042db77a64be4be0a8f041e927d5ff24';
    	var envelope_id = 'fld-86ff175986c74617a1c71822bf7e9f2c';
    	var people = record.getFieldValue(people_id);
    	var last_name_id = 'fld-f5e0010890dc47e886215eb097695315';
    	var first_name_id = 'fld-8c3880a29ec949e0a8ff1d502b527ae7';
    	
    	// Loop through the People records
    	for (var index = 0, count = people.length; index < count; index++){
         	var envelope = people[index].getFieldValue(envelope_id);
         	var first_name = people[index].getFieldValue(first_name_id);      		var last_name = people[index].getFieldValue(last_name_id);     	
         	// Does the Donation Envelope match the People Envelope?
    		if (envelope = envelope_donation) {
    			
    			// Yes, now get the name data
    			if(first_name && last_name)
    				return first_name + " " + last_name;
    			else if(!first_name && last_name)
    				return last_name;
    			else if(first_name && !last_name)
    				return first_name;
    		}
    	}
    	// We only get here if we can't find an envelope match
    	return "Not Found!";
    }
    
    Name();
    April 18, 2023 at 8:33 PM #49353

    Brendan
    Keymaster

    if (envelope = envelope_donation) {

    You should use == since that’s a comparison operator. You’ve used = which is an assignment operator.

    April 19, 2023 at 4:15 AM #49354

    Chris Jordan
    Participant

    Oh darn! I knew that. Fixed it. Thanks for the code review Brendan!

    April 19, 2023 at 12:35 PM #49355

    Brendan
    Keymaster

    Another little trick:

    var name = [];
    name.push(first_name);
    name.push(last_name);
    
    return name.join(" ");
    

    Basically it puts the first and last names into an array and then joins them together with a space. And if only one value is in the array because it’s not empty, then that’s the only value you get. But if both values are in the array, then you get them joined together with a space character in between.

    Saves having to do all that if statement logic.

    April 20, 2023 at 1:39 PM #49362

    Chris Jordan
    Participant

    That’s a good tip! Thanks Brendan.

    My script still isn’t working the way I wanted it to because in the Donations table I still have to manually select the Parent data in the “People” inverse relationship field. If I don’t select anything my script doesn’t work. I wanted to be able to put the Envelope ID in the Donations record and have it automatically look up all the relevant data in the People table. I don’t know if I am making any sense or not.

    People Donations
    ====== =========
    Envelope Envelope (manually entered)
    First Name First Name (auto fill from the script)
    Last Name Last Name (auto fill from the script)

    Anyway, I think I am going to just have one form and put the Donations on each person’s data in the People table.

    Thanks,

    Chris

    April 20, 2023 at 8:23 PM #49365

    Brendan
    Keymaster

    You’ll need a Join Link Type for that. Do you have that set? Or are you using Many to Many?

    April 21, 2023 at 6:05 AM #49367

    Chris Jordan
    Participant

    Well, I am giving up on scripts. I keep going round and round with this. I get the script to work in the console window while editing and then I go to the form and the field doesn’t update. I refresh both tables and go back to the script edit window and now the console values don’t work. So frustrating. I think there is an update issue in the software.

Viewing 16 reply threads

You must be logged in to reply to this topic.