powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Возможно ли получить ссылку на DWObject по его номеру?
38 сообщений из 38, показаны все 2 страниц
Возможно ли получить ссылку на DWObject по его номеру?
    #32386526
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например

integer li_cols, i
any la_any[]
DWObject dwobjectvar

li_cols = Integer(ds_1.Describe("DataWindow.Column.Count"))
for i = 1 to li_cols
// тут необходимо получить ссылку на соответствующий i DWObject
//dwobjectvar = ds_1.object.#i
la_any[] = dwobjectvar.Primary
...
// далее некие действия
next
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32386581
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По имени можно вот так
http://lokshinmark.narod.ru/tips.htm#tip0017
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32386622
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо,
оказывается по номеру тоже можно, например так:

integer li_cols, i
any la_any[]
DWObject dwobjectvar

li_cols = Integer(ds_1.Describe("DataWindow.Column.Count"))
for i = 1 to li_cols
// тут необходимо получить ссылку на соответствующий i DWObject
dwobjectvar = ds_1.object.get_attribute( "#"+string(i),True)
la_any[] = dwobjectvar.Primary
...
// далее некие действия
next
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32386663
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем это дурацкая практика, поскольку:
1) чаще всего это просто не нужно
2) синтаксис этот (get_attribute) НЕ документирован, НЕ поддержан, и меняется от версии к версии РВ
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32386694
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен, что пользоваться недокументированными функциями нехорошо...

Но меня немного удивляет, что стандартными и документированными средствами билдера нельзя в рантайме получить ссылку на DWObject по его имени или номеру...
Во время разработки в коде можно указать:

DWObject ldwo

ldwo = dw_1.Object.colname
или
ldwo = dw_1.Object.#1

а рантайме стандартными средствами этого делать нельзя...

чем можно объяснить отстутсвие стандартных средств?
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32386702
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторчем можно объяснить отстутсвие стандартных средств?

Тем, что кажущаяся необходимость его получить есть верный признак проблем в дизайне твоей логики/скриптинга...
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32387477
andy753
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть подозрение, что скорее проблема не в дизайне, а в методологическом взгляде на вещи. Скорее всего dGrichine привык работать с объектами, посему и пытается работать с DW не как с целостным объектом, а как с контейнером...

Я бы просто рекомендовал поработать и попрактиковаться в использовании Describe в DW ему. Надеюсь, это уберет максимум вопросов. :)
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32388153
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все заключается в том, что приложение, которым я занимаюсь является на 100% невизуальным, работаю только с DataStore (в первом постинге не зря указано ds_1), которые создаются в рантайме с помощью SyntaxFromSQL, следовательно ничего о количестве, наименовании и типе объектов во время написания скрипта я знать не могу и не знаю. Иметь же к ним (объектам) доступ в рантайме мне необходимо.
Еще раз повторюсь, что мне кажется странным:
С одной стороны при дизайне и скриптинге DataWindow или DataStore с заранее определенными объектами получить ссылку на них можно как по наименованию так и по номеру. И это не называется кривостью дизайна/скриптинга, а является стандартным и описанным в документации методом работы с объектами входящими в состав DataStore.
С другой же стороны, при работе с DataStore созданными во время выполнения все происходит с точностью до наоборот - получить ссылку на объект нельзя ни по номеру ни по наименованию и попытка ее получить - называется неправильной логикой приложения...

Самое интересное, что потребность в таком доступе существует, стоит только поискать обсуждение этой темы на форумам самого sybase'a... Там периодически обсуждают эту тему начиная, по-моему, с 98 года... Итог всего этого: потребность есть, скрытая возможность есть, а в добавить функцию в стандартные почему то не торопятся...
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32388166
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поддерживаю мнение dGrichine по этому вопросу. Действительно, весьма не ясно, почему к 9 версии нельзя было исправить.
Ну это из серии наличия объекта DataWindowChild в PowerBuilder'е, невозможности приведения объектов DataStore к DataWindow и обратно.
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32388217
Ermak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 dGrichine
автор// далее некие действия

Можно узнать, что это за некоторые действия?
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32388252
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторС одной стороны при дизайне и скриптинге DataWindow или DataStore с заранее определенными объектами получить ссылку на них можно как по наименованию так и по номеру. И это не называется кривостью дизайна/скриптинга, а является стандартным и описанным в документации методом работы с объектами входящими в состав DataStore.
С другой же стороны, при работе с DataStore созданными во время выполнения все происходит с точностью до наоборот - получить ссылку на объект нельзя ни по номеру ни по наименованию

Сие утверждение ложно. НИКАКОЙ разницы в том, что можно получить во время выполнения и при дизайне НЕТ. И там и там ты можешь обращаться с "объектами" сидящими внутри dataobjectа одинаково - или через Descirbe/Modify, или через dot notation.
Ссылку на TYPE DWObject ты получаешь ТОЛЬКО в событиях, предопределенных Sybaseом, и в плане этих ссылок разницы между runtime и design time нет .
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32388284
andy753
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To: Филипп Тут скорее всего речь идет не о "... во время выполнения и при дизайне ..." а о двух двух разных "типов" DW - созданных заранее и о которых мы знаем всю инфу и можем в скриптах напрямую работать с колонками...., и созданных динамически (например по синтаксису).

To: all
Так как народ (наверное в силу определенных причин) усиленно не хочет пользовать Descirbe/Modify (не совсем понятно почему...), то мучается с дот нотацией и удивляется - почему это не было сделано или сделано криво... Все это мне немного напоминают танцы с бубнами с API Windows :). Когда народ начинает юзать недокументированные функции и потом кричит, что мол все криво.

Чесно говоря - не совсем понимаю, почему Вы так до сих пор не работаете с Descirbe/Modify, может хоть пример приведете, где они "не спасают"? Тем более, насколько мне известно - работа с дот нотацией неэффективна (тормозит). Объясните, плиз...
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32388305
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy753 , опять за рыбу деньги продаем - никакой разницы между авторDW - созданных заранее и о которых мы знаем всю инфу и можем в скриптах напрямую работать с колонками...., и созданных динамически (например по синтаксису) НЕТ .
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32388327
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Филипп
Ссылку на TYPE DWObject ты получаешь ТОЛЬКО в событиях, предопределенных Sybaseом, и в плане этих ссылок разницы между runtime и design time нет.

Вот с этим позвольте не согласиться. Ссылку на DWObject объект я могу получить в design time где угодно, а не только в событиях DataWindow(DataStore) - см Help - Using the DWObject variable, а вот в run time этого сделать не удастся.

Филипп
НИКАКОЙ разницы в том, что можно получить во время выполнения и при дизайне НЕТ. И там и там ты можешь обращаться с "объектами" сидящими внутри dataobjectа одинаково - или через Descirbe/Modify, или через dot notation.

Изменять свойства объекта с помошью функций Descirbe/Modify это одно, а вот иметь ссылку на сам объект это совсем другое...
Как ты получишь/изменишь свойства объекта в run time с помощью dot natation если имена и количество объектов тебе заранее неизвестно?

В моем первом постинге есть пример того что мне сделать не удалось в run time. Если вам удастся заполнить в run time массив значений la_any[] из primary буфера какой-либо колонки с помощью Describe и без использования цикла с пробегом от первой строки до последней, то попрошу пример кода...
Но, думаю, навряд ли это удастся сделать эффективнее чем la_any[] = ds_1.object.#23.Primary

Только не спрашивайте зачем, раз уж разницы нет, то покажите как...
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32388343
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКак ты получишь/изменишь свойства объекта в run time с помощью dot notation если имена и количество объектов тебе заранее неизвестно?

Количество, номера (да и имена, поскольку номера) объектов известны ВСЕГДА, а для получения/изменения свойств имена вообще НЕ нужны, поэтому любой dot notation для получения/изменения свойств работает.

Код: plaintext
Ссылку на DWObject объект я могу получить в design time 

Ну да, всё захардкодируя, при этом неизвестно хорошо это или нет, причём ясно, что используешь ты эту ссылку ТОЛЬКО опять для получения/изменения свойств, потому как datу ты из этой ссылки вынуть всё равно не можешь.

То есть единственный случай, когда твои претензии хоть сколько нибудь обоснованы, это dot notation Syntax for one or all data items in ONE named column, OK, только в чём проблема с использования цикла с пробегом от первой строки до последней, раз тебе так уж понадобилось оперировать с ОДНОЙ колонкой с неизвестным именем?
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32388394
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, ну и зачем DataWindowChild в PowerBuilder'е присутствует? :)
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32388397
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А простите, причём здесь DataWindowChild?
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32388405
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну к DWObject'у он, конечно, не при чем, но все-же как-то навеяло :), почему в PowerBuilder'е функция GetChild возвращает DataWindowChild, а не DataWindow/DataStore? Вообще-то вопрос даже более чем интересный (по крайней мере, лично для меня).
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32388434
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКоличество, номера (да и имена, поскольку номера) объектов известны ВСЕГДА, а для получения/изменения свойств имена вообще НЕ нужны, поэтому любой dot notation для получения/изменения свойств работает.
что то мы о разном говорим, наверное...
я так и не пойму, как можно имея номер или имя объекта (их всегда можно получить) использовать dot notation в run time
приведу пример:
попытаюсь получить тип колонки в run time, получая в run time же наименование и номер колонки...
Только не говорите, что для этих целей надо использовать Describe... знаю...
но раз говорят, что см цитату выше, то как это сделать я не пойму...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
integer li_cols, i
string  ls_colname, ls_coltype

li_cols      = Integer(ads.Describe( "DataWindow.Column.Count" ))
for i =  1  to li_cols
	ls_colname = ads.Describe( "#"  +string(i)+  ".Name" )
	ls_coltype = ads.object.ls_colname.Coltype 
	ls_coltype = ads.object.#i.Coltype
next

в обоих случаях получаем system error:
Error Number = 36
Error text = Name not found accessing external object property ls_colname
и
Error Number = 36
Error text = Name not found accessing external object property #i

автор...причём ясно, что используешь ты эту ссылку ТОЛЬКО опять для получения/изменения свойств, потому как datу ты из этой ссылки вынуть всё равно не можешь.
имея ссылку на DWObject я могу изменять как данные так и свойства, но мне нужны данные, которые я могу вынуть, манипулировать ими... получив массив с данными, я могу их изменить и заново присвоить их объекту, пример см Real's HowTo @ www.rgagnon.com
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Sort an array
We create a small datastore and use it to sort our array. datastore lds_temp
string ls_err
integer i

// change the datastore definition according to the array data type
long ll_array[] = {  2  ,  3 ,  6 ,  5  }
string ls_dsdef = &
   'release 6; datawindow() table(column=(type=long name=a dbname="a") )'

lds_temp = CREATE datastore
lds_temp.Create(ls_dsdef, ls_err)
// put the array in the datastore
lds_temp.object.a.current = ll_array
lds_temp.SetSort( "a ASC" )
lds_temp.Sort()
// get back the array
ll_array = lds_temp.object.a.current

FOR i =  1  to Upperbound(ll_array)
  MessageBox("", string(ll_array[i]))
NEXT

DESTROY lds_temp


а вот используя стандартый механизм
Код: plaintext
1.
2.
for i =  1  to li_cols
      la_any[] = ads.object.data[ 1 ,i,ads.RowCount(),i]
next

я, действительно не смог достучаться до данных, массив la_any[] в таком случае выглядит как массив структур... (кстати, надо будет попробовать со структурой)
автор
только в чём проблема с использования цикла с пробегом от первой строки до последней, раз тебе так уж понадобилось оперировать с ОДНОЙ колонкой с неизвестным именем?
бегать по строкам и получать данные можно, но для этого нужно использовать набор функций GetItemDate, GetItemString, GetItemNumber и т.д.... чтобы их использовать, мне нужно определить тип каждой колонки и писать что-то типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CHOOSE CASE left(ads.Describe( "#" +string(i)+ ".Coltype" ), 4 )
	CASE 'char'
		тут используем GetItemString
	CASE 'deci'
		тут используем GetItemDecimal
	CASE <item>
		<statementblock>
		... т.д.
END CHOOSE

в случае же, если мне надо получить ВСЕ данные из DWObject, мне кажется проще и эффективнее использовать la_any[] = dwobjectvar.Primary
не говоря уже о быстродействии беганья по строкам
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32388453
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторбегать по строкам и получать данные можно, но для этого нужно использовать набор функций GetItemDate, GetItemString, GetItemNumber и т.д.... чтобы их использовать, мне нужно определить тип каждой колонки и писать что-то типа
Есть ерунда, делается это так:
Код: plaintext
1.
any	 lany
lany = ads.object.data[row, i])

где i - номер колонки.

А тут очепятка, вот так должно быть:
Код: plaintext
а для получения/изменения свойств имена вообще НЕ нужны, а любой dot notation для получения/изменения данных работает

(поскольку номер колонки известен, а получения/изменения свойств делаются естественно через Describe/Modify, что в любом случае лучше с точки зрения error handling)

авторно мне нужны данные, которые я могу вынуть, манипулировать ими... получив массив с данными, я могу их изменить и заново присвоить их объекту
...и далее идёт пример сортировки - блестящая идея, вынуть данные из объекта, который знает как и умеет сортировать, засунуть их в специально созданный объект (такого же класса, который умеет и знает тоже самое), потом нести их обратно.

Вы бы может поточнее задачу обрисовали, которую на самом деле решать пытаетесь, вместо того, чтоб сначала "решить", как вы её решать хотите, а потом жаловаться, что PowerBuilderное одеяло не натягивается на некоторые из ног вашего "решения"...
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32388574
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тебе про Фому, ты мне про Ерему... :)

Я тебе говорю, что иметь ссылку на DWObject полезно, указываю место в документации, ты мне говоришь, что-то про проблемы дизайна, хардкоддинг и одеяло :)

Я тебе говорю что получить ссылку на DWObject в design time можно, а в run time нельзя, ты мне говоришь, что нет никакой разницы... раз уж так, приведи пример.

Ты мне говоришь, что нельзя манипулировать данными из DWObject'а, я тебе показываю что это сделать довольно легко, привожу пример с сортировкой массива. Пример приведен, только для доказательства такой возможности.

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

И еще одна задача:
Необходимо в заполненный DataStore добавить копию какой-нибудь колонки, т.е. было 10 столбцов, стало 11, т.е. реализовать что-то типа
ds_1.AddColumn(name, type, data[], columnplace)
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32388588
andy753
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
)) ну просто Ексел какой-то получается... Сори за офтоп.
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32389692
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЯ тебе говорю что получить ссылку на DWObject в design time можно
ТОЛЬКО захардкодив имена, понятно, что дальше продолжать бессмысленно.

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

Ну так и что, из динамически сделанных колонок вынимать данные (и вставлять их) строковым перебором (причём можно и без лишнего CASTинга, как я показал выше), а сортировщик можно построить статический, со колонками всех типов данных и для вставления/вынимания данных в него/из него использовать dot notation и array asignments, всех дел то...

авторИ еще одна задача:
Необходимо в заполненный DataStore добавить копию какой-нибудь колонки, т.е. было 10 столбцов, стало 11, т.е. реализовать что-то типа

Ну а с этим вообще непонятно, при чём здесь DWObject, когда весь dataobject заново CREATEать надо...
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на DWObject по его номеру?
    #32389812
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ФилиппНу а с этим вообще непонятно, при чём здесь DWObject, когда весь dataobject заново CREATEать надо
Для External DатаWindow в свое время было опубликовано решение...
Заранее прошу прощения за длинную цитату, но может кому-то пригодится :-)

Код: 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.
Вот пpимеp скpипта. Я добавлял колонку c3 в External DataWindow
о двух колонках. Опpобовано на  6 . 5 

==== Hачало файла ADDCOL.TXT ====
string ls_syntax   // Синтакс DW
int    li_cnt      // Счетчик скобок
long   ll_cnt      // Счетчик символов
string ls_current  // Текущий символ

// Получаем синтакс
ls_syntax=dw_sheet.describe('DataWindow.Syntax')

// Ищем в нем конец table
li_cnt= 1 
FOR ll_cnt=pos(ls_syntax,'table(')+ 6  TO len(ls_syntax)
   // Ищем скобки
   ls_current=mid(ls_syntax,ll_cnt, 1 )
   IF ls_current='(' THEN
      li_cnt++
   LSEIF ls_current=')' THEN
      li_cnt  --
 
   END IF

   // Может, уже все нашли
   IF li_cnt= 0  THEN EXIT
NEXT

// Конец секции table найден - теперь вставляем колонку
// Имя колонки и тип вставляешь нужные (в примере c3 - char( 100 ))
ls_syntax=mid(ls_syntax, 1 ,ll_cnt - 1 )+&
             'column=(type=char(100) name=c3 dbname="c3" )'+&
              mid(ls_syntax,ll_cnt, 99999 )

// Создаем DataWindow заново
dw_sheet.create(ls_syntax)

// Делаем колонку c3 видимой
// Здесь можно вообще перечислять все атрибуты, Hо было лень все это писать
// Это можно сделать и непосpедстенно чеpез синтакс
// id - поpядковый номеp колонки в table()
dw_sheet.modify('create column( id=3 tabsequence=30 band=detail y="4"'+&
                ' x="200" height="60" width="200" name=c3 '+&
                'background.color="1086902488" color="33554432")')
==== Конец файла ADDCOL.TXT ====
Vlad.

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

авторНу так и что, из динамически сделанных колонок вынимать данные (и вставлять их) строковым перебором (причём можно и без лишнего CASTинга, как я показал выше)
можно, но какой смысл так делать? Данные в колонке уже являются массивом и вынуть/вставить их можно простым присваиванием этого массива локальному массиву.
Я никогда не поверю, что при копировании содержимого массивов из одного в другой ты ходишь по одному перебором (от первого элемента к последнему или от последнего к первому) и вставляешь данные поэлементно в другой... Копирование всех данных из DWObject'a в массив и обратно это как раз частный случай присвоения одного массива другому.

автора сортировщик можно построить статический, со колонками всех типов данных и для вставления/вынимания данных в него/из него использовать dot notation и array asignments, всех дел то...
зачем же строить/изобретать статический сортировщик, если сортировать прекрасно умеет dataobject... пример с сортировкой массива с использованием динамически создаваемого datastore, который я приводил выше, прекрасно с эти справляется.

авторНу а с этим вообще непонятно, при чём здесь DWObject, когда весь dataobject заново CREATEать надо...
правильно, dataobject придется пересоздавать, а вот чтобы данные из него не потерять тут как раз пригодилась бы прямая ссылка на DWObject. Но при копировании содержимого одного DWObjecta в другой этого можно избежать и использовать dot notation, как я показывал выше.
А если необходимо не копировать, а присвоить новой колонке какие-то другие данные, находящиеся в локальном одномерном массиве, то без ссылки на DWObject не обойтись...

авторТОЛЬКО захардкодив имена, понятно, что дальше продолжать бессмысленно.
Согласен, продолжать бессмысленно... доводы друг друга мы знаем и остались при своих мнениях...
...
Рейтинг: 0 / 0
Возможно ли получить ссылку на 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
38 сообщений из 38, показаны все 2 страниц
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Возможно ли получить ссылку на DWObject по его номеру?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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