Нужно реализовать ручной проход по дереву, что-то типа поиска в глубину, или ширину, что-то не пойму как это сделать на основе таблиц...
написал тестик:
для дерева есть более изящние пути обхода, но дерево должно быть описано как визуальный элемент со всеми вытекающими. А так да - рекурсивная функция с востановлением позиции рулит.
дак я и сделал рекурсивно! а как с помощью маркеров?
Визуальные элементы не навешаны... по визуальным и сам знаю
а можно примерчики? по типу как я тестилку на подразделениях накатал
While GetMarkerCount(PosInCash)>0
{
GetMarker(PosInCash, GetMarkerCount(PosInCash)-1, curPos);
if curPos>=GetMarkerCount(CashMarkers) begin
AtDeleteMarker(PosInCash, GetMarkerCount(PosInCash)-1);
Continue;
end;
While curPos<GetMarkerCount(CashMarkers)
{
GetMarker(CashMarkers, curPos, curParent); //по идее, раз ВСЕГДА должны попадать в границы
AtDeleteMarker(CashMarkers, curPos); //ща мы его выведем, значит ОН нам больше не пригодится
curCount:=GetMarkerCount(CashMarkers);
_loop KATPODR(KATPODR09) where ((curParent == KATPODR.CPODR))
{
InsertMarker(CashMarkers, KATPODR.NREC);
}
if curCount=GetMarkerCount(CashMarkers)
{
//нет детёнышей - вложенностей не будет
}
else
{
//запоминаем, откуда начинался обследованный уровень и переходим к вложенному
InsertMarker(PosInCash,curCount);
break;
}
}
}
//теперь позырим что насобирали....
var li1 : integer ;
var li3 : string ;
var li2 : comp ;
ну код 2 раза длинее чем у автора и в 4 чем через обход древа . К слову - для katpodr все еще проще - есть славная табла podrier - через нее удобно в sql фильтровать, тока проверку каталога подразделений иногда нужно делать - показатель что в зарплате в одних фейсах есть, а в других нет какого то подразделения. В других местах вроде как не используется. В ней по главному узлу содержатсся ссылки на все подчиненные записи.
edward_K
да я для примера привел просто катподр. у меня свои таблички
код с маркерами хоть и длиннее, но, думаю, быстрее будет. т.к. нет постоянного скакания по позициям, при выходе из рекурсивной функции...
Alexander писал(а):edward_K
да я для примера привел просто катподр. у меня свои таблички
код с маркерами хоть и длиннее, но, думаю, быстрее будет. т.к. нет постоянного скакания по позициям, при выходе из рекурсивной функции...
Да, теоретически должно быть побыстрее (проверить бы на деревянных данных в несколько десятков тысяч записей...)) ).
Уж не говоря о об обходе, упомянутым выше , с помощью деревянных treegetxxx.
// очередь подразделений
var Departments: longint;
Departments := InitMarker('', 8, 500, 100, false);
// обход начинается с BranchRoot
InsertMarker(Departments, BranchRoot);
while GetMarkerCount(Departments) > 0
{
var D: comp;
GetMarker(Departments, 0, D);
AtDeleteMarker(Departments, 0);
// обработать текущее подразделение
DoSomething(D);
// добавить в очередь дочерние подразделения
_loop KATPODR where ((D == KATPODR.CPODR))
InsertMarker(Departments, KATPODR.NREC);
}