Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИПОВС (2002) / DMoroz / Диплом.doc
Скачиваний:
42
Добавлен:
16.04.2013
Размер:
1.12 Mб
Скачать

1.3. Особенности реализации подсистемы

1.3.1. Взаимодействие с базой данных

Для взаимодействия Perl-скриптов с СУБДMySQLсистема ОРОКС использует модульDBI.

Общий алгоритм работы с базой данных можно представить в следующем виде:

  • Подключение к базе данных с помощью функции connect;

  • Подготовка запроса к выполнению с помощью функции prepare;

  • Выполнение запроса с помощью функции execute;

  • Выборка данных (для запросов содержащих команду SQL select) с помощью функций fetch;

  • Завершение работы с базой данных: функции finish и disconnect.

Подключение к базе данных производится системой ОРОКС автоматически при входе пользователя в систему.

Функции подготовки запроса к базе данных ОРОКС, выполнения этого запроса и выборки данных были изменены для автоматизации перехвата сообщений о возможных ошибках и приведены к более удобному виду для использования.

В результате для работы с БД имеются следующие функции:

ExecSQL($sql) – выполняет выражение $sql;

Assign2var– присваивает результат, возвращённый функциейExecSQLпеременной(ым);

Assign2list– присваивает результат, возращённый функциейExecSQLмассиву(ам) значений.

Приведём фрагмент программы, реализующий выборку из таблицы USERSидентификаторов записейID, фамилийufamи имёнunameстудентов, занимающихся в группе $FORM{group}. Результаты запроса с помощью функцииAssign2listзаносятся в соответствующие массивы данных:

$sql="SELECT ID, ufam, uname FROM users WHERE uflags='stand' AND ugroup='$FORM{group}'

$sth=ExecSQL($sql);

Assign2list($sth, \@ID, \@fams, \@names);

1.3.2. Передача значений между формами

При передаче данных из одной формы в другую используются хэш %Hiddenи скрытый элемент ввода «hidden».

Для передачи значения переменной $varсначала необходимо занести его в специальный ассоциативный массив %Hidden: $Hidden{name}=$var. Перед отправкой формы элементы этого массива шифруются функцией ОРОКСCodeHiddens() и передаются с использованием скрытого элемента ввода «hidden» на следующий экран, где они будут доступны как обычные элементы хэша %FORM. Т.е. значение переменной $var, записанное в хэш %Hiddensбудет доступно через $FORM{name}.

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

Допустим, нужно передать на следующую форму массив идентификаторов @ID. Для этого с помощью функцииjoin() языкаPerlобъединим все значения массива @IDв переменную $ID_array. В качестве разделителя выступит точка с запятой: $ID_array=join(";", @ID). Затем заносим эту переменную в хэш %Hiddens: $Hidden{ID_array}=$ID_array.

После кодирования хэша с помощью функции CodeHiddens() и отправки формы на следующем экране при обращении к элементу $FORMS{ID_array} получим искомый массив в виде строки, элементы которого разделены точкой с запятой. Для разбора этой строки и занесения элементов обратно в массив используется функцияsplit:

my (@ID)=split(';', $FORM{'ID_array'});

1.3.3. Особенности, связанные с подготовкой отчётов для печати

При подготовке документа для печати необходимо открыть новое окно Интернет-браузера и отобразить содержимое документа.

Для этих целей можно воспользоваться временными файлами, куда записывается HTML-документ и затем открывается средствами языкаJavaScript. Но в таком случае требуется обеспечить уникальность имён файлов при каждом вызове приложения и удаление ненужных временных файлов.

Для устранения этих недостатков был выбран другой способ. При нажатии на кнопку «Создать документ» заполненная форма отправляется на сервер, где в создаваемый HTML-документ записывается функцияwindow.open() языкаJavaScript, исполняемая при загрузке пользователемHTML-документа. Эта функция инициирует создание нового окна, в котором производится вызов того же приложения с передачей ему всех необходимых значений с помощью методаGETв виде «имя=значение&имя2=значение2...»

Поскольку передача значений с помощью метода GETпроисходит черезURLдокумента, то во избежание проблем с пониманием символов кириллицы некоторыми типами Интернет-браузеров, необходимо обеспечить преобразование всех передаваемых значений, содержащих русские буквы к виду, понимаемому всеми браузерами, т.е. «%»+ «шестнадцатеричный код символа».

Это осуществляется с использованием шаблонов и функции unpackязыкаPerl.

Ниже приведён фрагмент кода, в котором осуществляется такое преобразование имени учебной группы $groupи производится вызов функцииopenязыкаJavaScriptдля открытия нового окна с передачей туда всех необходимых значений:

$group=~s{(.|\n)}{'%'.unpack('H2',$1)}eg;

t_print qq(

<SCRIPT language=\"JavaScript\">

<!--

var aWinObj;

aWinObj = window.open('$CGIname?hv=$forms::hv&$str&show_nv=$FORM{show_nv}&short_form=$FORM{short_form}&group_by=$FORM{group_by}&s_plan=$s_plan&selected=$FORM{selected}&gr_plans=$FORM{gr_plans}&group=$group&zaversh=$FORM{zaversh}&plans=$FORM{plans}&selected=$FORM{selected}&diss=$diss&tests=$tests&inf=$in','Result',"toolbar=yes,directories=0,status=no,menubar=yes,scrollbars=yes,resizable=yes,copyhistory=0");

// -->

</SCRIPT>);

}

Соседние файлы в папке DMoroz