|
Программирование >> Программный интерфейс приложений
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, выполняющего задачу подбо-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |