Form Page Designer Issues

There seems to be issues designing a form page. There is a button near the top which lets you design where the fields go on the page. This has always been a bit quirky, but now it is difficult to work that designer at all. Changing widths for form fields seems to give unexpected results. Sometimes I can move a field and/or change its width, but sometimes (most of the time) it does not work. If I try to widen a field, it only widens a small amount. If I try to widen it more, it then goes back to the prior width.

Any ideas on this? Is it a known issue? Thanks…

This is a known issue, and we’ll look into it. When trying to widen a field, please ensure the cursor is inside the field. If you grab it from the outer edge, it won’t work.

Thanks!

Thanks for the reply Vin. Any progress on this issue? Note that widening a field does not work at all, even if I start with the cursor inside the field.

Hi,

You can refer to this post.
Issue when moving a field in the Form Designer - Support - Five Community Forums

Hope this help!

Thanks for the reply Vin. This does help, but any idea when the visual page designer will be working again?

Even though I am using the suggested technique with the display page, I am having an issue. Hopefully you can help me.

My Members form has a sub-form called Groups which displays a DataView to show which study groups the current member is involved with.

When I click one of the groups in the sub-form (configured as a button), it opens up a new form called GroupMembers. This is for editing purposes, since I can’t edit in a DataView.

My StudyGroups form also uses a DataView showing which members are in that group. It also, when clicking a member, opens up the GroupMembers form for similar editing.

The picture below is of this editing form in design mode. Note that it has a Group field and a Member field at the top.


The Group field has a showIf formula =(five.variable.ActiveForm == “Members”. The Member field has a similar showIf, but instead of “Members”, it contains “StudyGroups”.

My logic is: When showing the Members form and navigating to the edit form for a Study Group on the second page, I don’t want to see the “Members” field. Conversely, when showing the StudyGroups form, I don’t want to see the “StudyGroups” field on the edit form.

I’m not really sure if this logic is valid, perhaps I should always show both fields. However, right now that is my logic.

In any case, when I am viewing the StudyGroups main form, then click on a member in the next page, here is what comes up:

As you can see, the Member field is indented far to the right, and the Group field is correctly not showing. It would be to the left of the Members field.

Please believe me that if I run this from the Members main form, the Group field on the edit form shows up on the left of the first line.

So the question is, why is the member field indented past the “invisible” groups field? The Display tab in form design shows 0 PreWidth and 0 PostWidth for both fields.

I either need to solve this, or simply allow both fields to always show. I’m fine with that solution if you can assure me that if I happen to move the member to a different study group, or the study group to a different member, everything will work if I save the record. I am not sure it will work. What if I am in group 1 and group 2. Then I edit my Member record and bring up the edit form by clicking “Group 1” button. the edit form pops up and I change “Group 1” to “Group 2” in that edit form. When I save the record, wouldn’t that cause a conflict, since I’m already in Group 2?

Thanks for reading this somewhat verbose question.

I decided to simply show both fields in the GroupMembers form. Please see the following screen shot, which is from the Setup Members form. My record is visible, and I’ve scrolled the screen so you can see I am in 5 groups.

When I click the first item in the DataView, I get this:

When I click the drop-down for Group, I have the opportunity to change this study group (Book Brothers) to another group. It looks like I can select the group “Gadabouts” from the drop-down. This should NOT be permitted, since the first screenshot shows I’m already in Gadabouts, and this field is _LookupUnique. The lookup is based on the StudyGroups table, but the record being edited is in the GroupMembers table. So it appears _LookupUnique is not working the way I thought it would.

What is the best way to handle this issue?

I’m willing to not allow edits to this table, and require deleting the existing record (which I can already do by clicking Edit, then clicking trash can).

I still need the form to be able to add a new record to the table. Haven’t put that in the application yet. I need an “ADD” button (either in form header or as a separate control on the form itself). The ADD button would open this same GroupMembers form in add mode. So I need to figure out how to differentiate between opening the form for editing by clicking on a study group in the data view, and opening it for adding by clicking an action button.

Can you suggest how to differentiate between these 2 modes, so I can make the Study Group drop-down and Member drop-down disabled in case of editing, but enabled in case of adding a record?

Also, please advise if there is a better way to accomplish this task in Five.

Thanks so much!

UPDATE:

I’ve added an action button (Add Study Group) to the members form and made it visible only when the Groups page is selected. I also added an action button (Add Member) to the StudyGroups form, and made it visible only when the Members page is selected. So far so good.

I need a function to execute when I click the Add button, such as AddGroupMember. I need to set an AddMode variable to true, open the GroupMembers form, and in the form’s code somewhere, if AddMode variable is true, cause a new record to be added to the StudyGroupMembers table, including setting the primary key GUID value.

Can you please help with this function, which should probably be triggered by the On Show event? Please let me know if there is a better way to do this process of adding a new record.

NEW UPDATE:

I can’t figure out how to programmatically open up a child form for adding a record. My Members form, as mentioned, has a data view for the Groups page, showing which study groups the member is in. When I click the StudyGroup button, it opens that record in the GroupMembers form, for editing. This works just fine. Now I need to be able to add a new study group to the member. The Members form has an action button to “Add a Group”.

I’m trying to figure out how to navigate to the GroupMembers form in “Add” mode, so I don’t have to click the + button to add the record. Everything I need to know to add a record is known at the time I click that button. How can I tell a script to add some field values to a context object, then open the form in add mode with that context known? I’ve been using ChatGPT, which “thinks” it knows how five works, but it doesn’t. It’s helped me on other things, but every suggestion it gives me doesn’t work in Five. So is this possible? It’s not realistic, when looking at a member and their groups to need to navigate directly to a GroupMembers form, then click + , then re-enter the memberKey and StudyGroupKey, then save the record.

Much better would be a way to run a function which adds the record to a new GroupMembers record. I don’t want to run SQL to add a record to the StudyGroupMembers table, in case the user accidentally clicked the action button. Then I would need to delete the record they didn’t want to add.

ChatGPT thinks you can insert a record then navigate to the form in add mode, and the record will be there, not committed until I click the Save button. I can’t make this work with their code samples, but this would be optimal if it could be done.

Can you help with this use-case? Thanks…

Hello,

If you know the required fields upon clicking the add button, would you be able to set these as variables? You could then set the default value of the corresponding fields to equal the variable that was set upon clicking the add button. If the form that opens upon clicking the add button is also used in other areas of your application, this could prove to have some functional errors. In that case, you would need to create a seperate form which is identical to the form presented when clicking the add button, however, adjust the default values of the fields in the new form to correspond with the previously set variables. When clicking the add button, you can then select the new form rather than the old one.

Hope this helps,
Thanks,
Riley.

Thanks for the reply, Riley. I’m not sure I properly stated the issue, based on your reply. The question is not how to get the values into the form fields, I think I can do that. the problem is how to click an action button on one form (the parent form), and have the desired detail form open up in add mode, as if I had opened the form normally and clicked the + button above the list.

There must be a way to open a form already in add mode so the user can supply any values not already supplied via context items or five variables.

Ideally, I would like to fill a context object with the desired variables, and when the edit form opens in add mode, the context would be available. Alternatively, I can have the parent form’s script set variables, then on the edit form’s onShow event I can fill the fields.

Is there any way to open the form in add mode as if I had clicked the + button on the newly opened form? This seems like a reasonable use-case.

Thanks…

any ideas on this issue? my development is at a standstill. I have several topics on the forum which are 3 weeks old without a reply from you.

Hello Ron,

Sorry for the late reply!

Unfortunately, you are unable to open a form automatically in add mode. Your best option would be to include an action button in which opens up a process when it is clicked. Within this process, you can include fields in which would correspond to that of the form you wish to open. When the user fills in the fields on the process and saves it, you can then run an SQL query and insert the values into the table,

Thanks,
Riley.

Thanks Riley, that makes sense. So these comments / questions:

1: Are you saying that a process (with screen fields) can work similarly to a form, where I enter values then click Save? I was unaware a process could do this.

2: When you click Save on the process, there would be an event triggered where I would obtain the new record value using UUID then add the record via SQL? At that point, I no longer need to open the form for that table, because the record is already added, right? I could simply execute previousAction to go back to my original form, right?

3: I would also need a Cancel button on this process. That could simply execute the previousAction action, right?

Could you please suggest sample code for this use-case?

UPDATE: I have started building the process, but have no idea how to call it from an action button. An ActionButton only runs a function. I tried calling a process from the function as follows (where vars is a context object), but that didn’t work.

   five.executeAction("AddGroupMemberProcess",vars);

So how do I execute a process from within the function?

Finally, I would like to suggest that you add my request for opening a form in add mode to the queue of enhancements. This seems fairly simple in concept, since I can open a form then click the + button on the list to add a record, so why couldn’t a command to open the form in add mode do both? Thanks…

Hello:

  1. Yes they can, provided you do the SQL in the background manually.
  2. There is an on run event on a process, when you save it, this event triggers. In this function, you can parse the field values from the process to the backend and complete an SQL INSERT INTO query to add the record to your database, and therefore, you will make the UUID manually (this can be done using five.uuid())
  3. I am not sure what you mean by execute the previous action, you could just add a ‘Go Back’ button which takes you to the previous action.

To open up the process, you need to use five.selectAction(ACTION_ID) with ACTION_ID being the action ID of the process you created.

Thanks,
Riley.

I’m having troubles getting the process to run with a context. ChatGPT tells me I can run a process using selectAction(actionID, context). However, I don’t think this is right. Your documentation says selectAction(actionID, recordKey). Assuming your docs are correct, how can I run a process, then run a function from On Show of the process, and have the function’s context reflect the original context?

To add more, er, context, to this, here is the function that gets run when I click the “Add Member” action button on my StudyGroups form:

function AddGroupMember(five, context, result)  {
    
    const parentForm = five.variable.ActiveForm; 
    const parentKey = five.variable.ActiveKey;
    const newKey = five.uuid();

    let vars = {
        ParentForm: parentForm,
        StudyGroupMembersKey: newKey,
        MemberKey: null,
        StudyGroupKey: null,
        IsLeader: false,
        IsCoordinator: false,
        IsCoLeader: false,
        IsAssistant: false,
        IsSunshine: false,
        GroupPaidDate: null,
        CheckNumber: null
    };

    if (parentForm === "Members") {
        vars.MemberKey = parentKey;
        // vars.StudyGroupKey = five.variable.StudyGroupKey;
    } else if (parentForm === "StudyGroups") {
        vars.StudyGroupKey = parentKey;
        // vars.MemberKey = five.variable.MemberKey;
    }

    five.showMessage(JSON.stringify(vars));
    try {
        five.selectAction("AddGroupMemberProcess", vars);
    //    five.selectAction("GroupMembers", null, vars);
    //    await five.data.insertRecord("StudyGroupMembers", vars);
    //    five.showMessage("Record inserted??");
    //    five.selectAction("GroupMembers", newKey);
        return five.success(result);
    }
    catch (e) {
        five.showMessage("Error: " + e.message);
        return five.failure(result);
    }
}

When this executes, the process indeed runs even though the “vars” argument is wrong.

When the process is run, I have the On Show event running a function called InitAddMemberProcess. The purpose of this function is to load the screen fields of the process from the context. But of course the context is empty. Currently, the only statement in this function is five.showMessage(JSON.stringify(context)), just for testing.

What I get in the message is “{}”, which is expected if the context is blank.
the statement above, five.showMessage(JSON.stringify(vars));, does not execute at all. If I comment out the line: five.selectAction(“AddGroupMemberProcess”, vars);, then the above statement DOES execute, showing me my vars JSON object.

So I guess the issue is, how do I get the vars object into the code that is run when the process is started?

UPDATE:

I have setup the process and added screen fields for all the fields that need to be inserted into the join table. When I click run checkmark, On Run causes InsertGroupMember function to run. this builds a SQL statement and executes it using five.executeQuery(sql). This causes an error saying “five.executeQuery is not a function”. If I change it to five.db.query(sql), I get an error saying undefined. normally the first error means I’m running server-side, and the second error indicates I’m running client-side. Confusing!

ChatGPT suggests that in the InsertGroupMember function, I build a context and run a InsertGroupMemberServer function instead so I know I’m running on the server. Is this correct? If not, please advise how to solve this issue.

Thanks…

After some work, here are my functions, called when I click the Run checkmark of my process:

function InsertGroupMember(five, context, result)  {
    
    // make sure we selected member or group
    if (five.field.ParentTable === 'StudyGroups' && !five.field.MemberKey) {
        return five.createError("You must select a member before running this process.");
    }
    if (five.field.ParentTable === 'Members' && !five.field.StudyGroupKey) {
        return five.createError("You must select a study group before running this process.");
    }    
    
    let parms = {
            ParentTable: five.field.ParentTable,
            StudyGroupKey: five.field.StudyGroupKey ? `'${five.field.StudyGroupKey}'` : 'NULL',
            MemberKey: five.field.MemberKey ? `'${five.field.MemberKey}'` : 'NULL',
            IsLeader: five.field.isLeader ? 1 : 0,
            IsCoordinator: five.field.isCoordinator ? 1 : 0,
            IsCoLeader: five.field.isCoLeader ? 1 : 0,
            IsAssistant: five.field.isAssistant ? 1 : 0,
            IsSunshine: five.field.isSunshine ? 1 : 0,
            PaidDate: five.field.GroupPaidDate ? `'${five.field.GroupPaidDate}'` : 'NULL',
            CheckNumber: five.field.CheckNumber ? `'${five.field.CheckNumber}'` : 'NULL'
    }
    five.executeFunction('InsertGroupMemberServer', parms, null, '', '', function (result) {
        if (result.serverResponse.errorCode === 'ErrErrorOk') {
            return five.selectAction(five.variable.ActiveForm, five.variable.ActiveKey);
            // five.refreshTable(myTable);
            // five.reload();
            // return;
        }
        const functionMessage = result.serverResponse.results;
        if (functionMessage !== '') {
           return five.createError("Insert failed: " + functionMessage);
            _five.showMessage(functionMessage);
        }
    });
    // return five.success(result);
}
function InsertGroupMemberServer(five, context, result) {
    
    // variables:
    // ParentTable: five.field.ParentTable,
    // StudyGroupKey: five.field.StudyGroupKey ? `'${five.field.StudyGroupKey}'` : 'NULL',
    // MemberKey: five.field.MemberKey ? `'${five.field.MemberKey}'` : 'NULL',
    // IsLeader: five.field.isLeader ? 1 : 0,
    // IsCoordinator: five.field.isCoordinator ? 1 : 0,
    // IsCoLeader: five.field.isCoLeader ? 1 : 0,
    // IsAssistant: five.field.isAssistant ? 1 : 0,
    // IsSunshine: five.field.isSunshine ? 1 : 0,
    // PaidDate: five.field.GroupPaidDate ? `'${five.field.GroupPaidDate}'` : 'NULL',
    // CheckNumber: five.field.CheckNumber ? `'${five.field.CheckNumber}'` : 'NULL'
    
    const newKey = five.uuid();
    let sql = `Insert into ${context.ParentTable} ( StudyGroupMembersKey, StudyGroupKey, MemberKey, IsLeader, IsCoordinator, 
                    IsCoLeader, IsAssistant, IsSunshine, GroupPaidDate, CheckNumber ) 
                Values('${newKey}', ${context.StudyGroupKey}, ${context.MemberKey}, ${context.IsLeader}, ${context.IsCoordinator}, 
                    ${context.IsCoLeader}, ${context.IsAssistant}, ${context.IsSunshine}, ${context.PaidDate}, ${context.CheckNumber} )`;

    result = five.executeQuery(sql, 0)
    // five.log(sql);
    return five.success(result);
}

Now all I get is a spinning circle. The record never gets inserted. Can you advise what I did wrong?

UPDATE: Even if I comment out the executeQuery line, and uncomment the five.log line, I still get an endlessly spinning wheel. Here is the sql:

Insert into StudyGroups ( StudyGroupMembersKey, StudyGroupKey, MemberKey, IsLeader, IsCoordinator, IsCoLeader, IsAssistant, IsSunshine, GroupPaidDate, CheckNumber ) 
Values('052a973e-69f4-4907-a6b5-49c59ad2f889', '38eb45d7-6892-4842-a9db-263a96655dce', '864aad21-f3e7-4b46-94b7-20eb53321b05', 0, 0, 0, 1, 1, '2025-06-26', '567' )

Thanks…

With ChatGPT’s help, I refactored my code and no longer get the spinning wheel.
Instead I get “Insert failed: unknown error”

function InsertGroupMember(five, context, result)  {
    
    // make sure we selected member or group
    if (five.field.ParentTable === 'StudyGroups' && !five.field.MemberKey) {
        return five.createError("You must select a member before running this process.");
    }
    if (five.field.ParentTable === 'Members' && !five.field.StudyGroupKey) {
        return five.createError("You must select a study group before running this process.");
    }    
    
    let parms = {
            ParentTable: five.field.ParentTable,
            StudyGroupKey: five.field.StudyGroupKey ? `'${five.field.StudyGroupKey}'` : 'NULL',
            MemberKey: five.field.MemberKey ? `'${five.field.MemberKey}'` : 'NULL',
            IsLeader: five.field.isLeader ? 1 : 0,
            IsCoordinator: five.field.isCoordinator ? 1 : 0,
            IsCoLeader: five.field.isCoLeader ? 1 : 0,
            IsAssistant: five.field.isAssistant ? 1 : 0,
            IsSunshine: five.field.isSunshine ? 1 : 0,
            PaidDate: five.field.GroupPaidDate ? `'${five.field.GroupPaidDate}'` : 'NULL',
            CheckNumber: five.field.CheckNumber ? `'${five.field.CheckNumber}'` : 'NULL'
    }
    five.log('Calling server function');
    five.executeFunction('InsertGroupMemberServer', parms, null, '', '', function (serverResult) {
        five.log('Returned from server function');

        if (serverResult.isOk && serverResult.isOk()) {
            five.selectAction(five.variable.ActiveForm, five.variable.ActiveKey);
        } else {
            const errorMessage = serverResult.errorMessage ? serverResult.errorMessage() : "Unknown error";
            five.createError("Insert failed: " + errorMessage);
        }

    });
    // return five.success(result);
}
function InsertGroupMemberServer(five, context, result) {
    
    const newKey = five.uuid();
    const table = context.ParentTable;
    const groupKey = context.StudyGroupKey;
    const memberKey = context.MemberKey;
    const isLeader = context.IsLeader;
    const isCoordinator = context.IsCoordinator;
    const isCoLeader = context.IsCoLeader;
    const isAssistant = context.IsAssistant;
    const isSunshine = context.IsSunshine;
    const paidDate = context.PaidDate;
    const checkNumber = context.CheckNumber;
    
    const sql1 = `INSERT INTO ${table} ( StudyGroupMembersKey, StudyGroupKey, MemberKey, IsLeader, IsCoordinator, IsCoLeader, 
                    IsAssistant, IsSunshine, GroupPaidDate, CheckNumber ) `;
    const sql2 = `VALUES ( '${newKey}', ${groupKey}, ${memberKey}, ${isLeader}, ${isCoordinator}, ${isCoLeader}, ${isAssistant}, 
                    ${isSunshine}, ${paidDate}, ${checkNumber})`;
    let sql = sql1 + sql2;

    five.log(sql1);
    five.log(sql2);

    const queryResult = five.executeQuery(sql, 0);
    if (queryResult.isOk && queryResult.isOk()) {
        return five.success({ StudyGroupMembersKey: newKey });
    } else {
        return five.createError("Insert failed: " + (queryResult.errorMessage ? queryResult.errorMessage() : "Unknown error"));
    }
}

It’s hard to tell what “unknown error” is.

I’ve been working on this for a long time, and still can’t get it right. Here are the pertinent functions executed when I want to add a group member, which happens in a process:

function InsertGroupMember(five, context, result)  {
    
    // make sure we selected member or group
    if (five.field.ParentTable === 'StudyGroups' && !five.field.MemberKey) {
        return five.createError("You must select a member before running this process.");
    }
    if (five.field.ParentTable === 'Members' && !five.field.StudyGroupKey) {
        return five.createError("You must select a study group before running this process.");
    }    
    
    let parms = {
            ParentTable: 'StudyGroupMembers',
            StudyGroupKey: five.field.StudyGroupKey ? `'${five.field.StudyGroupKey}'` : 'NULL',
            MemberKey: five.field.MemberKey ? `'${five.field.MemberKey}'` : 'NULL',
            IsLeader: five.field.isLeader ? 1 : 0,
            IsCoordinator: five.field.isCoordinator ? 1 : 0,
            IsCoLeader: five.field.isCoLeader ? 1 : 0,
            IsAssistant: five.field.isAssistant ? 1 : 0,
            IsSunshine: five.field.isSunshine ? 1 : 0,
            PaidDate: five.field.GroupPaidDate ? `'${five.field.GroupPaidDate}'` : 'NULL',
            CheckNumber: five.field.CheckNumber ? `'${five.field.CheckNumber}'` : 'NULL'
    }
    // five.log('Calling server function');
    five.executeFunction('InsertGroupMemberServer', parms, null, '', '', function (serverResult) {

        if (typeof serverResult.isOk === 'function' && serverResult.isOk()) {
            five.selectAction(five.variable.MyForm, five.variable.MyKey);
        } else {
            const rows = checkResult.rows; // rows is an array
            if (rows && rows.length > 0 && rows[0].ExistingCount > 0) {
                return five.createError("This member is already assigned to this study group.");
        }
        five.showMessage("Insert failed: " + errorMessage);
        }

    });
    // return five.success(result);
}
function InsertGroupMemberServer(five, context, result) {
    
    const newKey = five.uuid();
    const table = context.ParentTable;
    const groupKey = context.StudyGroupKey;
    const memberKey = context.MemberKey;
    const isLeader = context.IsLeader;
    const isCoordinator = context.IsCoordinator;
    const isCoLeader = context.IsCoLeader;
    const isAssistant = context.IsAssistant;
    const isSunshine = context.IsSunshine;
    const paidDate = context.PaidDate;
    const checkNumber = context.CheckNumber;
    
    // if member is already in group, warn and exit
    const checkSQL = `SELECT COUNT(*) AS ExistingCount FROM ${table} WHERE StudyGroupKey = ${groupKey} AND MemberKey = ${memberKey}`;
    const checkResult = five.executeQuery(checkSQL, 0);
    five.log(checkSQL);

    // If the query failed
    if (!checkResult.isOk || !checkResult.isOk()) {
        return five.createError("Could not check for existing member assignment.");
    }

    // If the record already exists
    const rows = checkResult.rows;
    if (rows && rows.length > 0 && rows[0].ExistingCount > 0) {
        return five.createError("This member is already assigned to this study group.");
    }
    const sql1 = `INSERT INTO ${table} ( StudyGroupMembersKey, StudyGroupKey, MemberKey, IsLeader, IsCoordinator, IsCoLeader, 
                    IsAssistant, IsSunshine, GroupPaidDate, CheckNumber ) `;
    const sql2 = `VALUES ( '${newKey}', ${groupKey}, ${memberKey}, ${isLeader}, ${isCoordinator}, ${isCoLeader}, ${isAssistant}, 
                    ${isSunshine}, ${paidDate}, ${checkNumber})`;
    let sql = sql1 + sql2;

    five.log(sql1);
    five.log(sql2);

    const queryResult = five.executeQuery(sql, 0);
    if (queryResult.isOk && queryResult.isOk()) {
        return five.success({ StudyGroupMembersKey: newKey });
    } else {
        let err = "Insert failed.";
        if (queryResult.errorMessage) {
            err = queryResult.errorMessage();
        } else if (queryResult.error) {
            err = queryResult.error;
        } else {
            err = JSON.stringify(queryResult); // fallback for inspection
        }
        five.log("Insert Error: " + err);
        return five.createError("Insert failed: " + err);
    }
}

I tried to put code in there which would check for the member already being in the study group, but it is not. working, and several members are added multiple times during my testing.

Not only that, even though there is code in the client function to return to the calling form, it does not get executed, leaving me in the process screen. I can click the Cancel button there, and it will return me to the form. The code to return to the form is the same when cancelling as it is after saving the new record. This is using selectAction with variables for the form and record.

The last time you addressed this topic was 27 May. I have replied 4 times since then with updates and hopefully more concise questions. Now it is 5 July and I haven’t heard from anyone. Can you please look at my last post and help me with this?

Hi Ron,

The issue with Unknown error is what the function is returning, please change the following line:

return five.createError("Insert failed: " + (queryResult.errorMessage ? queryResult.errorMessage() : “Unknown error”));

To the following:

return five.createError(queryResult, “Insert failed record”);

Passing the queryResult as the first parameter to five.createError allows five to wrap the existing error, and you should get its error message back in the front end, or if you want to include the error message, it is actually just called “Message”, so you can do the following as well :

return five.createError("Insert failed: " + queryResult.Message);

Could I please ask, when you start a new topic could you please start a new thread, it makes it easier for us to follow, as this question does not relate to the title, thanks in advance this would be very helpful to us.

Kind regards,
Jo