Sign in Join
Wiki copytemporary

Lazarus Tdbf Tutorial/ru: what changed

Revision 1 to 2. 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
4040`MyDbf.FilePathFull := '/location/to/my/data';`\
4141`MyDbf.TableLevel := 7;`\
4242`MyDbf.TableName := 'customers.dbf'; // примечание: действительно ли необходимо .dbf?`\
4343`With MyDbf.FieldDefs do begin`\
4444`  Add('Id', ftAutoInc, 0, True);`\
4545`  Add('Name', ftString, 80, True);`\
4646`End;`
4747
4848Типы полей определены как:
4949
5050- ftUnknown
5151- **ftString**
5252- **ftSmallInt**
5353- **ftInteger**
5454- **ftWord**
5555- **ftBoolean**
5656- **ftFloat**
5757- **ftCurrency** (TableLevel 25)
5858- **ftBCD** (TableLevel 25)
5959- **ftDate**
6060- ftTime
6161- **ftDateTime**
6262- **ftBytes** (TableLevel 25)
6363- ftVarBytes
6464- **ftAutoInc** (TableLevel 7 or 25)
6565- **ftBlob**
6666- **ftMemo**
6767- ftGraphic
6868- ftFmtMemo
6969- ftParadoxOle
7070- **ftDBaseOle**
7171- ftTypedBinary
7272- ftCursor
7373- **ftFixedChar**
7474- **ftWideString**
7575- **ftLargeInt**
7676- ftADT
7777- ftArray
7878- ftReference
7979- ftDataSet
8080- ftOraBlob
8181- ftOraClob
8282- ftVariant
8383- ftInterface
8484- ftIDispatch
8585- ftGuid
8686- ftTimeStamp
8787- ftFMTBcd
8888
8989Выделенные жирным типы полей поддерживаются
9090
9191### Идем дальше и создаем!
9292
9393Как только вы определили поля, которые желаете использовать в вашей новой таблице, вы можете идти дальше и создать таблицу:
9494
9595`   MyDbf.CreateTable;`
9696
9797## Как добавить индексы в таблицу
9898
9999Если Ваша база данных состоит из большого числа записей, Вам может понадобиться определить индексы чтобы осуществлять более быстрый поиск по таблице. Чтобы изменить структуру индексов таблицы, мы должны иметь эксклюзивный доступ к таблице - который мы так или иначе име ли бы, создавая таблицу.
100100
101101`       MyDbf.Exclusive := True;`\
102102`       MyDbf.Open;`
103103
104104Теперь, нам необходимо просто добавить индексы.
105105
106106`       MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);`\
107107`       MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);`\
108108`       MyDbf.Close;`
109109
110110## Соберем все вместе и получим...
111111
112112Следующий пример создает новую таблицу "customers" в коде. Конечно, это необходимо выполнить только один раз, и после этого всего лишь ОТКРЫВАТЬ таблицу, не создавая её заново ;-)
113113
114114`{$MODE OBJFPC}`\
115115`Program DatabaseTest;  `\
116116`{ We will require the following units be in the USES clause: }`\
117117` uses Dbf, db, Dbf_Common;                                   `\
118118`{ The Dbf is put there when you drop the TDbf on a form...   }`\
119119`{ but you will need db for the DataSet object and Dbf_Common }`\
120120`{ for things such as the field type definitions              }`\
121121`var`\
122122`  MyDbf: TDbf;`\
123123`begin`\
124124`  MyDbf := TDbf.Create(nil);`\
125125`  try`\
126126`    { use relative path to "data" directory }`\
127127`    MyDbf.FilePath := 'data/'; `\
128128`    { we want to use Visual dBase VII compatible tables }`\
129129`    MyDbf.TableLevel := 7;`\
130130`    MyDbf.Exclusive := True;`\
131131`    MyDbf.TableName := 'customers.dbf';`\
132132`    With MyDbf.FieldDefs do begin`\
133133`      Add('Id', ftAutoInc, 0, True);`\
134134`      Add('Name', ftString, 80, True);`\
135135`    End;`\
136136`    MyDbf.CreateTable;`\
137137`    MyDbf.Open;`\
138138`    MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);`\
139139`    { add a secondary index }`\
140140`    MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);`\
141141`    MyDbf.Close;`\
142142`  finally`\
143143`    MyDbf.Free;`\
144144`  end;`\
145145`end;`
146146
147147## Внешние индексные файлы
148148
149149TDbf также поддерживает хранение вторичных индексов в раздельных файлах. Это может помочь в случае если ожидается очень большой размер базы данных. Файлы вторичных индексов создаются идентично обычным индексам, но с добавлением расширения файла '.ndx':
150150
151151`    MyDbf.AddIndex('custname.ndx','Name', [ixCaseInsensitive]);`
152152
153153Каждый раз при открытии TDbf, необходимо загрузить файл индексов:
154154
155155`    MyDbf.OpenIndexFile('custname.ndx');`
156156
157157Также индексы должны быть описанны включая расширение:
158158
159159`    MyDbf.IndexName := 'custname.ndx';`
160160
161161Индексные файлы могут быть упакованы простым использованием:
162162
163163`    MyDbf.CompactIndexFile('custname.ndx');`
164164
165165## Как присоединить TDbf к компонентам доступа к данным
166166
167167Пример, описанный ранее, показывает, как создать новую таблицу базы данных программно. Использование этой таблицы более чем простое.
168168
169169Компоненты доступа к данным в Lazarus (как например TDbEdit) указывают на компонент TDataSource используя свои свойства "DataSource" и "DataField". Компонент TDataSource обрабатывает соединение между движком базы данных и компонентами доступа к данным. Затем компонент TDataSource указывает на компонент TDbf используя его свойство "DataSet". Связь напоминает следующее:
170170
171171`TDbEdit-------`\
172172`             |`\
173173`TDbEdit------|-->TDataSource-->TDbf`\
174174`             |`\
175175`TDbNavigator--`
176176
177177Убедитесь, что Вы установили свойства FilePath (или FilePathFulll), TableLevel, и TableName вашего компонента TDbf перед вызовом
178178
179179`TDbf.Active := True;`
180180
181181Можно сказать гораздо больше о программировании баз данных в Lazarus, и я рекомендую хорошую книгу или две о программировании баз данных в Delphi, так как основные понятия одинаковые. Я постоянно обращаюсь к своей копии "Delphi 2 Unleashed" потому что концепции и базовый код не меняются уже 8 лет.
182182
183183## Упаковка и перестройка таблиц
184184
185185Когда запись удаляется, на самом деле она физически остается в таблице. Периодически Вы должны "паковать" таблицу чтобы восстановить потерянное место. Это может быть сделано установкой эксклюзивного режима доступа.
186186
187187`MyDbf.Exclusive := True;`\
188188`MyDbf.Open;`\
189189`MyDbf.PackTable;`\
190190`// давайте также перестроим индексы`\
191191`MyDbf.RegenerateIndexes;`\
192192`MyDbf.Close;`\
193193`MyDbf.Exclusive := False;`
194194
195195## Отношение главной/подчиненной таблиц
196196
197197Настоящая сила программирования баз данных начинается тогда, когда Вы имеете несколько таблиц, которые ссылаются друг на друга. Пока TDbf не поддерживает ссылочную целостность, но поддерживает представление "главная/подчиненная" между таблицами TDbf.
198198
199199Предположим, что есть две взаимосвязанные таблицы, например:
200200
201201`[customers]`\
202202`Id       <----|`\
203203`Name          |`\
204204`Phone         |`\
205205`Address       |`\
206206`              |  CustID в накладных ссылается на первоначальное  поле клиента`\
207207`[invoices]    |`\
208208`Id            |`\
209209`Amount        |`\
210210`CustID   -----|  * Это поле проиндексировано как "idxcustid"`
211211
212212Если вы хотели показать все накладные для предоставленного клиента, подчиненная таблица (invoices) может оставаться синхронизированной с главной таблицей (customers) автоматически.
213213
214214На компоненте накладные TDbf устанавливают следующее:
215215
216216`InvDbf.IndexName := 'idxcustid'; // our field that will match the customers table ID`\
217217`InvDbf.MasterSource := dsCustomers; // datasource that is linked to the customers TDbf`\
218218`InvDbf.MasterFields := 'Id'; // field on the customers table we are matching against our index`
219219
220220## Пример приложения - DB Browser
221221
222222Я написал простое приложение использующее TDbf для открытия и показа таблиц базы данных используя компонент dbGrid. Исполняемая программа Linux вместе с исходниками проекта, которые должны отлично компилироваться и в Windows, доступна по адресу: [tony.maro.net](http://tony.maro.net/mod.php?mod=downloads&op=showcat&id=3&level=1)
223223
224224## Необходимо учесть
225225
226226В настоящее время нет никакой поддержки ссылочной целостности или шифрования внутри .dbf файлов.
227227
228228## См. также
229229
230230- [[Guide for usage of Tdbf component/ru]]
231231- [[Example: TDbf (creating table and indexes, selecting of index)]]
232232
233-\
234-\
235-
236233---
237234*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).*
238235Category: Russian (unfinished translation)

Back to history