Дерево по словарю, связанного отношением само-на-себя
Данный класс представляет данные в древовидной структуре (исп. TreeView) таблицу, со структурой связи сама-на-себя. В классе присутствует как компонент чистого отображения, так и поиск по дереву.
ЗЫ добавлена поддержка ИД-полей с числовым типом и заточена работа от 6.0 до 9.0 версий Фокса
ЗЫЫ багофикс найденный flaxby. Непрально показывалось число найденных узлов + кой ч:е найденое не показывалось при определенных условиях
Определить есть или нет дочернии элементы у каждого узла дерева для выбранного родителя можно и
без помощи SEEK(). Прямо одним запросом.
Если использовать поля из таблицы данного примера, то это будет выглядеть так:
LOCAL lcParentID
lcParentID = Tovar.Tovar_id && Код родителя, для которого строится ветка
SELECT a.Tovar_id, a.Extern_id, a.name, ;
NOT IsNull(b.Tovar_id) as IsChild ;
FROM Tovar a ;
LEFT OUTER JOIN Tovar b ON a.Tovar_id=b.Extern_id ;
INTO CURSOR qSubTree NOFILTER ;
WHERE a.Extern_id=lcParentID ;
GROUP BY 1,2,3 ;
ORDER BY a.name
В результате, получится таблица с дополнительным логическим полем IsChild принимающем значение .T.
- если у данного элемента есть дочернии элементы и .F. - если нет.
В опции Group By следует перечислить все поля, кроме IsChild для исключения повторяющихся
значений.
Если убрать Group By, то еще одним запросом можно будет подсчитать количество дочерних элементов.
Такой способ (один запрос) очень удобен для клиент-серверных приложений.