Компонент TDBGrid теперь может отображать вложенные таблицы. Для иллюстрации этой возможности воспольуемся таблицами customer.db, orders.db и items.db, поставляемыми вместе с Delphi. Поместим на форму три компонента TTable, три компонента TDataSourse, один компонент TClientDataSet и один компонент TProvider. Установим следующие свойства этих компонентов:
| DBGrid1 | DataSource | DataSource3 |
| DBNavigator1 | DataSource | DataSource3 |
| Table1 | DatabaseName | 'DBDEMOS' |
| TableName | 'customer.db' | |
| Active | True | |
| DataSource1 | DataSet | Table1 |
| Table2 | DatabaseName | 'DBDEMOS' |
| TableName | 'orders.db' | |
| IndexFieldNames | 'CustNo' | |
| MasterFields | 'CustNo' | |
| MasterSource | DataSource1 | |
| Active | True | |
| DataSource2 | DataSet | Table2 |
| Table3 | DatabaseName | 'DBDEMOS' |
| TableName | 'items.db' | |
| IndexFieldNames | 'OrderNo' | |
| MasterFields | 'OrderNo' | |
| MasterSource | DataSource2 | |
| Active | True | |
| Provider1 | DataSet | Table1 |
| ClientDataSet1 | ProviderName | 'Provider1' |
| Active | True | |
| DataSource3 | DataSet | ClientDataSet1 |

Рис. 15 Главная форма приложения, использующего вложенные таблицы.
Сами таблицы формата Paradox, естественно, не поддерживают поля, содержащие вложенные таблицы, но такие поля поддерживает компонент TClientDataSet со страницы MIDAS палитры компонентов. Связав его с компонентом Table1 посредством компонента Provider1, мы получим набор данных, содержащий поле Table2 типа TDataSetField, а внутри вложенной таблицы - поле Table3 того же типа:

Рис. 16 Вложенные таблицы на этапе выполнения.
Такое представление данных даже в случае использования настольных СУБД весьма удобно просто потому, что оно решает общеизвестную проблему нехватки места на форме при наличии нескольких связанных таблиц. Единственное, о чем при этом следует позаботиться, это вызов метода ApplyUpdates компонента TClientDataSet (например, в обработчике события, связанного с выбором какого-либо пункта меню или с нажатием на кнопку): ClientDataSet1.ApplyUpdates(-1);
Если не использовать этот метод, данные будут сохраняться только в кэше, которым фактически и является компонент TClientDataSet, а не в самих таблицах.