Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / TreeView DataWindow / 20 сообщений из 20, страница 1 из 1
20.07.2008, 01:28
    #35441073
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
Как получить список(массив) уникальных значений столбца в TreeView DataWindow 1-го уровня?
Делаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
string ls_Col
long ll_find, ll_end

ll_end = dw_1.RowCount()
ls_Col = string(dw_1.Object.Data[ 1 ,  1 ])

for ll_find =  1  to ll_end
   ll_find = dw_1.Find("#1 not in ("+ls_Col+")", ll_find, ll_end)
   IF ll_find >  0  THEN
       ls_Col = ls_Col + ", " + string(dw_1.Object.Data[ll_find,  1 ])
   else
       exit
   end if
next
Но думаю, что можно как то проще и чтобы быстрее работало.
Пробовал сделать отфильтровать - не получилось.
Какие есть ещё варианты или как это сделать?
...
Рейтинг: 0 / 0
20.07.2008, 12:39
    #35441173
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
В этом же (во вспомогательном DataWindow предварительно перенеся туда первый столбец), сделать по нему группу и при помощи выражения
Код: plaintext
cumulativeSum(  1  for group  1 )
и фильтра по нему отсеч все дубликаты выражением
Код: plaintext
compute_1 =  1 
и получить столбец с уникальными значениями. С точки зрения быстродействия это будет по-всей видимости неплохо. Как мне кажется просто одними выражениями здесь не обойтись...
...
Рейтинг: 0 / 0
20.07.2008, 13:11
    #35441184
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
Локшин Марк
Спасибо за вариант, идея понятна.
А что Вы скажете, если во вспомогательное DW либо DS сделать выборку из БД сразу набора уникальных значений? Будет ли это быстрее, ведь по сути надо будет повторить почти аналогичный SQL как для dw_1, а он и так был не быстрый? При этом есть ли риск несовпадения результатов?

А есть ли прямое обращение к 1-му столбцу 1-й строки в группе? Или как туда достучаться?
...
Рейтинг: 0 / 0
20.07.2008, 14:15
    #35441218
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
AIS
Спасибо за вариант, идея понятна.
А что Вы скажете, если во вспомогательное DW либо DS сделать выборку из БД сразу набора уникальных значений? Будет ли это быстрее, ведь по сути надо будет повторить почти аналогичный SQL как для dw_1, а он и так был не быстрый? При этом есть ли риск несовпадения результатов?
Если делать 2 запроса - то риск получить несовпадения результатов есть (зависит от уровня изоляции транзакций), но я не это имел ввиду. Если в исходном DataWindow уже есть группа, то ее можно временно изменить на группу по 1 столбцу. Или не возиться и перенести данные в отдельное DataWindow либо при помощи RowsCopy либо что-то типа
Код: plaintext
ds.object.data[ 1 , 1 ,n, 1 ] = dw.object.data[ 1 , 1 ,n, 1 ]
AIS
А есть ли прямое обращение к 1-му столбцу 1-й строки в группе? Или как туда достучаться?
Гм, что-то я не понял про что вы тут...
...
Рейтинг: 0 / 0
20.07.2008, 18:26
    #35441323
18-я весна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
Локшин МаркЕсли в исходном DataWindow уже есть группа
Насколько я помню, TreeView DW это обычное Group DW, в котором группы отображаются в виде уровней дерева.
Поэтому по идее должна работать ф-я FindGroupChange(row, level), вызывая которую в цикле можно заполнить массив:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
ll_breakrow =  0 
DO WHILE True
    ll_breakrow = dw_1.FindGroupChange(ll_breakrow,  1 )
    IF ll_breakrow <=  0  THEN EXIT
    ls_array[Upperbound(ls_array[]) +  1 ] = dw_1.GetItemString(ll_breakrow, "column") 
    ll_breakrow = ll_breakrow +  1 
LOOP

Вот такая вот у меня есть теория. Насколько она соответствует практике, предлагаю выяснить AIS и рассказать нам.
...
Рейтинг: 0 / 0
20.07.2008, 18:38
    #35441327
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
18-я весна
Взял это за основу и немного подстроил под себя. Спасибо. Всё работает.
На этом пожалуй и остановлюсь.
...
Рейтинг: 0 / 0
21.07.2008, 09:43
    #35441668
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
18-я весна Локшин МаркЕсли в исходном DataWindow уже есть группа
Поэтому по идее должна работать ф-я FindGroupChange(row, level), вызывая которую в цикле можно заполнить массив...
Вот такая вот у меня есть теория. Насколько она соответствует практике, предлагаю выяснить AIS и рассказать нам.
Как мне кажется, мой способ должен работать раз в десять быстрее (минимум), чем на PowerScript'е крутить циклы и вызывать FindGroupChange.
...
Рейтинг: 0 / 0
21.07.2008, 11:31
    #35441933
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
Локшин Марк
...Если в исходном DataWindow уже есть группа, то ее можно временно изменить на группу по 1 столбцу. Или не возиться и перенести данные в отдельное DataWindow либо при помощи RowsCopy либо что-то типа
Код: plaintext
ds.object.data[ 1 , 1 ,n, 1 ] = dw.object.data[ 1 , 1 ,n, 1 ]

...Как мне кажется, мой способ должен работать раз в десять быстрее (минимум), чем на PowerScript'е крутить циклы и вызывать FindGroupChange.
В Вашем варианте всё равно необходимо будет использовать цикл для получения списка уникальных значений 1-го столбца, а может ещё и фильтры и сортировки, плюс создание вспомогательных объектов. Думаю, что это все же будет медленнее работать, чем через FindGroupChange, где всего один цикл и сразу строка списка в результате.
...
Рейтинг: 0 / 0
21.07.2008, 11:44
    #35441969
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
Локшин МаркКак мне кажется, мой способ должен работать раз в десять быстрее (минимум), чем на PowerScript'е крутить циклы и вызывать FindGroupChange.
А я думаю, что на кол-ве записей до 100тыс, визуально нельзя будет различить :)
...
Рейтинг: 0 / 0
21.07.2008, 11:46
    #35441978
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
AIS
В Вашем варианте всё равно необходимо будет использовать цикл для получения списка уникальных значений 1-го столбца, а может ещё и фильтры и сортировки, плюс создание вспомогательных объектов. Думаю, что это все же будет медленнее работать, чем через FindGroupChange, где всего один цикл и сразу строка списка в результате.
Неа, цикл не нужен.
array = ds.Object.Col[1, rowcount]

Но быстрее не будет, так как внутренне эти два способа используют одни и те же механизмы :)
...
Рейтинг: 0 / 0
21.07.2008, 12:19
    #35442072
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
Anatoly Moskovsky AIS
В Вашем варианте всё равно необходимо будет использовать цикл для получения списка уникальных значений 1-го столбца, а может ещё и фильтры и сортировки, плюс создание вспомогательных объектов. Думаю, что это все же будет медленнее работать, чем через FindGroupChange, где всего один цикл и сразу строка списка в результате.
Неа, цикл не нужен.
array = ds.Object.Col[1, rowcount]

Но быстрее не будет, так как внутренне эти два способа используют одни и те же механизмы :)
В итоге это будет массив всех значений 1-го столбца, а нужен массив уникальных значений , и не просто массив, а в ввиде строки содержащей список таких значений.
Может в РВ есть функция, которая переводит массив в строку его значений (как например в РНР), то я этого не нашел, поэтому думаю без какого-нибудь цикла не обойтись.
...
Рейтинг: 0 / 0
21.07.2008, 12:24
    #35442088
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
AISВ Вашем варианте всё равно необходимо будет использовать цикл для получения списка уникальных значений 1-го столбца, а может ещё и фильтры и сортировки, плюс создание вспомогательных объектов. Думаю, что это все же будет медленнее работать, чем через FindGroupChange, где всего один цикл и сразу строка списка в результате.
Фильтр по моему условию будет работать быстро, сортировка для FindGroupChange тоже нужна, а список уникальных значений из столбца получается одним присваением.
Anatoly MoskovskyНо быстрее не будет, так как внутренне эти два способа используют одни и те же механизмы :)
Будет, будет. Если действие выражается через несколько вызовов функций - 99% будет гораздо быстрей этих же действий написанных в циклах PowerScript - проверено неоднократно.
...
Рейтинг: 0 / 0
21.07.2008, 12:27
    #35442093
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
AISВ итоге это будет массив всех значений 1-го столбца, а нужен массив уникальных значений , и не просто массив, а в ввиде строки содержащей список таких значений.
Может в РВ есть функция, которая переводит массив в строку его значений (как например в РНР), то я этого не нашел, поэтому думаю без какого-нибудь цикла не обойтись.
Там и будет массив уникальных значений . А извините, в виде строки это Вы сейчас только-что изобразили.
...
Рейтинг: 0 / 0
21.07.2008, 12:46
    #35442166
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
Локшин МаркЕсли действие выражается через несколько вызовов функций - 99% будет гораздо быстрей этих же действий написанных в циклах PowerScript - проверено неоднократно.
Это та ситуация, где как раз тот 1%.
...
Рейтинг: 0 / 0
21.07.2008, 12:48
    #35442172
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
Anatoly Moskovsky Локшин МаркЕсли действие выражается через несколько вызовов функций - 99% будет гораздо быстрей этих же действий написанных в циклах PowerScript - проверено неоднократно.
Это та ситуация, где как раз тот 1%.
Что проверяли?
...
Рейтинг: 0 / 0
21.07.2008, 12:57
    #35442200
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
Локшин Марк Anatoly Moskovsky Локшин МаркЕсли действие выражается через несколько вызовов функций - 99% будет гораздо быстрей этих же действий написанных в циклах PowerScript - проверено неоднократно.
Это та ситуация, где как раз тот 1%.
Что проверяли?
Да :)
...
Рейтинг: 0 / 0
21.07.2008, 13:06
    #35442225
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
Локшин Марк
Там и будет массив уникальных значений. А извините, в виде строки это Вы сейчас только-что изобразили.

Нет не сейчас. Это видно из моего скрипта в самом начале, что на выходе именно строка со списком уникальных значений 1-го столбца. :)
Локшин Марк
Фильтр по моему условию будет работать быстро, сортировка для FindGroupChange тоже нужна, а список уникальных значений из столбца получается одним присваением.

Каким одним присваиванием? Подскажите как.
...
Рейтинг: 0 / 0
21.07.2008, 13:08
    #35442234
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
...
Рейтинг: 0 / 0
21.07.2008, 16:26
    #35442855
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
Anatoly Moskovsky Локшин Марк Anatoly Moskovsky Локшин МаркЕсли действие выражается через несколько вызовов функций - 99% будет гораздо быстрей этих же действий написанных в циклах PowerScript - проверено неоднократно.
Это та ситуация, где как раз тот 1%.
Что проверяли?
Да :)
Хм, действительно
...
Рейтинг: 0 / 0
21.07.2008, 18:17
    #35443129
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView DataWindow
Локшин Марк Вот.
Это понятно. Я думал, что есть вариант загнать одним присваением массив значений в строку с указанием разделителя, как в других языках.
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / TreeView DataWindow / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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