Вопрос про tree
Модераторы: m0p3e, edward_K, Модераторы
Вопрос про tree
Вобщем есть вот такой интерфейс выбора, который отображает дерево со всеми вложенными элементами. Как заставить его отображать не все дерево, а какую либо одну ветку со всеми вложениями? Т.е. сделать нечто наподобии фильтра по какой-то одной (или нескольким) ветке.
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.
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.
-
- Местный житель
- Сообщения: 474
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Сибирь-матушка
- Контактная информация:
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;
Идентификатор записи обязательно должен быть первым полем в таблице, по нему должен быть уникальный индекс - тоже самым первым в списке индексов данной таблы
TreeJumToRecordEx(TreeID:integer;TableID:integer;RecID:comp)- то же самое , только для дерева, построенного по 2 и более линейным таблицам
Tree testTree Table TreeTable;
<ля-ля-ля>
end;
handleeevent
cmDoSomeThing:
{
TreeJumToRecord(#testTree, TreeTable.NRec);
}
end;
Идентификатор записи обязательно должен быть первым полем в таблице, по нему должен быть уникальный индекс - тоже самым первым в списке индексов данной таблы
Питаю патологические отвращение и ненависть в особо тяжелой и крайне запущенной формах к семейству программ Microsoft Business Solution !
Восславим господа Кришну за то, что у нас есть ГАЛАКТИКА !
Восславим господа Кришну за то, что у нас есть ГАЛАКТИКА !
-
- Местный житель
- Сообщения: 2896
- Зарегистрирован: 24 июн 2005, 12:12
- Откуда: Иркутская область
Код: Выделить всё
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.
-
- Местный житель
- Сообщения: 412
- Зарегистрирован: 28 апр 2005, 11:34
- Откуда: Галактика Млечный Путь
вроде заработало, можно использовать как пример
// тут показывается список и возвращается выбранный сегмент
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.
// тут показывается список и возвращается выбранный сегмент
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.
-
- Местный житель
- Сообщения: 474
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Сибирь-матушка
- Контактная информация:
Аж 2 раза упомянута ...
TreeJumpToRecord и TreeJumpToRecordEx - функции по большей части сервисные, служат для корретного отображения дерева.
Дли поиска по дереву они бесполезны, вообще в принципе поиск по дереву штука сложная, напрямую искать по тому же экземпляру таблы , по которому строится дерево - не выйдет 100 % процентов из-за особенности построения логической таблы дерева
TreeJumpToRecord и TreeJumpToRecordEx - функции по большей части сервисные, служат для корретного отображения дерева.
Дли поиска по дереву они бесполезны, вообще в принципе поиск по дереву штука сложная, напрямую искать по тому же экземпляру таблы , по которому строится дерево - не выйдет 100 % процентов из-за особенности построения логической таблы дерева
Питаю патологические отвращение и ненависть в особо тяжелой и крайне запущенной формах к семейству программ Microsoft Business Solution !
Восславим господа Кришну за то, что у нас есть ГАЛАКТИКА !
Восславим господа Кришну за то, что у нас есть ГАЛАКТИКА !
-
- Постоянный гость
- Сообщения: 60
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Москва
- Контактная информация:
Виноват...я как сама ленивость нажал CTRL+F и решил поиском, а тот почему-то в посте от san её не нашел. И сейчас вот снова попробовал, в Вашем посте находит, а в его нет - чудеса...Аж 2 раза упомянута ...
вот вот... поэтому глупо бегаю по дереву, открывая узлы и проверяя на совпадение...есть варианты получше?...особенности построения логической таблы дерева...
Межет отыскать запись в синониме, не обремененном подцепкой, потом в выставить этот Parant в дереве и дальше TreeJumpToRecord ?