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

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>);

}

1.3.4. Сортировка массивов

При отображении результатов на экране в виде таблицы и создании отчётов часто возникала необходимость сортировки выводимых значений по какому-либо столбцу таблицы. Т.е. фактически необходимо было переставить элементы всех массивов в соответствии с перестановкой элементов в сортируемом массиве. Поскольку массивов с данными, которые необходимо отразить на экране может быть несколько, и количество элементов массива довольно большое (количество элементов одинаково во всех массивах), требовалось максимально ускорить данную процедуру.

Эта задача решалась следующим образом:

  1. Создавался новый массив элементов, содержащий элементы от нуля до количества элементов сортируемого массива.

  2. Производилась сортировка элементов массива с помощью функции быстрой сортировки sort() языка Perl, причём результаты сортировки записывались в созданный на предыдущем шаге массив: индексы массива располагались в соответствии с расположением элементов в отсортированном массиве.

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

Далее приведён фрагмент программы, в котором приведена сортировка массивов @studs, @groups и @rs_dates в соответствии с выбором пользователя ($FORM{'sort'}) с использованием массива индексов и вывод отсортированных элементов на экран:

my @ind=(); # Это массив индексов

for ($i=0; $i<scalar(@studs); $i++)

{

push(@ind,$i);

}

if ($FORM{'sort'} eq 'student') # Если сортируем по ФИО студента

{

@ind=sort{$studs[$a] cmp $studs[$b]}@ind;

}

elsif ($FORM{'sort'} eq 'group') # Если сортируем по уч. группе

{

@ind=sort{$groups[$a] cmp $groups[$b]}@ind;

}

elsif ($FORM{'sort'} eq 'rs_date') # Если сортируем по Дате

{

@ind=sort

{

cmp_dates(str_to_date($rs_dates[$b]), str_to_date($rs_dates[$a]))

}@ind;

}

# Вывод на экран

for ($i=0; $i<scalar(@studs); $i++)

{

t_print qq(

Студент: $studs[$ind[$i]], Группа: $groups[$ind[$i]], Дата: $rs_dates[$ind[$i]]

);

}

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