Tap Forms – Organizer Database App for Mac, iPhone, and iPad › Forums › Script Talk › Open record as result
- This topic has 15 replies, 6 voices, and was last updated 9 months, 3 weeks ago by Scott Specker.
-
AuthorPosts
-
October 19, 2023 at 2:39 AM #50000
Paul HirstParticipantIf I’ve written a script to conduct a search and then at the end want to open the record that is the result of the search is there a way to do this? I have found the ability to print the result but that brings it up as a page to print rather than opens up the record?
October 19, 2023 at 9:29 AM #50001
Daniel LeuParticipantHi Paul, did you try
form.selectRecord(someRecord);
?- This reply was modified 1 year ago by Daniel Leu.
October 19, 2023 at 1:32 PM #50003
Paul HirstParticipantNo I haven’t. I’ll give that a shot. Is someRecord the record ID? I can’t see it defined in the API.
October 19, 2023 at 4:38 PM #50004
Daniel LeuParticipantAccording to the API doc, the parameter is a
record
, so it’s a record object and not a record id. If you have one search result I would trylet records = search.getRecords(); form.selectRecord(records[0]);
- This reply was modified 1 year ago by Daniel Leu.
October 20, 2023 at 12:39 AM #50008
David GoldParticipantHi Daniel (or OP)
I would like to be able to do this also. I have some code below (not sure exactly how to insert a code block). I’m trying to do what you’ve said in line 11 with function show_name. Basically I want to be able to search the name field and when I get a result (whether multiple or single by selection in prompter) it then opens the record in Tap Forms. Can you tell me how to make it work?
Really appreciate any help as my javascript knowledge is limited.
var myForm = document.getFormNamed(‘Test’);var records = myForm.getRecords();var search_term = Utils.copyTextFromClipboard();var result_count = 0;var results = [];var results_name = [];var selected;function show_name( name ) {form.selectRecord(name[0]);}function copy_result_multiple( name ) {if ( name == true ) {console.log( ‘Index:’ + results.indexOf( selected ) );console.log( results_name[ results.indexOf( selected ) ] );show_name( results_name[ results.indexOf( selected ) ] );} else {console.log( ‘Cancelled’ );}}function multiple_results( all_results ) {let prompter = Prompter.new();prompter.cancelButtonTitle = ‘cancel’;prompter.continueButtonTitle = ‘Show Name’;prompter.addParameter(‘Select Result ‘, ‘selected’, ‘popup’, all_results).show(‘Multiple Results Found’, copy_result_multiple );}function search_records( haystack , needle ) {var name_id = ‘fld-1acb38c0b51b44698849501407b51722’;var rec;for (rec of haystack) {var name = rec.getFieldValue( name_id );if (name && name.includes( needle ) ) {results.push( rec.getFieldValue( name_id ) );results_name.push( rec.getFieldValue( name_id ) );result_count++;} else {if (! name) {console.log(“Empty field: ” + rec.getUrl());}}}if( result_count == 0 ){Utils.alertWithMessage(“No Results”, “No results were found for the search term: ” + needle);}else if( result_count > 1 ){//multiple resultsmultiple_results( results );}else{//single resultshow_name( results_name[0] );}}search_records( records , search_term );October 20, 2023 at 2:05 PM #50011
Daniel LeuParticipantYou can use backticks around the code to have it displayed as such.
When I write code, I try to avoid global variables. It makes it easier to understand what’s going on.
With
show_name( results_name[0] );
you provide a record object as argument. So there’s no need to do this again withform.selectRecord(name[0]);
. Justform.selectRecord(name);
in theshow_name
function would be sufficient.October 20, 2023 at 4:24 PM #50012
David GoldParticipantI hear you re global variables. When I remove the [0] I get the following error in the console:
Search Test Records Again: TypeError: Argument does not match Objective-C Class, line:(null)
October 20, 2023 at 6:17 PM #50016
Daniel LeuParticipantI got it working after some edits. It shows as well that
form.selectRecord(someRecord);
works :). The issue wasresults
vsresults_name
. The former contains the found records while the latter contains the matching names.A remaining issue is when you get more than one match. Since you match on the name and then use
results_name.indexOf(name)
to find the index, you will always stop at the first found entry. This needs some refinement.//var myForm = document.getFormNamed(‘Test’);//var records = myForm.getRecords();var records = form.getRecords();var search_term = Utils.copyTextFromClipboard();var result_count = 0;var results = [];var results_name = [];var selected;function show_name( name ) {form.selectRecord(name);}function copy_result_multiple( name ) {if ( name == true ) {let index = results_name.indexOf(selected);console.log( 'Index:' + index );console.log( results_name[index]);show_name( results[index]);} else {console.log( 'Cancelled' );}}function multiple_results( all_results ) {let prompter = Prompter.new();prompter.cancelButtonTitle = 'cancel';prompter.continueButtonTitle = 'Show Name';prompter.addParameter('Select Result ', 'selected', 'popup', results_name).show('Multiple Results Found', copy_result_multiple );}function search_records( haystack , needle ) {var name_id = 'fld-5ecd60d90a8246f4853175f6fc6aaabe';//var name_id = 'fld-1acb38c0b51b44698849501407b51722';var rec;for (rec of haystack) {var name = rec.getFieldValue( name_id );if (name && name.includes( needle ) ) {results.push( rec );results_name.push( rec.getFieldValue( name_id ) );result_count++;} else {if (! name) {console.log("Empty field: " + rec.getUrl());}}}if( result_count == 0 ){Utils.alertWithMessage("No Results", "No results were found for the search term: " + needle);} else if ( result_count > 1 ){//multiple resultsconsole.log("Found " + result_count + " matches");multiple_results( results );} else {//single resultconsole.log("Found one match");show_name( results[0] );}}search_records( records , search_term );- This reply was modified 1 year ago by Daniel Leu.
- This reply was modified 1 year ago by Daniel Leu.
- This reply was modified 1 year ago by Daniel Leu.
- This reply was modified 1 year ago by Daniel Leu.
- This reply was modified 1 year ago by Daniel Leu.
October 20, 2023 at 8:07 PM #50023
David GoldParticipantThanks so much. Really appreciate it. It is definitely working on my Mac. For some reason it doesn’t actually open the record on iOS but I’ll live with it working on Mac. Thanks again!
October 20, 2023 at 8:14 PM #50025
Daniel LeuParticipantCool! The iOS issue is something for @brendan to look at.
October 20, 2023 at 8:16 PM #50026
David GoldParticipantOK thanks.
October 20, 2023 at 9:41 PM #50027
BrendanKeymasterThe
form.selectRecord()
function only works on the Mac version right now.You could ask the record for its URL with
record.getUrl()
and then callUtils.openUrl(url);
to have the record displayed on iOS.October 21, 2023 at 12:11 AM #50028
David GoldParticipantThanks. Got that working.
November 2, 2023 at 12:46 PM #50080
Glen ForisterParticipantI’ve always wanted this in a database, and I did have it in HanDBase in it’s early years, but it got lost for some reason in its later years and I severely miss it and asked about it soon after I joined.
Is this a function that can be attempted without Script knowledge to make all the connections. I can do that for simple scripts, but I wonder about the maze above.
Hopefully.
November 3, 2023 at 8:25 PM #50085
BrendanKeymasterHi Glen,
Which part of the above maze do you mean when you say
this
? Searching records? You don’t need scripting to search records.January 24, 2024 at 11:11 PM #50374
Scott SpeckerParticipantHi Brendan, thanks, this explains why form.selectRecord() wasn’t working on iOS.
The
form.selectRecord()
function only works on the Mac version right now.You could ask the record for its URL with
record.getUrl()
and then callUtils.openUrl(url);
to have the record displayed on iOS.I have a script that creates a new record following your mileage entry example. At the end, I want to go to the newly created record. Since select record doesn’t work on iOS, I tried the URL suggestion.
Unfortunately, the URL solution doesn’t appear to work on iOS, either. It works on the Mac, but on iOS, it doesn’t jump to the new record. I have to exit the current record and then manually select the new one.
var newRecord = form.addNewRecord();
form.saveAllChanges();// form.selectRecord(newRecord);
var url = newRecord.getUrl();
Utils.openUrl(url);Any idea what I am doing wrong?
-
AuthorPosts
You must be logged in to reply to this topic.