Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PowerBuilder Новый топик    Ответить
 TreeView DataWindow  [new]
AIS
Member

Откуда:
Сообщений: 1695
Как получить список(массив) уникальных значений столбца в TreeView DataWindow 1-го уровня?
Делаю так:
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
Но думаю, что можно как то проще и чтобы быстрее работало.
Пробовал сделать отфильтровать - не получилось.
Какие есть ещё варианты или как это сделать?
20 июл 08, 01:28    [5959952]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
В этом же (во вспомогательном DataWindow предварительно перенеся туда первый столбец), сделать по нему группу и при помощи выражения
cumulativeSum( 1 for group 1)
и фильтра по нему отсеч все дубликаты выражением
compute_1 = 1
и получить столбец с уникальными значениями. С точки зрения быстродействия это будет по-всей видимости неплохо. Как мне кажется просто одними выражениями здесь не обойтись...
20 июл 08, 12:39    [5960305]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
AIS
Member

Откуда:
Сообщений: 1695
Локшин Марк

Спасибо за вариант, идея понятна.
А что Вы скажете, если во вспомогательное DW либо DS сделать выборку из БД сразу набора уникальных значений? Будет ли это быстрее, ведь по сути надо будет повторить почти аналогичный SQL как для dw_1, а он и так был не быстрый? При этом есть ли риск несовпадения результатов?

А есть ли прямое обращение к 1-му столбцу 1-й строки в группе? Или как туда достучаться?
20 июл 08, 13:11    [5960333]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
AIS

Спасибо за вариант, идея понятна.
А что Вы скажете, если во вспомогательное DW либо DS сделать выборку из БД сразу набора уникальных значений? Будет ли это быстрее, ведь по сути надо будет повторить почти аналогичный SQL как для dw_1, а он и так был не быстрый? При этом есть ли риск несовпадения результатов?

Если делать 2 запроса - то риск получить несовпадения результатов есть (зависит от уровня изоляции транзакций), но я не это имел ввиду. Если в исходном DataWindow уже есть группа, то ее можно временно изменить на группу по 1 столбцу. Или не возиться и перенести данные в отдельное DataWindow либо при помощи RowsCopy либо что-то типа
ds.object.data[1,1,n,1] = dw.object.data[1,1,n,1]
AIS

А есть ли прямое обращение к 1-му столбцу 1-й строки в группе? Или как туда достучаться?

Гм, что-то я не понял про что вы тут...
20 июл 08, 14:15    [5960435]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
18-я весна
Member

Откуда: Odessa
Сообщений: 203
Локшин Марк
Если в исходном DataWindow уже есть группа

Насколько я помню, TreeView DW это обычное Group DW, в котором группы отображаются в виде уровней дерева.
Поэтому по идее должна работать ф-я FindGroupChange(row, level), вызывая которую в цикле можно заполнить массив:
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 и рассказать нам.
20 июл 08, 18:26    [5960761]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
AIS
Member

Откуда:
Сообщений: 1695
18-я весна

Взял это за основу и немного подстроил под себя. Спасибо. Всё работает.
На этом пожалуй и остановлюсь.
20 июл 08, 18:38    [5960779]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
18-я весна
Локшин Марк
Если в исходном DataWindow уже есть группа

Поэтому по идее должна работать ф-я FindGroupChange(row, level), вызывая которую в цикле можно заполнить массив...
Вот такая вот у меня есть теория. Насколько она соответствует практике, предлагаю выяснить AIS и рассказать нам.

Как мне кажется, мой способ должен работать раз в десять быстрее (минимум), чем на PowerScript'е крутить циклы и вызывать FindGroupChange.
21 июл 08, 09:43    [5961610]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
AIS
Member

Откуда:
Сообщений: 1695
Локшин Марк

...Если в исходном DataWindow уже есть группа, то ее можно временно изменить на группу по 1 столбцу. Или не возиться и перенести данные в отдельное DataWindow либо при помощи RowsCopy либо что-то типа
ds.object.data[1,1,n,1] = dw.object.data[1,1,n,1]

...Как мне кажется, мой способ должен работать раз в десять быстрее (минимум), чем на PowerScript'е крутить циклы и вызывать FindGroupChange.

В Вашем варианте всё равно необходимо будет использовать цикл для получения списка уникальных значений 1-го столбца, а может ещё и фильтры и сортировки, плюс создание вспомогательных объектов. Думаю, что это все же будет медленнее работать, чем через FindGroupChange, где всего один цикл и сразу строка списка в результате.
21 июл 08, 11:31    [5962261]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6610
Локшин Марк
Как мне кажется, мой способ должен работать раз в десять быстрее (минимум), чем на PowerScript'е крутить циклы и вызывать FindGroupChange.

А я думаю, что на кол-ве записей до 100тыс, визуально нельзя будет различить :)
21 июл 08, 11:44    [5962353]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6610
AIS

В Вашем варианте всё равно необходимо будет использовать цикл для получения списка уникальных значений 1-го столбца, а может ещё и фильтры и сортировки, плюс создание вспомогательных объектов. Думаю, что это все же будет медленнее работать, чем через FindGroupChange, где всего один цикл и сразу строка списка в результате.

Неа, цикл не нужен.
array = ds.Object.Col[1, rowcount]

Но быстрее не будет, так как внутренне эти два способа используют одни и те же механизмы :)
21 июл 08, 11:46    [5962370]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
AIS
Member

Откуда:
Сообщений: 1695
Anatoly Moskovsky
AIS

В Вашем варианте всё равно необходимо будет использовать цикл для получения списка уникальных значений 1-го столбца, а может ещё и фильтры и сортировки, плюс создание вспомогательных объектов. Думаю, что это все же будет медленнее работать, чем через FindGroupChange, где всего один цикл и сразу строка списка в результате.

Неа, цикл не нужен.
array = ds.Object.Col[1, rowcount]

Но быстрее не будет, так как внутренне эти два способа используют одни и те же механизмы :)

В итоге это будет массив всех значений 1-го столбца, а нужен массив уникальных значений, и не просто массив, а в ввиде строки содержащей список таких значений.
Может в РВ есть функция, которая переводит массив в строку его значений (как например в РНР), то я этого не нашел, поэтому думаю без какого-нибудь цикла не обойтись.
21 июл 08, 12:19    [5962575]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
AIS
В Вашем варианте всё равно необходимо будет использовать цикл для получения списка уникальных значений 1-го столбца, а может ещё и фильтры и сортировки, плюс создание вспомогательных объектов. Думаю, что это все же будет медленнее работать, чем через FindGroupChange, где всего один цикл и сразу строка списка в результате.

Фильтр по моему условию будет работать быстро, сортировка для FindGroupChange тоже нужна, а список уникальных значений из столбца получается одним присваением.
Anatoly Moskovsky
Но быстрее не будет, так как внутренне эти два способа используют одни и те же механизмы :)

Будет, будет. Если действие выражается через несколько вызовов функций - 99% будет гораздо быстрей этих же действий написанных в циклах PowerScript - проверено неоднократно.
21 июл 08, 12:24    [5962609]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
AIS
В итоге это будет массив всех значений 1-го столбца, а нужен массив уникальных значений, и не просто массив, а в ввиде строки содержащей список таких значений.
Может в РВ есть функция, которая переводит массив в строку его значений (как например в РНР), то я этого не нашел, поэтому думаю без какого-нибудь цикла не обойтись.

Там и будет массив уникальных значений. А извините, в виде строки это Вы сейчас только-что изобразили.
21 июл 08, 12:27    [5962626]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6610
Локшин Марк
Если действие выражается через несколько вызовов функций - 99% будет гораздо быстрей этих же действий написанных в циклах PowerScript - проверено неоднократно.

Это та ситуация, где как раз тот 1%.
21 июл 08, 12:46    [5962799]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
Anatoly Moskovsky
Локшин Марк
Если действие выражается через несколько вызовов функций - 99% будет гораздо быстрей этих же действий написанных в циклах PowerScript - проверено неоднократно.

Это та ситуация, где как раз тот 1%.

Что проверяли?
21 июл 08, 12:48    [5962823]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6610
Локшин Марк
Anatoly Moskovsky
Локшин Марк
Если действие выражается через несколько вызовов функций - 99% будет гораздо быстрей этих же действий написанных в циклах PowerScript - проверено неоднократно.

Это та ситуация, где как раз тот 1%.

Что проверяли?

Да :)
21 июл 08, 12:57    [5962897]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
AIS
Member

Откуда:
Сообщений: 1695
Локшин Марк

Там и будет массив уникальных значений. А извините, в виде строки это Вы сейчас только-что изобразили.

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

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

Каким одним присваиванием? Подскажите как.
21 июл 08, 13:06    [5962976]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
Вот.
21 июл 08, 13:08    [5962996]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
Anatoly Moskovsky
Локшин Марк
Anatoly Moskovsky
Локшин Марк
Если действие выражается через несколько вызовов функций - 99% будет гораздо быстрей этих же действий написанных в циклах PowerScript - проверено неоднократно.

Это та ситуация, где как раз тот 1%.

Что проверяли?

Да :)

Хм, действительно
21 июл 08, 16:26    [5964742]     Ответить | Цитировать Сообщить модератору
 Re: TreeView DataWindow  [new]
AIS
Member

Откуда:
Сообщений: 1695
Локшин Марк
Вот.

Это понятно. Я думал, что есть вариант загнать одним присваением массив значений в строку с указанием разделителя, как в других языках.
21 июл 08, 18:17    [5965560]     Ответить | Цитировать Сообщить модератору
Все форумы / PowerBuilder Ответить