Search Results for 'form.getRecords'
Tap Forms – Organizer Database App for Mac, iPhone, and iPad › Forums › Search › Search Results for 'form.getRecords'
-
AuthorSearch Results
-
February 3, 2024 at 1:37 PM #50452
Fernando DS
Participant- I have an income and expense form and I want to automate it as much as possible. To do this, and with the invaluable help of my friend ChatGPT, I have made the script that I am sending you. What I want is for the last pending payments or collections to be credited when the script is executed, if the current date is later than the date of said payments or collections. The payment records are in a table-type field called “Calculations”, which includes the fields: – “Payment or collection date”, date type field, is the expected date for payment or collection. – “Amounts and accumulated”, numerical field, is the amount to be paid or collected. – “Payments and accumulated”, numerical field, is filled in with the value of the Amounts field when the Payment Date arrives. What the script intends is that when the Payment or Collection Date is before the current date, the script is executed and the following actions occur: In the line of the last pending payment, the Payments field will be filled in with the value of the Amounts field, so that payment or collection will be settled. At the same time, a new line will be created with the new Payment or Collection Date and the new Amount, which is always the same, and therefore will copy the amount of the previous movement. Regarding the new date, the script will take into account the “Periodicity” field, a text field that marks the type of period that passes between one movement and the next, monthly, annual, etc., and which is also outside the Calculations table. And with this the next pending payment or collection will be completed. Two more fields will also be completed, which are outside the Calculations table: – Next payment or collection date, date type field, which will copy the date of the last pending payment or collection that has been created. – Balance/next payment or collection, field calculated with a formula, which is the balance between the totals of the Amounts and the Payments. Here the new balance will be incorporated, which will be equal to the previous one. And that would be it. I want to clarify that I also have records with different amounts, but I find it very difficult to put these in a script. Each record in the form is a different payment or collection and are independent of each other. Without prejudice to the fact that the amounts are added to obtain totals and balances. Anyway, I hope I have explained myself. Although I will clarify any doubts. And this is the script
var fechaActual = new Date();
var registros = form.getRecords();registros.forEach(function (registro) {
var calculos = registro.getFieldValue(‘fld-d8a58dbf35914f3c858c6dfb880c1c48’) || [];
var fechaProximoPagoCobro = registro.getFieldValue(‘fld-3671b67b092b4b3b949984292c023511’);
var saldoProximoPagoCobro = registro.getFieldValue(‘fld-a554770fd7834b22802b65c488be9f0d’);
var periodicidadTexto = registro.getFieldValue(‘fld-aaba9a24064a4a8893a3963f7cbe8595’);
if (calculos.length > 0 && fechaProximoPagoCobro && saldoProximoPagoCobro && periodicidadTexto) {
var fechaUltimoCalculo = new Date(calculos[calculos.length – 1].fecha_pago_o_cobro_id);// Si la última fecha de pago es anterior a la fecha actual
if (fechaUltimoCalculo < fechaActual) {
var nuevaFecha = new Date(fechaUltimoCalculo);
var meses = { ‘Mensual’: 1, ‘Bimensual’: 2, ‘Trimestral’: 3, ‘Semestral’: 6, ‘Anual’: 12 };
var dias = { ‘7 días’: 7 };// Añadir tiempo a la fecha según la periodicidad
if (meses[periodicidadTexto]) {
nuevaFecha.setMonth(nuevaFecha.getMonth() + meses[periodicidadTexto]);
} else if (dias[periodicidadTexto]) {
nuevaFecha.setDate(nuevaFecha.getDate() + dias[periodicidadTexto]);
}// Si la nueva fecha es en el futuro, añadimos una nueva entrada
if (nuevaFecha > fechaActual) {
var ultimoImporte = calculos[calculos.length – 1].importes_y_acumulado_id;
calculos.push({
fecha_pago_o_cobro_id: nuevaFecha,
importes_y_acumulado_id: ultimoImporte,
pagos_y_acumulado_id: ”
});
}// Actualizamos el campo ‘Pagos y acumulado’ del último cálculo
calculos[calculos.length – 1].pagos_y_acumulado_id = saldoProximoPagoCobro;// Guardamos los cambios en el registro
registro.setFieldValue(‘fld-d8a58dbf35914f3c858c6dfb880c1c48’, calculos);form.saveRecord(registro);
}
}
});January 2, 2024 at 2:00 AM #50281In reply to: Problem with a calculate form
Fernando DS
ParticipantThank you Glen.
I must say that my records are independent. Every record is a different debt.
I have done the following script, but it continues not working. The saldo field is the result of importe-pagos, not saldo-pagos as I want. Any sugestions on the script?
function updateRunningTotal(records) {
records.forEach(function(record) {
var importe = parseFloat(record.getFieldValue(‘fld-1cff7a1e6d3d4c68a081fa20be53ba48’)) || 0;
var pagos = parseFloat(record.getFieldValue(‘fld-c4d4d96ce0584cef99a8422512ece4e6’)) || 0;
var saldoAnterior = parseFloat(record.getFieldValue(‘fld-db305c87f3db46d0bbcaaf95dcb47858’)) || 0;// Calcular el nuevo Saldo basándose en el Saldo anterior y los Pagos
var nuevoSaldo = saldoAnterior – pagos;// Actualizar el campo Saldo en el registro actual
record.setFieldValue(‘fld-db305c87f3db46d0bbcaaf95dcb47858’, nuevoSaldo);console.log(“Importe: ” + importe);
console.log(“Pagos: ” + pagos);
console.log(“Saldo Anterior: ” + saldoAnterior);
console.log(“Nuevo Saldo: ” + nuevoSaldo);
});
}var allRecords = form.getRecords();
// Llamar a esta función para actualizar el Saldo basándose en el Saldo anterior y los Pagos en todos los registros
updateRunningTotal(allRecords);December 30, 2023 at 5:45 AM #50268In reply to: Previous Record problem
Daniel Leu
ParticipantHi Glen, in your original script, you were reading the previous total from the wrong field. Now it should work as expected:
function toHrsMin(sec){let str = "";let h = Math.floor(sec / 3600);let m = (sec / 60) % 60;return h + ' hr, ' + m + ' mins';}function Accum_Tot() {var records = form.getRecords();var currentRecordIndex = records.indexOf(record);if (currentRecordIndex > 0) {var previousRecord = records[currentRecordIndex-1];var previous_total = previousRecord.getFieldValue('fld-b2f9616bf5e44fb4880ad9addd2afc6e');} else {var previous_total = 0;}var today = record.getFieldValue('fld-44acc9d2314f41beb3f2257ace5bae01');var total = today + parseInt(previous_total);console.log("Today: " + toHrsMin(today))console.log("Previous: " + toHrsMin(previous_total))console.log("Total: " + toHrsMin(total))return total;}Accum_Tot();-
This reply was modified 1 year, 3 months ago by
Daniel Leu.
December 27, 2023 at 7:21 PM #50249In reply to: Previous Record problem
Daniel Leu
ParticipantThis works for me:
function toHrsMin(sec){let h = Math.floor(sec / 3600);let m = (sec / 60) % 60;return h + ' hr, ' + m + ' mins';}function Accum_Tot() {var records = form.getRecords();var currentRecordIndex = records.indexOf(record);if (currentRecordIndex > 0) {var previousRecord = records[currentRecordIndex-1];var previous_total = previousRecord.getFieldValue('fld-44acc9d2314f41beb3f2257ace5bae01');} else {var previous_total = 0;}var today = record.getFieldValue('fld-44acc9d2314f41beb3f2257ace5bae01');var total = today + previous_total;console.log("Today: " + toHrsMin(today))console.log("Previous: " + toHrsMin(previous_total))console.log("Total: " + toHrsMin(total))return total;}Accum_Tot();-
This reply was modified 1 year, 3 months ago by
Daniel Leu.
-
This reply was modified 1 year, 3 months ago by
Daniel Leu.
-
This reply was modified 1 year, 3 months ago by
Daniel Leu.
-
This reply was modified 1 year, 3 months ago by
Daniel Leu.
-
This reply was modified 1 year, 3 months ago by
Daniel Leu.
-
This reply was modified 1 year, 3 months ago by
Daniel Leu.
-
This reply was modified 1 year, 3 months ago by
Daniel Leu.
November 22, 2023 at 11:29 PM #50176In reply to: Help with a script with two conditions
Fernando DS
ParticipantAt last this is the script that works:
function modifyFieldsBasedOnCondition() {
var fieldId1 = ‘fld-28b97ce8ab4f4f57a83aefa7e91f17fe’;
var fieldId2 = ‘fld-c2fd26ae62c1445692b3a0abc1e89158’;for (var record of form.getRecords()) {
var valueField1 = record.getFieldValue(fieldId1);
var valueField2 = record.getFieldValue(fieldId2);if (valueField1 === 4 && (valueField2 === null || valueField2 === “”)) {
record.setFieldValue(fieldId2, “Buen disco.”);
console.log(“Campo fieldid2 actualizado en el registro con campo fieldid1 igual a 4 y fieldid2 vacío.”);
}
}form.saveAllChanges();
}modifyFieldsBasedOnCondition();
Thank you Brendan and Daniel for your valuable help.
Bye.
November 22, 2023 at 5:11 PM #50169In reply to: Help with a script with two conditions
Daniel Leu
ParticipantThis works for me:
function modifyFieldsBasedOnCondition() {
var fieldId1 = 'fld-28b97ce8ab4f4f57a83aefa7e91f17fe';var fieldId2 = 'fld-c2fd26ae62c1445692b3a0abc1e89158';for (var record of form.getRecords()) {console.log(record.getFieldValue(fieldId1));console.log(record.getFieldValue(fieldId2));if (record.getFieldValue(fieldId1) == 4 &&record.getFieldValue(fieldId2) == undefined){record.setFieldValue(fieldId2, "Buen disco.");console.log("empty record found");}}form.saveAllChanges();}modifyFieldsBasedOnCondition();-
This reply was modified 1 year, 4 months ago by
Daniel Leu.
-
This reply was modified 1 year, 4 months ago by
Daniel Leu.
-
This reply was modified 1 year, 4 months ago by
Daniel Leu.
-
This reply was modified 1 year, 4 months ago by
Daniel Leu.
-
This reply was modified 1 year, 4 months ago by
Daniel Leu.
November 22, 2023 at 2:22 PM #50167In reply to: Help with a script with two conditions
Fernando DS
ParticipantJust another try, without errors in console, but not works.
function modifyFieldsBasedOnCondition() { var fieldId1 = 'fld-28b97ce8ab4f4f57a83aefa7e91f17fe'; var fieldId2 = 'fld-c2fd26ae62c1445692b3a0abc1e89158'; for (var record of form.getRecords()) { if (record.getFieldValue(fieldId1) == 4 && record.getFieldValue(fieldId2) <= (0)) record.setFieldValue(fieldId2, "Buen disco."); } } form.saveAllChanges(); modifyFieldsBasedOnCondition();
-
This reply was modified 1 year, 4 months ago by
Brendan.
November 22, 2023 at 5:13 AM #50160In reply to: Help with a script with two conditions
Fernando DS
ParticipantWell, I’m going to paste it here.
function modifyFieldsBasedOnCondition() { var fieldId1 = 'fld-28b97ce8ab4f4f57a83aefa7e91f17fe'; var fieldId2 = 'fld-c2fd26ae62c1445692b3a0abc1e89158'; for (var record of form.getRecords()) { if (record.getFieldValue(fieldId1) == 4 && record.getFieldValue(fieldId2) == "") { record.setFieldValue(fieldId2, "Buen disco."); } } form.saveAllChanges(); } modifyFieldsBasedOnCondition();
-
This reply was modified 1 year, 4 months ago by
Brendan.
November 8, 2023 at 11:56 AM #50104In reply to: Javascript Help
Daniel Leu
ParticipantIn my case, the checkbox field is called ‘selected’. You just need to assign the field id of field Added_to_VR-Mailing on line 3 of the code below.
// This script selects all records function selectAll(){ const selected_id = 'fld-xxxx'; var records = form.getRecords(); for (var index = 0, count = records.length; index < count; index++){ var myRec = records[index]; myRec.setFieldValue(selected_id, true); } document.saveAllChanges(); } selectAll();
The code loops over all records and sets the checkbox value to true.
-
This reply was modified 1 year, 5 months ago by
Daniel Leu.
-
This reply was modified 1 year, 5 months ago by
Daniel Leu.
-
This reply was modified 1 year, 5 months ago by
Daniel Leu.
October 20, 2023 at 6:17 PM #50016In reply to: Open record as result
Daniel Leu
ParticipantI 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, 6 months ago by
Daniel Leu.
-
This reply was modified 1 year, 6 months ago by
Daniel Leu.
-
This reply was modified 1 year, 6 months ago by
Daniel Leu.
-
This reply was modified 1 year, 6 months ago by
Daniel Leu.
-
This reply was modified 1 year, 6 months ago by
Daniel Leu.
October 20, 2023 at 12:39 AM #50008In reply to: Open record as result
David Gold
ParticipantHi 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 18, 2023 at 6:41 PM #49998In reply to: Script to conduct a search
David Gold
ParticipantI’ve had a go at it cutting and pasting from some other scripts but can’t work out why it’s not working. Am getting an error in the console saying:
var myForm = document.getFormNamed(‘Boral’);
var records = myForm.getRecords();
var search_term = Utils.copyTextFromClipboard();
var result_count = 0;
var results = [];
var selected;function copy_name( name ) {
Utils.copyTextToClipboard( name );
}function multiple_results() {
var joined = ‘–multiple_matches–‘;
var res;
for (res of results) {
joined = joined +
res.name;
}
copy_comments( joined );
}function search_records( haystack , needle ) {
var name_id = ‘fld-1acb38c0b51b44698849501507b51722’;
var rec;for (const rec of haystack) {
if ( rec.getFieldValue( name ).toLowerCase().includes( needle.toLowerCase() ) ) {
results.push( { location: rec.getFieldValue( name_id ) } );
result_count++;
}}
if( result_count == 0 ){
console.log( ‘No results found!’ );
}else if( result_count > 1 ){
multiple_results();
}else{
copy_name( results[0].name );
}}
search_records( records , search_term );
-
This reply was modified 1 year, 6 months ago by
David Gold.
September 18, 2023 at 2:25 PM #49866Brendan
KeymasterHi Brian,
I think this will take a bit of work. There is an API called
record.addRecordToField(someRecord, field_id);
in Tap Forms. You’ll need to call that to add the record to your Link to Form field.Now the tricky part is to get the record that you need from the linked form. That would be the
someRecord
in the above API.You will also probably need to use the
var records = form.getRecordsForSearchTerm("search term");
API call. Now, theform
you use will need to be the Link to Form field’s form. So to get that, you’ll need to call thedocument.getFormNamed('My Movie Library');
API and assign it to a variable (not namedform
).For example:
var link_to_form_field_id = 'fld-......'; var linkedForm = document.getFormNamed('Linked Form'); var records = linkedForm.getRecordsForSearchTerm("some unique course code"); var linkedRecord = records[0]; // assuming your course code is unique you'll get just one record back record.addRecordToField(linkedRecord, link_to_form_field_id); form.saveAllChanges();
Hopefully that’ll get you what you need. I haven’t tested this code (just off the top of my head), but it should generally work. You may need to do some testing to check to see if you actually get records back.
-
This reply was modified 1 year, 7 months ago by
Brendan.
September 14, 2023 at 10:27 AM #49839In reply to: Convert 2 fields
Brendan
KeymasterThere’s no function
getSelectedRecords()
. There is aform.getRecords();
function though.The current record can be obtained by simply referencing
record
.So get rid of the
var record = form.getSelectedRecords()[0];
statement.For
"sourceField"
you’ll need to put in the field ID of the field you want to get the value from. Tap Forms will display the field ID when you select it. Or just select the field and click the ID button to have Tap Forms generate the line of code for you.Also there’s no
record.save()
function. You want to useform.saveAllChanges()
instead.August 24, 2023 at 7:02 PM #49794In reply to: Permissions don’t synchronize to iOS?
Daniel Leu
ParticipantIn one of my forms, I encountered an issue of missing parents. The contact field should contain the infos from the parent. This form script loops over all records of a form and checks if the contact field contains records. If no record is found (eg, length == 0), I set the select field. Afterwards, I can use a smart filter to find all these records where the select field is set to 1. This way, I can verify that these records are indeed the once I want to delete. Maybe this helps you!
function Select_No_Contact_Parent() {
const contact_id = 'fld-xxx';const select_id = 'fld-xxx';for (rec of form.getRecords()){let contacts = rec.getFieldValue(contact_id);if (contacts.length == 0) {rec.setFieldValue(select_id, true);}}document.saveAllChanges();}Select_No_Contact_Parent();-
This reply was modified 1 year, 7 months ago by
Daniel Leu.
-
This reply was modified 1 year, 7 months ago by
Daniel Leu.
-
This reply was modified 1 year, 7 months ago by
Daniel Leu.
-
AuthorSearch Results