Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];




Вниз

Дерево из записей 


Beer   (2002-03-12 14:41) [0]

Уважаемые мастера!
Как создать дерево (как в реестре) из значений определенного поля в БД, и получать запись, соответствеющую этому значению, при его выборе...
С уважением...



DiggerAbstract   (2002-03-12 14:55) [1]

Вот кусок кода из одной проги



type
Attrib = record
sCod: string;
sCodP: string;
sName: string;
iCode: integer;
bSelect: Boolean;
end;
PAttrib = ^Attrib;


procedure TFormTree.CreateTreeView (pQ: TADOQuery; TV: TTreeView);
var
iIndex, iNumber: Integer;
Atr, AtrF: PAttrib;
iII: Integer;
pListNode: TStringList;
FullItemsListChild: TStringList;
pNode: TTreeNode;

function FindCod(ssCod: string):Boolean;
var
iI: Integer;
begin
if FullItemsListChild.Find(ssCod, iI) then Result:=true
else Result:=false;
end;

begin
pListNode := TStringList.Create;
FullItemsListChild := TStringList.Create;
pQ.First;
for iIndex:=0 to pQ.RecordCount-1 do
begin
New(Atr);
Atr^.sCod := pQ.Fields.Fields[0].AsString;
Atr^.sCodP := pQ.Fields.Fields[1].AsString;
Atr^.sName := pQ.Fields.Fields[2].AsString;
Atr^.iCode := pQ.Fields.Fields[3].AsInteger;

New(AtrF);
AtrF^.sCod := pQ.Fields.Fields[0].AsString;
AtrF^.sCodP := pQ.Fields.Fields[1].AsString;
AtrF^.sName := pQ.Fields.Fields[2].AsString;
AtrF^.iCode := pQ.Fields.Fields[3].AsInteger;
FullItemsListChild.AddObject(AtrF^.sCod, TObject(AtrF));

ItemsList.AddObject(Atr^.sCodP, TObject(Atr));
pQ.Next;
end;
iIndex:=0;
iII:=0;
FullItemsListChild.Sort;
while iIndex<ItemsList.Count do
begin
if (PAttrib(ItemsList.Objects[iII])^.sCodP=PAttrib(ItemsList.Objects[iII])^.sCod) or (not FindCod(PAttrib(ItemsList.Objects[iII])^.sCodP)) then
begin
pNode := TV.Items.AddObject(nil, PAttrib(ItemsList.Objects[iII])^.sName, ItemsList.Objects[iII]);
pListNode.AddObject(PAttrib(ItemsList.Objects[iII])^.sName, pNode);
ItemsList.Delete(iII);
ItemsList.Sort;
Dec(iII);
end;
Inc(iIndex);
Inc(iII);
end;
//////////////////////

for iIndex:=0 to pListNode.Count-1 do
begin
AddFirstInUroven(TTreeNode(pListNode.Objects[iIndex]));
end;

iNumber := FullItemsListChild.Count-1;
for iIndex:=0 to iNumber do
begin
Atr := PAttrib (FullItemsListChild.Objects[iNumber-iIndex]);
Dispose(Atr);
end;
FullItemsListChild.Clear;
FullItemsListChild.Free;

ItemsList.Sort;
pListNode.Clear;
pListNode.Free;
// TreeView1.AlphaSort;

TreeView1.CustomSort(@CustomSortProc, 0);
end;


Запрос примерно такой:

select id, id_parent, name, id, name from kzk.b_budgetentry where id in
(
select id_entry from
(
select * from kzk.b_budget where id_period=:ID_PERIOD and id_dept=:ID_DEPT
and cost<>0 ) as s
group by id_entry
)



Beer   (2002-03-12 16:04) [2]

to DiggerAbstract>
Не совсем понятен тип переменной ItemList? Хотя рискну предположить, что это TStringList.
Вызывая метод AddObject дублируется ли физически значение объекта, который передаем вторым параметром?
Как затем получить значение поля через TTreeNode?



DiggerAbstract   (2002-03-12 16:36) [3]

спорол косяк - не все написал.
шлю на мыло пример
этот пример работает, просто настрой коннекцию и напиши SQL запрос по примеру который есть там



Beer   (2002-03-12 19:17) [4]


Ок, жду...
Спасибо!



Beer   (2002-03-12 19:29) [5]

Да, еще вопрос, как определить стректуру, если заранее не известно количество и типы полей?




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.023 c
14-9599           tovSuhov              2002-02-21 08:36  2002.04.04  
---|Ветка была без названия|---


1-9570            anod                  2002-03-24 00:29  2002.04.04  
StringGrid


14-9615           Alx2                  2002-02-22 08:23  2002.04.04  
С Днем Модератора!


1-9551            новыйенкий            2002-03-23 20:10  2002.04.04  
Нужна помощь


1-9585            MARcoDEN              2002-03-24 08:20  2002.04.04  
Запуск программы