Программирование >>  Программный интерфейс приложений 

1 ... 119 120 121 [ 122 ] 123 124 125 ... 264


return ($str);

# ожидание ввода значения столбца; отобразить текущее значение, если

# значение - $show current true sub col prompt

my {$name, $val, $show current) = @ ; my ($prompt, $str);

$prorapt = 5name;

$prompt .= [$val] if $show current; $prompt .= : ; print STDERR $prompt; chomp ($str = <STDIN>); return ($str ? $str : $val);

Параметр $show current предназначен для того, чтобы функция col prompt О при обновлении записей осуществляла проверку на существование записей. Значение $showcurrent будет равно О при создании новой записи, когда нет текущих значений, и не равно О, когда модифицируется существующая запись. Подсказка в последнем случае будет отображать текущее значение, которое пользователь может принять, нажав клавишу <Enter>.

Программный код редактирования записи данных текущего члена аналогичен коду создания существующей записи о новом члене. Однако в этом случае мы имеем дело с записью, которая уже существует и подсказка отображает текущее состояние записи, а метод edit member () вьщает запрос update, а не insert:

# редактирование существующих записей

sub eciit member {

my ($col name ref , $entry ref) = @ ; my {$col val, $query, $delim);

# отобразить существующее значение, запросить подтверждение

# на дальнейшее выполнение и редактирование show member {$col name ref , $entry ref);

return unless prompt { \пРедактировать эту запись? ) =- /y/i;

# подсказка для ввода новых данных;

# пользователь вводит новое значение для замещения

# существующего значения, null - для ввода пустого значения,

# exit для того, чтобы выйти

# раньше или Enter для принятия текущего значения, foreach my $col name (@{$col name ref ))

next if $col name eq member id ; # пропустить ключевое поле $col val = $entry ref ->{$col name>; $col val = NULL unless defined ($col val); $col val = col prompt {$col name, $col val, 1);



return if $col val =~ /exit$/i; # преждевременный выход Scol val = undef if Scol val =~ /null$/i; $entry ref->{$col name) = $col val;

# отобразить новые значения, запросить подтверждение

# перед модификацией

show member {$col name ref, $entry ref);

return unless prompt ( \пМодифицировать эту запись? ) =- /y/i;

# создать запрос UPDATE, а затем сделать его Squery = UPDATE member ;

Sdelim = SET ; # перед первым столбцом поставить SET ,

# перед другими - , foreach my $col name {@{Scol name ref)) {

next if $col name eq member id ; # пропустить ключевое

# поле

# quote() преобразует значение undef в слово NULL (без

# кавычек),

# это то, что нам нужно.

Squery .= sprintf ( %s %s=%s , Sdelim, Scol name, $dbh->quote ($entry ref->{$col name})); Sdelim = , ;

Squery WHERE member id = ? ;

warn Предупреждение: запись не модифицирована?\п unless $dbh->do (Squery, undef,

Sentry ref->{member id}) == 1;

Особенность использования edit member заключается в том, что он не делает никакой проверки введенных значений. Для большинства полей таблицы member не надо ничего проверять - это просто строковые поля. Но для таких столбцов как дата истечения срока членства, проверка необходима. Это нужно хотя бы для того, чтобы данные, заносимые в эти поля, напоминали собой даты. В прикладных профаммах, осуществляющих ввод данных общего назначения, предварительно можно получить данные о сфуктуре таблицы, чтобы на основании этой информации определить типы всех ее столбцов. На основании этих данных определяется область существования данных. Это слишком сложная тема, в которую мы не будем углубляться, просто добавим в функцию col prompt () код проверки формата данных при вводе данных в столбец expiration. Простейшая проверка даты может быть сделана следующим образом.

sub col prompt {

my (Sname, Sval, Sshow current) = @ ; my (Sprompt, Sstr);

loop:

Sprompt = Sname;

Sprompt .= [Sval] if Sshow current; Sprompt .= : ; print STDERR Sprompt;



chomp ($str <STDIN>);

# сделать элементарную проверку даты истечения срока членства if {$str SS $name eq expiration ) # проверить формат даты

# истечения срока членства

$str =- r\d+[ \dl\d+t \dl\d+$/ or goto loop;

return ($str ? $str : Sval);

Шаблон проверяет три цифровые последовательности, разделенные нецифровыми символами. Но это неполная проверка, которая не учитывает такие ошибки в формате даты как 1999-14-92 . Усовершенствование сценария подразумевает более полную проверку адекватности дат и проверку на наличие пробелов в имени и фамилии.

В числе других усовершенствований можно назвать отказ от операции модификации записи, если столбцы не были изменены, или вьщавать предупреждение пользователю о том, что пока он редактировал запись кто-то другой уже внес в нее изменения. Это можно осуществить, сохранив первоначальные данные, а затем запрограммировав оператор update таким образом, чтобы модифицировать только те столбцы записи, которые подвергались изменению. Если таковых нет, оператор даже не сработает. Кроме того, предложение where можно написать с выражением and со1 пвте = col vel для значения каждого столбца. Это вызовет сбой при выполнении оператора update, если кто-то еще вносил изменения в запись. Это и создаст обратную связь, сигнализирующую о том, что два пользователя пытаются внести изменения в одну и ту же запись одновременно.

Подбор членов Исторической Лиги по общности интересов

в круг обязанностей секретаря Исторической Лиги входит и обработка запросов, поступающих от членов Исторической Лиги по подбору других членов, имеющих аналогичные научные интересы в области истории США. При работе с текстовым редактором совсем нетрудно найти таких членов, область научных интересов которых - период Великой Депрессии или биография Авраама Линкольна. Но создать список, удовлетворяющий этим критериям, будет уже затруднительно, и для решения такой задачи будет удобнее воспользоваться возможностями СУБД MySQL и сделать такой запрос.

SELECT * FROM member WHERE interests LIKE %lincoln% ORDER BY last name, first name

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



1 ... 119 120 121 [ 122 ] 123 124 125 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика