Гость
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / поиск в TreeView / 16 сообщений из 16, страница 1 из 1
28.04.2015, 21:44
    #38947890
LeS_05
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в TreeView
подскажите,пожалуйста,как осуществить поиск в TreeView :выбрана какая-то запись в 'дереве'..необходимо проверить наличие идентичных записей во всем 'дереве' и запомнить их ParentTreeItem! ,если таковые имеются.....
...
Рейтинг: 0 / 0
28.04.2015, 22:51
    #38947947
VanoR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в TreeView
Использовать рекурсивную функцию, в которой будет вызываться FindItem с параметрами ChildTreeItem! и NextTreeItem!
...
Рейтинг: 0 / 0
28.04.2015, 23:11
    #38947975
LeS_05
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в TreeView
VanoR, а каким образом сравнение осуществлять?
...
Рейтинг: 0 / 0
28.04.2015, 23:12
    #38947977
LeS_05
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в TreeView
VanoR,можно небольшой пример???
...
Рейтинг: 0 / 0
29.04.2015, 10:58
    #38948273
VanoR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в TreeView
Примера у меня нет.

Наверно в функции нужно создать переменную типа treeviewitem, затем по очереди перебирать все узлы с помощью FindItem(ChildTreeItem!,parent_item) и FindItem(NextTreeItem!,item)... Вытаскивать с помощью GetItem в переменную типа treeviewitem и в этой переменной смотреть необходимые данные, например в Label.
...
Рейтинг: 0 / 0
29.04.2015, 11:27
    #38948318
Senger
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в TreeView
LeS_05,

У меня поиск работает так. Может поможет. Реализовано в виде функции.

Long ll_row
Long il_queue[],ll_handle,li_next,ll_child,ll_qposition,li_level
N_ds tmp_ds
Long ll_date
string ls_label

ll_handle = atv_ltvs.FindItem(RootTreeItem!, 0)
Do While ll_handle > 0
li_next = upperbound(il_queue) + 1
il_queue[li_next] = ll_handle
ll_handle = atv_ltvs.FindItem(NextTreeItem!, ll_handle)

Loop

ll_qposition = 1
DO
ll_handle = il_queue[ll_qposition]

atv_ltvs.inv_levelsource.of_GetDataRow(ll_handle,tmp_ds, ll_row)
ll_date = tmp_ds.GetItemNumber(ll_row,as_cldata)
ls_label = tmp_ds.GetItemString(ll_row,as_cllabel)

if ((ll_date = al_data and ls_label = al_label)) then // Условие для al_data,al_label - передаются в функцию
atv_ltvs.ExpandAll(ll_handle)
atv_ltvs.selectitem(ll_handle)
return
end if
atv_ltvs.ExpandItem(ll_handle)
ll_child = atv_ltvs.FindItem(ChildTreeItem!, ll_handle)
atv_ltvs.CollapseItem(ll_handle)
Do While ll_child > 0
li_next = upperbound(il_queue) + 1
il_queue[li_next] = ll_child
ll_child = atv_ltvs.FindItem(NextTreeItem!, ll_child)
Loop
ll_qposition++

Loop until ll_qposition > upperbound(il_queue)

P.S. дерево унаследовано от u_tvs
...
Рейтинг: 0 / 0
29.04.2015, 11:30
    #38948326
Senger
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в TreeView
LeS_05,
Добавлю.
я просто раскрываю дерево на найденном элементе, и прекращаю поиск.
...
Рейтинг: 0 / 0
29.04.2015, 12:59
    #38948493
PaulJB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в TreeView
А с какой, если не секрет, целью это делается?
Просто, может, задачу можно решить как-то по другому?
...
Рейтинг: 0 / 0
29.04.2015, 13:20
    #38948534
LeS_05
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в TreeView
PaulJB, нужно найти в какие еще узлы входит выбранный элемент.
...
Рейтинг: 0 / 0
29.04.2015, 13:34
    #38948561
Raven A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в TreeView
LeS_05,
а может PaulJB прав?
Например поискать в источнике данных для дерева?
...
Рейтинг: 0 / 0
29.04.2015, 13:46
    #38948583
LeS_05
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в TreeView
Raven A,искал..но смог реализовать только через рекурсивный запрос oracle, выполнение которого занимает не мало времени... из за использования connect by prior
может,кто подскажет как сократить время выполнения(в общей сложности в таблицах 1,5 млн записей..и это все занимает ~1,5мин)?

select distinct
elem_id_kuda,
prj_elem.elem_id,
a.prim_kolvo
from prj_primen a, prj_elem, prj_elem c
where prj_elem.elem_id=a.elem_id
and c.elem_id=a.elem_id_kuda
and c.revision=a.num_izm
and a.elem_id=:a
start with a.elem_id=:b
connect by prior a.elem_id=a.elem_id_kuda;
...
Рейтинг: 0 / 0
29.04.2015, 14:10
    #38948627
Raven A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в TreeView
LeS_05,
Понятно, но я имел ввиду несколько другое.
Не зная постановки задачи и контекста, просто поток мыслей, уж извините :)
Исходя из допущений, что:
- дерево надо строить в любом случае
- данные уже "на борту"
- данные - плоская табл. типа [node_id],[parent_id],[node_name]
можно просто ids_TreeData.Filter( ... )
...
Рейтинг: 0 / 0
29.04.2015, 14:14
    #38948634
PaulJB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в TreeView
Мда ... грузить полтора ляма в дерево - жестко :)
Как я понял, то надо найти похожие записи и к ним вывести список узлов (для каждой)?
Это дело для БД, билдер тут не причем.
Я бы делал так (если правильно понял задачу): нашел записи, претенденты и для каждой найденной определил бы узлы с помощью sys_connect_by_path.
...
Рейтинг: 0 / 0
04.05.2015, 15:29
    #38951149
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в TreeView
Oracle вообще очень интересная вещь, скорее даже не вещь, а философия.
Решение данной задачи может быть основано на различных принципах (дерево, окно данных, синтетический ключ, вычисляемое поле, кластерный индекс, обратный индекс и т.д.).
Если это разовая операция, то 1.5 минуты на 1.5 миллиона вполне себе приемлемое решение.
Если нет - нужно оптимизировать. Как оптимизировать - смотреть задачу. Возможно просто не нужна такая куча действий и такой глобальный поиск с построением дерева.
...
Рейтинг: 0 / 0
05.05.2015, 19:31
    #38952112
PL99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в TreeView
LeS_05может,кто подскажет как сократить время выполнения(в общей сложности в таблицах 1,5 млн записей..и это все занимает ~1,5мин)?
Неплохо было бы привести план запроса. Не удивлюсь, если увижу там фуллскан.

LeS_05
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 select distinct
	       elem_id_kuda, 
			 prj_elem.elem_id,
			 a.prim_kolvo
  from prj_primen a, prj_elem, prj_elem c
 where prj_elem.elem_id=a.elem_id
	and c.elem_id=a.elem_id_kuda
	and c.revision=a.num_izm
        and a.elem_id=:a
start with a.elem_id=:b
connect by prior a.elem_id=a.elem_id_kuda;

И у меня одного вызывают сомнения выделенные места?
...
Рейтинг: 0 / 0
06.05.2015, 16:57
    #38952853
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск в TreeView
Мда, наверняка так и есть. Планчик в студию:)
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / поиск в TreeView / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]