powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Treeview And Structure
11 сообщений из 11, страница 1 из 1
Treeview And Structure
    #33616792
ex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
необходимо создать дерево (treeview).. Основание этого дерево всегда один и тот же набор folders..
е.g
Folder1
|_ ...
Folder2
|_ ...
Folder3
|_ ...

а вот содержимое этих фолдеров зависит от некоторых параметров и дергается из БД используя хр. процедуры..

я так полагаю, что рисовать главную струтуру дерева нужно при загрузки окна, струтуру заложить в Structure в виде строковых значений,
при открытии folder динамически дергать хр.процедуры дб сервера..

я начинающий в pb, подскажите как лучше сделать и если есть то пример какой-нить..

thnx a lot
...
Рейтинг: 0 / 0
Treeview And Structure
    #33617982
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Структура не обязательна.
оч кратко:

статичкские айтимы создаешь сразу с указанием что eсть дети.
ID можно держать в treeviewitem.data
если помнит надо больше чем ID, делай структуру...
на событии itempopulate берешь item что открыли, вызываешь процедуру с параметром ID и добавляешь детей.

как-то так.
...
Рейтинг: 0 / 0
Treeview And Structure
    #33619795
ex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry.Структура не обязательна.
оч кратко:

статичкские айтимы создаешь сразу с указанием что eсть дети.
ID можно держать в treeviewitem.data
если помнит надо больше чем ID, делай структуру...
на событии itempopulate берешь item что открыли, вызываешь процедуру с параметром ID и добавляешь детей.

как-то так.

- спасибо, так и сделал, все работает на ура..
...
Рейтинг: 0 / 0
Treeview And Structure
    #33620371
ex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как можно дернуть хранимую процедуру? и получить набор данных из нее? предположим, что у меня есть список хранимых процедур, возвращает только один колумн во всех случаях..
thxalot
...
Рейтинг: 0 / 0
Treeview And Structure
    #33620804
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
public function integer f_dbretrieve (long parenthandle);

int ret= 1 
string query
boolean isProcedure
treeViewItem tvi
long level
any outparm[]
long l
boolean ChildrenFound
boolean AddItem
string lock
pointer oldpointer

if db_busy then return( 0 )
db_busy=true
if parenthandle> 0  then
	GetItem(parenthandle,tvi)
	level=tvi.level+ 1 
else
	deleteItem( 0 )
	level= 1 
end if
query=""
oldpointer=SetPointer(HourGlass!)
trigger event db_prepare(ParentHandle,level,query,isProcedure)
if query<>"" then
	if isProcedure then
		DECLARE TreeViewRetrieveP DYNAMIC PROCEDURE FOR SQLSA;
	else
		DECLARE TreeViewRetrieveC DYNAMIC CURSOR FOR SQLSA;
	end if
	
	PREPARE SQLSA FROM :query using SQLCA;
	DESCRIBE SQLSA INTO SQLDA;
	lock=SQLCA.lock
	SQLCA.lock="RU"
	 f_clearTreeViewItem(tvi)
	if isProcedure then
		EXECUTE DYNAMIC TreeViewRetrieveP USING DESCRIPTOR SQLDA;
		if SQLCA.sqlcode=- 1  then 
			message.of_message(sqlca.sqlerrtext)
			ret=- 1 
		end if
		FETCH TreeViewRetrieveP USING DESCRIPTOR SQLDA;
	else
		OPEN DYNAMIC TreeViewRetrieveC USING DESCRIPTOR SQLDA;
		if SQLCA.sqlcode=- 1  then 
			message.of_message(sqlca.sqlerrtext)
			ret=- 1 
		end if
		FETCH TreeViewRetrieveC USING DESCRIPTOR SQLDA;
	end if
	ChildrenFound=false
	DO WHILE SQLCA.sqlcode= 0 
		if SQLDA.NumOutputs< 1  then continue
		for l= 1  to SQLDA.NumOutputs
			CHOOSE CASE SQLDA.OutParmType[l]
				CASE TypeDate!
					outparm[l]=SQLDA.GetDynamicDate(l)
				CASE TypeDateTime!
					outparm[l]=SQLDA.GetDynamicDateTime(l)
				CASE TypeDecimal!,TypeDouble!,TypeReal!,TypeUInt!,TypeULong!,TypeBoolean!
					outparm[l]=SQLDA.GetDynamicNumber(l)
				CASE TypeLong!
					outparm[l]=long(SQLDA.GetDynamicNumber(l))
				CASE TypeInteger!
					outparm[l]=integer(SQLDA.GetDynamicNumber(l))
				CASE TypeString!
					outparm[l]=SQLDA.GetDynamicString(l)
				CASE TypeTime!
					outparm[l]=SQLDA.GetDynamicTime(l)
			END CHOOSE
		next
		AddItem=true
		trigger Event db_retrieve_row(parenthandle,level,outparm,tvi,AddItem)
		if AddItem then			
			trigger Event ue_dbitemadded(insertItemLast(ParentHandle,tvi))
			ChildrenFound=true
		end if
		if isProcedure then
			FETCH TreeViewRetrieveP USING DESCRIPTOR SQLDA;
		else
			FETCH TreeViewRetrieveC USING DESCRIPTOR SQLDA;
		end if
	LOOP
	if SQLCA.sqlcode=- 1  then 
		message.of_message(sqlca.sqlerrtext)
		ret=- 1 
	end if
	if not ChildrenFound then
		if GetItem(ParentHandle,tvi)> 0  then
			tvi.children=false
			SetItem(ParentHandle,tvi)
		end if
	end if
	if isProcedure then
		CLOSE TreeViewRetrieveP;
	else
		CLOSE TreeViewRetrieveC;
	end if
	SQLCA.lock=lock
end if
SetPointer(oldpointer)
db_busy=false
return(ret)
...
Рейтинг: 0 / 0
Treeview And Structure
    #33620872
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exкак можно дернуть хранимую процедуру? и получить набор данных из нее? предположим, что у меня есть список хранимых процедур, возвращает только один колумн во всех случаях..
thxalot
Сделать datawindow у которого источником данных является процедура.
Использовать datastore.
что то типа такого:
datastore ds
ds = CREATE datastore
ds.dataobject = '<тут наше dw с источником sp>'
ds.SetTransObject(SQLCA)
rowcount = ds.Retrieve(...)
For row = 1 to rowCount
...
next
так будет покомпактнее чем embedded sql.

dw object-ов можно настрогать по одному на каждую хранимку, а можно сделать один dw object и менять динамически имя процедуры.
ds.Modify("DataWindow.Table.Procedure='1 execute <owner>.<procname>;1'")
...
Рейтинг: 0 / 0
Treeview And Structure
    #33620878
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и еще чтоб ловить ошибки в dberror event лучше использовать не встроенный datastore, а унаследованный от оного свой.
...
Рейтинг: 0 / 0
Treeview And Structure
    #33620888
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry.public function integer f_dbretrieve (long parenthandle);

Уау! Монстр!

It usually takes a long time to find a shorter way.
...
Рейтинг: 0 / 0
Treeview And Structure
    #33621020
ex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасиб,

так и попробую..
...
Рейтинг: 0 / 0
Treeview And Structure
    #33621379
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry.
Код: plaintext
public function integer f_dbretrieve (long parenthandle);

Ужас какой!!!
...
Рейтинг: 0 / 0
Treeview And Structure
    #33621804
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати ничего страшного нет
и работает этот код с еще 5-го билдера
и с windows 3.1
и память на тот момент была очень критична
писал для динамического, бесконечно рекурсивного тривью

с использованием DataStore, в момент после ретрайва и заполнения тривью, у вас памяти используется в 2 раза больше.

и кроме того лишних обьектов не создаю. а это тоже очень важно если у вас порядка 3000 обьектов в приложении.
--------------------------------------
пример использования моего обьекта

кидаете на форму обьект

и имплементите такие события:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
event ( long parentHandle,  integer newLevel,  ref string query,  ref boolean isProcedure )

treeviewitem ltvi
Choose case newlevel
	case  1 
		query = 'select distinct opa_famille.soc_id, opa_do.dor_code_fm from opa_famille, opa_do where opa_famille.soc_id = opa_do.soc_id' 
	case  2 
		GetItem(parenthandle,ltvi)
		query = 'select fam_id, fam_nom, fam_code from opa_famille where fam_id_pere is null and soc_id = ' + string(ltvi.Data)
	case else
		GetItem(parenthandle,ltvi)
		query = 'select fam_id, fam_nom, fam_code from opa_famille where fam_id_pere = ' + string(ltvi.Data)
end choose

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
event db_retrieve_row
newitem.PictureIndex = min(newlevel, 2 )
newitem.SelectedPictureIndex = newitem.PictureIndex
if newlevel =  1  then 
	newitem.Label = outparm[ 2 ]
else
	newitem.Label = string(outparm[ 3 ]) + " (" + string(outparm[ 2 ]) + ')'
end if
newitem.data = outparm[ 1 ]
newitem.children = true
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Treeview And Structure
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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