Sign in Join
Wiki copytemporary

Lazarus Tdbf Tutorial/ru: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Обзор
22
33Это руководство описывает основы разработки баз данных с использованием компонента [TDbf](https://tdbf.sf.net) (by Micha Nelissen) в Lazarus. Дополнительная документация по TDbf также доступна. Эта страница была создана Tony Maro но другие контрибьюторы также приветствуются!
44
55Документацию компонента TDbf в формате pdf смотрите на [SourceForge](https://sourceforge.net/project/showfiles.php?group_id=34085&package_id=26371). Полезно сохранить этот pdf и обращаться к нему по мере прочтения этой статьи.
66
77### Что нам понадобится
88
99Этот документ был написан с версией Free Pascal Compiler 2.3.1 /Lazarus 0.9.23.
1010
1111Пакет DbfLaz установлен по умолчанию.
1212
1313### Что обеспечивает TDbf
1414
1515TDbf обеспечивает доступ к таблицам баз данных dBase и FoxPro для Lazarus (и других IDE), учитывая чтение, запись и создание dBase III +, dBase IV, Visual dBase VII и FoxPro таблиц. Все это делается без использования дополнительных библиотек или движков базы данных. Просто разместите компонент TDbf на вашей форме, и Вы имеете мгновенный доступ в окружающей среде базы данных на разных платформах. TDbf работает и в Windows и в Linux используя Лазарус.
1616
1717## Как создать новую таблицу базы данных
1818
1919Поскольку для Lazarus нет приложения наподобии "Database Desktop", мы должны создать новую базу данных в коде.
2020
2121### Установка пути
2222
2323Хорошей мыслью будет выделение для базы данных Вашего приложения собственного каталога. Это упростит резервирование данных. Есть два варианта установки пути. Вы можете установить полный путь используя свойство FilePathFull, или установить путь относительно пути приложения с помощью свойства FilePath. Нипример, установка "FilePath" во время выполнения к "data/" будет использовать субдиректорию data только в директории исполнимого файла. Установка свойства "FilePathFull" к "/var/data/" будет размещать точно по указанному пути, игнорируя расположение приложения.
2424
2525### Выбор TableLevel
2626
2727По умолчанию, TDbf создает таблицы dBase IV. Хотя это и наиболее совместимо, некоторые возможности, которые Вам могут понадобиться, не поддерживаются. Для поддержки автоинкрементных полей вы должны использовать кое-что поновее. Типы таблиц могут быть следующими::
2828
2929- 3 dBase III+
3030- 4 dBase IV
3131- 7 Visual dBase VII
3232- 25 FoxPro
3333
3434Вы выбираете тип таблицы установкой свойства TableLevel соответственно.
3535
3636### Добавление полей
3737
3838Создание полей для Вашей новой таблицы во время выполнения в большинстве следует старому стандарту Delphi. Как только вы установили свои значения для свойств FilePath, TableLevel, и TableName, манипулируйте свойством FieldDefs чтобы определить структуру. Например:
3939
40-`MyDbf.FilePathFull := '/location/to/my/data';`\
41-`MyDbf.TableLevel := 7;`\
42-`MyDbf.TableName := 'customers.dbf'; // примечание: действительно ли необходимо .dbf?`\
43-`With MyDbf.FieldDefs do begin`\
44-`  Add('Id', ftAutoInc, 0, True);`\
45-`  Add('Name', ftString, 80, True);`\
46-`End;`
40+``` pascal
41+MyDbf.FilePathFull := '/location/to/my/data';
42+MyDbf.TableLevel := 7;
43+MyDbf.TableName := 'customers.dbf'; // примечание: действительно ли необходимо .dbf?
44+With MyDbf.FieldDefs do begin
45+ Add('Id', ftAutoInc, 0, True);
46+ Add('Name', ftString, 80, True);
47+End;
48+```
4749
4850Типы полей определены как:
4951
5052- ftUnknown
5153- **ftString**
5254- **ftSmallInt**
5355- **ftInteger**
5456- **ftWord**
5557- **ftBoolean**
5658- **ftFloat**
5759- **ftCurrency** (TableLevel 25)
5860- **ftBCD** (TableLevel 25)
5961- **ftDate**
6062- ftTime
6163- **ftDateTime**
6264- **ftBytes** (TableLevel 25)
6365- ftVarBytes
6466- **ftAutoInc** (TableLevel 7 or 25)
6567- **ftBlob**
6668- **ftMemo**
6769- ftGraphic
6870- ftFmtMemo
6971- ftParadoxOle
7072- **ftDBaseOle**
7173- ftTypedBinary
7274- ftCursor
7375- **ftFixedChar**
7476- **ftWideString**
7577- **ftLargeInt**
7678- ftADT
7779- ftArray
7880- ftReference
7981- ftDataSet
8082- ftOraBlob
8183- ftOraClob
8284- ftVariant
8385- ftInterface
8486- ftIDispatch
8587- ftGuid
8688- ftTimeStamp
8789- ftFMTBcd
8890
8991Выделенные жирным типы полей поддерживаются
9092
9193### Идем дальше и создаем!
9294
9395Как только вы определили поля, которые желаете использовать в вашей новой таблице, вы можете идти дальше и создать таблицу:
9496
95-`   MyDbf.CreateTable;`
97+```text
98+ MyDbf.CreateTable;
99+```
96100
97101## Как добавить индексы в таблицу
98102
99103Если Ваша база данных состоит из большого числа записей, Вам может понадобиться определить индексы чтобы осуществлять более быстрый поиск по таблице. Чтобы изменить структуру индексов таблицы, мы должны иметь эксклюзивный доступ к таблице - который мы так или иначе име ли бы, создавая таблицу.
100104
101-`       MyDbf.Exclusive := True;`\
102-`       MyDbf.Open;`
105+``` pascal
106+ MyDbf.Exclusive := True;
107+ MyDbf.Open;
108+```
103109
104110Теперь, нам необходимо просто добавить индексы.
105111
106-`       MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);`\
107-`       MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);`\
108-`       MyDbf.Close;`
112+```text
113+ MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);
114+ MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);
115+ MyDbf.Close;
116+```
109117
110118## Соберем все вместе и получим...
111119
112120Следующий пример создает новую таблицу "customers" в коде. Конечно, это необходимо выполнить только один раз, и после этого всего лишь ОТКРЫВАТЬ таблицу, не создавая её заново ;-)
113121
114-`{$MODE OBJFPC}`\
115-`Program DatabaseTest;  `\
116-`{ We will require the following units be in the USES clause: }`\
117-` uses Dbf, db, Dbf_Common;                                   `\
118-`{ The Dbf is put there when you drop the TDbf on a form...   }`\
119-`{ but you will need db for the DataSet object and Dbf_Common }`\
120-`{ for things such as the field type definitions              }`\
121-`var`\
122-`  MyDbf: TDbf;`\
123-`begin`\
124-`  MyDbf := TDbf.Create(nil);`\
125-`  try`\
126-`    { use relative path to "data" directory }`\
127-`    MyDbf.FilePath := 'data/'; `\
128-`    { we want to use Visual dBase VII compatible tables }`\
129-`    MyDbf.TableLevel := 7;`\
130-`    MyDbf.Exclusive := True;`\
131-`    MyDbf.TableName := 'customers.dbf';`\
132-`    With MyDbf.FieldDefs do begin`\
133-`      Add('Id', ftAutoInc, 0, True);`\
134-`      Add('Name', ftString, 80, True);`\
135-`    End;`\
136-`    MyDbf.CreateTable;`\
137-`    MyDbf.Open;`\
138-`    MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);`\
139-`    { add a secondary index }`\
140-`    MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);`\
141-`    MyDbf.Close;`\
142-`  finally`\
143-`    MyDbf.Free;`\
144-`  end;`\
145-`end;`
122+``` pascal
123+{$MODE OBJFPC}
124+Program DatabaseTest;
125+{ We will require the following units be in the USES clause: }
126+ uses Dbf, db, Dbf_Common;
127+{ The Dbf is put there when you drop the TDbf on a form... }
128+{ but you will need db for the DataSet object and Dbf_Common }
129+{ for things such as the field type definitions }
130+var
131+ MyDbf: TDbf;
132+begin
133+ MyDbf := TDbf.Create(nil);
134+ try
135+ { use relative path to "data" directory }
136+ MyDbf.FilePath := 'data/';
137+ { we want to use Visual dBase VII compatible tables }
138+ MyDbf.TableLevel := 7;
139+ MyDbf.Exclusive := True;
140+ MyDbf.TableName := 'customers.dbf';
141+ With MyDbf.FieldDefs do begin
142+ Add('Id', ftAutoInc, 0, True);
143+ Add('Name', ftString, 80, True);
144+ End;
145+ MyDbf.CreateTable;
146+ MyDbf.Open;
147+ MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);
148+ { add a secondary index }
149+ MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);
150+ MyDbf.Close;
151+ finally
152+ MyDbf.Free;
153+ end;
154+end;
155+```
146156
147157## Внешние индексные файлы
148158
149159TDbf также поддерживает хранение вторичных индексов в раздельных файлах. Это может помочь в случае если ожидается очень большой размер базы данных. Файлы вторичных индексов создаются идентично обычным индексам, но с добавлением расширения файла '.ndx':
150160
151-`    MyDbf.AddIndex('custname.ndx','Name', [ixCaseInsensitive]);`
161+```text
162+ MyDbf.AddIndex('custname.ndx','Name', [ixCaseInsensitive]);
163+```
152164
153165Каждый раз при открытии TDbf, необходимо загрузить файл индексов:
154166
155-`    MyDbf.OpenIndexFile('custname.ndx');`
167+```text
168+ MyDbf.OpenIndexFile('custname.ndx');
169+```
156170
157171Также индексы должны быть описанны включая расширение:
158172
159-`    MyDbf.IndexName := 'custname.ndx';`
173+``` pascal
174+ MyDbf.IndexName := 'custname.ndx';
175+```
160176
161177Индексные файлы могут быть упакованы простым использованием:
162178
163-`    MyDbf.CompactIndexFile('custname.ndx');`
179+```text
180+ MyDbf.CompactIndexFile('custname.ndx');
181+```
164182
165183## Как присоединить TDbf к компонентам доступа к данным
166184
167185Пример, описанный ранее, показывает, как создать новую таблицу базы данных программно. Использование этой таблицы более чем простое.
168186
169187Компоненты доступа к данным в Lazarus (как например TDbEdit) указывают на компонент TDataSource используя свои свойства "DataSource" и "DataField". Компонент TDataSource обрабатывает соединение между движком базы данных и компонентами доступа к данным. Затем компонент TDataSource указывает на компонент TDbf используя его свойство "DataSet". Связь напоминает следующее:
170188
171-`TDbEdit-------`\
172-`             |`\
173-`TDbEdit------|-->TDataSource-->TDbf`\
174-`             |`\
175-`TDbNavigator--`
189+```text
190+TDbEdit-------
191+ |
192+TDbEdit------|-->TDataSource-->TDbf
193+ |
194+TDbNavigator--
195+```
176196
177197Убедитесь, что Вы установили свойства FilePath (или FilePathFulll), TableLevel, и TableName вашего компонента TDbf перед вызовом
178198
179-`TDbf.Active := True;`
199+``` pascal
200+TDbf.Active := True;
201+```
180202
181203Можно сказать гораздо больше о программировании баз данных в Lazarus, и я рекомендую хорошую книгу или две о программировании баз данных в Delphi, так как основные понятия одинаковые. Я постоянно обращаюсь к своей копии "Delphi 2 Unleashed" потому что концепции и базовый код не меняются уже 8 лет.
182204
183205## Упаковка и перестройка таблиц
184206
185207Когда запись удаляется, на самом деле она физически остается в таблице. Периодически Вы должны "паковать" таблицу чтобы восстановить потерянное место. Это может быть сделано установкой эксклюзивного режима доступа.
186208
187-`MyDbf.Exclusive := True;`\
188-`MyDbf.Open;`\
189-`MyDbf.PackTable;`\
190-`// давайте также перестроим индексы`\
191-`MyDbf.RegenerateIndexes;`\
192-`MyDbf.Close;`\
193-`MyDbf.Exclusive := False;`
209+``` pascal
210+MyDbf.Exclusive := True;
211+MyDbf.Open;
212+MyDbf.PackTable;
213+// давайте также перестроим индексы
214+MyDbf.RegenerateIndexes;
215+MyDbf.Close;
216+MyDbf.Exclusive := False;
217+```
194218
195219## Отношение главной/подчиненной таблиц
196220
197221Настоящая сила программирования баз данных начинается тогда, когда Вы имеете несколько таблиц, которые ссылаются друг на друга. Пока TDbf не поддерживает ссылочную целостность, но поддерживает представление "главная/подчиненная" между таблицами TDbf.
198222
199223Предположим, что есть две взаимосвязанные таблицы, например:
200224
201-`[customers]`\
202-`Id       <----|`\
203-`Name          |`\
204-`Phone         |`\
205-`Address       |`\
206-`              |  CustID в накладных ссылается на первоначальное  поле клиента`\
207-`[invoices]    |`\
208-`Id            |`\
209-`Amount        |`\
210-`CustID   -----|  * Это поле проиндексировано как "idxcustid"`
225+```text
226+[customers]
227+Id <----|
228+Name |
229+Phone |
230+Address |
231+ | CustID в накладных ссылается на первоначальное поле клиента
232+[invoices] |
233+Id |
234+Amount |
235+CustID -----| * Это поле проиндексировано как "idxcustid"
236+```
211237
212238Если вы хотели показать все накладные для предоставленного клиента, подчиненная таблица (invoices) может оставаться синхронизированной с главной таблицей (customers) автоматически.
213239
214240На компоненте накладные TDbf устанавливают следующее:
215241
216-`InvDbf.IndexName := 'idxcustid'; // our field that will match the customers table ID`\
217-`InvDbf.MasterSource := dsCustomers; // datasource that is linked to the customers TDbf`\
218-`InvDbf.MasterFields := 'Id'; // field on the customers table we are matching against our index`
242+``` pascal
243+InvDbf.IndexName := 'idxcustid'; // our field that will match the customers table ID
244+InvDbf.MasterSource := dsCustomers; // datasource that is linked to the customers TDbf
245+InvDbf.MasterFields := 'Id'; // field on the customers table we are matching against our index
246+```
219247
220248## Пример приложения - DB Browser
221249
222250Я написал простое приложение использующее TDbf для открытия и показа таблиц базы данных используя компонент dbGrid. Исполняемая программа Linux вместе с исходниками проекта, которые должны отлично компилироваться и в Windows, доступна по адресу: [tony.maro.net](http://tony.maro.net/mod.php?mod=downloads&op=showcat&id=3&level=1)
223251
224252## Необходимо учесть
225253
226254В настоящее время нет никакой поддержки ссылочной целостности или шифрования внутри .dbf файлов.
227255
228256## См. также
229257
230258- [[Guide for usage of Tdbf component/ru]]
231259- [[Example: TDbf (creating table and indexes, selecting of index)]]
232260
233261---
234262*From the Free Pascal wiki, page "Lazarus Tdbf Tutorial/ru", as it stood on 2016-01-23 after a change by FTurtle, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
235263Category: Russian (unfinished translation)

Back to history