![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
"Случайная" переменная?
markers © (2006-10-19 10:26:00)Можно-ли реализовать и как %subj ? Заренее Спасибо!
Сергей М. (2006-10-19 17:30:00) [21]
> "а если чтобы пункты нужны в определенном порядке?" сразу
> скажу - придирки
Нет, не придирки.
Это тот самый общий случай, при котором не делается никаких предположений о логическом порядке следования записей о существующих узлах в НД.
Твой код (как и авторский) отражает лишь частныйслучай - запись о дочернем узле (в порядке следования записей в результирующем НД) всегда ожидается позже, нежели запись о родительском узле.
В общем же случае запись о родителе не обязана фигурировать в НД раньше записи о его "чаде"
Сергей М. (2006-10-19 17:24:00) [22]
> q.sql.text:='select id, id_parent, caption from tree order by caption'
Чтой-то вдруг именно по caption ? Зачем вообще здесь явно указанная сортировка ? Почему она не по ParentId, если уж на то пошло ?
> If q.Fields[1].IsNull Then
А если это условие ложно ? Где у тебя его обработка ?
Palladin (2006-10-19 17:22:00) [23]краткий глоссарий
TWRIntegerMap - коллекция: ключ - данные (разных типов), с бинарным поиском
vtQuickADOQuery - всего лишь процедура выставляющая параметры исполнения TADOQuery на максимальную производительность
p.s. предполагая подобное "а если чтобы пункты нужны в определенном порядке?" сразу скажу - придирки, бо ничего сложного нет в: докрутить к вышенаписанному добавление элементов в дерево в определенном порядке...
Palladin (2006-10-19 17:17:00) [24]это для не рекурсивного дерева, для рекурсивного немного сложней...
Palladin (2006-10-19 17:15:00) [25]момент истины
procedure TForm1.Button1Click(Sender: TObject);
Type
PItem=^TItem;
TItem=Record
nID:Integer;
strCaption:String;
End;
Var
theUnlinked,
theTree:TWRIntegerMap;
q:TADOQuery;
n,nID,nIDParent:Integer;
strCaption:String;
Function _CreateNode(p_theParent:TTreeNode;p_nID:Integer;Const p_strCaption:String):TTreeNode;
Var
i,n:Integer;
Begin
Result:=TreeView.Items.AddChild(p_theParent,p_strCaption);
Result.Data:=Pointer(p_nID);
If theUnlinked.Find(p_nID,n) Then
Begin
For i:=0 to TList(theUnlinked.ObjectData[n]).Count-1 Do
Begin
With PItem(TList(theUnlinked.ObjectData[n])[i])^ Do
theTree.Add_Integer(nID,Integer(_CreateNode(Result,nID,strCaption)));
Dispose(PItem(TList(theUnlinked.ObjectData[n])[i]));
End;
theUnlinked.Delete(n);
End;
End;
Procedure _AddToUnlinked(p_nID,p_nIDParent:Integer;Const p_strCaption:String);
Var
n:Integer;
p:PItem;
Begin
New(p);
p.nID:=p_nID;
p.strCaption:=p_strCaption;
If Not theUnlinked.Find(p_nIDParent,n) Then n:=theUnlinked.Add_Object(p_nIDParent,TList.Create);
TList(theUnlinked.ObjectData[n]).Add(p);
End;
begin
theTree:=TWRIntegerMap.Create;
theUnlinked:=TWRIntegerMap.Create;
q:=TADOQuery.Create(Nil);
q.Connection:=ADOConnection1;
vtQuickADOQuery(q);
q.sql.text:='select id, id_parent, caption from tree order by caption';
q.Open;
While not q.Eof Do
Begin
nID:=q.Fields[0].AsInteger;
strCaption:=q.Fields[2].AsString;
If q.Fields[1].IsNull Then theTree.Add_Integer(nID,Integer(_CreateNode(Nil,nID,strCaption))) Else
Begin
nIDParent:=q.Fields[1].AsInteger;
If theTree.Find(nIDParent,n)
Then theTree.Add_Integer(nID,Integer(_CreateNode(TTreeNode(theTree.IntegerData[n]),nI D,strCaption)))
Else _AddToUnlinked(nID,nIDParent,strCaption);
End;
q.Next;
End;
q.Close;
q.Free;
theTree.Free;
theUnlinked.Free;
end;
на все вопросы отвечу...
Сергей М. (2006-10-19 14:34:00) [26]
> Palladin © (19.10.06 14:13) [38]
Ради истины потерплю.
Palladin (2006-10-19 14:13:00) [27]
> Теперь представь себе, что выглядит он иначе:
>
> 2 0
> 3 0
> 0 Null
> 1 Null
>
> И ?
что И? я помоему достаточно ясно выразился сказав что мне не принципиально наличие какого либо упорядочивания в НД... и я тоже буду двигаться только в одном направлении... если не веришь, то потерпи немного: я до дома дойду и напишу тебе великую тайну реализации...
Сергей М. (2006-10-19 13:48:00) [28]
> Palladin © (19.10.06 13:26) [36]
>
>
> 0 Null
> 1 Null
> 2 0
> 3 0
> 4 2
> 5 2
>
Теперь представь себе, что выглядит он иначе:
2 0
3 0
0 Null
1 Null
И ?
> мне по барабану в каком порядке мне вернулся НД
Я так и понял, что тебе по барабану)
А вот автору, к примеру, не по барабану. Он получил unidirectional-НД (содержимое см. выше) и движется по нему в порядке следования записей (а как быть иначе, если он однонаправленный ?).
Ну и о каком визуальном построении может идти речь, если первая же запись ссылается на родителя, который фигурирует лишь в 3-й записи в порядке следования записей в данномНД ?
думай)...
Palladin (2006-10-19 13:26:00) [29]
0 Null
1 Null
2 0
3 0
4 2
5 2
> И обоснуй, что записи в этом НД должны следовать именно так и не иначе ...
зачем? мне по барабану в каком порядке мне вернулся НД...
Сергей М. (2006-10-19 13:22:00) [30]
> Palladin © (19.10.06 13:16) [34]
Так.
Приведи фрагмент НД, сформированный твоим запросом ... И обоснуй, что записи в этом НД должны следовать именно так и не иначе ...
Palladin (2006-10-19 13:16:00) [31]хм...
select id,id_parent from tree
Сергей М. (2006-10-19 13:12:00) [32]
> Palladin © (19.10.06 13:02) [32]
> например?
Например, приведи текст того самого единственного "универсального" запроса, который , по-твоему мнению, заменит ту самую кучу запросов, в неоходимости которой ты засомневался в [26].
И я тебе распишу в подробностях конкретную ситуацию, при которой твой "универсальный" запрос окажется у кота под хвостом)
Palladin (2006-10-19 13:02:00) [33]
> Такая логика запросто даст сбой при определенных условиях.
например?
Сергей М. (2006-10-19 12:46:00) [34]
> Elen © (19.10.06 12:43) [29]
О скорости речи не идет, да и особый это разговор.
Сергей М. (2006-10-19 12:45:00) [35]
> Ketmar © (19.10.06 12:41) [28]
Это частный случай.
Такая логика запросто даст сбой при определенных условиях.
Но это уже тема для обсуждения в "Базы".
Elen (2006-10-19 12:43:00) [36]
> Правильные результаты визуализации м.б. получены только
> так.
Не спорю, А скорость выполнения такого не упадет?
Ketmar (2006-10-19 12:41:00) [37]>[27] Сергей М.(c) 19-Oct-2006, 12:27
>Если возражаешь - приведи контраргументы)...
есть ещё куча всяких способов. с ходу: получить всё скопом один раз и потом уже разгребать.
Сергей М. (2006-10-19 12:27:00) [38]
> Palladin © (19.10.06 12:23) [26]
К чему сарказм ?)
Если возражаешь - приведи контраргументы)...
Palladin (2006-10-19 12:23:00) [39]
> Правильные результаты визуализации м.б. получены только
> так.
да ну конечно только так...
Сергей М. (2006-10-19 12:19:00) [40]
> Elen © (19.10.06 11:19) [18]
> Зачем тебе постоянно делать Select?
Все верно он делает, не смущай автора.
Автор визуализирует древовидную структуру, хранящуюся в БД.
Правильные результаты визуализации м.б. получены только так.