Tk::DBI::DBGrid - grid для просмотра и редактирования базы.
use DBI;
use Tk;
use Tk::DBI::DBGrid;
my $dbh = DBI->connect( $dbhstr, $name, $pas, {AutoCommit => 0, RaiseError => 0}) or die DBI::errstr;
my $w = $MW->Toplevel(-title => 'dbgrid');
.....
my $sql = "SELECT field0, field1, field2 FROM table0";
# только просмотр
my $grid = $w->DBGrid( -dbh => $dbh, -sql => $sql )->pack;
# с использованием редактирования, без встаки и удаления
my @pkey = ('field0');
my $upd = sub {
my @row = @_;
..... # какой-нибудь код до update, если нужно
$dbh->do("UPDATE table0 SET WHERE field0 = $row[0]");
$dbh->commit;
..... # какой-нибудь код после update, если нужно
0; # ноль нужен для будущих реализаций
};
my $grid = $w->DBGrid( -dbh => $dbh, -sql => $sql, -maxrow => 10, -edit => 1, -pkey => \@pkey, -updfunc => $upd, -font => 'Courier 10' )->pack;
# with insert, delete and formating sells
my @pkey = ('field0');
my @cell;
$cell[0]{width} = 5;
$cell[0]{edit} = 0;
$cell[0]{name} = 'title0' # заголовок для первой колонки
$cell[1]{width} = undef; # считывается длина поля из таблицы
$cell[1]{edit} = 1;
$cell[2]{width} = 7;
$cell[2]{edit} = 1;
$cell[2]{justify} = 'left';
my $ins = sub {
my @row = @_;
......
$dbh->do("INSERT INTO table0 (field0, field1, field2) VALUES ($row[0], $row[1], $row[2])");
$dbh->commit;
......
0;
};
my $upd = sub {
my @row = @_;
.....
$dbh->do("UPDATE table0 SET WHERE field0 = $row[0]");
$dbh->commit;
.....
0;
};
my $del = sub {
my ($pkey) = @_;
.....
$dbh->do("DELETE FROM table0 WHERE field0 = $pkey");
$dbh->commit;
.....
0;
};
my %fkey;
$fkey{ins} = 'Key-F5';
$fkey{del} = 'Key-F8';
$fkey{copy} = 'Control-Key-c';
$fkey{copy2} = 'Control-Key-C';
$fkey{copy3} = 'Control-Insert';
my $encd = sub {
return decode('cp1251', $_[0]); # from module Encode
};
my $grid = $w->DBGrid( -dbh => $dbh,
-sql => $sql,
-maxrow => 10,
-edit => 1,
-pkey => \@pkey,
-insfunc => $ins,
-updfunc => $upd,
-delfunc => $del,
-titlbg => '#f0f0f0',
-seltitlbg => 'gray',
-font => 'Courier 10',
-cellformat => \@cell,
-fkeys => \%fkey,
-encodes => $encd
)->pack(-fill => 'x');
DBGrid позволяет просматривать/редактировать любую таблицу, к которой можно обратиться используя запрос. Запрос может объединять несколько таблиц.
Для редактирования надо что бы каждую запись можно было однозначно определить каким-либо полем, которое будет выполнять функцию primary key. Для передачи изменения в базу используются функции, указатели на которые передаются в конструкторе ( -insfunc, -updfunc & -delfunc ). Сами функции описываются в основном тексте программы. Если указатель не передается или передается undef, то соответствующее действие не обрабатывается. Если в запросе будут найдены ключевые слова групповых операций или UNION, то DBGrid будет в режиме просмотра ( аналогично -edit => 0 ). После вызовов функций отображаемые данные обновляются если возвращается 1.
Параметры отображения каждого поля определяются параметрами самой таблицы (считываются длина поля и тип - текстовый, цисловой и остальные). Для поля, определенного через -pkey, редактирование не доступно. Все ячейки DBGrid - элементы управления Label или Entry, и после отображения ими можно управлять отдельно, например $grig->{rowframee}->[$i][$j]->configure( -font => 'Courier 12').
Вадим Лихота vadim-lvv[at]yandex.ru
dbgrid, entry, label, database, table