Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обход связанных 2-х таблиц - с шапкой и детализацией [D6, Access]


Sergeyy ©   (2002-10-14 12:10:00) 

Есть 2 таблицы рецептов:
1. Заголовочная. MASTER(ID, INGRED_ID, UNIT_ID, DAT);("рецепт")
2. Детализация. DETAILS(MASTER_ID, INGRED_ID, UNIT_ID, AMOUNT);
MASTER.ID = DETAILS.MASTER_ID
Проблема в том, что каждый ингредиент, участвующий в детализации может иметь для себя такую же шапку и быть далее расписан на неограниченное количество вложений. Как мне наилучшим способом пройтись по все этим таблицам и получить список всех ингридиентов, участвующих в заданном рецепте, независимо от уровня вложенности.
База связязано с клиентским приложением через ADO Jet.


MMF   (2002-10-14 16:57:00) [1]

Sergeyy © (14.10.02 12:10)
фактически, ты работаешь с деревом неопределенной глубины. Почитай http://sdm.viptop.ru/articles/sqltrees.html


passm   (2002-10-14 16:50:00) [2]

Sergeyy © (14.10.02 15:42)> Для Access"а ИМХО никак :-(
Можно написать процедуру/функцию:
procedure MyProc(Query: TQuery; const FieldID, FieldName, FieldChildCount, ParamParent: string; List: TStringList);
var
i, j: Integer;
begin
Query.First;
while not(Query.Eof) do
begin
List.Add(Query.FieldByName(FieldName).AsString);
if Query.FieldByName(FieldChildCount).AsInteger > 0 then
begin
i:= Query.FieldByName(FieldID).AsInteger;
j:= Query.ParamByName(ParamParent).AsInteger;
Query.ParamByName(ParamParent).AsInteger:= Query.FieldByName(FieldID).AsInteger;
Query.Close;
Query.Open;
MyProc(Query, FieldID, FieldName, FieldChildCount, ParamParent, List);
Query.ParamByName(ParamParent).AsInteger:= j;
Query.Close;
Query.Open;
Query.Locate(FieldID, i, [])
end;
Query.Next
end
end;

И запрос:
SELECT T1.ID, T1.NAME, T1.PARENT
FROM TABLE1 AS T1
WHERE T1.PARENT = :PARENT

P.S. Вместо List можно использовать редактируемый набор данных (например, Query, возвращающий пустой набор данных с нужными полями).


Sergeyy   (2002-10-14 15:42:00) [3]

2 passm

Думаю, что, рекурсивный. В Access это можно сделать? (желательно в чистом SQL)


passm   (2002-10-14 13:17:00) [4]

Sergeyy © (14.10.02 12:10)> ???
Тебе рекурсивный запрос нужен?


Наверх

Титульная страница Поиск, карта сайта Написать письмо