Kwert-soft.ru

IT Софт для ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Delphi access создать таблицу

Delphi access создать таблицу

Вот собственно говоря и весь вопрос.


ЮЮ © ( 2004-10-04 09:50 ) [1]

выполнить запрос CREATE TABLE .


Галинка © ( 2004-10-08 15:52 ) [2]

Создание получается, а использование (((.
Вот код создания:
ZemlDM.ADOCommand1.CommandText:=»Create Table Rez_»
+TableNameStr+»_Epic
(InNNID autoincrement Not Null Primary Key, K_max Single,
H_gip Single)»;
ZemlDM.ADOCommand1.Execute;
ZemlDM.ADOCommand1.CommandText:=»Create Table Rez_»
+TableNameStr+»_Radiusy
(InIID autoincrement Not Null Primary Key, InNNID
Integer, I_tek Single, BolRad Single, MalRad Single)»;
ZemlDM.ADOCommand1.Execute;
Вот код заполнения:
ZemlDM.ADOCommand1.CommandText:=Format(«Insert Into
Rez_»+TableNameStr+»_Epic (K_max, H_gip) Values (%f, %f)»,
[Tek_K, Tek_H]);
ZemlDM.ADOCommand1.Execute;
ZemlDM.ADOCommand1.CommandText:=Format(«Insert Into
Rez_»+TableNameStr+»_Radiusy (InNNID, I_Tek, BolRad,
MalRad) Values (%d, %f, %f, %f)», [i, TekIzoParam.I,
TekIzoParam.rad_max, TekIzoParam.rad_min]);
ZemlDM.ADOCommand1.Execute;
Создается все и заполняется прекрасно, а вот использовать не получается.


Галинка © ( 2004-10-08 15:57 ) [3]

А весь код такой:
procedure TMainForm.CalcNew1Execute(Sender: TObject);
var
Dialog1:TMDBSelectDlg;
Dialog2, Dialog3:TMDBEditDlg;
IntervalDlg:TIntervalsDlg;
i:Integer;
begin
TekActionValue:=0;
Dialog1:=TMDBSelectDlg.Create(Application);
with Dialog1 do
try
ShowModal;
if ModalResult=mrOK then
Dialog2:=TMDBEditDlg.Create(Application);
with Dialog2 do
try
ShowModal;
if ModalResult=mrOK then
begin
Raschet.FullCalculate; <Расчитываем коэффициенты>
IntervalDlg:=TIntervalsDlg.Create(Application);
with IntervalDlg do
try
if IntervalDlg.ShowModal=mrOK then
begin
try
ZemlDM.ADOCommand1.CommandText:=»Create Table Rez_»+TableNameStr+»_Epic (InNNID autoincrement Not Null Primary Key, K_max Single, H_gip Single)»;
ZemlDM.ADOCommand1.Execute;
ZemlDM.ADOCommand1.CommandText:=»Create Table Rez_»+TableNameStr+»_Radiusy (InIID autoincrement Not Null Primary Key, InNNID Integer, I_tek Single, BolRad Single, MalRad Single)»;
ZemlDM.ADOCommand1.Execute;
except
on EOleException do
begin
if (MessageDlg(«Таблица с общим именем «+ TableNameStr+» уже существует!»+#13+#10+»Записать данные в другую таблицу?»,mtWarning,[mbYes, mbNo],0)=mrYes) then
with TTableNameSelectDlg.Create(Application) do
try
if ShowModal=mrOK then
begin
ZemlDM.ADOCommand1.CommandText:=»Create Table Rez_»+TableNameStr+»_Epic (InNNID autoincrement Not Null Primary Key, K_max Single, H_gip Single)»;
ZemlDM.ADOCommand1.Execute;
ZemlDM.ADOCommand1.CommandText:=»Create Table Rez_»+TableNameStr+»_Radiusy (InIID autoincrement Not Null Primary Key, InNNID Integer, I_tek Single, BolRad Single, MalRad Single)»;
ZemlDM.ADOCommand1.Execute;
end;
finally
Free;
end
else
begin
ZemlDM.ADOCommand1.CommandText:=»Delete from Rez_»+TableNameStr+»_Epic»;
ZemlDM.ADOCommand1.Execute;
ZemlDM.ADOCommand1.CommandText:=»Delete from Rez_»+TableNameStr+»_Radiusy»;
ZemlDM.ADOCommand1.Execute;
end;
end;
end;
<Расчитываем Радиусы>
DecimalSeparator:=».»;
Tek_K:=K_min;i:=0;
repeat
Tek_h:=h_min;
repeat
ZemlDM.ADOCommand1.CommandText:=Format(«Insert Into Rez_»+TableNameStr+»_Epic (K_max, H_gip) Values (%f, %f)», [Tek_K, Tek_H]);
ZemlDM.ADOCommand1.Execute;
inc(i);
Tek_i:=2;
repeat
TekIzoParam:=Raschet.GetDelta(TekKoefD, TekKoefP, Tek_h, Tek_K, Tek_i);
if TekIzoParam.rad_min>0 then
begin
ZemlDM.ADOCommand1.CommandText:=Format(«Insert Into Rez_»+TableNameStr+»_Radiusy (InNNID, I_Tek, BolRad, MalRad) Values (%d, %f, %f, %f)», [i, TekIzoParam.I, TekIzoParam.rad_max, TekIzoParam.rad_min]);
ZemlDM.ADOCommand1.Execute;
end;
Tek_i:=Tek_i+0.5;
until (TekIzoParam.rad_min h_max;
Tek_K:=Tek_K+K_step;
until Tek_K>K_max;
DecimalSeparator:=»,»;
SetLength(TablesNames,1);
TablesNames[0]:=»Rez_»+TableNameStr+»_Epic»;
SetLength(TablesNames,2);
TablesNames[1]:=»Rez_»+TableNameStr+»_Radiusy»;
SetLength(FieldNames,1);
FieldNames[0]:=»K_max»;
SetLength(FieldNames,2);
FieldNames[1]:=»H_gip»;
SetLength(FieldNames,3);
FieldNames[2]:=»I_tek»;
SetLength(FieldNames,4);
FieldNames[3]:=»BolRad»;
SetLength(FieldNames,5);
FieldNames[4]:=»MalRad»;
TekMasterDetailFields:=»InNNID;InNNID»;

Dialog3:=TMDBEditDlg.Create(Application);
with Dialog3 do
if ShowModal=mrOK then
begin
if (MessageDlg(«Хотите построить схему?»,mtInformation,[mbYes, mbNo],0)=mrYes) then
CreateMDIChild(TableNameStr);
end;
end;
finally
Free;
end;
end;
finally
Free;
end;
finally
Free;
end;
end;

procedure TMDBEditDlg.OKBtnClick(Sender: TObject);
begin
Visible:=false;
TekArPZ:=ArZemlInit;
ZemlDM.ADOTable1.Active:=false;
ZemlDM.ADOTable2.Active:=false;
ZemlDM.ADOTable2.MasterFields:=»»;
end;

procedure TMDBEditDlg.FormCreate(Sender: TObject);
var
Ni,Nf,N_Item:integer;
begin
ZemlDM.ADOTable1.TableName:=TablesNames[0];
ZemlDM.ADOTable2.TableName:=TablesNames[1];
ZemlDM.ADOTable1.Active:=true;
ZemlDM.ADOTable2.Active:=true;

N_Item:=0;
for Nf:=0 to High(FieldNames) do
begin
for Ni:=0 to ZemlDM.ADOTable1.FieldCount-1 do
if FieldNames[Nf]=ZemlDM.ADOTable1.Fields[Ni].FieldName
then
begin
DBGrid1.Columns.Add;
DBGr > inc(N_Item);
end;
end;

N_Item:=0;
for Nf:=0 to High(FieldNames) do
begin
for Ni:=0 to ZemlDM.ADOTable2.FieldCount-1 do
if FieldNames[Nf]=ZemlDM.ADOTable2.Fields[Ni].FieldName
then
begin
DBGrid2.Columns.Add;
DBGr > inc(N_Item);
end;
end;
ZemlDM.ADOTable2.MasterFields:=TekMasterDetailFields;
end;

Будут еще вопросы ДОБРО ПОЖАЛОВАТЬ.
Заранее спасибо, если ответы по делу.

Работа с базой данных Access в Delphi

В данной статье рассмотрим как можно реализовать программу, которая сможет работать с данными, размещенными в файле СУБД MS Access. Программе необходимо подключиться к внешнему файлу БД. Затем, в ней должна быть реализована форма, в которой пользователь сможет просматривать записи из таблицы БД, добавлять новые записи, удалять или редактировать их.

Обычно, для работы с текстовым файлом в Delphi достаточно использовать простые команды связи внешнего файла с файловой переменной и команды чтения и записи. Для работы со специализированными файлами приходится использовать дополнительные библиотеки или компоненты. Для решения данной задачи, воспользуемся технологией ADO, а так же соответствующими компонентами, позволяющими отобразить данные на пользовательской форме.

Чтобы организовать работу программы с БД, потребуется следующие компоненты:

ADOConnection – используется для подключения к БД (закладка палитры ADO, в некоторых версиях dbGO);

ADOTable – связывается с конкретной таблицей БД (закладка ADO);

DataSource – компонент, используется как связка данных из таблиц, с отображающими и управляющими компонентами Delphi (закладка Data Access);

DBGrid – таблица, позволяющая вывести содержимое таблицы БД на пользовательскую форму (закладка Data Controls);

DBNavigator – кнопочная панель, способная управлять данными в привязанной к ней таблице (закладка Data Controls).

После того, как все компоненты установлены на форму, можно приступить к их настройке. Для решения нашей задачи никакого программного кода не потребуется. Только настройка свойств компонентов:

Свойство ConnectionString компонента ADOConnection

Свойство ConnectionString удобно настраивается в специальных окнах. Открываем редактор свойства ConnectionString в инспекторе объектов кнопкой «…» . В появившемся окне оставляем все настройки как они были по умолчанию и нажимаем кнопку «Build…» .

Читать еще:  База данных банка в access

Получаем еще одно окно с несколькими закладками.

В первой закладке «Поставщик данных» выбираем в списке «Microsoft.Jet.OLEDB.4.0» и жмем «Далее >>» .

Во второй закладке «Соединение» в поле «1. Выберете или введите имя базы данных:» жмем «…» и привычным окном выбираем нужный файл БД. Здесь стоит отметить, что при выборе адреса, будет указан полный путь, начиная от корневой директории. При таком указании директории, становится неудобно использование программы на другом компьютере, так как приходится создавать все директории, что и на компьютере, где была создана программа. Чтобы не сталкиваться с такой проблемой, удобней указать относительный путь. Если в этом поле указать только имя файла БД, то программа будет открывать ее из той же директории, где она находится, в какую бы директории ее не разместили. Естественно файл БД должен находиться в той же папке, куда вы сохраняете свой проект Delphi.

Нажимаем кнопку «ОК» .

Снова видим предыдущее окно, но уже с заполненной строкой. Снова нажимаем «ОК» . Все, настройка свойства ConnectionString завершена.

Свойство LoginPrompt компонента ADOConnection

Это свойство логического типа определяет, будет ли при подключении к БД запрашиваться пароль. Пока никакие пароли не нужны, поэтому, чтобы оно не мешало при работе с программой ставим ему значение False.

Свойство Connected компонента ADOConnection

Свойство определяет, выполнено ли подключение в данный момент. Чтобы не подключаться к БД программно после запуска приложения, указываем True. Если после присвоению свойству значения True, Delphi не вывел никаких сообщений об ошибках, значит, все выполнено правильно. В случае ошибок, стоит проверить, правильно ли указано имя файла БД или «Поставщик данных».

Свойство Connection компонента ADOTable

Выбираем из списка созданный и настроенный компонент ADOConnection. Как альтернатива этому свойству у компонента ADOTable есть собственное свойство ConnectionString, которым точно так же можно настроить подключение прямо к БД. Но если планируется работать с несколькими таблицами, гораздо удобней настроить подключение один раз и далее для всех таблиц пользоваться им.

Свойство TableName компонента ADOTable

Выбираем из списка необходимую таблицу из БД.

Свойство Active компонента ADOTable

Свойство, определяющее режим работы компонента. Указываем значение True. Если сообщений об ошибках нет, все нормально. Если есть, проверьте предыдущие два свойства.

Свойство DataSet компонента DataSource

Из списка выбираем нужную таблицу, если их несколько. Обычно для удобства каждой таблице в БД соответствует своя пара ADOTable + DataSource.

На этом настройка невизуальных компонентов, использующихся для работы с данными БД, завешена. После этого нужно настроить пользовательскую форму для вывода информации и предоставления возможностей управления ей.

Свойство DataSource компонентов DBGrid и DBNavigator

Свойство настраивается выбором из списка нужного компонента DataSource.

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


Рисунок: Подключение Delphi с БД Access

Delphi access создать таблицу

Создание таблиц с помощью компонента TTable

  1. Обзор
  2. На этом небольшом уроке мы завершим изучение возможностей создания таблиц. Как Вы помните, мы уже освоили два способа создания таблиц — с помощью утилиты Database Desktop, входящей в поставку Delphi (урок 11) и с помощью SQL-запросов (урок 12), которые можно использовать как в WISQL (Windows Interactive SQL — клиентская часть Local InterBase), так и в компоненте TQuery . Теперь мы рассмотрим, как можно создавать локальные таблицы в режиме выполнения с помощью компонента TTable .
  3. Создание таблиц с помощью компонента TTable

Для создания таблиц компонент TTable имеет метод CreateTable . Этот метод создает новую пустую таблицу заданной структуры. Данный метод (процедура) может создавать только локальные таблицы формата dBase или Paradox.

Компонент TTable можно поместить на форму в режиме проектирования или создать динамически во время выполнения. В последнем случае перед использованием его необходимо создать, например, с помощью следующей конструкции:

Перед вызовом метода CreateTable необходимо установить значения свойств

  • TableType — тип таблицы
  • DatabaseName — база данных
  • TableName — имя таблицы
  • FieldDefs — массив описаний полей
  • IndexDefs — массив описаний индексов .

Свойство TableType имеет тип TTableType и определяет тип таблицы в базе данных. Если это свойство установлено в ttDefault , тип таблицы определяется по расширению файла, содержащего эту таблицу:

  • Расширение .DB или без расширения: таблица Paradox
  • Расширение .DBF : таблица dBASE
  • Расширение .TXT : таблица ASCII (текстовый файл).
Читать еще:  База данных библиотека access пример

Если значение свойства TableType не равно ttDefault , создаваемая таблица всегда будет иметь установленный тип, вне зависимости от расширения:

  • ttASCII : текстовый файл
  • ttDBase : таблица dBASE
  • ttParadox : таблица Paradox.

Свойство DatabaseName определяет базу данных, в которой находится таблица. Это свойство может содержать:

  • BDE алиас
  • директорий для локальных БД
  • директорий и имя файла базы данных для Local InterBase
  • локальный алиас, определенный через компонент TDatabase .

Свойство TableName определяет имя таблицы базы данных.

Свойство FieldDefs (имеющее тип TFieldDefs ) для существующей таблицы содержит информацию обо всех полях таблицы. Эта информация доступна только в режиме выполнения и хранится в виде массива экземпляров класса TFieldDef , хранящих данные о физических полях таблицы (т.о. вычисляемые на уровне клиента поля не имеют своего объекта TFieldDef ). Число полей определяется свойством Count , а доступ к элементам массива осуществляется через свойство Items :

property Items[Index: Integer]: TFieldDef;

При создании таблицы, перед вызовом метода CreateTable , нужно сформировать эти элементы. Для этого у класса TFieldDefs имеется метод Add :

procedure Add(const Name: string; DataType: TFieldType; Size: Word; Required: Boolean);

Параметр Name , имеющий тип string , определяет имя поля. Параметр DataType (тип TFieldType ) обозначает тип поля. Он может иметь одно из следующих значений, смысл которых ясен из их наименования:

TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftBlob, ftMemo,

Параметр Size (тип word ) представляет собой размер поля. Этот параметр имеет смысл только для полей типа ftString , ftBytes , ftVarBytes , ftBlob , ftMemo , ftGraphic , размер которых может сильно варьироваться. Поля остальных типов всегда имеют строго фиксированный размер, так что данный параметр для них не принимается во внимание. Четвертый параметр — Required — определяет, может ли поле иметь пустое значение при записи в базу данных. Если значение этого параметра — true , то поле является “требуемым”, т.е. не может иметь пустого значения. В противном случае поле не является “требуемым” и, следовательно, допускает запись значения NULL. Отметим, что в документации по Delphi и online-справочнике допущена ошибка — там отсутствует упоминание о четвертом параметре для метода Add .

Если Вы желаете индексировать таблицу по одному или нескольким полям, используйте метод Add для свойства IndexDefs , которое, как можно догадаться, также является объектом, т.е. экземпляром класса TIndexDefs . Свойство IndexDefs для существующей таблицы содержит информацию обо всех индексах таблицы. Эта информация доступна только в режиме выполнения и хранится в виде массива экземпляров класса TIndexDef , хранящих данные об индексах таблицы. Число индексов определяется свойством Count , а доступ к элементам массива осуществляется через свойство Items :

property Items[Index: Integer]: TIndexDef;

Метод Add класса TIndexDefs имеет следующий вид:

procedure Add(const Name, Fields: string;
Options: TIndexOptions);

Параметр Name , имеющий тип string , определяет имя индекса. Параметр Fields (также имеющий тип string ) обозначает имя поля, которое должно быть индексировано, т.е. имя индексируемого поля. Составной индекс, использующий несколько полей, может быть задан списком имен полей, разделенных точкой с запятой “ ; ”, например: ‘Field1;Field2;Field4’ . Последний параметр — Options — определяет тип индекса. Он может иметь набор значений, описываемых типом TIndexOptions :

TIndexOptions = set of (ixPrimary, ixUnique, ixDescending,

Поясним эти значения. ixPrimary обозначает первичный ключ, ixUnique — уникальный индекс, ixDescending — индекс, отсортированный по уменьшению значений (для строк — в порядке, обратном алфавитному), ixCaseInsensitive — индекс, “нечувствительный” к регистру букв, ixExpression — индекс по выражению. Отметим, что упоминание о последнем значении также отсутствует в документации и online-справочнике. Опция ixExpression позволяет для таблиц формата dBase создавать индекс по выражению. Для этого достаточно в параметре Fields указать желаемое выражение, например: ‘Field1*Field2+Field3’ . Вообще говоря, не все опции индексов применимы ко всем форматам таблиц. Ниже мы приведем список допустимых значений для таблиц dBase и Paradox:

Опции индексов dBASE Paradox

ixDescending ь ь

Необходимо придерживаться указанного порядка применения опций индексов во избежание некорректной работы. Следует отметить, что для формата Paradox опция ixUnique может использоваться только вместе с опцией ixPrimary (см. пример на диске — Рис. 0-1 ).

Итак, после заполнения всех указанных выше свойств и вызова методов Add для FieldDefs и IndexDefs необходимо вызвать метод класса TTable — CreateTable :

with FieldDefs do

Add(‘Surname’, ftString, 30, true);

Add(‘Name’, ftString, 25, true);

Add(‘Patronymic’, ftString, 25, true);

Add(‘Age’, ftInteger, 0, false);

Add(‘Weight’, ftFloat, 0, false);

with IndexDefs do

Add(‘I_Name’, ‘Surname;Name;Patronymic’,
[ixPrimary, ixUnique]);

Add(‘I_Age’, ‘Age’, [ixCaseInsensitive]);

Индексы можно сгенерировать и не только при создании таблицы. Для того чтобы сгенерировать индексы для существующей таблицы, нужно вызвать метод AddIndex класса TTable , набор параметров которого полностью повторяет набор параметров для метода Add класса TIndexDefs :

Читать еще:  Accessory switch перевод

procedure AddIndex(const Name, Fields: string;
Options: TIndexOptions);

При этом для метода AddIndex справедливы все замечания по поводу записи полей и опций индексов, сделанные выше.

Итак, мы познакомились с еще одним способом создания таблиц — способом, использующим метод CreateTable класса TTable . Использование данного способа придаст Вашему приложению максимальную гибкость, и Вы сможете строить локальные таблицы “на лету”. Сопутствующим методом является метод AddIndex класса TTable , позволяющий создавать индексы для уже существующей таблицы. Подчеркнем еще раз, что данный способ применим только для локальных таблиц. Более общий способ состоит в использовании SQL-запросов, который мы рассматривали на уроке 12.

Работа с ADO в Delphi. Часть 9. Связанные таблицы

На этот раз хотел бы поговорить о связанных таблицах в БД MS Access. Статья, возможно не новая, но кто часто работает с БД, тому, возможно, будет полезная. В ней расскажу, как я связываю таблицы между собой. По крайней мере, я пользуюсь двумя способами, об одном я расскажу в теоретическом плане, с практикой проблем тут не должно возникнуть, а второй способ, немного рассмотрим и практики.

Для начала, нам необходимо создать базу данных и как минимум две таблицы, которые мы и будем связывать между собой.

В моей БД две таблицы с именами — Таблица1 и Таблица2. Я создам таблицу с фамилиями, а вторая таблица будет с названиями автомобилей. То есть, у каждого владельца, может быть несколько автомобилей (всем бы так). Вот так мы и свяжем наши таблицы. Отношение связи, тут получается, один ко многим. Насколько я помню, бывают следующие типы отношений:

  • один ко многим
  • многие ко многим
  • один к одному

Это так, что сейчас вспомнилось. Ну а теперь, посмотрим на структуры наших таблиц.


Таблица2. Структура.


Теперь, нам необходимо связать эти две таблицы в MS Access. Поле id Таблицы2 предназначено для хранения идентификаторов записей из Таблицы1. По ним будет распознаваться, какая запись из Таблицы2 принадлежит записи из Таблицы1.

Для того, чтобы связать наши таблицы, необходимо перейти в Схему данных, добавить наши таблицы и связать следующие поля ,отношением — один ко многим:


Если в БД MS Access добавлять теперь записи, то для каждой фамилии можно добавлять сколько угодно автомобилей, а если выбрать определенную запись, то покажется список автомобилей для данного человека.

В нашем проекте будет что-то похожее, давайте же приступим к нему. На форме у меня следующие компоненты:

  • TADOConnection
  • TADOTable — 2 шт
  • TDBGrid — 2 шт
  • TDataSource — 2 шт
  • TEdit
  • TButton

По поводу подключения к БД, смотрим статью. Ну, а дальше самое интересное. Нам необходимо связать наши компоненты. Выделяем компоненты TADOTable и в каждом, в свойстве Connection, указываем компонент TADOConnection. Дальше выделяем DBGrid1 и связываем его с DataSource1, в свойстве DataSource. Компонент DataSource1, в свойстве DataSet, указываем AdoTable1. Все готово, одна таблица связана, это будет наша главная таблица, а точнее с имена и фамилиями автовладельцев.

Дальше нашу главную таблицу необходимо активировать. Выделяем AdoTable1, в свойстве TableName выбираем Таблица1 и свойство Active устанавливаем в True.

Все, теперь главная таблица полностью готова. Теперь приступим к подчиненной.

Выделяем компонент DBGrid2 и в свойстве DataSource связываем его с компонентом DataSource2, а компонент DataSource2, в свойстве DataSet, связываем с компонентом AdoTable2.

Все, теперь выделяем компонент AdoTable2 и в свойстве TableName выбираем Таблица2, в свойстве MasterSource выбираем DataSource1 (в данном случае необходимо выбрать тут TDataSource главной таблицы, то есть главную таблицу).

Дальше, в свойстве MasterFields, компонента AdoTable2 (подчиненной таблицы), мы указываем связующие поля, следующим образом:


Все, когда у нас все настроено, также активируем данную таблицу, свойство Active устанавливаем в True.

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

Что касается еще одно метода, связывания таблиц, то тут также все просто. Необходимо все самому отслеживать: для какой записи из основной таблицы добавляется запись подчиненной таблицы, что добавляется и самому записывать идентификатор основной таблицы в подчиненную, а затем уже, по выделенной записи (получать ее идентификатор), делать выборку записей из подчиненной таблицы.

Ссылка на основную публикацию
Adblock
detector