type TPaintPanelEvent = procedure (DBCtrlGrid: TDBCtrlGrid; Index: Integer) of object;
Параметр index указывает номер панели, отображение элементов которой выполняется в настоящий момент. Кроме прорисовки, в обработчике события OnPaintPanel можно выполнить другие действия, например, обработку связанных с панелью данных.
Использование навигационного интерфейса
Для управления набором данных можно использовать навигатор, который обеспечивает соответствующий интерфейс пользователя. По внешнему виду и организации работы навигатор похож на мультимедийный проигрыватель. В Delphi навигатор представлен компонентом DBNavigator (рис. 6.9).
'ЧЧЧмЫ~1Ч^1хк
Рис. 6.9. Навигатор
Навигатор содержит кнопки, обеспечивающие выполнение различных операций с набором данных путем автоматического вызова соответствующих методов. Состав видимых кнопок определяет свойство visibleButtons типа TButtonSet, принимающее комбинации следующих значений (в скобках указан вызываемый метод):
□ nbFirst — перейти к первой записи (First);
□ nbPrior — перейти к предыдущей записи (Prior);
□ nbNext — перейти к следующей записи (Next);
Глава 6. Визуальные компоненты для работы с данными
153
П nbLast — перейти к последней записи (Last);
□ nbinsert — вставить новую запись (insert);
□ nbDelete — удалить текущую запись (Delete);
□ nbEdit — редактировать текущую запись (Edit);
□ nbPost — утвердить результат изменения записи (Post);
□ nbCancel — отменить изменения в текущей записи (Cancel);
□ nbRefresh — обновить информацию в наборе данных (Refresh). По умолчанию в навигаторе видимы все кнопки.
Метод BtnClick(index: TNavigateBtn) служит для имитации нажатия кнопки, заданной параметром index. Тип TNavigateBtn этого параметра идентичен типу TButtonSet, возможные значения соответствующего параметра которого перечислены выше. В качестве примера приведем строку кода:
|
DBNavigator.BtnClick(nbNext);
В ней имитируется нажатие кнопки nbNext, вызывающей переход к следующей записи набора данных.
При нажатии кнопки nbDelete может появляться диалоговое окно, в котором пользователь должен подтвердить или отменить удаление текущей записи. Появлением окна подтверждения управляет свойство ConfirmDelete типа Boolean, по умолчанию имеющее значение True, т. е. окно подтверждения выводится. Если при отладке приложения установить это свойство в значение False, то запись будет удаляться без запроса подтверждения.
Свойство Flat типа Boolean управляет внешним видом кнопок. По умолчанию оно имеет значение False, и кнопки отображаются в объемном виде. При установке свойства Flat в значение True кнопки приобретают плоский вид, соответствующий современному стилю.
Подсказку для отдельной кнопки можно установить с помощью свойства Hints типа TString. По умолчанию список подсказок содержит текст на английском языке, который можно заменить на русский, вызвав Строковый редактор (String list editor). Подсказка для навигатора устанавливается через свойство Hint типа string. Напомним, что для отображения подсказок нужно присвоить значение True свойству SnowHint, по умолчанию имеющему значение False.
На практике часто вместо навигатора используются отдельные кнопки Button или BitBtn, при нажатии которых вызываются соответствующие методы управления набором данных. Например, в процедурах:
procedure TForml.ButtonlClick(Sender: TObject); begin
Tablel.Next; end;
154
Часть II. Технологии доступа к данным
procedure TForml.Button2Click(Sender: TObject);
begin
Tablel.Prior;
|
end;
при нажатии кнопок Buttonl и Button2 выполняется переход к следующей и предыдущей записям набора данных Tablel соответственно.
Вывод графических изображений
Компонент DBimage (графическое изображение) предназначен для вывода изображений, содержащихся в графических полях БД. Если компонент DBimage связать с полем, не содержащим изображение, например, с числовым, то в области компонента выводится имя этого поля. В случае, когда компонент DBimage не связан ни с одним полем, он отображает свое собственное имя (значение свойства Name).
Кроме вывода изображения, компонент также позволяет изменить (заменить) его, вставив нужный рисунок из буфера обмена Windows.
Основные свойства графического изображения мы рассматривать не будем, а рассмотрим только дополнительные характеристики компонента DBimage.
Свойство AutoDisplay типа Boolean указывает, каким способом в компоненте DBimage отображаются изменения в связанном с ним поле. По умолчанию свойство имеет значение True, и содержимое графического поля отображается. Если свойство AutoDisplay установить в значение False, то при изменении значения поля, например, из-за перехода к другой записи, вместо изображения выводится имя поля. В этом случае для вывода графики нужно выполнить двойной щелчок на графическом компоненте или нажать клавишу <Enter>, когда на нем находится фокус ввода. Можно также вывести содержимое поля программно с помощью метода LoadPicture. Например:
DBImagel.AutoDisplay:= False;
procedure TForml.ButtonlClick(Sender: TObject);
begin
DBImagel.LoadPicture;
end;
В данной процедуре при нажатии кнопки Buttonl в графическом компоненте DBImagel выводится содержимое графического поля текущей записи.
|
Компонент DBimage поддерживает работу с буфером обмена Windows, позволяя копировать изображение в буфер и вставлять изображение из буфера. Для выполнения этих действий используются обычные для Windows-программ комбинации клавиш: копирование в буфер — <Ctrl>+<Insert>, удаление в буфер — <Shift>+<Delete>, вставка из буфера — <Shift>+<insert>.
Глава 6. Визуальные компоненты для работы с данными
155
Указанные действия также могут быть выполнены программно. Метод CopyToClipboard копирует изображение в буфер обмена, метод CutToClipboard вырезает (перемещает) изображение в буфер обмена, а метод PasteFromClipboard вставляет изображение из буфера обмена.
При использовании любого способа вставки из буфера новое изображение автоматически заменяет предыдущее содержимое компонента DBimage.
Рассмотрим в качестве примера программу для работы с фотоальбомом.
Пусть информация о фотографиях хранится в таблице Paradox, представляющей собой "электронный фотоальбом" и включающей следующие поля:
□ код (автоинкрементное поле);
□ название (символьное поле);
□ дата (поле даты);
□ изображение (графическое поле);
□ описание (Memo-поле).
Для просмотра и редактирования альбома создано приложение, форма которого показана на рис. 6.10. Содержимое альбома выводится в соответствующих компонентах. В верхней части расположены поля редактирования DBEdit, одно из которых содержит название, а другое — дату фотографии. Снимок выводится в графическом компоненте DBimagel, а описание снимка — в многострочном редакторе DBMemol. Для навигации по альбому используется навигатор DBNavigatorl, расположенный в нижней части формы. Флажок checkBoxl управляет масштабированием изображения по размеру компонента DBimagel. По умолчанию этот флажок снят, и изображение не подстраивается под размеры графического компонента.
Название, дата и описание фотографии редактируются обычным способом с помощью соответствующих компонентов DBEdit и DBMemo. Для редактирования снимка имеются кнопки, позволяющие вставлять изображение из файла и сохранять его в файле, а также обмениваться изображениями через буфер.
Нажатие кнопки Открыть вызывает появление диалога OpenPictureDialogl выбора файла для открытия. После выбора нужного файла содержащееся в нем изображение загружается в компонент DBimagel. Фильтр диалога настроен на выбор графических файлов формата BMP, а также форматов ICO, EMF и WMF, которые при загрузке автоматически преобразуются в формат BMP.
Нажатие кнопки Сохранить открывает диалог SavePictureDialogl выбора файла для сохранения. После выбора файла в него записывается изображение из компонента DBimagel. Фильтр диалога настроен на выбор графического файла формата BMP. Настройка фильтров обоих диалогов произведена при создании формы.
156
Часть II. Технологии доступа к данным
Рис. 6.10. Просмотр и редактирование электронного фотоальбома
Кнопки с названиями Копировать, Вырезать и Вставить выполняют соответствующий обмен между графическим компонентом DBimagel и буфером. Кнопка Закрыть прекращает работу приложения.
Ниже приведен код модуля uAlbum формы Forml приложения.
unit uAlbum; interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, DBCtrls, ExtCtrls, Db, DBTables, Grids, DBGrids, ExtDlgs,
Mask;
type
TForml = class(TForm)
DataSourcel: TDataSource;
Tablel: TTable;
DBNavigatorl: TDBNavigator;
Buttonl: TButton;
OpenPictureDialogl: TOpenPictureDialog;
SavePictureDialogl: TSavePictureDialog;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Глава 6. Визуальные компоненты для работы с данными
157
Button5: TButton;
Button6: TButton;
DBMemo1: TDBMemo;
DBImagel: TDBImage;
CheckBoxl: TCheckBox;
DBEditl: TDBEdit;
DBEdit2: TDBEdit;
procedure ButtonlClick(Sender: TObject procedure Button2Click(Sender: TObject procedure Button3Click(Sender: TObject procedure Button4Click(Sender: TObject procedure Button5Click(Sender: TObject procedure Button6Click(Sender: TObject procedure FormCreate(Sender: TObject); procedure CheckBoxlClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Forml: TForml;
implementation
{$R *.DFM}
procedure TForml.FormCreate(Sender: TObject);
begin
OpenPictureDialogl.Filter:=
'Все файлы (*.bmp;*.ico;*.emf;*.wmf) *.bmp;*.ico;*.emf;*.wmf' SavePictureDialogl.Filter:= '*.bmp|*.bmp';
end;
procedure TForml.ButtonlClick(Sender: TObject); begin
if OpenPictureDialogl.Execute then DBImagel.Picture.LoadFromFile(OpenPictureDialogl.FileName); end;
158
Часть II. Технологии доступа к данным
procedure TForml.Button2Click(Sender: TObject); begin
if SavePictureDialogl.Execute then DBImagel.Picture.LoadFromFile(SavePictureDialogl.FileName); end;
procedure TForml.Button3Click(Sender: TObject); begin
DBImagel.CopyToClipboard; end;
procedure TForml.Button4Click(Sender: TObject); begin
DBImagel.CutToClipboard; end;
procedure TForml.Button5Click(Sender: TObject); begin
DBImagel.PasteFromClipboard; end;
procedure TForml.Button6Click(Sender: TObject);
begin
Forml.Close; end;
procedure TForml.CheckBoxlClick(Sender: TObject); begin
DBImagel.Stretch:= CheckBoxl.Checked; end;
end.
Отметим, что в отличие от компонента image, у графического компонента DBimage нет свойства Canvas, позволяющего рисовать на поверхности изображения.
Построение диаграмм
Для построения диаграмм на основании информации, содержащейся в наборе данных, предназначен компонент-диаграмма DBChart. Он позволяет выводить диаграммы различных типов, в том числе объемные. Этот компонент является достаточно сложным и имеет большое количество разнообразных свойств, многие из которых являются объектами и также имеют свои свойства. На практике
Глава 6. Визуальные компоненты для работы с данными
159
установка значений этих свойств выполняется при разработке приложения с помощью Редактора диаграмм, окно которого Editing DBChartl показано на рис. 6.11. Редактор позволяет оперировать со свойствами-объектами, информация о которых отображается на его страницах, и вызывается двойным щелчком на компоненте DBChart или через поле значения свойства-объекта в Инспекторе объектов (в этом случае активной становится страница, соответствующая выбранному свойству).
Важнейшим свойством компонента DBChart является свойство Series [ index:Longint] типа TChartSeries, представляющее собой массив диаграмм, выводимых в области компонента. (Часто компонент DBChart содержит только одну диаграмму.)
Для каждой диаграммы можно установить:
□ тип; □ описание;
□ название; □ источник данных
□ оси; и другие параметры.
Рис. 6.11. Редактор диаграмм
Разработчик должен как минимум указать тип диаграммы и источник данных. Тип выбранной диаграммы (диаграмм) и ее название отображаются на странице Chart-Series Редактора диаграмм (рис. 6.11). Для добавления новой диаграммы нужно нажать кнопку Add, в результате чего появляется окно, показанное на рис. 6.12. После выбора типа диаграммы, объемного или плоского варианта ее построения и нажатия кнопки ОК диаграмма добавляется к значению свойства Series и отображается на соответствующей странице Редактора диаграмм.
160
Часть II. Технологии доступа к данным
Для выбранной диаграммы можно выполнить следующие действия:
□ изменить имя по умолчанию (seriesl, Series2 и т. д.) — кнопка Title;
□ изменить тип диаграммы — кнопка Change;
□ скопировать диаграмму — кнопка Clone;
□ удалить диаграмму — кнопка Delete.
Источник данных выбирается на странице Series-DataSource из следующих вариантов:
□ No Data — значения, вводимые программно;
□ Random Values — случайные числа;
□ Function — значения, определяемые выбранной функцией;
□ DataSet — значения набора данных; компонент DBChart отличается от компонента chart именно тем, что для него в качестве источника данных можно использовать набор данных, т. е. DBChart является более универсальным компонентом.
Standard Functions
Line Bar Horiz.Bar Area
Point Pie Fast Line Shape
Gantt Arrow Bubble
OK Cancel |7 3D
Рис. 6.12. Выбор типа диаграммы
Если выбран программный способ (вариант No Data) ввода значений, то при выполнении приложения нужно вызывать соответствующие методы. Для управления значениями, по которым строится диаграмма, часто используются методы
Add, Delete или Clear.
Функция Add (Const AValue: Double; Const ALabel: String; AColor: TColor): Longint добавляет к диаграмме значение, указанное параметром
Глава 6. Визуальные компоненты для работы с данными
161
AValue. Параметры ALabel и AColor содержат соответственно надпись значения и цвет, используемый при выводе. В качестве результата функция возвращает номер значения в массиве значений диаграммы. Кроме Add, есть несколько других методов, также позволяющих добавлять значения.
Процедура Delete (Valueindex: Longint) удаляет значение с номером, указанным параметром Valueindex. Для удаления всех значений удобно использовать процедуру Clear.
В качестве примера рассмотрим, как осуществляется вывод графика.
Тип диаграммы (график) задан при разработке приложения. Вид графика при выполнении приложения показан на рис. 6.13. Используемые при его построении значения вводятся построчно в редакторе Memol.
Рис. 6.13. Вывод графика
Ниже приведены обработчики событий для кнопок формы приложения.
procedure TForml.ButtonlClick(Sender: TObject);
var n: integer;
begin
DBChartl.Title.Text.Add('График');
for n:= 0 to Memol.Lines.Count - 1 do
DBChartl.Series[0].Add(StrToFloat(Memol.Lines[n]), IntToStr(n), clRed); end;
procedure TForml.Button2Click(Sender: TObject);
begin
DBChartl.Title.Text.Clear;
DBChartl.Series[0].Clear;
end;
162
Часть II. Технологии доступа к данным
При нажатии кнопки График (Buttonl) значения из редактора Memol заносятся в компонент DBChartl, отображающий график. Удаляется график нажатием кнопки Очистить (Button2).
Задание случайных чисел (вариант Random Values) в качестве источника данных для диаграммы бывает полезным при предварительной настройке диаграммы, например, при выборе ее типа или размера.
Использование функции (вариант Function) в качестве источника данных для диаграммы заключается в том, что диаграмма строится на основании обработки значений, взятых из двух и более других диаграмм (серий). В качестве функций обработки можно использовать Copy, Average, Low, High, Divide, Multiply, Subtract и Add. Например, если указать функцию Subtract (Вычитание) и две диаграммы-источника Seriesl и Series2, то каждое значение нашей диаграммы будет вычисляться как разность между соответствующими значениями диаграмм Seriesl и Series2.
При задании набора данных (вариант Dataset) в качестве источника данных для диаграммы (рис. 6.14) становится видимой панель для ввода информации о наборе данных.
Рис. 6.14. Задание источника данных для диаграммы
В списке Dataset содержатся имена наборов данных, доступных в модуле той формы, в которой расположен компонент DBChart. В приведенном на рис. 6.14 примере — это набор данных Tablel. В списке Labels выбирается имя поля (в примере Name), данные из которого используются в качестве надписей для обо-
Глава 6. Визуальные компоненты для работы с данными
163
значения секторов диаграммы, а в списке Pie — имя поля (в примере Dial), из которого выбираются данные для построения секторов диаграммы.
После закрытия окна Редактора диаграмма автоматически строится системой Delphi на основании записей, составляющих набор данных (рис. 6.15).
Рис.6.15. Диаграмма, построенная на основании значений набора данных |
При выполнении приложения диаграмма выглядит так же, как и при проектировании. При этом ее функционирование является динамическим, т. е. при изменении данных, содержащихся в наборе, диаграмма изменяется автоматически.
Глава 7
Навигационный доступ к данным с помощью BDE
Напомним, что навигационный способ доступа заключается в обработке каждой отдельной записи набора данных. Достоинством этого способа является простота кодирования операций, а основной недостаток состоит в том, что приложение получает все записи набора независимо от того, сколько их требуется обработать на самом деле. Это приводит к большой нагрузке на сеть, особенно при интенсивном обмене данными. Поэтому применение навигационного способа доступа обычно ограничивается локальными БД.
В данной главе мы познакомимся с основными операциями, используемыми в локальных БД. Эти операции также могут быть применены и при организации работы с удаленными БД, если сеть имеет небольшое число пользователей. Операции с таблицами будут рассмотрены по отношению к наборам данных Table и Query, используемым при механизме BDE. Наряду с навигационным, язык структурированных запросов SQL и набор данных Query позволяют реализовать для локальных БД и реляционный доступ к данным, который подробно будет изложен в главе 8.
Если нет каких-либо специальных ограничений, то при работе с локальными БД более предпочтительным представляется набор данных Table, т. к. он работает несколько быстрее, чем Query. Для доступа к удаленным БД, наоборот, лучше использовать набор данных Query, т. к. с помощью SQL-запроса он позволяет реализовать реляционный доступ к данным, уменьшающий число передаваемых по сети записей.
При навигационном способе доступа операции выполняются с отдельными записями. Каждый набор данных имеет указатель текущей записи, т. е. записи, с полями которой могут быть выполнены такие операции, как редактирование или удаление. Компоненты Table и Query позволяют управлять положением этого указателя.
Навигационный способ доступа дает возможность осуществлять следующие операции:
□ сортировку записей;
□ навигацию по набору данных;
Глава 7. Навигационный доступ к данным с помощью BDE
165
П редактирование записей;
□ вставку и удаление записей;
□ фильтрацию записей.
Отметим, что аналогичные операции применимы к набору данных и при реляционном способе доступа, реализуемом с помощью SQL-запроса.
Операции с таблицей БД
Кроме действий с отдельными записями, с помощью компонента Table можно выполнять также действия с таблицей БД в целом, например, создавать, удалять, переименовывать таблицы или устанавливать режимы доступа к ним.
Создание, удаление и переименование
Обычно таблицы создаются на этапе разработки приложения с помощью соответствующих инструментальных программ типа Database Desktop. Как правило, удаление таблицы также выполняется при разработке приложения, например, с помощью Проводника Windows. Использование инструментов позволяет достаточно удобно создавать таблицы, удалять их и изменять их структуру. Кроме того, программист может создать или удалить таблицу динамически, т. е. в процессе выполнения приложения. Такая потребность может возникнуть, например, при необходимости получить резервную или архивную копию всей таблицы или ее части.
Для создания таблицы используется метод CreateTable. В результате на диске появляется пустая таблица. Перед вызовом метода нужно подготовить необходимые данные, на основе которых создается таблица. Эти данные следует присвоить в качестве значений соответствующим свойствам набора данных. Перед вызовом метода CreateTable набор данных должен быть закрыт и установлены значения следующих свойств:
□ DatabaseName (путь к файлам базы данных (каталог));
□ ТаЫеТуре (тип таблицы);
□ FieldDef s (описание полей);
□ indexDef s (описание индексов);
□ TableName (название таблицы).
Свойство TableName задает имя физического файла таблицы, находящегося в каталоге, указанном для размещения БД (свойство DatabaseName).
Формат таблицы TableName типа TTableName может быть следующим:
□ ttDefault (формат таблицы) — по умолчанию, определяется на основании
расширений имен файлов таблиц:
• db или отсутствует — таблица Paradox;
166
Часть II. Технологии доступа к данным
• dbf — таблица dBase;
• txt — таблица ASCII;
□ ttParadox (таблица Paradox);
□ ttDBase (таблица dBase);
□ ttFoxPro (таблица FoxPro);
□ ttASCii (таблица ASCII — текстовый файл, разбитый на столбцы).
Для новой таблицы в свойстве FieldDefs типа TFieldDefs обязательно должно быть определено хотя бы одно поле. Перед тем как приступить к описанию полей новой таблицы, значение этого свойства следует очистить, т. к. в нем может находиться информация о полях предыдущей таблицы, с которой был связан набор данных. Для очистки значения свойства FieldDef s можно применить метод clear, а для занесения информации о полях новой таблицы — метод Add.
Процедура Add (const Name: String; DataType: TFieldType; Size: Word;
Required: Boolean) добавляет к массиву полей описание нового поля. Пара
метр Name указывает название, а параметр DataType — тип поля, который мож
но выбрать в следующем списке: ftUnknown, ftstring, ftSmallint,
ftlnteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime,
ftDateTime, ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic,
ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor,
ftFixedChar, ftWideString, ftLargeint, ftADT, ftArray, ftReference, ftDataSet. В перечисленных значениях префикс ft является сокращением от Field Type — тип поля, а последующая часть определяет собственно тип.
Параметр size определяет размер поля; если для полей некоторых типов, например, поля даты (ftDate), размер не задается, то параметр size принимает значение ноль. Логический параметр Required определяет, должно ли поле обязательно содержать значение (True) или может быть пустым (False).
(_____ ЗамечаниеJ
Если в наборе данных определены статические поля, то при вызове метода CreateTable, скорее всего, возникнет исключение. Это происходит из-за того, что в новой таблице задан новый состав полей и отсутствуют физические поля, с которыми были связаны созданные ранее статические поля.
В таблице можно определить индексы. Описание индексов заносится в свойство indexDef s типа TindexDef s (мы рассматривали его при описании набора данных Table) с помощью метода Add. Отметим, что после создания таблицы в ней можно удалить или создать индекс методами Addlndex и Deletelndex.
(_____ ЗамечаниеJ
После задания новых индексов следует установить нужные значения для свойств indexName и indexFieldName, т. к. они могут указывать на индекс предыдущей таблицы, с которой был связан набор данных.
Глава 7. Навигационный доступ к данным с помощью BDE
167
Для компонента Query действия, связанные с созданием таблицы, выполняются через запрос SQL.
Рассмотрим следующий пример:
procedure TForml.btnNewTableClick(Sender: TObject);
begin
// Закрытие набора данных
Tablel.Active:= False;
// Параметры таблицы БД
Tablel.DatabaseName:= 'BDPlace';
Tablel.TableName:= 'NewTable';
Tablel.TableType:= ttParadox;
// Описание полей таблицы
Tablel.FieldDefs.Clear;
Tablel.FieldDefs.Add('Code', ftAutoinc, 0, True);
Tablel.FieldDefs.Add('Name', ftString, 20, True);
Tablel.FieldDefs.Add('Date', ftDate, 0, False);
// Описание индексов таблицы
Tablel.IndexDefs.Clear;
Tablel.IndexDefs.Add('', 'Code', [ixPrimary, ixUnique]);
Tablel.IndexDefs.Add('indName', 'Name', [ixCaselnsensitive]);
// Создание таблицы
Tablel.CreateTable;
// Установка текущего индекса
Tablel.IndexName:= 'indName';
// Открытие набора данных, связанного с новой (пустой) таблицей
Tablel.Active:= True;
end;
Здесь в каталоге, указываемом псевдонимом BDPlace, создается новая таблица Paradox с именем NewTable.db. Для таблицы заданы три поля: код (номер), имя и дата. Поля кода и имени требуют обязательного заполнения при вводе или модификации записей созданной таблицы. По автоинкрементному полю номера построен главный ключ (без имени), а по полю имени — вторичный ключ, который после создания таблицы устанавливается как текущий.
Для удаления таблицы используется метод DeleteTable, в результате выполнения которого происходит физическое удаление всех файлов указанной таблицы. Путь и имя удаляемой таблицы определяют свойства DatabaseName и TableName набора данных. Перед удалением таблицы набор данных должен быть закрыт.
Для переименования таблиц dBase и Paradox можно использовать метод RenameTable (const NewTableName: String), при выполнении которого переименовываются все файлы, относящиеся к таблице. Параметр NewTableName
168
Часть II. Технологии доступа к данным
задает новое название таблицы. Напомним, что имя таблицы совпадает с именами файлов, а расширения имен файлов указывают на содержащуюся в них информацию, например, данные или индексы.