Свет
в соседней комнате горит
|
Свет
у соседей горит
|
Поменять
лампочку
|
Проверить
пробки
|
Позвонить
электрику
|
Позвонить
диспетчеру
|
Да
|
-
|
Х
|
|
|
|
Нет
|
|
Х
|
Х
|
|
Нет
|
Нет
|
|
|
Х
|
Х
|
Получилась реляционная таблица с шестью
столбцами и тремя строками.
Каждой строке данной таблицы соответствует
продукция. Например, для первой строки:
Свет_в_соседней_комнате_горит(Да) ˄
Свет_у_соседей_горит(Безразлично) => Поменять_лампочку(Да)
Тип таблицы принятия решений зависит от
количества возможных вариантов выполнения условий. Бинарные варианты (например,
да / нет) называют условиями с ограниченным входом. Как правило, добавляется
третье значение - безразлично. Варианты выполнения условия, которые могут
учитывать большее количество возможных исходов, называют условиями с
расширенным входом. Таблица принятия решений, которые сочетают в себе как
условия с ограниченным входом, так и с расширенным входом, называется таблицей
принятия решения со смешанным входом.
Данное инструментальное средство используют
условия с расширенным входом.
Число таблиц решения в одной задаче может
достигать многих десятков. Поэтому необходимо создать адаптивный интерфейс
пользователя, настраиваемый под текущую таблицу решений.
Универсальность интерфейса была получена за счет
использования универсальной модели данных [1]. Это делает интерфейс независимым
от решаемой задачи.
2. Архитектура
инструментального средства для работы с таблицами решений
Рисунок 2.1
Разработанный прототип инструментального
средства, представленный на рисунке 2.1 состоит из следующих модулей:
- Интерфейс пользователя
- Интерфейс базы данных
- База данных
Прототип интерфейса создан Семенютиной Л.
Мною реализован интерфейс пользователя и
интерфейс базы данных.
Используемые таблицы решений хранятся в базе
данных, схема базы показана на рисунке 2.2. Модель данных разработана Зубко М.
Рисунок 2.2
Таблица DECISION
- таблица принятия решений, в которой определённому набору ответов
соответствуют действия и последействия.
Рисунок 2.3
Таблица DATA_USERS
содержит информацию о пользователях: имя, адрес, идентификатор, названия
системы, области и подобласти, с которыми работает данный пользователь, а также
логин и пароль для входа в систему. Данные заносятся в таблицу при регистрации
пользователя.
Рисунок 2.4
Таблица METADATA
содержит список условий и действий для данной системы, области, подобласти,
таблицы, а также поле TYPE_СON,
определяющее способ получения ответа от клиента: ввод собственного значения (text)
или выбор из списка предложенных (checkbox).
Рисунок 2.5
Таблица DATA
- содержит имя системы, область, подобласть, номер и название таблицы, с
которой работает клиент, идентификационный номер клиента, номера и названия
условий, а также ответы на поставленные условия. Данные в таблицу заносятся
автоматически, в процессе работы с системой.
Рисунок 2.6
Таблица DATA_CLIENTS
содержит
информацию о клиентах (адрес, имя и т.д.), номер пользователя, к которому
привязан этот клиент, названия системы, области, подобласти, с которыми этот
клиент работает, а также данные о номере текущей таблицы решения. Информация о
клиенте добавляется пользователем (user),
данные о текущей таблице решения заносятся автоматически.
Рисунок 2.7
Таблица History
содержит историю переходов клиентов пользователя по таблицам принятия решений.
Рисунок 2.8
3. Интерфейс
пользователя
Разработанный WEB
- интерфейс является частью инструментального средства для работы с таблицами
принятия решений.
Интерфейс пользователя универсален для любой
задачи, решаемой системами таблиц принятия решений в рамках логики предикатов
первого порядка.
Так как интерфейс пользователя обеспечивает
текущую работу с таблицами принятия решений, он реализуется программным кодом
общим для всех таблиц. Таким образом, при добавлении новых областей,
подобластей или строк в таблицы переписывать интерфейс не придется.
3.1 Технологии и методы
Архитектура интерфейса представлена на рисунке
3.1.
Рисунок 3.1
Интерфейс базы данных представляет собой набор PHP
скриптов, осуществляющих подключение к базе данных, отправку запроса,
преобразование и вывод полученных данных.
Для подключения к СУБД Oracle
используются расширение OCI8
и библиотеки Oracle Database Instant Client. Расширение позволяет работать с
базой данных Oracle 11g, 10g, 9i и 8i, поддерживать SQL и PL/SQL-выражения.
Основной функционал представляет собой поддержку транзакций, привязку
переменных PHP к соответствующим плейсхолдерам Oracle.
Пример PHP
скрипта изображен на рисунке 3.2.
Рисунок 3.2
Обмен данными между клиентом и сервером
происходит по технологии AJAX. Она не является самостоятельной, и представляет
собой концепцию использования нескольких смежных технологий. AJAX базируется на
двух основных принципах:
- использование технологии
динамического обращения к серверу "на лету", без перезагрузки всей
страницы полностью
- использование DHTML (CSS, DOM и
JavaScript) для динамического изменения содержания страницы
Итак, рассмотрим, что же Ajax по существу делает.
Он помещает технологию JavaScript и объект XMLHttpRequest между Web-формой и
сервером. Когда пользователи заполняют формы, данные передаются в какой-то
JavaScript-код, а не прямо на сервер. Вместо этого JavaScript-код собирает
данные формы и передает запрос на сервер. Пока это происходит, форма на экране
пользователя не мелькает, не мигает, не исчезает и не блокируется. Другими
словами, код JavaScript передает запрос в фоновом режиме; пользователь даже не
замечает, что происходит запрос на сервер. Более того, запрос передается
асинхронно, а это означает, что JavaScript-код (и пользователь) не ожидают
ответа сервера. То есть, пользователи могут продолжать вводить данные,
прокручивать страницу и работать с приложением. Затем сервер передает данные
обратно в JavaScript-код (все еще находящийся в Web-форме), который решает, что
делать с данными. Он может обновить поля формы "на лету", придавая
приложению свойство немедленности - пользователи получают новые данные без
подтверждения или обновления их форм.
Таким образом, мы получаем динамичность,
чувствительность, высокую интерактивность настольного приложения вместе со
всеми возможностями интернет.
В качестве формата обмена данными между
интерфейсом и сервером использована технология JSON, основанная на JavaScript.
Главными преимуществами JSON являются независимость от языка программирования и
легкая читаемость, как машиной, так и человеком.
JSON представляет
собой комбинацию массивов и объектов и предназначен только для хранения данных.
Как следствие, JSON не может иметь переменных и не допускает никаких операций
над ними. Вот пример объекта с использованием синтаксиса JSON:
{
"firm":["BMW",
"Audi", "Volkswagen"],
"model":["X5",
"A6", "Touareg 7L"],
"year":[2007, 2008, 2006],
"price":[99000, 78000, 45000]
}
Передача такого объекта с использованием
HTTP-протокола будет происходить очень быстро, поскольку содержит минимум
символов. JSON не требуют дополнительного синтаксического анализа на стороне
клиента, что является очевидным его преимуществом перед XML в аспекте передачи
данных от сервера клиенту.
Итак, в PHP за работу с данными в формате JSON
отвечают две функции: json_encode() и json_decode().
Первая - преобразует структуру PHP (объект,
массив или ассоциативный массив) в данные формата JSON. Вторая реализует
обратное преобразование. Интересно, что функции json_encode и json_decode
работают корректно только с кодировкой UTF-8.
Реализация Ajax
и поддержка JSON в
интерфейсе пользователя обеспечивается использованием библиотеки jQuery.
Из многочисленных методов этой библиотеки в разработанном интерфейсе
используются ajax() и getJSON().
Первый
метод удобно использовать для получения данных из одного столбца. Синтаксис
метода выглядит так: jQuery.ajax(settings).
Используемые настройки для вызова:
Таблица 4
Название
|
Описание
|
type:
string("GET")
|
Определяет
тип выполняемого запроса (GET или POST). Можно использовать также типы PUT и
DELETE, но нужно помнить, что их поддерживают не все браузеры.
|
url:
string(адрес текущей страницы)
|
Определяет
адрес, на который будет отправлен запрос.
|
data:
object, string
|
Данные,
которые будут отправлены на сервер. Если они заданы не строчным значением, то
будут предварительно преобразованы в строку.
|
success(data, textStatus):
function, array
|
Функция,
которая будет вызвана в случае удачного завершения запроса к серверу. Ей
будут переданы два параметра: данные, присланные сервером и уже прошедшие
предварительную обработку и строка со статусом выполнения.
|
Пример использования метода представлен на
рисунке 3.3.
Рисунок 3.3
Метод getJSON()
удобен для получения данных из многостолбцовой выборки. Полученные в результате
запроса JSON данные
будут автоматически преобразованы в массив javascript-объектов. Одна строчка
выборки соответствует одному объекту из массива. Доступ к полям объекта
осуществляется по названию столбца или его псевдонима.
Запрос json-данных у сервера производится
методом GET, т.е. без перезагрузки страницы.
Синтаксис данного метода: jQuery.getJSON(url,[data],[callback]).
Используемые параметры для вызова.
Таблица 5
Параметры
|
Описание
|
url
|
url-адрес,
по которому будет отправлен запрос
|
data
|
данные,
которые будут отправлены на сервер. Они должны быть представлены в объектом,
в формате: {fName1:value1, fName2:value2, ...}
|
callback(data,
textStatus)
|
пользовательская
функция, которая будет вызвана после ответа сервера
|
|
data
|
данные,
присланные с сервера
|
|
textStatus
|
статус
того, как был выполнен запрос
|
.2 Реализация
Главная страница интерфейса представляет собой
меню, с помощью которого пользователь может войти в систему и выбрать
соответствующие область и подобласть знаний. Новые пользователи имеют
возможность зарегистрироваться. При желании пользователь может загрузить
обучающие материалы и по таблицам принятия решений, и работе интерфейса
Рисунок 3.4
Рисунок 3.5
Рисунок 3.6
При аутентификации пользователь выбирает
соответствующую область знаний из динамически строящегося списка всех доступных
областей.
Рисунок 3.7
Так выглядит регистрационная форма (рис).
Обязательными являются только три поля: имя, логин и пароль.
Рисунок 3.8
Если аутентификация пройдена успешно, то
пользователь попадает на вторую страницу. На ней находится динамически
построенный список его клиентов. Для обеспечения динамики необходимые параметры
(имя системы, область, подобласть, идентификатор пользователя) передаются
странице в адресной строке.
Рисунок 3.9
Рисунок 3.10
При необходимости пользователь может добавлять и
удалять клиентов. Данные манипуляции проводятся с таблицей Data_Clients.
Рисунок 3.11
В таблице в столбце CURRENT_PROGRESS
находится номер следующей таблицы решений. И при нажатии на ссылку происходит
переход на страницу заполнения. В качестве параметров выступают: имя системы,
область, подобласть знаний, номер таблицы и идентификатор клиента.
Рисунок 3.12
Рисунок 3.13
В первой вкладке при загрузке создается форма
для заполнения текущей таблицы решений. При нажатии на кнопке Submit
происходит вставка сформированных из выбора пользователя строк в таблицу DATA.
Во второй вкладке находится таблица с данными о предыдущих заполнениях таблиц
для данного клиента, эта информация находится в таблице DATA.
Рисунок 3.14
В третьей вкладке приводится таблица принятия
решений для текущей заполняемой формы. Верхняя часть таблицы - условия и
комбинации условий, нижняя - действия и комбинации действий. Данные
запрашиваются из временной таблицы, созданной процедурой TRANS().
А при нажатии на зеленый домик пользователь
всегда может вернуться на главную страницу.
4. Экспериментальные
данные
В качестве примера рассмотрим базу знаний для
постановки медицинского диагноза заболеваний кожи. Она реализована, как система
таблиц принятия решения, переходы между которыми осуществляются за счет
использования последействий. Структура таблиц решения приведена на рисунке 4.1.
Проведем диагностику у пациента Tim
Balm c
id = 46.
Рисунок 4.2
Выбираем из предложенного списка симптомы
пациента. Результаты обрабатываются, и система отправляет пользователя к
следующей таблице принятия решений.
Рисунок 4.3
В любой момент у пользователя есть возможность
просмотреть ответы к уже пройденным таблицам и взглянуть на текущую таблицу
решений.
Рисунок 4.4
По результатам обработки введенных данных при
переходах по таблицам принятия решений формируется итоговая таблица, в которой
отражен диагноз. В случае с нашим пациентом - это болезнь Гюнтера.
Рисунок 4.5
Заключение
В рамках выполнения данной курсовой работы были
изучены основы программирования на языке PHP.
С использованием полученных знаний был
реализован адаптивный WEB
интерфейс инструментального средства для работы с таблицами принятия решений.
В дальнейшем планируется реализовать интерфейс
администратора, а также экспорт и импорт данных для взаимодействия с внешними
приложениями.
Список использованных источников
Бессарабов Н.В., Муса-Оглы
Е.С. Универсальная модель данных. RSDN, 2011, №3. С. 51-55
Хамби Э. Программирование
таблиц решений. Москва: Мир, 1976. - 86 с.
3 Jones C., Holloway A.
The underground PHP and Oracle manual. Oracle, 2012. - 362 с.
Документация jQuery
Tools [Электронный
ресурс]. URL: http://jquerytools.org
Документация PHP
[Электронный ресурс]. URL:
http://www.php.net
Русская документация по jQuery
[Электронный ресурс]. URL:
http://jquery-docs.ru
Документация Oracle
[Электронный ресурс]. URL:
http://oracle.com
Приложение
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>БЗ</title>
<link rel="shortcut
icon" href="images/favicon.ico"
type="image/x-icon">
<link rel="stylesheet"
href="style3.css">
<link rel="stylesheet"
href="accord2.css">
<script
type="text/javascript" src="jquery.tools.min.js"
></script>
<script
type="text/javascript"
src="progress_scen.js"></script>
</head>
<body>
<div id='header'>
<a href='index.htm'><img>
<div>
</div>
<div id='wrap'>
<div>
<div id="accordion">
<div>
<div style="width:650px;
display:block">
<div id='test'></div>
<br><br>
<div
id='test_ok'>Submit<img id='rabbit'="images/rabbit.png"
/></div>
</div>
<div>
<div>
<div
id='data_pane'></div>
</div>
<div>
<div>
<div id
='sol_tab'></div>
</div></div></div>
<div>
</div>
<div
id='footer'>footer</div>
</body>
$(function() {tableno =
parseInt(param('Tableno'));sysname = param("Sysname");domain =
param("Domain");subdomain = param("Subdomain");cli_id =
param("Client_id");
//alert(tableno);
$("#accordion").tabs(".pane",
{: '.head',: 'horizontal'
});
$.getJSON("index3.php","col=select
condition,type_con from metadata "
+"where
tableno="+tableno+" and sysname='"+sysname+"' and
domain='"+domain+"' and subdomain='"+subdomain
+"' and condition is not null
order by condition_id",(data,textStatus){
$.each(data,function(i,res){
$('#test').append("<div>
+res[1]+"
name='row'>"+res[0]+"</input></div>");
});
$.getJSON("index3.php",
"col=select
rownum,tableno,condition_name,answer from data "
+"where
client_id="+cli_id+" and sysname='"+sysname
+"' and
domain='"+domain+"' and
subdomain='"+subdomain+"'",(data,textStatus){
$.each(data,function(i,res){
$('#data_pane').append("<tr>
+res[0]+"</td><td>
+res[2]+"</td><td>
$('#data_pane
tr:even').addClass('first');
});
$.ajax({:'GET',:'index4.php',:
"col=select * from decision_"+tableno
+"&num="+tableno+"&col1=begin
trans('"+sysname+"','"+domain+"','"+subdomain+"',"+tableno+");
end;",:'json',: function(data,textStatus){var m = 0;
$.each(data,function(i,res){
$('#sol_tab').append('<tr id =
"sol_tab_'+m+'"></tr>');(var key in res) {(key == 0)
$('#sol_tab tr:last').append('<td>
'<td>
}++;});(var m = 0;m <
data.length/2;m++)
$('#sol_tab_'+m+'
td:first').addClass('first');(var m = data.length/2;m < data.length;m++){
$('#sol_tab_'+m+'
td:not(:first)').addClass('first');
}}
});
$("#rabbit").tooltip({
tip: '#rab',
effect: 'fade',
fadeOutSpeed: 100,
predelay: 400,
position: "bottom right",
offset: [-50, -80] });
$('#test_ok').click(function(){div =
$('#test').children();m = 1;answer ='yes';
$.each(div,function(i,res){($(res).find('.test_inp').prop("checked"))
answer ='yes';answer ='no';
$.ajax({:'GET',:'index2.php',:
"col=insert into data
(sysname,domain,subdomain,tableno,client_id,condition_id,condition_name,answer)
values ('"
+sysname+"','"+domain+"','"+subdomain+"',"
+tableno+","+cli_id+","+m+",'"+$(res).text()+"','"+answer+"')
",: false,: function(data,textStatus){
//alert(textStatus);
}
});++;});
$.ajax({:'GET',:'index5.php',:
"col=select current_progress from data_clients where
client_id="+cli_id+"&num="+tableno+"&col1=begin
go('"+sysname+"','"
+domain+"','"+subdomain+"',"+tableno+","+cli_id+");
end;",:'json',: false,: function(data,textStatus){.location.href =
'progress.htm?Sysname='+sysname
+'&Domain='+domain+'&Subdomain='+subdomain+'&Tableno='+data
+'&Client_id='+cli_id;
}
});
});
$('#rabbit').click(function(){.location.href
= 'result.htm?Sysname='+sysname
+'&Domain='+domain+'&Subdomain='+subdomain+'&Client_id='+cli_id;
});
});template(row,data){(var key in
data) {(key+':'+data[key])
}.text(data[0]);row;}template_inp(row,data){.append("<input
type="+data[1]+"
name='row'>"+data[0]+"</input>");row;}param(Name)
{ var Params =
location.search.substring(1).split("&");variable =
"";(var i = 0; i < Params.length; i++)
{(Params[i].split("=")[0]
== Name)
{(Params[i].split("=").length
> 1)= Params[i].split("=")[1];= replaceAll(variable,'%20','
');variable;
}}"";}replaceAll(str,
what, to) {str.split(what).join(to);
}