Difference between revisions of "Lazarus Tdbf Tutorial/ru"

From Lazarus wiki
Jump to navigationJump to search
(New page: {{Lazarus Tdbf Tutorial}} == Overview == Это руководство описывает основы разработки баз данных с использованием [https://...)
 
(added link to example)
 
(40 intermediate revisions by 7 users not shown)
Line 1: Line 1:
 
{{Lazarus Tdbf Tutorial}}
 
{{Lazarus Tdbf Tutorial}}
  
== Overview ==
+
== Обзор ==
  
Это руководство описывает основы разработки баз данных с использованием [https://tdbf.sf.net TDbf] компонента TDbf (by Micha Nelissen) в Lazarus. Дополнительная документация по TDbf также доступна. Эта страница была создана [[User:ViruZ | ViruZ]] but other contributions are welcome!
+
Это руководство описывает основы разработки баз данных с использованием компонента [https://tdbf.sf.net TDbf] (by Micha Nelissen) в Lazarus. Дополнительная документация по TDbf также доступна. Эта страница была создана [[User:Tonymaro | Tony Maro]] но другие контрибьюторы также приветствуются!
  
For TDbf documentation pdf go to the [https://sourceforge.net/project/showfiles.php?group_id=34085&package_id=26371  SourceForge] site. It may be useful to keep that pdf alongside this document while reading.
+
Документацию компонента TDbf в формате pdf смотрите на [https://sourceforge.net/project/showfiles.php?group_id=34085&package_id=26371  SourceForge]. Полезно сохранить этот pdf и обращаться к нему по мере прочтения этой статьи.
  
=== What you will need ===
+
=== Что нам понадобится ===
No doubt this will soon be easier as FreePascal releases the next version 2.0, however currently you will need a recent CVS edition of FPC 1.9.X in order to properly use the TDbf component. It may be possible to download just the TDbf component by itself and use it with the 1.1 version of FreePascal, however this document was written with 1.9.X in mind, partly due to bug fixes in the other database components used in Lazarus.
+
Этот документ был написан с версией Free Pascal Compiler 2.3.1 /Lazarus 0.9.23.
  
The DbfLaz package is now (version 0.9.13) installed by default.
+
Пакет DbfLaz установлен по умолчанию.
  
=== What the TDbf provides ===
+
=== Что обеспечивает TDbf ===
The TDbf provides access to dBase and FoxPro database tables for Lazarus (and others). It allows for reading, writing and creation of dBase III+, dBase IV, Visual dBase VII and FoxPro tables. It does all of this without the need for additional libraries or database engines. Simply drop the TDbf on your form and you have instant access to a cross-platform database environment. The TDbf works in both Windows and Linux using Lazarus.
+
TDbf обеспечивает доступ к таблицам баз данных dBase и FoxPro для Lazarus (и других IDE),  
 +
учитывая чтение, запись и создание dBase III +, dBase IV, Visual dBase VII и FoxPro таблиц. Все это  делается без использования дополнительных библиотек или движков базы данных. Просто разместите компонент TDbf на вашей форме, и Вы имеете мгновенный доступ в окружающей среде базы данных на разных платформах. TDbf работает и в Windows и в Linux используя Лазарус.
  
== How to create a new database table ==
+
== Как создать новую таблицу базы данных ==
  
As there is no "Database Desktop" application for Lazarus yet, we must create a new database in code.
+
Поскольку для Lazarus нет приложения наподобии "Database Desktop", мы должны создать новую базу данных в коде.
=== Setting the path ===
+
=== Установка пути ===
It's a good idea to give your application's database it's own directory. This simplifies making backups of the data. There are two ways to set the path. You can set the full path using the FilePathFull property, or you can set a path relative to the current application path with FilePath. For instance, setting "FilePath" at runtime to "data/" would use a data subdirectory just below the executable file. Setting the "FilePathFull" property to "/var/data/" would place everthing in that exact folder, ignoring the application's location.
+
Хорошей мыслью будет выделение для базы данных Вашего приложения собственного каталога. Это упростит резервирование данных. Есть два варианта установки пути. Вы можете установить полный путь используя свойство FilePathFull, или установить путь относительно пути приложения с помощью свойства FilePath. Нипример, установка "FilePath" во время выполнения к "data/" будет использовать субдиректорию data только в директории исполнимого файла. Установка свойства "FilePathFull" к "/var/data/" будет размещать точно по указанному пути, игнорируя расположение приложения.
=== Choosing a TableLevel ===
+
 
By default, the TDbf will create dBase IV tables. While this is very compatible, there are features you may wish to use that are not supported. To support auto-incrementing fields, you must use something newer. The table types are:
+
=== Выбор TableLevel ===
 +
По умолчанию, TDbf создает таблицы dBase IV. Хотя это и наиболее совместимо, некоторые возможности, которые Вам могут понадобиться, не поддерживаются. Для поддержки автоинкрементных полей вы должны использовать кое-что поновее. Типы таблиц могут быть следующими::
  
 
*3 dBase III+
 
*3 dBase III+
Line 28: Line 30:
 
*25 FoxPro
 
*25 FoxPro
  
You choose a table type by setting the TableLevel property appropriately.
+
Вы выбираете тип таблицы установкой свойства TableLevel соответственно.
  
=== Adding fields ===
+
=== Добавление полей ===
Creating fields for your new table at runtime pretty much follows the old Delphi standard. Once you have set your FilePath, TableLevel, and TableName properties, manipulate the FieldDefs property to set up the structure. For example:
+
Создание полей для Вашей новой таблицы во время выполнения в большинстве следует старому стандарту Delphi. Как только вы установили свои значения для свойств FilePath, TableLevel, и TableName, манипулируйте свойством FieldDefs чтобы определить структуру. Например:
  
 
  MyDbf.FilePathFull := '/location/to/my/data';
 
  MyDbf.FilePathFull := '/location/to/my/data';
 
  MyDbf.TableLevel := 7;
 
  MyDbf.TableLevel := 7;
  MyDbf.TableName := 'customers.dbf'; // note: is the .dbf really required?
+
  MyDbf.TableName := 'customers.dbf'; // примечание: действительно ли необходимо .dbf?
 
  With MyDbf.FieldDefs do begin
 
  With MyDbf.FieldDefs do begin
 
   Add('Id', ftAutoInc, 0, True);
 
   Add('Id', ftAutoInc, 0, True);
Line 41: Line 43:
 
  End;
 
  End;
  
Field types are defined as:
+
Типы полей определены как:
  
 
*    ftUnknown
 
*    ftUnknown
Line 82: Line 84:
 
*    ftFMTBcd
 
*    ftFMTBcd
  
Bold types are currently supported
+
Выделенные жирным типы полей поддерживаются
  
=== Go ahead and create it! ===
+
=== Идем дальше и создаем! ===
Once you have defined the fields you wish to use in your new table, you can go ahead and create it with:
+
Как только вы определили поля, которые желаете использовать в вашей новой таблице, вы можете идти дальше и создать таблицу:
  
 
     MyDbf.CreateTable;
 
     MyDbf.CreateTable;
  
== How to add indexes to a table ==
+
== Как добавить индексы в таблицу ==
  
If your database is larger than a few records, chances are you will want to have indexes defined to make searching faster. To change the index structure of a table, we will want to have exclusive access to the table - which we would have while creating it anyway.
+
Если Ваша база данных состоит из большого числа записей, Вам может понадобиться определить индексы чтобы осуществлять более быстрый поиск по таблице. Чтобы изменить структуру индексов таблицы, мы должны иметь эксклюзивный доступ к таблице - который мы так или иначе име ли бы, создавая таблицу.
  
 
         MyDbf.Exclusive := True;
 
         MyDbf.Exclusive := True;
 
         MyDbf.Open;
 
         MyDbf.Open;
  
Now, we just have to add the index.
+
Теперь, нам необходимо просто добавить индексы.
  
 
         MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);
 
         MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);
Line 102: Line 104:
 
         MyDbf.Close;
 
         MyDbf.Close;
  
== Put it all together and you get... ==
+
== Соберем все вместе и получим... ==
  
The following sample creates a new table "customers" in code. This of course only needs done once, and after that you just OPEN the table, don't create it ;-)
+
Следующий пример создает новую таблицу "customers" в коде. Конечно, это необходимо выполнить только один раз, и после этого всего лишь ОТКРЫВАТЬ таблицу, не создавая её заново ;-)
  
 +
{$MODE OBJFPC}
 +
Program DatabaseTest; 
 
  { We will require the following units be in the USES clause: }
 
  { We will require the following units be in the USES clause: }
{ uses Dbf, db, Dbf_Common                                  }
+
  uses Dbf, db, Dbf_Common;                                    
 
  { The Dbf is put there when you drop the TDbf on a form...  }
 
  { The Dbf is put there when you drop the TDbf on a form...  }
 
  { but you will need db for the DataSet object and Dbf_Common }
 
  { but you will need db for the DataSet object and Dbf_Common }
Line 137: Line 141:
 
  end;
 
  end;
  
== External Index Files ==
+
== Внешние индексные файлы ==
  
The TDbf also supports storing secondary indexes in a separate file. This might be helpful if the database is expected to be very large. Secondary index files are created almost identically to normal indexes, but with the addition of the '.ndx' file extension:
+
TDbf также поддерживает хранение вторичных индексов в раздельных файлах. Это может помочь в случае если ожидается очень большой размер базы данных. Файлы вторичных индексов создаются идентично обычным индексам, но с добавлением расширения файла '.ndx':
  
 
     MyDbf.AddIndex('custname.ndx','Name', [ixCaseInsensitive]);
 
     MyDbf.AddIndex('custname.ndx','Name', [ixCaseInsensitive]);
  
  
Each time the TDbf is opened, the index file must be loaded:
+
Каждый раз при открытии TDbf, необходимо загрузить файл индексов:
  
 
     MyDbf.OpenIndexFile('custname.ndx');
 
     MyDbf.OpenIndexFile('custname.ndx');
  
  
And indexes must be referenced including the extension:
+
Также индексы должны быть описанны включая расширение:
  
 
     MyDbf.IndexName := 'custname.ndx';
 
     MyDbf.IndexName := 'custname.ndx';
  
  
Index files are packed separately using:
+
Индексные файлы могут быть упакованы простым использованием:
  
 
     MyDbf.CompactIndexFile('custname.ndx');
 
     MyDbf.CompactIndexFile('custname.ndx');
  
== How to link the TDbf to data-aware components ==
+
== Как присоединить TDbf к компонентам доступа к данным ==
  
The above examples show how to create a new database table in code. Using that table is even more simple.
+
Пример, описанный ранее, показывает, как создать новую таблицу базы данных программно. Использование этой таблицы более чем простое.
  
Data aware components in Lazarus (such as the TDbEdit control) link to a TDataSource component using their "DataSource" and "DataField" properties. The TDataSource component handles communication between the database engine and the data aware components. A TDataSource then links to the TDbf component using it's "DataSet" property. The connection looks like this:
+
Компоненты доступа к данным в Lazarus (как например TDbEdit) указывают на компонент TDataSource используя свои свойства "DataSource" и "DataField". Компонент TDataSource обрабатывает соединение между движком базы данных и компонентами доступа к данным. Затем компонент TDataSource указывает на компонент TDbf используя его свойство "DataSet". Связь напоминает следующее:
  
 
  TDbEdit-------
 
  TDbEdit-------
Line 171: Line 175:
  
  
Be sure to set the FilePath (or FilePathFulll), TableLevel, and TableName properties of your TDbf component before calling
+
Убедитесь, что Вы установили свойства FilePath (или FilePathFulll), TableLevel, и TableName вашего компонента TDbf перед вызовом
  
 
  TDbf.Active := True;
 
  TDbf.Active := True;
  
  
There is much more that can be said about programming with databases in Lazarus, and I would recommend a good Delphi database programming book or two as the underlying concepts are the same. I constantly refer to my copy of "Delphi 2 Unleashed" because the concepts and basic code haven't changed much in 8 years.
+
Можно сказать гораздо больше о программировании баз данных в Lazarus, и я рекомендую хорошую книгу или две о программировании баз данных в Delphi, так как основные понятия одинаковые. Я постоянно обращаюсь к своей копии "Delphi 2 Unleashed" потому что концепции и базовый код не меняются уже 8 лет.
  
== Packing and rebuilding the tables ==
+
== Упаковка и перестройка таблиц ==
  
When a record is deleted, it's not truly removed from the physical table. Periodically you must "pack" a table to recover that lost space. This should be done with exclusive mode set.
+
Когда запись удаляется, на самом деле она физически остается в таблице. Периодически Вы должны "паковать" таблицу чтобы восстановить потерянное место. Это может быть сделано установкой эксклюзивного режима доступа.
  
 
  MyDbf.Exclusive := True;
 
  MyDbf.Exclusive := True;
 
  MyDbf.Open;
 
  MyDbf.Open;
 
  MyDbf.PackTable;
 
  MyDbf.PackTable;
  // let's also rebuild all the indexes
+
  // давайте также перестроим индексы
 
  MyDbf.RegenerateIndexes;
 
  MyDbf.RegenerateIndexes;
 
  MyDbf.Close;
 
  MyDbf.Close;
 
  MyDbf.Exclusive := False;
 
  MyDbf.Exclusive := False;
  
== Master table relations ==
+
== Отношение главной/подчиненной таблиц ==
  
Real power in database programming begins when you have multiple tables that reference each other. While TDbf does not yet support referential integrity, it does support a master / detail relationship between TDbf's.
+
Настоящая сила программирования баз данных начинается тогда, когда Вы имеете несколько таблиц, которые ссылаются друг на друга. Пока TDbf не поддерживает ссылочную целостность, но поддерживает представление "главная/подчиненная" между таблицами TDbf.
  
When there are two tables related, for instance:
+
Предположим, что есть две взаимосвязанные таблицы, например:
  
 
  [customers]
 
  [customers]
Line 201: Line 205:
 
  Phone        |
 
  Phone        |
 
  Address      |
 
  Address      |
               |  The CustID in invoices references a customer primary field
+
               |  CustID в накладных ссылается на первоначальное поле клиента
 
  [invoices]    |
 
  [invoices]    |
 
  Id            |
 
  Id            |
 
  Amount        |
 
  Amount        |
  CustID  -----|  * This field indexed as "idxcustid"
+
  CustID  -----|  * Это поле проиндексировано как "idxcustid"
  
  
If you wanted to display all invoices for a given customer, the detail table (invoices) can stay in sync with the master table (customers) automatically.
+
Если вы хотели показать все накладные для предоставленного клиента, подчиненная таблица (invoices) может оставаться синхронизированной с главной таблицей (customers) автоматически.
  
On the invoices TDbf component set the following:
+
На компоненте накладные TDbf устанавливают следующее:
  
 
  InvDbf.IndexName := 'idxcustid'; // our field that will match the customers table ID
 
  InvDbf.IndexName := 'idxcustid'; // our field that will match the customers table ID
Line 216: Line 220:
 
  InvDbf.MasterFields := 'Id'; // field on the customers table we are matching against our index
 
  InvDbf.MasterFields := 'Id'; // field on the customers table we are matching against our index
  
 +
== Пример приложения - DB Browser ==
 +
Я написал простое приложение использующее TDbf для открытия и показа таблиц базы данных используя компонент dbGrid. Исполняемая программа Linux вместе с исходниками проекта, которые должны отлично компилироваться и в Windows, доступна по адресу:  [http://tony.maro.net/mod.php?mod=downloads&op=showcat&id=3&level=1 tony.maro.net]
 +
 +
== Необходимо учесть ==
  
== Sample application - DB Browser ==
+
В настоящее время нет никакой поддержки ссылочной целостности или шифрования внутри .dbf файлов.
I've written a simple application that will use the TDbf to open and display database tables using the dbGrid control. The Linux executable along with project sources which should compile fine in Windows is available from:  [http://tony.maro.net/mod.php?mod=downloads&op=showcat&id=3&level=1 tony.maro.net]
 
  
== Things you need to be aware of ==
+
== См. также ==
 +
*[[Guide for usage of Tdbf component/ru]]
 +
*[[Example: TDbf (creating table and indexes, selecting of index)]]
 +
<br/><br/>
  
Currently there is no support for referential integrity, or internally encrypted .dbf files.
+
[[Category:Russian (unfinished translation)]]

Latest revision as of 22:12, 23 January 2016

Deutsch (de) English (en) español (es) français (fr) português (pt) русский (ru) 中文(中国大陆)‎ (zh_CN)

Обзор

Это руководство описывает основы разработки баз данных с использованием компонента TDbf (by Micha Nelissen) в Lazarus. Дополнительная документация по TDbf также доступна. Эта страница была создана Tony Maro но другие контрибьюторы также приветствуются!

Документацию компонента TDbf в формате pdf смотрите на SourceForge. Полезно сохранить этот pdf и обращаться к нему по мере прочтения этой статьи.

Что нам понадобится

Этот документ был написан с версией Free Pascal Compiler 2.3.1 /Lazarus 0.9.23.

Пакет DbfLaz установлен по умолчанию.

Что обеспечивает TDbf

TDbf обеспечивает доступ к таблицам баз данных dBase и FoxPro для Lazarus (и других IDE), учитывая чтение, запись и создание dBase III +, dBase IV, Visual dBase VII и FoxPro таблиц. Все это делается без использования дополнительных библиотек или движков базы данных. Просто разместите компонент TDbf на вашей форме, и Вы имеете мгновенный доступ в окружающей среде базы данных на разных платформах. TDbf работает и в Windows и в Linux используя Лазарус.

Как создать новую таблицу базы данных

Поскольку для Lazarus нет приложения наподобии "Database Desktop", мы должны создать новую базу данных в коде.

Установка пути

Хорошей мыслью будет выделение для базы данных Вашего приложения собственного каталога. Это упростит резервирование данных. Есть два варианта установки пути. Вы можете установить полный путь используя свойство FilePathFull, или установить путь относительно пути приложения с помощью свойства FilePath. Нипример, установка "FilePath" во время выполнения к "data/" будет использовать субдиректорию data только в директории исполнимого файла. Установка свойства "FilePathFull" к "/var/data/" будет размещать точно по указанному пути, игнорируя расположение приложения.

Выбор TableLevel

По умолчанию, TDbf создает таблицы dBase IV. Хотя это и наиболее совместимо, некоторые возможности, которые Вам могут понадобиться, не поддерживаются. Для поддержки автоинкрементных полей вы должны использовать кое-что поновее. Типы таблиц могут быть следующими::

  • 3 dBase III+
  • 4 dBase IV
  • 7 Visual dBase VII
  • 25 FoxPro

Вы выбираете тип таблицы установкой свойства TableLevel соответственно.

Добавление полей

Создание полей для Вашей новой таблицы во время выполнения в большинстве следует старому стандарту Delphi. Как только вы установили свои значения для свойств FilePath, TableLevel, и TableName, манипулируйте свойством FieldDefs чтобы определить структуру. Например:

MyDbf.FilePathFull := '/location/to/my/data';
MyDbf.TableLevel := 7;
MyDbf.TableName := 'customers.dbf'; // примечание: действительно ли необходимо .dbf?
With MyDbf.FieldDefs do begin
  Add('Id', ftAutoInc, 0, True);
  Add('Name', ftString, 80, True);
End;

Типы полей определены как:

  • ftUnknown
  • ftString
  • ftSmallInt
  • ftInteger
  • ftWord
  • ftBoolean
  • ftFloat
  • ftCurrency (TableLevel 25)
  • ftBCD (TableLevel 25)
  • ftDate
  • ftTime
  • ftDateTime
  • ftBytes (TableLevel 25)
  • ftVarBytes
  • ftAutoInc (TableLevel 7 or 25)
  • ftBlob
  • ftMemo
  • ftGraphic
  • ftFmtMemo
  • ftParadoxOle
  • ftDBaseOle
  • ftTypedBinary
  • ftCursor
  • ftFixedChar
  • ftWideString
  • ftLargeInt
  • ftADT
  • ftArray
  • ftReference
  • ftDataSet
  • ftOraBlob
  • ftOraClob
  • ftVariant
  • ftInterface
  • ftIDispatch
  • ftGuid
  • ftTimeStamp
  • ftFMTBcd

Выделенные жирным типы полей поддерживаются

Идем дальше и создаем!

Как только вы определили поля, которые желаете использовать в вашей новой таблице, вы можете идти дальше и создать таблицу:

   MyDbf.CreateTable;

Как добавить индексы в таблицу

Если Ваша база данных состоит из большого числа записей, Вам может понадобиться определить индексы чтобы осуществлять более быстрый поиск по таблице. Чтобы изменить структуру индексов таблицы, мы должны иметь эксклюзивный доступ к таблице - который мы так или иначе име ли бы, создавая таблицу.

       MyDbf.Exclusive := True;
       MyDbf.Open;

Теперь, нам необходимо просто добавить индексы.

       MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);
       MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);
       MyDbf.Close;

Соберем все вместе и получим...

Следующий пример создает новую таблицу "customers" в коде. Конечно, это необходимо выполнить только один раз, и после этого всего лишь ОТКРЫВАТЬ таблицу, не создавая её заново ;-)

{$MODE OBJFPC}
Program DatabaseTest;  
{ We will require the following units be in the USES clause: }
 uses Dbf, db, Dbf_Common;                                   
{ The Dbf is put there when you drop the TDbf on a form...   }
{ but you will need db for the DataSet object and Dbf_Common }
{ for things such as the field type definitions              }
var
  MyDbf: TDbf;
begin
  MyDbf := TDbf.Create(nil);
  try
    { use relative path to "data" directory }
    MyDbf.FilePath := 'data/'; 
    { we want to use Visual dBase VII compatible tables }
    MyDbf.TableLevel := 7;
    MyDbf.Exclusive := True;
    MyDbf.TableName := 'customers.dbf';
    With MyDbf.FieldDefs do begin
      Add('Id', ftAutoInc, 0, True);
      Add('Name', ftString, 80, True);
    End;
    MyDbf.CreateTable;
    MyDbf.Open;
    MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);
    { add a secondary index }
    MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);
    MyDbf.Close;
  finally
    MyDbf.Free;
  end;
end;

Внешние индексные файлы

TDbf также поддерживает хранение вторичных индексов в раздельных файлах. Это может помочь в случае если ожидается очень большой размер базы данных. Файлы вторичных индексов создаются идентично обычным индексам, но с добавлением расширения файла '.ndx':

    MyDbf.AddIndex('custname.ndx','Name', [ixCaseInsensitive]);


Каждый раз при открытии TDbf, необходимо загрузить файл индексов:

    MyDbf.OpenIndexFile('custname.ndx');


Также индексы должны быть описанны включая расширение:

    MyDbf.IndexName := 'custname.ndx';


Индексные файлы могут быть упакованы простым использованием:

    MyDbf.CompactIndexFile('custname.ndx');

Как присоединить TDbf к компонентам доступа к данным

Пример, описанный ранее, показывает, как создать новую таблицу базы данных программно. Использование этой таблицы более чем простое.

Компоненты доступа к данным в Lazarus (как например TDbEdit) указывают на компонент TDataSource используя свои свойства "DataSource" и "DataField". Компонент TDataSource обрабатывает соединение между движком базы данных и компонентами доступа к данным. Затем компонент TDataSource указывает на компонент TDbf используя его свойство "DataSet". Связь напоминает следующее:

TDbEdit-------
             |
TDbEdit------|-->TDataSource-->TDbf
             |
TDbNavigator--


Убедитесь, что Вы установили свойства FilePath (или FilePathFulll), TableLevel, и TableName вашего компонента TDbf перед вызовом

TDbf.Active := True;


Можно сказать гораздо больше о программировании баз данных в Lazarus, и я рекомендую хорошую книгу или две о программировании баз данных в Delphi, так как основные понятия одинаковые. Я постоянно обращаюсь к своей копии "Delphi 2 Unleashed" потому что концепции и базовый код не меняются уже 8 лет.

Упаковка и перестройка таблиц

Когда запись удаляется, на самом деле она физически остается в таблице. Периодически Вы должны "паковать" таблицу чтобы восстановить потерянное место. Это может быть сделано установкой эксклюзивного режима доступа.

MyDbf.Exclusive := True;
MyDbf.Open;
MyDbf.PackTable;
// давайте также перестроим индексы
MyDbf.RegenerateIndexes;
MyDbf.Close;
MyDbf.Exclusive := False;

Отношение главной/подчиненной таблиц

Настоящая сила программирования баз данных начинается тогда, когда Вы имеете несколько таблиц, которые ссылаются друг на друга. Пока TDbf не поддерживает ссылочную целостность, но поддерживает представление "главная/подчиненная" между таблицами TDbf.

Предположим, что есть две взаимосвязанные таблицы, например:

[customers]
Id       <----|
Name          |
Phone         |
Address       |
              |  CustID в накладных ссылается на первоначальное  поле клиента
[invoices]    |
Id            |
Amount        |
CustID   -----|  * Это поле проиндексировано как "idxcustid"


Если вы хотели показать все накладные для предоставленного клиента, подчиненная таблица (invoices) может оставаться синхронизированной с главной таблицей (customers) автоматически.

На компоненте накладные TDbf устанавливают следующее:

InvDbf.IndexName := 'idxcustid'; // our field that will match the customers table ID
InvDbf.MasterSource := dsCustomers; // datasource that is linked to the customers TDbf
InvDbf.MasterFields := 'Id'; // field on the customers table we are matching against our index

Пример приложения - DB Browser

Я написал простое приложение использующее TDbf для открытия и показа таблиц базы данных используя компонент dbGrid. Исполняемая программа Linux вместе с исходниками проекта, которые должны отлично компилироваться и в Windows, доступна по адресу: tony.maro.net

Необходимо учесть

В настоящее время нет никакой поддержки ссылочной целостности или шифрования внутри .dbf файлов.

См. также