|
Программирование >> Программный интерфейс приложений
foreach my $col name (@col name) { printf OUT %s: %s\n , $col name, $entry ref->{$col name); close (OUT); Эту процедуру можно усовершенствовать. Добавим, например, столбец, который будет содержать дату отсылки самого последнего напоминания. Это поможет не посылать такие предупреждения слишком часто. Самый подходящий интервал такой рассылки может быть один месяц. Теперь оба сценария можно считать законченными. Они запускаются на выполнение следующим образом. % need renewal > junk % (проверьте текст сообщения) % renewal notify junk Для того чтобы оповестить отдельных членов, нужно обозначить их, указав соответствующий идентификационный номер или электронный адрес: % need renewal 18 g.steve@pluto.com Редактирование записей о членах Исторической Лиги Рассьшка сообщений о необходимости обновления членства началась. Теперь необходимо учесть тот факт, что некоторые из членов Исторической Лиги , которых мы предупредили, возобновили свое членство в этой организации. Когда это происходит, необходимо получить возможность обновлять их записи и модифицировать их даты завершения срока членства. В следующей главе будет показан способ, как это можно сделать из Web-броузера. А в этой главе будет создан сценарий editmember, работающий из командной строки, позволяющий модифицировать записи с помощью простого последовательного ввода нового значения для всех частей записи. Он работает следующим образом. Когда сценарий editmember запускается без аргументов, предполагается, что пользователь хочет ввести данные о новом члене Исторической Лиги . В результате будет создана новая запись. Когда сценарий editmember вызьшается из командной строки с определенным идентификационным номером, осуществляется просмотр существующих компонентов записи и запрос новых данных по каждому столбцу. Введенное значение обновляет текущее значение. После нажатия клавиши <Enter>, содержимое столбца не изменится. (В случае, если идентификационный номер не известен, для его определения можно вызвать сценарий show member last name.) Вероятно, это усложнит работу по модификации только даты истечения срока членства. Но сценарий, аналогичный этому, позволяет производить простую модификацию любой части записи, не касаясь при этом SQL-запросов. (Особо стоит отметить, что сценарий edit member не позволяет вносить изменения в поле memberid. Это является следствием того, что оно создается автоматическим образом и его значение после этого менять нельзя.) Прежде всего, сценарий editmember должен знать имена столбцов в таблице member. # получить имена столбцов таблицы member my ($sth) = Sdbh->prepare (qq( SELECT * FROM member WHERE 1 = 0 }); $sth->execute (); my (@col name) = @{$sth->{NAME}}; $sth->finish 0; После этого перейдем к главному циклу. if (@ARGV ==0) # аргументы отсутствуют - создать новую запись ( new member (\@col name) ; else # иначе редактировать записи, рассматривая аргументы # в качестве идентификаторов членов Исторической Лиги ту (@id) ; # сохранить @ARGV и затем очистить его с тем, чтобы при чтении # с устройства STDIN # не использовал аргументы их в качестве имен файлов @id = @ARGV; @ARGV = () ; # для определенного идентификатора найти запись и # отредактировать ее while (my $id = shift (@id)) { my ($entry ref ) ; $sth = $dbh->prepare (qq{ SELECT * FROM member WHERE member id = ? }) $sth->execute $entry ref = $sth->fetchrow hashref () ; $sth->finish 0; if (!Sentry ref) { warn Член Исторической Лиги с номером = $id не найденХп ; next; edit member (\@col name, $entry ref) ; Профаммный код для создания новой записи члена Исторической Лиги приведен ниже. Он запрашивает новые значения для каждого столбца, а затем генерирует оператор insert для того, чтобы добавить новую запись. # создать новую запись sub new member { my (Scol name ref) = shift; my (Sentry ref); my (Scol val, Squery, Sdelim); return unless prompt ( Создать новую запись? ) =~ / y/i; # подсказка для получения новых значений; # пользователь вводит новое значение, # для того чтобы ввести пустое значение, # введите null , для преждевременного выхода - введите exit foreach my Scol name (@{Scol name ref>) next if Scol name eq member id ; # пропустить ключевое поле Scol val = col prompt (Scol name, , 0); next if $col val eq ; # пользователь нажал клавишу <Enter> return if $col val =- /exitS/i; # преждевременный выход Scol val = undef if Scol val =- /nullS/i; Sentry ref->{Scol name} = Scol val; # показать значения, перед вставкой запросить подтверждение show member ($col name ref, Sentry ref); return unless prompt ( ХпВставить эту запись? ) =~ /y/i; # создать запрос INSERT, a затем запустить его. Squery = INSERT INTO member ; Sdelim = SET ; # перед первым столбцом вставить SET , # перед другими - , foreach my Scol name (@{Scol name ref}) { # определять заданные значения столбцов next if Idefined (Sentry ref->{$col name}); # функция quote 0 при получении значения undef выводит # слово NULL (без кавычек), Squery .= sprintf ( %s %s=%s , Sdelim, $col name, Sdbh->quote (Sentry ref->{$col name})); Sdelim = , ; warn Предупреждение: запись не введена?\п unless Sdbh->do (Squery) == 1; Подпрофамма вывода подсказок, которые использует new member(), выглядит следующим образом. # задать вопрос и ожидать ответа sub prompt my (Sstr) = shift; print STDERR Sstr; chomp (Sstr = <STDIN>);
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |