Показать в вопросе только те варианты ответа, которые отметили в предыдущем вопросе
Часто возникает необходимость, отобразить в вопросе только те варианты ответа, которые респондент выбрал в одном из предыдущих вопросов, или наоборот - показать только оставшиеся варианты ответа, которые респондент не выбрал.
Самый простой способ сделать подобное - использовать Действия перед показом вопроса. Например, у нас есть вопрос с множественным выбором (вариант ответа 99 помечен флагом Блокирующий):
Q1: Какие магазины Вы посещаете?
1 - Магазин А
2 - Магазин Б
3 - Магазин В
98 - Другой (запишите)
99 - Затрудняюсь ответить
Далее идет уточняющий вопрос с единственным выбором:
Q2: Какой магазин, из тех, что Вы посещаете - любимый?
1 - Магазин А
2 - Магазин Б
3 - Магазин В
98 - {Q1.98T}
То есть в Q1 будет один список ответов, а в Q2 - другой. Важно, чтобы коды одних и тех же ответов в обоих списках совпадали. Количество ответов в списках может быть разным.
Для вопроса Q2 надо не забыть прописать условие показа, чтобы он не задавался, когда в Q1 отметили код 99. Например, сделать в Q1 после ответа переход куда-то далее, через Q2, или у самого Q2 прописать условие показа Q1 < 99.
Чтобы отобразить в Q2 только те варианты ответа, коды которых выбраны в Q1, добавляем в Q2 два действия перед показом:
- Скрыть все варианты ответа
- Показать варианты ответа, отмеченные в вопросе Q1
либо используем одно действие, заменяющее два указанных выше:
- Показать только варианты ответа, отмеченные в вопросе Q1
Действия добавляются без указания условия. Всё, этого достаточно. Если в Q2 есть исключающие варианты ответа, например Затрудняюсь ответить, то в свойствах этих ответов надо не забыть поставить флаг Всегда отображается.
Важный момент - необходимо всегда сначала скрывать все варианты ответа, прежде чем показывать необходимые (и наоборот, в зависимости от задачи), т.к. вопрос перед показом не сбрасывается в исходное состояние, и в случае если оператор будет ходить по анкете назад и менять ответы в Q1 - будет странный результат. Это не касается действий вроде Показать только варианты ответа, отмеченные в вопросе, т.к. они сами выполняют всё необходимое.
Всё то же самое можно, конечно, сделать и скриптами. Вместо действий, пишем в Q2 в скрипт перед показом:
Q.answers.hideAll(); Q.answers.show(Q1.getCheckedCodes());
или проще:
Q.answers.showOnly(Q1.getCheckedCodes()); return Q.answers.hasVisible ? ok : skip;
Тут мы сразу проверяем, есть ли в итоге какие-то ответы для показа, и если их не осталось - пропускаем вопрос. Сделать такую же проверку можно и действием
- Пропустить, если нет видимых вариантов ответа или строк
Если наш вопрос Q2 - это табличный вопрос, и надо показать только те строки, коды которых отмечены в Q1, то это сделать можно только скриптом перед показом для Q2:
Q.rows.hideAll(); Q.rows.show(Q1.getCheckedCodes()); return Q.rows.hasVisible ? ok : skip;
или так:
Q.rows.showOnly(Q1.getCheckedCodes()); return Q.rows.visibleCount > 0 ? ok : skip;
Ещё один встречающийся случай - показать в табличном вопросе только те строки, для которых также в табличном вопросе, например в Q1, отметили код 1 или 2:
Q.rows.hideAll(); for (let row of Q1.rows.getVisible()) { if (row.isChecked(1) || row.isChecked(2)) { Q.rows.show(row.code); } } return Q.rows.hasVisible ? ok : skip;