Страница 1 из 1

Вопрос про tree

Добавлено: 06 окт 2005, 15:58
Alexx
Вобщем есть вот такой интерфейс выбора, который отображает дерево со всеми вложенными элементами. Как заставить его отображать не все дерево, а какую либо одну ветку со всеми вложениями? Т.е. сделать нечто наподобии фильтра по какой-то одной (или нескольким) ветке.

interface cuptree 'Траляля' cyan, doaccept;

view
var
curowner: comp;
gr_nrec: comp;
gr_kod, gr_name: string;
as select * from groupsch, groupsch groupsch2
where ((curowner == groupsch.cnode and
groupsch.nrec == groupsch2.cnode))
order by groupsch.kod;

parameters
gr_nrec,
gr_kod,
gr_name;

tree b1;
fields
groupsch.kod: [20], protect;
groupsch.name:[40], protect;
end;

handleevent
cmDefault:
{
gr_nrec := groupsch.nrec;
gr_kod := groupsch.kod;
gr_name := groupsch.name;
}
cmTreeNodeType:
{
if isvalidall(tngroupsch2) then
{
TreeSetNodeType(b1, if(TreeNodeIsOpen(b1), ntfopen, ntfclose));
}
else
{
TreeSetNodeType(b1, ntftext);
}
}
cmTreeTop: curowner := 0;
cmTreeDown: curowner:=groupsch.nrec;
cmTreeUp: curowner:=groupsch.cnode;
cmCancel: {};
cmDone: {};
end;

end.

Добавлено: 06 окт 2005, 16:08
Goblin
в cmTreeTop не 0 ставить , а Nrec нужного элемента - и будет счастье

Добавлено: 06 окт 2005, 16:51
ecasoft
Кстати по деревьям. Хотел использовать функции JUMP... но так и не понял, что надо ставить в качестве параметров. В описании параметров используется терминалогия , которая не описана (или не смог найти).

Добавлено: 07 окт 2005, 08:13
Goblin
TreeJumpToRecord(TreeID:integer,REcID:Comp) - переводит текущую позицию курсора на позицию с NRec=RecID и в, случае успешного перехода, перерисоовывает дерево.
TreeJumToRecordEx(TreeID:integer;TableID:integer;RecID:comp)- то же самое , только для дерева, построенного по 2 и более линейным таблицам


Tree testTree Table TreeTable;
<ля-ля-ля>
end;

handleeevent
cmDoSomeThing:
{
TreeJumToRecord(#testTree, TreeTable.NRec);
}
end;

Идентификатор записи обязательно должен быть первым полем в таблице, по нему должен быть уникальный индекс - тоже самым первым в списке индексов данной таблы

Добавлено: 27 фев 2006, 13:47
Алексей
А для какой версии это сделано? :)) Для 5.85.02 не получается.

Используем TreeJumToRecord(testTree, TreeTable.NRec);
в итоге функция даёт фолс и полный привет.

Может поможет кто и расскажет где тут собака порылась?

Интересует именно переход на заданную запись, зная её нрек.

Добавлено: 27 фев 2006, 13:52
Goblin
еще на 5.7 работало ...
примерчик бы, где не работает

Добавлено: 27 фев 2006, 13:59
Алексей

Код: Выделить всё

Interface myPodr 'Каталог складов - самописный' cyan;
show at(,,100,20);
Table struct kpodr
(
  nrec:comp,
  name:string,
  kod :string,
  cpodr:comp
)
With Index
(
 i01 = nrec  (Unique, SUrrogate),
 i02 = cpodr

);
create view var c:comp;
from katpodr, kpodr, kpodr kpodr1 where((

     0             == katpodr.sklad
and  c             == kpodr.cpodr
and  kpodr.nrec    == kpodr1.cpodr
));

Tree tr1
show at(1,1,99,15);
table kpodr
fields
 kpodr.name :[50],protect;
 kpodr.kod  :[20],protect;
end;
HandleEvent
cmInit:{ 
         c:=kpodr.nrec;
         if TreeGetFirst(tr1) then {} 
}
cmTreeTop  : c:=0;
cmTreeDown : c:=kpodr.nrec;
cmTreeUP   : c:=kpodr.cpodr;
cmTreeNodeType  :
{
  if not isvalid(#Kpodr1) then TreeSetNodeType(TR1,ntfText);
}
end;

Screen sc1
show at(1,16,99,);
buttons
 cmJump;
<<
 <. Jump . .>
>>
end;
HandleEvent
cmJump:
{
 message('jump '+TreeJumpToRecord(tr1,3302));
}
end;

HANDLEEVENT
cmInit:
{
 MtRetrieve(#kpodr,mfClear);
 _Loop katpodr
 {
   clearbuffer(#kpodr);
   kpodr.name := katpodr.name ;
   kpodr.kod  := katpodr.kod  ;
   kpodr.nrec := katpodr.nrec ;
   kpodr.cpodr:= katpodr.cpodr;
   insert current kpodr;
  }
}
cmDone: MtRetrieve(#kpodr,mfClear);
END;
// 3302 -- нрека записи...
end.
Не работает ни переход на запись ни установка на первую запись дерева.

Добавлено: 28 фев 2006, 07:51
san
вроде заработало, можно использовать как пример
// тут показывается список и возвращается выбранный сегмент
interface cfgpickexclassifier 'Выбор внешнего классификатора',DoAccept ;
CONST
scCfgClassifierTree = 346;
end;
Table Struct TmpExClassSeg
(
NREC : comp,
CGROUP : comp,
NAME : string[250],
value : string[20],
ISLEAF: word
)
with index
(
i1=nrec (unique,surrogate),
i2=cgroup+value
);
create view
var
wTable : word;
cExClassName : comp;
cExClassSeg : comp; // выбранный сегмент (возвращаемый)
P4 : word; // флаг (0=cmCancel,1=cmOK) (возвращаемый)

CurGroup : comp;
from
ExClassName,
ExClassSeg,
TmpExClassSeg,
TmpExClassSeg SubTmpExClassSeg
where
((
cExClassName == exclassname.nrec
and ExClassName.ClassCode == ExClassSeg.ClassCode

and CurGroup == TmpExClassSeg.cGroup
and TmpExClassSeg.nrec == SubTmpExClassSeg.cGroup
))
;
parameters wtable,cExClassName,cExClassSeg,p4;

screen scrname;
show at (,,,3)
table exclassname
fields exclassname.name : skip;
<<

Наименование классификации.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

>>
end;

Tree TRCLASSIFIER (,,scCfgClassifierTree);
show at (,4,,)
table TmpEXCLASSSEG;
Fields
TmpEXCLASSSEG.NAME : [30], Protect;
TmpEXCLASSSEG.Value : [15], Protect;
end;

handleEvent
cminit:
{
if getfirst ExClassName <> tsOK {abort;exit}

mtretrieve(#TmpExClassSeg,mfClear);

_loop ExClassSeg
{
TmpExClassSeg.nrec := ExClassSeg.nrec ;
TmpExClassSeg.cgroup := ExClassSeg.cgroup;
TmpExClassSeg.name := ExClassSeg.name ;
TmpExClassSeg.value := ExClassSeg.value ;
TmpExClassSeg.isleaf := ExClassSeg.isleaf ;
insert current TmpExClassSeg;
}

if getfirst TmpExClassSeg where((cExClassSeg==TmpExClassSeg.nrec))= tsOK
{
CurGroup := TmpExClassSeg.cGroup;
if TreeJumpToRecord(TRCLASSIFIER,TmpExClassSeg.nrec) {}//message('установили позицию');
}
else
{
CurGroup := 0;
if TreeGetFirstEx(TRCLASSIFIER) {}//message('установили первую');
}
}
cmTreeTop :
begin
CurGroup := 0; // текущий корень - вершина
end;

cmTreeDown :
begin
CurGroup := TmpExClassSeg.nrec; // текущий корень - текущая запись
end;

cmTreeUp :
begin
CurGroup := TmpExClassSeg.cGroup; // текущий корень - ссылка вверх
end;
cmTreeNodeType :
{
if not isvalid(#SubTmpExClassSeg) TreeSetNodeType(TRCLASSIFIER,ntfText);
}
cmTreeNeedOwner:
{
TreeJumpToRecord(TRCLASSIFIER,TmpExClassSeg.cGroup);
}
cmDefault:
{
cExClassSeg := TmpExClassSeg.nrec;
P4 := 1;
}
cmCancel : P4 := 0;
cmDone: mtretrieve(#TmpExClassSeg,mfClear);
cmPass: RunInterface(CFGEXEXTCLASS,ExClassName.wTable,ExClassName.ClassCode,ExClassName.UNIQFEAT);// f4
cmClose: P4 := 0;// esc
end;
end.

Добавлено: 13 мар 2006, 14:28
Juve
Может я чего не понял, но в приведенном примере я не нашел вообще TreeJumToRecord, и у меня она тоже никогда не работала. Поиск по дереву делаю "ручками" :sad:

Добавлено: 13 мар 2006, 14:44
Goblin
Аж 2 раза упомянута ...

TreeJumpToRecord и TreeJumpToRecordEx - функции по большей части сервисные, служат для корретного отображения дерева.

Дли поиска по дереву они бесполезны, вообще в принципе поиск по дереву штука сложная, напрямую искать по тому же экземпляру таблы , по которому строится дерево - не выйдет 100 % процентов из-за особенности построения логической таблы дерева

Добавлено: 13 мар 2006, 18:42
Juve
Аж 2 раза упомянута ...
Виноват...я как сама ленивость нажал CTRL+F и решил поиском, а тот почему-то в посте от san её не нашел. И сейчас вот снова попробовал, в Вашем посте находит, а в его нет - чудеса...
...особенности построения логической таблы дерева...
вот вот... поэтому глупо бегаю по дереву, открывая узлы и проверяя на совпадение...есть варианты получше?

Межет отыскать запись в синониме, не обремененном подцепкой, потом в выставить этот Parant в дереве и дальше TreeJumpToRecord ?

Добавлено: 15 мар 2006, 07:45
Алексей
Juve
как в примере написано, так и делайте.
Если есть нрек записи, то пользуйтес Jump- ом.
Не забудте про событие cmTreeNeedOwner
Иначе правильной отрисовки дерева не получите.

Кстати, пример этот рабочий.

Добавлено: 15 мар 2006, 13:03
Juve
Спасибо, Алексей!