При использовании выражений в условиях счетчиков, условиях показа вопросов, условиях действий - многие сталкиваются с проблемой… проверяем на неравенство, а в итоге условие работает не совсем так, как ожидается. Связано это с самим принципом работы выражений.
Любое выражение (условие) по вопросу проверяет: а есть ли любой ответ на этот вопрос, удовлетворяющий условию? Например:
Q20 = 3
Словами это условие можно произнести так: "Есть ли в Q20 ответ с кодом 3?". Такое условие будет прекрасно работать как с вопросами с единственным выбором, так и с множественным выбором, т.к. даже если в Q20 отмечено несколько кодов - это не важно, т.к. мы проверяем только на наличие кода 3. Также подобное условие будет работать и с табличными вопросами, и звучать в этом случае оно будет: "Есть ли в любой строке Q20 ответ с кодом 3?".
С равенством (а также с другими операциями, вроде <, >, <=, >=) всё понятно. А вот когда дело доходит до проверки на неравенство… появляется непонимание. Например меняем наше условие на такое:
Q20 != 3
Мы явно хотим проверить, что в вопросе Q20 не отмечен код 3. Но! Прочитаем условие словами, по принципу описанному выше: "Есть ли в Q20 ответ с кодом не равным 3?". Вот тут и зарылась проблема… Если Q20 это вопрос с единственным выбором, то условие будет работать как ожидается, т.е. выполняться когда например в Q20 отмечен код 2, и наоборот - не выполняться, если в Q20 отметили код 3. Однако, как только вопрос становится с множественным выбором - поведение условия меняется, и в некоторых случаях приведет совсем к обратному результату. Например: в Q20 отмечен код 2 и код 3. Условие у нас Q20 != 3. По ожидаемой логике наше условие не должно выполняться, т.к. в Q20 есть ответ с кодом 3… но, условие будет выполнено! Почему? Вспомним как звучит это условие словами: "Есть ли в Q20 ответ с кодом не равным 3?". И да! Конечно есть! Это код 2. Сл-но условие будет выполнено. Иногда это даже на пользу, если понимаешь что делаешь. Например когда надо проверить именно что есть любой ответ с кодом отличным от 3, так и надо писать Q20 != 3.
Как же быть? Всё просто. Надо проверять от обратного, т.е. пишем условие так:
not Q20 = 3
И тогда всё будет верно. Мы проверяем "Есть ли в Q20 ответ с кодом 3?" и после этого инвертируем результат.
Есть ещё один момент, который надо учесть. Условие вида not Q20 = 3 сработает и тогда, когда на Q20 нет вообще никакого ответа. Обычно это не то, что нам нужно. Чтобы этого избежать, добавляем проверку на наличие хоть какого-то ответа на Q20:
Q20 and not Q20 = 3
Теперь проверка абсолютно верна.
Ещё один частый вопрос, который относится к теме данной статьи: как проверить, ответ с определённым кодом выбран один или же есть ещё другие ответы? Такая проверка бывает нужна, когда, например, надо завершить интервью, если выбран только ответ 3, и продолжить, если вместе с ним выбран другой ответ. Учитывая вышесказанное, написать такое выражение просто:
Q = 3 and not Q != 3
То есть в первой части выражения проверяем, "Есть ли в текущем вопросе ответ с кодом 3?". Во второй - "Есть ли тут же ответ с кодом не равным 3?" и инвертируем эту проверку. Таким образом, выражение выполнится, если в вопросе выбран только ответ с кодом 3.