OCA Учебник online                   

"Не учась и лаптя не сплетешь".
Русская пословица

Логический контроль введенных анкет
(OCA for Windows)
Логическим контролем называют контроль введенной информации после ввода результатов опроса (анкет) операторами в компьютер и перед началом написания отчета или передачей данных заказчику. Иногда логический контроль называют чисткой массива. Обычно на этом этапе проверяются некие логические связки в анкете (например, чтоб опрошенный возрасте 16 лет не имел 10 детей). Кроме этого проверяются некоторые подозрительные ситуации (их часто называют английским словом аутлаеры). Например, наличие в семье 20 детей возможно, но все же стоит лишний раз проверить, возможно, оператор случайно ввел 20 вместо 2.

На этом этапе главное не переусердствовать. Присутствие малой доли нелогичности в анкете вполне допустимо. Сложно требовать от респондента (опрашиваемого) повышенной сосредоточенности и вдумчивости при заполнении анкеты. Поэтому вполне возможно, что некоторые оценочные суждения в начале и конце анкеты могут не совпадать. Ведь противоречивые суждения могут быть свидетельством того, что у человека, например, нет однозначного мнения по данному вопросу.

Помните, главная задача логического контроля - это исправление ошибок операторов, которые вводили анкеты и некоторых грубых ошибок, допущенных интервьюерами.

Итак, у нас есть окончательный массив. Первое на что следует обратить внимание, это на ключевой признак (признак, отмеченный в паспорте директивой @key). Поскольку именно он является идентификатором анкеты, позволяет установить связь между введенной анкетой и ее бумажным аналогом, следует уделить ему особенное внимание. Вначале имеет смысл упорядочить анкеты в массиве данных, отсортировав их по значению ключевого признака. Для этого воспользуемся функцией сортировки анкет.



Сортировку по возрастанию ключевого признака (в нашем примере это будет признак номер 1). Отсутствие ответов в этом признаке недопустимо, каждая анкета должны иметь свой номер.



Теперь воспользуемся функцией логического контроля массива.



Вначале нам нужно указать имя файла, в котором будут сохранены наши условия контроля. Можно указать уже существующий файл, если Вы ранее уже писали условия к массиву.
Файл с условиями логического контроля имеет расширение osy, так как, фактически, является файлом синтаксиса ОСА. После указания имени файла будет автоматически запущен текстовый редактор ОСА и в нем будет загружен ранее указанный файл. Если Вы указали имя нового файла, то после его загрузки Вы увидите в редакторе пустой контейнера для написания заданий логического контроля.



Все строки, находящиеся между строчками <logc> и </logc> интерпретируются как задания для логического контроля и автоматической перекодировки массива. Подробно о написании синтаксических заданий для ОСА for Windows можно прочитать в файле помощи по синтаксису ОСА.



Теперь напишем одну команду NumberCheck - для проверки правильности нумерации. Пользоваться этой командой имеет смысл только после сортировки анкет по значению ключевого признака.

<logc>
NumberCheck
</logc>

Выполним наше задание. Для этого выберем соответствующий пункт меню, или нажмем Ctrl+F9. Окно тектовог редактора будет свернуто, а в текстовом поле главного окна программы будут выведены результаты. В любой момент, нажав F4, окно редактора можно вернуть в нормальное состояние, для исправления условий или написания новых.



Как мы видим, есть повторы в нумерации. Их необходимо исправить. Это может быть дважды введенная одна и так же анкета, ошибка оператора или ошибка в нумерации анкет. Анкеты с некоторыми номерами отсутствуют, неплохо было бы проверить, действительно ли не было таких анкет, или они утеряны. Ошибки следует исправлять с помощью функции редактирования массива.



Подробнее о редактировании массива можно прочитать тут.
После того, как вышеперечисленные неточности проверены и исправлены, можно убрать команду проверки нумерации. Теперь мы будем писать основные условия логического контроля.

Как мы помним, паспорт может содержать некоторые команды управления вводом. Директивы @goto и @jump позволяют автоматически прописывать некоторые фрагменты анкеты, исходя из уже введенных ответов. Например, если человек не курит, то ряд вопросов связанных с его любимой маркой сигарет, местом покупки сигарет и т.п. можно автоматически прописать значением отсутствующего ответа (в ОСА обозначается символом доллара), освободив оператора от пробивания "не ответами" ряда признаков.
Однако, имеет смысл проверить, насколько эти условия управления соблюдены в финальном массиве. Можно, конечно, описать ряд проверок, но лучше воспользоваться макрокомандами: GotoCheck и JumpCheck. Эти команды, соответственно, проверят соответствие массива условиям, описанным директивами @goto и @jump. С помощью макрокоманды RangeCheck можно проверить соответствие значений описанным с помощью директивы @r интервалам.

<logc>
GotoCheck
JumpCheck
RangeCheck
</logc>

Теперь напишем несколько своих условий. Например, проверим, чтобы признак с именем Пол имел ответ во всех анкетах. Напоминаем, что имя может быть задано директивой @qname=X, где X желаемое имя. При обращении к признаку по имени, а не по номеру имя берется в квадратные скобки. Наше условие будет выглядеть так:

N([Пол]) -> отсутствие ответа в признаке Пол

Как можно увидеть, слева от стрелки содержится условие, подобное условиям фильтра, а справа текст, выводящийся в качестве сигнала к нахождению ошибки. Подробнее о написании условий можно прочитать в разделе, посвященном отбору анкет (здесь).

Теперь проверим, чтоб в признаках с совместимыми альтернативами не было одновременно отмечено несколько ответов, одним из которых является "Трудно сказать". Ведь если человек дал некий содержательный ответ, то альтернатива "Трудно сказать" не должны быть отмечена. Напишем это условие для признака номер 7, код альтернативы "Трудно сказать" 9.

E(7,9) and caj(7)>1 -> ТС и содержательный ответ в признаке 7

Однако, подобное условие необходимо и для других аналогичных признаков. Перепишем его с использованием переменных. В нашем случае переменной является некое числовое значение, к которому можно обращаться по его имени.
Для задания значения переменной используется команда Set, имя переменной обязательно должно начинаться с символа восклицательного знака. Таким образом запись Set !a=5, записывает в переменную с именем !а значение 5. Задавая номер признака и альтернативы через переменные, получим:

Set !sign=7
Set !alt=9
E(!sign,!alt) and caj(!sign)>1 -> ТС и содержательный ответ в признаке !sign

И хотя, на первый взгляд, наша программа стала занимать несколько больше места, вносить изменения (например, для проведения аналогичной проверки в признаке с другим номером и другим кодом альтернативы) теперь намного проще. В переменной !sign записывается номер признака, в переменную !alt записываем номер альтернативы, присутствие которой в сочетании с другими нежелательно. Скопировав условие, и заменив эти два параметра, мы можем легко приспособить данное условие для других аналогичных случаев.

Значения переменных могут вычисляться. Например:

Set !a=(#1#+#2#+#3#)*2
!a<10 -> сумма признаков 1-3 умноженная на 2 менее 10

Следует отметить, при суммировании нескольких признаков лучше пользоваться командой Sum(x,y) где x номер (имя) первого признака из группы, а y - последнего. Таким образом, выщеприведенное условие лучше записать как:

Set !a=Sum(1,3)*2
!a<10 -> сумма признаков 1-3 умноженная на 2 менее 10

Запустив программу, мы получим список анкет, содержащих контролируемые ситуации. Также будет выведена статистика по количеству встреч каждой из написанных ситуаций.



Как мы видим, для анкет сообщается порядковый номер анкеты в массиве, значение ключевого признака и комментарий к ситуации, которую анкета содержит. Теперь, посмотрев в бумажный вариант анкеты, с помощью функции редактирования массива (как и в случае исправлени янумерации) мы можем внести исправления.

Предположим, что у нас нет времени просматривать анкеты на предмет корректности. Мы просто хотим исправить найденные ситуации, поправить нелогичности, не сверяя введенную информацию с бумажными носителями. Для этого воспользуемся функциями по автоматическому исправлению ошибок. Фактически, проведем некоторые перекодировки в массиве. Например, будем автоматически удалять альтернативу "Трудно сказать" если она соседствует с содержательными ответами.

Set !sign=7
Set !alt=9
E(!sign,!alt) and caj(!sign)>1 ->> del !sign,!alt

Как мы видим, поменялся разделитель левой и правой части задания. Вместо -> используется ->> . Такой разделитель свидетельствует о том, что следом идут команды по управлению массивом. Команда del x,y удаляет из признака с номером x альтернативу с кодом y. Весь список доступных команд (их немного) можно увидеть в соответствующем разделе помощи.



Заметим, что используя вместо GotoCheck и JumpCheck команды, GotoCheckRec и JumpCheckRec, мы не только проверим корректность массива относительно описанных директивами @goto и @jump переходов, но и автоматически исправим все найденные неточности.

Информация о перекодировках производимых в массиве, выводится в листинге синим цветом (информация об ошибках черным).



Теперь проверим отсутствие ответов в некотором блоке вопросов. Например, с 10 по 15. Это можно сделать пятью однотипными условиями, подобными условию проверки наличия ответа в признаке "Пол". Но лучше воспользоваться циклом. Цикл позволяет повторить одни и те же действия несколько раз. При этом есть специальная переменная !index, автоматически увеличивающаяся ПОСЛЕ каждого выполнения цикла.

For 10 to 15;1: n(!index) -> отсутствие ответа в признаке номер !index

Вышеприведенный цикл можно интерпретировать так. Изначально в служебную переменную !index, записывается значение 10. Цикл выполняется до тех пор пока значение переменной !index не превысить 15. С каждым выполнением цикла переменная !index увеличивается на 1. Тело цикла - набор команд выполняющихся заданное количество раз:
n(!index) -> отсутствие ответа в признаке номер !index

Таким образом, запись:
For 10 to 15;1: n(!index) -> отсутствие ответа в признаке номер !index
эквивалентна набору записей:

n(1) -> отсутствие ответа в признаке номер 1
n(2) -> отсутствие ответа в признаке номер 2
n(3) -> отсутствие ответа в признаке номер 3
n(4) -> отсутствие ответа в признаке номер 4
n(5) -> отсутствие ответа в признаке номер 5

Итак, наша финальная программа, после проверки корректности заполнения ключевого признака.

<logc>
GotoCheckRec
JumpCheckRec
N([Пол]) -> отсутствие ответа в признаке Пол

Set !sign=7
Set !alt=9
E(!sign,!alt) and caj(!sign)>1 ->> del !sign,!alt

For 10 to 15;1: n(!index) -> отсутствие ответа в признаке номер !index
</logc>