powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Возможно ли получить ссылку на DWObject по его номеру?
13 сообщений из 38, страница 2 из 2
Возможно ли получить ссылку на DWObject по его номеру?
    #32389828
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 PL99
в приведенном примере вы потеряете все данные, которые были в dataobjecte... задача же была скопировать колонку с данными или добавить новый столбец и заполнить его какими-то данными...
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32389840
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 dGrichine
Пример был приведен именно (и только) в качестве примера :-) динамического создания колонки...
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32389873
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторзачем же строить/изобретать статический сортировщик, если сортировать прекрасно умеет dataobject... пример с сортировкой массива с использованием динамически создаваемого datastore, который я приводил выше, прекрасно с эти справляется.

А затем, что в динамически созданном ты не сможешь данные вынимать через dot notation в array в одну строку, поскольку к твоему сожалению захардкодить имена не удастся :-)

авторможно, но какой смысл так делать?
Смысл вытекает из идиотизма задачи типа:
Пусть есть объект DataStore, сформированный и заполненный динамически НЕСВЯЗАННЫМИ между собой данными. Необходимо произвести сортировку данных одного или нескольких объектов, входящих с состав этого DataStore так, чтобы соседние данные остались на прежних местах...

Повторю ещё раз, хошь динамически, делай строковый перебор, хочешь статически, хардкодируя - вот тут для тебя сделали поблажку в design time в виде shortcutа из array assignments
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32389874
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор...задача же была добавить новый столбец и заполнить его какими-то данными (без потери данных в остальных столбцах)...
Эта задача не решается ВНЕ ЗАВИСИМОСТИ от возможности получить ссылку на DWObject по его номеру...
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32390771
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, о примере когда хорошо бы получать ссылку на DWObject.

Есть у нас DataWindow с какими-то манипуляциями на ItemChanged, сделано окошко, все работает.
И тут, вас просят разместить на окне кнопку, нажав на которую в текущее поле (если оно datetime) попадает, к примеру, текущее время.
Не пригодился ли бы тут DWObject?
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32391024
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСмысл вытекает из идиотизма задачи
Из того что, тебе такая задача в жизни не встретилась совсем не значит, что она идиотская... теперь я не удивлюсь, что ты придерживаешься мнения, что все, что не может делать PB, или все, что ты не можешь в нем реализовать, являются идиотскими идеями и задачами :)
авторА затем, что в динамически созданном ты не сможешь данные вынимать через dot notation в array в одну строку, поскольку к твоему сожалению захардкодить имена не удастся :-)
см пример с сортировкой массива, который я указал выше, смотри там строчку:
Код: plaintext
1.
// get back the array
ll_array = lds_temp.object.a.current

или по твоему это не извлечение данных в массив через dot notation одной строчкой кода?
получив ссылку на DWObject динамически, я могу сделать тоже самое
Код: plaintext
1.
2.
DWObject dwobjectvar
dwobjectvar = lds_temp.object.get_attribute(  "a" ,True) 
ll_array = dwobjectvar.current

или опять скажешь, что низззя? :)

авторПовторю ещё раз, хошь динамически, делай строковый перебор...
ну это мы уже обсудили, как лучше присваивать массивы между собой...
а вот тут:
авторхочешь статически, хардкодируя - вот тут для тебя сделали поблажку в design time в виде shortcutа из array assignments
что и требовалось доказать - различия между run time & design time есть .
в design time поблажка есть, а в run time нет... что меня удивило и о чем я говорил ранее...

авторЭта задача не решается ВНЕ ЗАВИСИМОСТИ от возможности получить ссылку на DWObject по его номеру...
ты сам то пробовал? или это твое ИМХО?
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32391210
Ermak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 dGrochine
автор автор
А затем, что в динамически созданном ты не сможешь данные вынимать через dot notation в array в одну строку, поскольку к твоему сожалению захардкодить имена не удастся :-)

см пример с сортировкой массива, который я указал выше, смотри там строчку:
// get back the array
ll_array = lds_temp.object.a.current

или по твоему это не извлечение данных в массив через dot notation одной строчкой кода?


В приведенном Вами примере: ll_array = lds_temp.object. a .current

Имя колонки известно в момент создания dataStore:
Код: plaintext
string ls_dsdef = 'release 6; datawindow() table(column=(type=long name=a dbname="a") )'


Видите?
Так что, в данном случае при использовании dot notation имеет место быть явное указание (так называемый хардкодинг) имени колонки.

Мне интересно, как Вы решите подобную задачу, если DataWindow
заменить на Excel?

Тоже хочется что бы не зная ничего о структуре данных в листе Excel'я, просто взять и скопировать допустим колонку №5 в массив, просто одним оператором присвоения.
Что бы не гемороитья вообще никак.
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32391251
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Ermak
авторТак что, в данном случае при использовании dot notation имеет место быть явное указание (так называемый хардкодинг) имени колонки.
это понятно... lds_temp.object.a это и есть DWObject

посмотрите на пример чуть ниже, где я могу получить ссылку на DWObject без указания имени, просто по номеру
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
DWObject dwobjectvar
dwobjectvar = lds_temp.object.get_attribute(  "a" ,True) 
// или
i =  1 
dwobjectvar = lds_temp.object.get_attribute(  "#" +string(i),True) 

ll_array = dwobjectvar.current

здесь тоже хардкоддинг?
тогда в функции <datawindow>.Describe(<ColunmName>.<ColProperty>) тоже присутствует хардкоддинг...

другое дело, что стандартной функции получения DWObject'a по его имени или номеру нет...

про Excel ничего сказать не могу, сорри...
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32391297
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да ладно вам спорить впустую.
Если надо DWObject - используйте get_attribute, просто нужно помнить что в разных версиях - разное имя и в будущих версиях оно вообще может быть удалено.
Пока же известно, что в версиях 6-10 эта ф-я есть (про предыдущие не знаю).
Значит пишем что-то вроде этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Environment env
GetEnvironment(env)
If env.PBMajorRevision >  6  And env.PBMajorRevision <=  10  Then
   ldwo = dw_1.Object.__get_attribute( "aa" , True)
ElseIf env.PBMajorRevision =  6  Then
   ldwo = dw_1.Object.get_attribute( "aa" , True)
Else
   // здесь возможно не поддерживается
End If
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32391312
Ermak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автордругое дело, что стандартной функции получения DWObject'a по его имени или номеру нет...

В том-то и дело, что нет. Ох и не спроста же его уже столько лет всё нет и нет.

Все-таки я бы не стал использовать get_attribute(...), в виду её недокументированности. Для меня стабильность (надежность) работы приложения значат больше моего удобства кодирования.
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32391438
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДа ладно вам спорить впустую.
согласен с Anatoly Moskovsky, спор прекращаю :)
надеюсь, что хоть что-то полезное из этого топика можно почерпнуть

и напоследок, наколенный пример копирования колонки датасторе с данными, без использования ненависной get_attribute() :)

Код: 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.
string    ls_syntax_source, ls_syntax_target, ls_error, ls_tmp, ls_col[]
integer   li_rc, i, li_cols, li_rows
any       la_any[], la_null[]

datastore lds_source, lds_target

lds_source = create datastore 
lds_target = create datastore 

// создадим и заполним lds_source
ls_syntax_source = 'release 6; datawindow() table(column=(type=date name=c1 dbname="c1"))'
li_rc = lds_source.Create(ls_syntax_source, ls_error)

la_any[ 100 ] = today()
for i =  99  to  1  step - 1 
	la_any[i] = RelativeDate ( la_any[i +  1 ],  1  ) 
next

lds_source.object.c1.Primary = la_any[]

// создадим lds_target на основе lds_source и добавим одну колонку
li_cols = integer(lds_source.describe( "Datawindow.Column.Count" ))

for i =  1  to li_cols
	ls_col[ 1 ] = lds_source.describe( "#"  + string(i) +  ".ColType" )
	ls_col[ 2 ] = lds_source.describe( "#"  + string(i) +  ".Name" )
	ls_col[ 3 ] = lds_source.describe( "#"  + string(i) +  ".DbName" )
	ls_tmp += 'column=(type='+ls_col[ 1 ]+ ' name=' + ls_col[ 2 ] + ' dbname="' + ls_col[ 3 ] + '")' +  "~r~n" 
next

//ls_col[ 2 ] += '_' // можем изменить имя
ls_tmp    += 'column=(type='+ls_col[ 1 ]+ ' name=' + ls_col[ 2 ] + ' dbname="' + ls_col[ 3 ] + '")'  

// построим новый синтаксис
ls_syntax_target = 'release 6; datawindow() table(' + ls_tmp + ')'
// создадим lds_target
li_rc = lds_target.Create(ls_syntax_target, ls_error)

li_rows = lds_source.RowCount()
// пройдемся по столбцам и переприсвоим данные одного dataobject'a другому
for i =  1  to li_cols
	lds_target.object.data[ 1 ,i,li_rows,i] = lds_source.object.data[ 1 ,i,li_rows,i]
next
// или это можно сделать одним куском, если добавляем колонку в конец

// получим данные первого столбца lds_source
i =  1 
la_any[] = lds_source.object.data[ 1 ,i,li_rows,i]

// присвоим их последнему столбцу lds_target
lds_target.object.data[ 1 ,li_cols +  1 ,UpperBound(la_any),li_cols +  1 ] = la_any[]

// пересоздадим lds_source уже на основе нового синтаксиса
li_rc = lds_source.Create(lds_target.Describe( "DataWindow.Syntax" ), ls_error)

// заполним его новыми данными
li_rc = lds_target.RowsCopy(lds_target.GetRow(), lds_target.RowCount(), Primary!, lds_source,  1 , Primary!)
// или одним куском
//lds_source.object.data[ 1 , 1 ,lds_target.RowCount(),integer(lds_target.describe( "Datawindow.Column.Count" ))] = lds_target.object.data[ 1 , 1 ,lds_target.RowCount(),integer(lds_target.describe( "Datawindow.Column.Count" ))]

// разрушим ненужный lds_target
destroy lds_target

// выведем результат
messageBox(lds_source.Describe( "Datawindow.Column.Count" ), String(lds_source.RowCount()))

destroy lds_source

return
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32391479
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор// пересоздадим lds_source уже на основе нового синтаксиса
Код: plaintext
1.
2.
3.
4.
5.
li_rc = lds_source.Create(lds_target.Describe( "DataWindow.Syntax" ), ls_error)

// заполним его новыми данными
li_rc = lds_target.RowsCopy(lds_target.GetRow(), lds_target.RowCount(), Primary!, lds_source,  1 , Primary!)
// или одним куском
//lds_source.object.data[ 1 , 1 ,lds_target.RowCount(),integer(lds_target.describe( "Datawindow.Column.Count" ))] = lds_target.object.data[ 1 , 1 ,lds_target.RowCount(),integer(lds_target.describe( "Datawindow.Column.Count" ))]


Кстати, то что идёт после фразы " или одним куском ", никому не нужно, у lds_source и lds_target теперь ведь dataobjectы одинаковые, надо просто вот так:
Код: plaintext
lds_source.object.data = lds_target.object.data
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32392095
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу получения ссылки на DWO (соседний топик навеял :)
Код: plaintext
1.
2.
3.
4.
5.
6.
dw_1.SetRedraw(False)
ls_err = dw_1.Modify('create column (id=' + String(li_col) + &
' name=tmpdwo band=detail  x="1" y="1" height="1"  width="1" )')
ldwo = dw_1.Object.tmpdwo
ls_err = dw_1.Modify('destroy tmpdwo')
dw_1.SetRedraw(True)


Правда тут свойства теряются, но зато данные есть. :)
И их можно изменять (изменения отражаются в исходном DW) :
Код: plaintext
ldwo.Primary = { "T1" ,  "T2" ,  "T3" }
...
Рейтинг: 0 / 0
13 сообщений из 38, страница 2 из 2
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Возможно ли получить ссылку на DWObject по его номеру?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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