FibPlus 6.4.1 установка курсора на нужную запись

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

paratruper
Сообщения: 29
Зарегистрирован: 20 апр 2006, 17:28

Сообщение paratruper » 14 июл 2006, 21:18

Merlin писал(а):
paratruper писал(а): Значит все дело в следующем:
Есть таблица ~400000 записей (клиенты) есть грид1 к нему подключен датасет1
и он же работает с таблицей то есть является визуальным её представлением :) (показывет клиентов которые есть в таблице)
Зачем? Для красоты?

Нет. чтобы пользователь видел с чем работает. Ему же надо видеть какие клиенты у него есть.
paratruper писал(а): Теперь внимание. :) необходимо сделать так чтобы при клике на записи в гриде 2, в гриде 1 курсор автоматически ставился на запись соответствующего клиента.
Вот именно. Внимание: а для на зачем? Патамушта есть? Третий каскад?

Честно? Пользователь попросил, удобно ему когда автоматом будет показан клиент и все его реквизиты и данные которых нет в гриде с должниками потому как ненужны они там.
Мне самому эта проктология не нравиться но пользователь хочет...
И пока я вижу только 2 варианта решения моей проблемы
1. locate
2. select's
Первый медленный и громоздкий но полностью удовлетворяющий моим запросам
Второй быстрый, но проктологически более неудобный необходимо извращаться.
Других путей я пока не вижу.К сожалению.
paratruper писал(а): Что я делаю неправильно? :)
Думаешь. Руками, а не головой. Не хочу обидеть, хочу направить. Основа проектирования - функционально-целевой анализ и структурирование предметной области как совокупности модели и решаемых на ней задач. А не набрасывание на формы гридов и придумывание а что бы теперь с ними сделать.
Да я не обижаюсь отрицательный опыт тоже опыт :)
а гриды я накидывал чтобы визуализировать некий объем получаемых данных.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 14 июл 2006, 21:30

цитировать прилично только часть того, на что ты отвечаешь. а не целиком.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 14 июл 2006, 22:33

paratruper писал(а): Нет. чтобы пользователь видел с чем работает. Ему же надо видеть какие клиенты у него есть.
Опять - зачем? Всех сразу? Нет. Тогда почему 20 именно этих? Фигня-с полчаеццо. Архитектурное излишество.

paratruper писал(а): Честно? Пользователь попросил, удобно ему когда автоматом будет показан клиент и все его реквизиты и данные которых нет в гриде с должниками потому как ненужны они там.
Сразу два простейших решения.

1. Джойн с основной таблицей всё равно есть. Тянуть из неё все поля, а показывать только нужные для навигации. А когда понадобятся, при активизации какой-то функции, показать в другом контроле.

2. Мастер-деталь. То есть, тянуть по ID одну запись целиком из основной таблицы, ту, на которой спозиционирован грид с должниками. Медленней первого, но бывает сподручней в разработке.
paratruper писал(а): Мне самому эта проктология не нравиться но пользователь хочет...
Мы должны давать пользователю то, что ему нужно, а не то, что он хочет (С). Он сам не знает чего хочет на начальных этапах. С ним нужно работать.
paratruper писал(а): И пока я вижу только 2 варианта решения моей проблемы
1. locate
2. select's
Первый медленный и громоздкий но полностью удовлетворяющий моим запросам
Второй быстрый, но проктологически более неудобный необходимо извращаться.
Да не быстрый он, не быстрый. Если по полю сортировки не получится ORDER-план (а скорей всего так и будет), то для построения фрагментарной выборки серверу придётся дважды отсортировать ВСЮ выборку. Tmp-файл под гиг построить два раза.


2 kdv - он в квот-тагах запутался просто, не то лишний убрал, не то лишний оставил.

paratruper
Сообщения: 29
Зарегистрирован: 20 апр 2006, 17:28

Сообщение paratruper » 15 июл 2006, 11:24

Merlin писал(а):
paratruper писал(а): Нет. чтобы пользователь видел с чем работает. Ему же надо видеть какие клиенты у него есть.
Опять - зачем? Всех сразу? Нет. Тогда почему 20 именно этих? Фигня-с полчаеццо. Архитектурное излишество.
Нет зачем же всех вот захочет он увидеть Васю Пупкина пролистает грид на Васю пупкина, либо поиск сделает, захочет увидеть Серёжу Карацупу, на него отмотает. Это грид показывающий имя фамилию и отчество клиента, остальные данные (реквизиты)пишуться в обычные едиты ведь удобнее видеть список. Опять же в один определённый момент времени у нас в датасете не вся таблица а её кусочек с необходимыми данными.
Merlin писал(а): Сразу два простейших решения.
1. Джойн с основной таблицей всё равно есть. Тянуть из неё все поля, а показывать только нужные для навигации. А когда понадобятся, при активизации какой-то функции, показать в другом контроле.
Вариант хороший, но зачем их показывать в другом контроле если просто можно указать в гриде1, правда есть одно но. Если эти данные в этот момент не находяться в датасете который подключен к гриду1 возникает ситуация когда придёться их тянуть с сервера.
Merlin писал(а): 2. Мастер-деталь. То есть, тянуть по ID одну запись целиком из основной таблицы, ту, на которой спозиционирован грид с должниками. Медленней первого, но бывает сподручней в разработке.
Тоже вариант.
Я хочу пояснить, может я неправильно рассказал суть проблемы. Вытащить id из "должников" труда особого нет, как нет и труда вытащить все необходимые реквизиты из большой таблицы по этому id. НО после этих манипуляций у меня будет ОДНА запись. И что я могу с ней делать? :) Правильно визуализировать для пользователя, а как? :) Вот тут то и загвоздка можно как предлагаете вы, сделать отдельный контрол который покажет всю вытянутую информацию. А можно как хочет пользователь :) вывести эту информацию в уже существующий контрол т.е грид1. Так вот если ему покажеться ОДНА искомая запись в гриде где то этого был список этих записей юзер будет огорчен :)Желательно показать ещё рядомстоящие с найденой записи, при том что все равно выборка будет отсортирована, я думаю это возможно,но проктологически трудоемко. Т.е. сделать аналог locate но технически по другому. Ведь когда locatу работает он ведь указатель ставит на одну запись, а в гриде мы видим все равно не только найденную но и рядомстоящие.
Хотя я вот уже подумываю над убедительными доводами, что не нужно это ему :) и не реализовывать такой зависимости.
Merlin писал(а): Да не быстрый он, не быстрый. Если по полю сортировки не получится ORDER-план (а скорей всего так и будет), то для построения фрагментарной выборки серверу придётся дважды отсортировать ВСЮ выборку. Tmp-файл под гиг построить два раза.
К счастью order получился :)
хотя скорость тоже не блещет но все равно быстрее locate :)
выборка порядка 4 секунд на 400000 записях индекс по 4 полям одно из которых уникальное в order все эти поля и забиты.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 июл 2006, 17:52

Желательно показать ещё рядомстоящие с найденой записи, при том что все равно выборка будет отсортирована, я думаю это возможно,но проктологически трудоемко.
зачем это надо?
я может чего не понимаю, но идея какая-то очень мутная.
Нет зачем же всех вот захочет он увидеть Васю Пупкина пролистает грид на Васю пупкина, либо поиск сделает, захочет увидеть Серёжу Карацупу, на него отмотает.
по-моему, не надо фантазировать за пользователя. Половина проблем при проектировании из-за того, что разработчик сам начинает выдумывать какие то "процессы" для пользователя, которые тому совсем не нужны.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 июл 2006, 17:56

выборка порядка 4 секунд на 400000 записях индекс по 4 полям одно из которых уникальное в order все эти поля и забиты.
это тебе только кажется.
ты попробуй прокрутить данные в гриде дальше, вниз. если тормозов не будет - тебе повезло. в общем случае plan sort лучше чем plan table order ....

paratruper
Сообщения: 29
Зарегистрирован: 20 апр 2006, 17:28

Сообщение paratruper » 16 июл 2006, 16:59

Желательно показать ещё рядомстоящие с найденой записи, при том что все равно выборка будет отсортирована, я думаю это возможно,но проктологически трудоемко. зачем это надо?
kdv писал(а): я может чего не понимаю, но идея какая-то очень мутная.
К сожалению нельзя картинки вставлять, показал бы визуально. Объяснить на пальцах как оказываеться у меня плохо получается.
Хотя кое какие идеи мне все-таки подсказали :) Буду думать :)
Кстати может есть где текст с принципами визуализации больших объёмов данных. Я понимаю что человеку не надо видеть сразу 1000000 записей, но ведь можно как-то опптимизировать интерфейс что бы доступ и навигация с таким объёмом данных происходили достаточно оперативно, а то у меня все пока получается методом "научного тыка пальцем в небо" :) .

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 16 июл 2006, 17:49

www.ibase.ru, документация

# Обновление клиентских наборов данных
# Передача данных между клиентом и сервером
и
http://www.interbase-world.com/ru/articles/2350.php

можно еще gbdatasets попробовать. Но только надо сначала консерваторию поправить.
Я понимаю что человеку не надо видеть сразу 1000000 записей, но ведь можно как-то опптимизировать интерфейс что бы доступ и навигация с таким объёмом данных происходили достаточно оперативно,
тебе надо привыкнуть, что с сервером работают как с источником "подмножеств" записей. Полное множество - это какая-нибудь таблица целиком. Целиком она никому не нужна. Вопрос в том, как извлекать для пользователя нужные ему наборы записей.
Это и есть "оптимизация интерфейса".
К сожалению нельзя картинки вставлять, показал бы визуально
пришли в gif, я что-нибудь придумаю.

paratruper
Сообщения: 29
Зарегистрирован: 20 апр 2006, 17:28

Сообщение paratruper » 17 июл 2006, 11:02

kdv писал(а): можно еще gbdatasets попробовать. Но только надо сначала консерваторию поправить.
gbdatasets.... по такомуже принципу у Фибов работает режим ограниченного кеша, который я и использую. Он всем хорош, однако в фибах нет параметра(вернее записи) относительно которой идет выборка. Даже не так... параметр есть но он передается автоматически при "скролировании датасета".
Попробую объяснить на пальцах :)
Есть 3 select'а:
1. запись на которой стоит курсор - select * from table where field=X
2. записи которые "ниже" курсора -select * from table where field>X ORDER BY field
2. записи которые "выше" курсора -select * from table where field<X ORDER BY field DESС
Вот если бы было можно принудительно передавать в компонент значение Х, моя проблема была бы решена. Я бы передавал к примеру id необходимой мне записи, а компонент бы сливал пакет записей вместе с искомой и автоматом ставил бы курсор на неё- чем не альтернатива locate ?. Но к сожалению пока нельзя. Хотя может в gbdatasets можно?
пришли в gif, я что-нибудь придумаю.
куда присылать?
За ссылки большое спасибо.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 июл 2006, 11:06

Попробую объяснить на пальцах
кому? :) эта схема была еще в BDE
www.ibase.ru/devinfo/bde.htm ("живой и мертвый кэш")
Хотя может в gbdatasets можно?
можно. он именно так и работает.

paratruper
Сообщения: 29
Зарегистрирован: 20 апр 2006, 17:28

Сообщение paratruper » 17 июл 2006, 12:14

Хотя может в gbdatasets можно?
можно. он именно так и работает.
Сейчас сливаю gbdatasets... неужели в них можно задавать запись относительно которой идёт слив пакета? Тогда это очень здорово! Жаль в фибах нельзя, придётся покупать ещё и gbdatasets.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 июл 2006, 13:05

придётся покупать ещё и gbdatasets
покупать ???
неужели в них можно задавать запись относительно которой идёт слив пакета?
мил-человек, ну нельзя быть таким ... Есть sql. есть таблицы. у таблиц есть первичный ключ. ВСЕ. Например, IBObjects позволяет смотреть гигантские таблицы, вытаскивая только столбец ПК, и потом динамически подчитывая запись по этому ПК для показа в гриде.
куда присылать?
на деревню дедушке. :) на ibase.ru нет адресов, что-ли?

paratruper
Сообщения: 29
Зарегистрирован: 20 апр 2006, 17:28

Сообщение paratruper » 17 июл 2006, 13:30

kdv писал(а):
придётся покупать ещё и gbdatasets
покупать ???
он ведь платный вроде в коммерческой эксплуатации...
мил-человек, ну нельзя быть таким ... Есть sql. есть таблицы. у таблиц есть первичный ключ. ВСЕ. Например, IBObjects позволяет смотреть гигантские таблицы, вытаскивая только столбец ПК, и потом динамически подчитывая запись по этому ПК для показа в гриде.
Именно это мне и надо, а можно значение ПК передавать компоненту вручную? Чтоб вот он относительно допустим записи с ПК 2485 вытащил мне данные?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 июл 2006, 13:48

он ведь платный вроде в коммерческой эксплуатации...
а, да, я и не обращал внимания. Но лицения trustware, т.е. оценивать исходники можешь сколько угодно.
Именно это мне и надо, а можно значение ПК передавать компоненту вручную? Чтоб вот он относительно допустим записи с ПК 2485 вытащил мне данные?
я не понял вопроса. потому что не вижу вопроса как такового. надо - возьми ПК и передай его куда угодно, и делай с ним что хочешь.
Показ блобов обычно таким образом организуется - в выборке блобов нет, а когда пользователь останавливается на записи дольше секунды, или жмет кнопку - выполняется запрос, вытаскивающий блоб по ПК.

paratruper
Сообщения: 29
Зарегистрирован: 20 апр 2006, 17:28

Сообщение paratruper » 17 июл 2006, 14:24

Вот ведь жизнь какая странная штука....
Слил gb_dataset установил. Сдеал тестовую базу на 500000 записей. Ради интереса на форму поместил 2 грида один к фибовскому датасету другой к gb_dataset посмотреть кто быстрее....
в результате переход к ЛЮБОЙ записи не более 2 секунд - что Фибы что ГБ.. Я рад!
Хотя даже не знаю может это у меня руки кривые были, ведь раньше на одних фибах порядка 20 секунд переходило. Или это ГБ что то подлинковало свое?

paratruper
Сообщения: 29
Зарегистрирован: 20 апр 2006, 17:28

Сообщение paratruper » 17 июл 2006, 15:19

Господа можете громко с меня смеяться....
Все дело оказалось в индексах. После вставки большого объёма записей индексы не были перестроены, и как результат медленная работа по индексным полям :( Сейчас сделал selectivity all :) Любая выборка не более 2 секунд :) :!:
Тем не менее всем спасибо за советы и рекомендации.

Ответить