NAME

Tk::DBI::DBGrid - grid для просмотра и редактирования базы.


SYNOPSIS

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

DESCRIPTION

DBGrid позволяет просматривать/редактировать любую таблицу, к которой можно обратиться используя запрос. Запрос может объединять несколько таблиц.

Edit table

Для редактирования надо что бы каждую запись можно было однозначно определить каким-либо полем, которое будет выполнять функцию primary key. Для передачи изменения в базу используются функции, указатели на которые передаются в конструкторе ( -insfunc, -updfunc & -delfunc ). Сами функции описываются в основном тексте программы. Если указатель не передается или передается undef, то соответствующее действие не обрабатывается. Если в запросе будут найдены ключевые слова групповых операций или UNION, то DBGrid будет в режиме просмотра ( аналогично -edit => 0 ). После вызовов функций отображаемые данные обновляются если возвращается 1.

Formating cells

Параметры отображения каждого поля определяются параметрами самой таблицы (считываются длина поля и тип - текстовый, цисловой и остальные). Для поля, определенного через -pkey, редактирование не доступно. Все ячейки DBGrid - элементы управления Label или Entry, и после отображения ими можно управлять отдельно, например $grig->{rowframee}->[$i][$j]->configure( -font => 'Courier 12').


OPTIONS

-dbh
дескриптор соединения с базой данный. Обязательный параметр.
-sql
Запрос, результат которого отображает DBGrig. Результаты запроса заносятся в массив $grid->{table}->{data}->[номер_записи][номер_поля]. Нумерация идет с нуля. Обязательный параметр.
-maxrow
Максимальное количество записей, отображаемое на экране. Default 10.
-edit
Указывает в каком режиме отображается DBGrig : только просмотр ( 0 ) или редактирования ( 1 ). Default 0.
-pkey
Для режима редактирования должно быть указано ключевое поле (primary key) и считывается оно из первого элемента массива, на который передается указатель. Если -pkey не определнено или не найдено в запросе, то edit = 0.
-incfunc
Указатель на функцию, которая вызывается для вставки новой строки. В функцию передается массив, содержащий запись для вставки в таблицу. Порядок полей в записи такой же, как в запросе, полученном через -sql. Если функция не определена, новая запись добавлятся не будет. Если функция возвращает 1 (истина), то после ее вызова обновляются данные из базы. Default undef.
-updfunc
Работает аналогично -insfunc, но с одним отличием: при значении undef все равно позволяет изменять значения в ячейках, но эти изменения в базу не передаются. Если в функции данные не модифицируются, то данные в кэше модуля лучше не обновлять (возвращать 0). Default undef.

-delfunc
Работает аналогично -insfunc.
-titlbg
Цвет фона заголовков полей. Default for windows SystemButtonFace, for other OS is #f0f0f0.
-seltitlbg
Цвет фона заголовка активного поля. По умочанию для windows SystemHighlight, для остальных gray.
-font
Шрифт, используемый в ячейках. Т.к. ширина элементов Entry и Label задается в символах, то для шрифт должен быть monospaced, например Courier. Default 'Courier 9'
-cellformat
указатель на массив, первый элемент которого указывает на номер поля (нумерация с нуля), второй - параметр форматирования поля. width - ширина поля в символах, edit - доступно ли редактирование данного поля при разрешении редактировании всей таблицы, justify - центрирование надписи (left, center, right).
-fkeys
Указатель на хэш, в котором будут храниться новые комбаниции клавиш для вставки и удаления записей: в поле {ins} - вставка новой записи, {del} - удаление текущей, {copy}, {copy2}, {copy3} - копировать запись в буфер обмена. Если знечение -fkeys не определено, то для вставки назначается F5, для удаления F8, для копирования в буфер текущей записи - Ctrl+C и Ctrl+Ins.
-encodes
Указатель на функцию, которая вызывается для перекодирования из кодовой страницы базы данных в кодовую страницу графической оболочки, например, в базе используется NLS_LANG=CL8MSWIN1251, а Gnome 2.x - UTF8. Если функция не определена, перекодировка не производится. Default undef.

AUTHORS

Вадим Лихота vadim-lvv[at]yandex.ru


KEYWORDS

dbgrid, entry, label, database, table

главная