powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / поиск в TreeView
16 сообщений из 16, страница 1 из 1
поиск в TreeView
    #38947890
LeS_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
подскажите,пожалуйста,как осуществить поиск в TreeView :выбрана какая-то запись в 'дереве'..необходимо проверить наличие идентичных записей во всем 'дереве' и запомнить их ParentTreeItem! ,если таковые имеются.....
...
Рейтинг: 0 / 0
поиск в TreeView
    #38947947
VanoR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использовать рекурсивную функцию, в которой будет вызываться FindItem с параметрами ChildTreeItem! и NextTreeItem!
...
Рейтинг: 0 / 0
поиск в TreeView
    #38947975
LeS_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VanoR, а каким образом сравнение осуществлять?
...
Рейтинг: 0 / 0
поиск в TreeView
    #38947977
LeS_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VanoR,можно небольшой пример???
...
Рейтинг: 0 / 0
поиск в TreeView
    #38948273
VanoR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примера у меня нет.

Наверно в функции нужно создать переменную типа treeviewitem, затем по очереди перебирать все узлы с помощью FindItem(ChildTreeItem!,parent_item) и FindItem(NextTreeItem!,item)... Вытаскивать с помощью GetItem в переменную типа treeviewitem и в этой переменной смотреть необходимые данные, например в Label.
...
Рейтинг: 0 / 0
поиск в TreeView
    #38948318
Senger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
поиск в TreeView
    #38948326
Senger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeS_05,
Добавлю.
я просто раскрываю дерево на найденном элементе, и прекращаю поиск.
...
Рейтинг: 0 / 0
поиск в TreeView
    #38948493
PaulJB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А с какой, если не секрет, целью это делается?
Просто, может, задачу можно решить как-то по другому?
...
Рейтинг: 0 / 0
поиск в TreeView
    #38948534
LeS_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulJB, нужно найти в какие еще узлы входит выбранный элемент.
...
Рейтинг: 0 / 0
поиск в TreeView
    #38948561
Фотография Raven A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeS_05,
а может PaulJB прав?
Например поискать в источнике данных для дерева?
...
Рейтинг: 0 / 0
поиск в TreeView
    #38948583
LeS_05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
поиск в TreeView
    #38948627
Фотография Raven A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeS_05,
Понятно, но я имел ввиду несколько другое.
Не зная постановки задачи и контекста, просто поток мыслей, уж извините :)
Исходя из допущений, что:
- дерево надо строить в любом случае
- данные уже "на борту"
- данные - плоская табл. типа [node_id],[parent_id],[node_name]
можно просто ids_TreeData.Filter( ... )
...
Рейтинг: 0 / 0
поиск в TreeView
    #38948634
PaulJB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда ... грузить полтора ляма в дерево - жестко :)
Как я понял, то надо найти похожие записи и к ним вывести список узлов (для каждой)?
Это дело для БД, билдер тут не причем.
Я бы делал так (если правильно понял задачу): нашел записи, претенденты и для каждой найденной определил бы узлы с помощью sys_connect_by_path.
...
Рейтинг: 0 / 0
поиск в TreeView
    #38951149
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle вообще очень интересная вещь, скорее даже не вещь, а философия.
Решение данной задачи может быть основано на различных принципах (дерево, окно данных, синтетический ключ, вычисляемое поле, кластерный индекс, обратный индекс и т.д.).
Если это разовая операция, то 1.5 минуты на 1.5 миллиона вполне себе приемлемое решение.
Если нет - нужно оптимизировать. Как оптимизировать - смотреть задачу. Возможно просто не нужна такая куча действий и такой глобальный поиск с построением дерева.
...
Рейтинг: 0 / 0
поиск в TreeView
    #38952112
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
поиск в TreeView
    #38952853
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда, наверняка так и есть. Планчик в студию:)
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / поиск в TreeView
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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