Restrict choices already selected from a repeat group

Description

I need to restrict choices already selected from a repeat group exactly as described here: Restrict choices already selected from a repeat group
and here: Preventing duplicate entries in a repeat loop

The two solutions given are good but do not work on Kobocollect and Enketo when trying to add more than 2 instances of the repeat group. If you add 3 instances of the repeat group and try to send the form it throws an error.

Steps to Reproduce

  1. Download Restrict choices already selected from a repeat group.xlsx and upload it in a new project
  2. Preview the form with Enketo or deploy it and use it with Kobocollect
  3. Add at least 3 instances and try to validate data or save it on Kobocollect to see the error.

Expected behavior

The expected behaviour would be to prevent the user to repeat one-select answers in repeat groups.

Actual behavior

The control on duplicates works fine while filling the form but it does not let me finish the form because of an error thrown.

Additional details

*Your environment, why you think this might be happening.

I think that the error comes from the constraint being checked twice (once when the values are entered and once when the form has to be sent). The first time the constraint is met while the second time is not. How do I overcome this problem? Is this a bug?

Thanks!

@andrea_ageon, I just checked this at my end and it works perfectly as expected both in Enketo and Collect android app. The main objective of this workaround is to restrict the same entry twice in a repeat group. Please check XLSForm I shared here:

Dear @Kal_Lam,
have you tried to add more than 2 repeat groups? If you try to add at least three groups (for example selecting once “One”, once “Two”, once “Three”) you should be able to replicate the error. Thanks!

OK, I got it. So when you are with Enketo, and you have a repeat group of more than 3, the issue starts popping up. Similarly, when you are Collect android app and you have a repeat group of more than 4, the issue starts popping up.

Please note that this is not a system bug. It’s the limitation of the syntax. Maybe the community could help build from this point to overcome the limitation.

Thank you once again for flagging this in the community.

I have tried applying the same concept in my form but if I change the response it does not take off the error message. In the below image, I tried selecting visit 3A and then when the error message showed up, I changed the option to Visit 3B, However, the error message does not disappear.

Can you please have a look at the form and let me know how to rectify this.

ChemotherapyForm.xls (147 KB)

Appreciate any help.

Regards,

Hi @an_ju,

Have you considered using a choice filter rather than constraints? Here’s something that might work for your situation:

survey

type name label calculation choice_filter
calculate c1 concat(${visit})
begin_repeat visits Visits
calculate c2 substr(${c1}, 0, position(…) - 1)
select_one visits visit Visit not(contains(${c2}, name))
end_repeat

choices

list_name name label
visits 0 Visit 3A
visits 1 Visit 3B
visits 2 Visit 3C

choice-filter-repeat-group.xlsx (6.0 KB)

4 Likes

Hey Josh,

Sorry for the late response… And thank you for this view. I did not try this. Appreciate it very much.

sir what i had wanted was that if the option ‘One’ is selected, it should not show in subsequent repeats
e.g in first repeat if “One” is selected, second repeat should only display all other options except the option “One” which was selected
if “Two” is also selected in second repeat, both options “One” and “Two” should not display in subsequent repeats,
the repeat should continue until the all options are selected, then repeat ends at last option selected

Hi @yendor,

Josh’s solution seems exactly like what you asked. Can you elaborate on your question?

1 Like

thank you sir
but this does not work for select multiple in the first repeat, when i replaced the select one with select multiple in first repeat, it does not work
3choice_filter-display options not selected in next question.xlsx (62.5 KB)
attached is what I’ve tried but its not working too

Hi @yendor,

Do you think this might help you?

1 Like

Hi, This example from Josh would be perfect if I can get it to work.
The example as it stands does not remove a selected option after a few (I think 3) repeats. I made the select_one options list longer in the attached example and have modified the example a bit. It seems to be working now, but if i make the select_one required i cannot save it it seems to be ‘removing’ the second answer and i cannot continue.

It would be great if i could get this to work as it solves many enumerator problems.

Thanks
choice-filter-repeat-group Modified.xlsx (10.9 KB)

Would you mind, please, to avoid posting the same issue, probably for the same project, twice to the community?
See Eliminating selected options after selected once in repeat group - #5 by Rusti

Genial!!, excelente ayuda
Saludos desde Ecuador

1 Like

Hi @Josh, @Kal_Lam

I tried your example and it worked perfectly. Unfortunately, I added up to 11 choices which does work if the choices are more than 9. How to fix this ? As a new user I can not upload the test file.

Hi @Josh and @Kal_Lam.

I’m also having the same issue. If I add more than 10 options, when the user comes to the 10th item, it gets repeated values for those that are remaining (or the former selection are not fixed). How should I approach this issue? Is this related to the calculation field of C2?

Thanks.

Hi @vick25 and @rrmaximiliano, thank you for flagging this. You can just use letters instead of numbers for the choice names (the formula as I wrote it only works on single letter-length choice names):

survey

type name label calculation choice_filter
calculate c1 concat(${visit})
begin_repeat visits Visits
calculate c2 substr(${c1}, 0, position(…) - 1)
select_one visits visit Visit not(contains(${c2}, name))
end_repeat

choices

list_name name label
visits a Visit 3A
visits b Visit 3B
visits c Visit 3C
visits d Visit 3D
visits e Visit 3E
visits f Visit 3F
visits g Visit 3G
visits h Visit 3H
visits i Visit 3I
visits j Visit 3J
visits k Visit 3K
visits l Visit 3L
visits m Visit 3M

choice-filter-repeat-group-alpha.xlsx (9.9 KB)

3 Likes

Hi Kal Lam,

Hope you are doing well. My name is Rony, and, first, my apologies for sending this email impromptu, but I found one of your solutions while searching for a question about restricting choices already selected from a repeat group on KoboToolbox. And I was wondering if you happen to have another solution for that problem when you have more than 10 choices.

A bit of background, we are implementing a program in Ukraine for students that need tutoring classes, and the tutors need to provide feedback. In some cases, the group of students consists of 10+ kids, and when I implemented your solution in the link above it seems that I am not able to make it fully functional after the 10th kid. So, for example, the 11th and 12th kids are not removed when I get to the 13th kid.

Thank you very much in advance, and regardless of your message, I appreciate the solutions you have posted overall in the kobo forum.

Cheers,
Rony Rodrigo Maximiliano Rodríguez-Ramírez

Hi @Kal_Lam ,
I try to follow and modify your approach based on my need but , but I faced an error on the constraint when the repeat group more than 2 group. Kindly need help.

Please see capture below :

If you my screen capture above, All class that selected are different, but value still not allowed.

Here the my xls file

Hi @Josh ,
is there anything that we can do to apply multiple choice filter, for instance in my case the previous selection is not hide.
I use this choice filter : selected(${school},filter) and not(contains(${C2}, name)), since I need to cascade the class as well by school