:: Visual Foxpro, Foxpro for DOS
Система на CursorAdapter
sphinx
Автор

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Друзья, всем привет!

Вот такой вопрос. Сейчас у меня есть приложение, которое написал на связке VFP + PostrgreSQL. Основная таблица не большая, летает. Но подход. Коллега (он больше по Джаве спец, причем крутой товарищ, почти все рисует с закрытыми глазами). Он говорит, что забирать все данные с сервера - плохо. Согласен. На больших объемах будут тормоза (там еще и машины есть слабые, есть еще и фильтры-сортировки и прочее..). Так вот. Может хоть на пальцах, как лучше организовать тот же курсор-адаптер, чтобы он все данные не выкачивал на локальную машину. Код я привести могу, но он на работе, мне не на чем его принести сегодня.

Мне может вполне хватит идеологии, может с небольшим примером, кому не трудно.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Система на CursorAdapter
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Лучше брать только необходимое,из БД. Но часто бывает что, по тексту ЯП, ТЗ,брать надо всё ) Крутись

Доб.
> может с небольшим примером, кому не трудно
извлекаеш, например, ФИО, зная только ИО, индекса (по ИО) нет. Фокс просто читает весь файл таблицы в поиске...

Доб.
> чтобы он все данные не выкачивал на локальную машину
Фокс именно "выкачивает" (сохраняя 5-минутную актуальность копии) CDX на локальную машину... Это сложнейший инструментальный прибор фокса, многопользовательский...



Исправлено 2 раз(а). Последнее : of63, 15.02.19 23:22
Ratings: 0 negative/0 positive
Re: Система на CursorAdapter
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
sphinx
как лучше организовать тот же курсор-адаптер, чтобы он все данные не выкачивал на локальную машину.
В selectcmd адаптера можно написать не только select * from table, но и select <список только нужных полей> from table1 inner\left join table2 ... where filed1 = 'что-то' and field2 = ?Thisform._FilterValue
Почти выдранный из рабочей проги пример. Непонятно какие сложности ты нашел в отборе только нужных данных.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Система на CursorAdapter
sphinx
Автор

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Алексеич! Да я редко пишу SELECT * FROM, как то в большинстве случаев (если это не временно в недрах проекта) все поля добросовестно перечисляю, и в грид подставляются ( который якобы универсальный, жрет все на входе, ибо умеет сам с типом данных разобраться).

Может я идеологию Ка не очень понял в свое время? Хорошо, готов учиться заново, мне не стыдно, не зазорно, я вышел из школьного возраста насмешек.

Итак. Делаю примерно следующее. В главном модуле вызываю конструктор КАДа, он выкачивает данные (все поля, которые нужны для ИД, и для грида, чтобы потом не перечитывать) на локальную машину. Режим оптимистики=3 (иначе не взлетает сортировка по столбцам в базовом классе - может это и ересь, я не спорю, я давно спиритов и Вадика не вызывал ).

При каждом обновлении - пока-то быстро, универсально, даже мальчика могу обучить, чтобы слез не полил - но потом все посыпется, боюсь. Сергей, Как КАД правильно организовать? При учете, что сортировки по любым полям (правда работает же FOXOBJ Вади - правда там одну маненькую-маненькую строчку надо добавить в конце процедуры, а то некрасиво получается..

Кинь свой пример работы с кадом - учебно-промывающий.. Я буду благодарен, это понятно.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Система на CursorAdapter
sphinx
Автор

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Так, увлекся. ФоксОбж - это выгрузка почти любых данных из грида в отчет. Тестировал - работает отлично. Вадик про проблемы писал в описании - мне понятны, но когда дойдут руки или начальство.

А класс универсального грида с сортировкой по столбцам позаимствовал у гуру Фокса - Рика Страля (один из перцев в Вест-Винд). Работает, хотя что-то в дочерних приходится докручивать, но это уже точно не тонны коды.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Система на CursorAdapter
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
sphinx
В главном модуле вызываю конструктор КАДа, он выкачивает данные (все поля, которые нужны для ИД, и для грида, чтобы потом не перечитывать) на локальную машину.
Зачем? Почему в главном, а не там, где нужно?
Цитата:
Режим оптимистики=3 (иначе не взлетает сортировка по столбцам в базовом классе - может это и ересь, я не спорю, я давно спиритов и Вадика не вызывал ).
Саня, ты ТАК сильно отстал от жизни? Давным-давно придумано
CursorSetProp("Buffering", 3, .Alias)
Index On id_gruppo Tag id_gruppo
CursorSetProp("Buffering", .BufferModeOverride, .Alias)
И хоть обиндексируйся при 5-м режиме буферизации.
Цитата:
При каждом обновлении - пока-то быстро, универсально, даже мальчика могу обучить, чтобы слез не полил - но потом все посыпется, боюсь.
Это вообще не понял о чем ты.
Цитата:
Сергей, Как КАД правильно организовать?
Руками и головой.
Цитата:
При учете, что сортировки по любым полям (правда работает же FOXOBJ Вади - правда там одну маненькую-маненькую строчку надо добавить в конце процедуры, а то некрасиво получается..
И опять в огороде бузина, а в Киеве дядька...
Цитата:

Кинь свой пример работы с кадом - учебно-промывающий..
Пример чего? Запроса в КАД? И что он тебе даст?
Давай ка ты лучше расскажешь что конкретно ты не понимаешь?
Как заполнять свойства КАД? Как обновлять весь курсор или только его часть? Как загонять данные на сервер? Что-то еше?


------------------
Лень - это неосознанная мудрость.




Исправлено 1 раз(а). Последнее : ssa, 16.02.19 11:27
Ratings: 0 negative/0 positive
Re: Система на CursorAdapter
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
of63
Лучше брать только необходимое,из БД. Но часто бывает что, по тексту ЯП, ТЗ,брать надо всё ) Крутись
Если ТЗ говно (типа "показывать полный список граждан РФ с возможностью сортировки по полям ... и быстрого перехода к записи по условию ..."), то и результат будет именно таким. Если же разумно прописать что надо "брать только необходимое,из БД" то всё будет ок.
of63
Фокс именно "выкачивает" (сохраняя 5-минутную актуальность копии) CDX на локальную машину... Это сложнейший инструментальный прибор фокса, многопользовательский...
Нет, конечно. Целиком фокс файлы не читает - ни dbf ни cdx - только нужные их части. А уж что именно окажется "нужным" - целиком и полностью от запроса зависит. Будет там написано Select * from OneGbTable WHERE Id = ?NeededId и он считает буквально пару килобайт данных - и из dbf и из cdx.
Фоксу, кстати, по барабану писать SELECT * FROM ... или SELECT oneField FROM ... - он в любом случае физически из таблицы считывает всю запись целиком, не отдельные её поля - ну может за исклюбчением memo, которые и физически отдельно хранятся - но тут я не уверен - надо проверять.
Для "больших" СУБД, конечно же лучше только необходимые поля указывать в запросе - но это чуть менее важно по сравнению с WHERE условия_отбора - именно эти условия и есть ключевое для "ускорения".


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Система на CursorAdapter
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> и он считает буквально пару килобайт данных - и из dbf и из cdx.
Возможно, вернее, конечно, часть файла DBF, и CDX-а тоже часть. Точнее фокс обращается к удаленному файлу (на файл-сервере) через ОС, а уж что читает ОС... тоже не видно, как и то, что читает сам фокс. В принципе без разницы кто там что читает, лишь бы поменьше лишнего ). Но к чему это говорю, что иногда на файл-сервере одна машина добавит запись, а вторая машина это замечает минут через 5, причем третья машина может заметить это добавление сразу... И никакие FLUSH, и SYS(1104) (?), не помогают. Что-то с этими чтениями сетевых файлов не так.
Ratings: 0 negative/0 positive
Re: Система на CursorAdapter
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Что читает ОС вполне себе видно через FileMon - какие куски файлов. Понятно, что "физически" считывается сектор целиком, а в современных HDD их встроенное ПО (firmware) может в порядке кэширования сразу несколько соседних секторов считать (всё одно голову куда надо уже выставили, так чего ж не считать всю дорожку целиком - расходы на позиционирование и ожидание доворота диска всяко больше чем потери от забивания кэша потенциально ненужной инфой).
of63
иногда на файл-сервере одна машина добавит запись, а вторая машина это замечает минут через 5, причем третья машина может заметить это добавление сразу
Тут надо понимать всю систему кэширования - от фокса (чем вполне можно управлять, хотя есть и свои подводные камни или, скорее, багофичи в фоксе - типа необходимости передвигать указатель текущей записи для того чтобы таки заставить его "освежить" данные) до ОС (где уже возможности повлиять на кэш чутка поменьше - хотя указанные команды также влияют и на кэш ОС - но сама ОС, особенно серверная, если она ещё и не-виндовая, может "мешать"). В добавок SET REFRESH надо упомянуть - он (его 2 параметр) тоже влияет на то как быстро фокс увидит изменения...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Система на CursorAdapter
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
() ИК, настройки всех этих 3-4х деталей типовые. SET REFRESH - умолчательный (5 сек), я проверил. Дело не в этом. Дело в фоксе+ОС, обе косые немного. Надо пользоваться "взрослыми БД". Возможно. Пока не "сьеден" сам фокс. ...Смотрю на БК-шку, она в Оракле типа, но все фокс, да фокс... )
Ratings: 0 negative/0 positive
Re: Система на CursorAdapter
Божья_коровка

Сообщений: 25720
Дата регистрации: 23.08.2001
of63
Смотрю на БК-шку, она в Оракле типа, но все фокс, да фокс... )
У меня "морда" частично на фоксе, и что?


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




Исправлено 1 раз(а). Последнее : Божья_коровка, 19.02.19 10:59
Ratings: 0 negative/0 positive
Re: Система на CursorAdapter
doktor

Сообщений: 269
Дата регистрации: 03.09.2002
В CAD имеется такое чудесное свойство как MaxRecords. Указывает максимальное количество строк для выборки, когда после команды возвращается набор данных.
Я туда записываю 50000,с таким количеством все летает. И сделал возможным пользователю изменять это значение.
Но на практике этого достаточно,для уменьшения количества срок используются фильтры.
Ratings: 0 negative/0 positive
Re: Система на CursorAdapter
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
При правильном использовании фильтров (т.е. когда условия почти всегда дают выборку с значительно меньшим количеством записей) нет нужды использовать MaxRecords. Да и в плане оптимизации запроса может быть эффективнее прямо в запрсе указывать TOP N или его аналог, а не посылать на сервер "полный" запрос, а вынимать из него лишь первые N записей. Кстати 50К это очень, нет ОЧЕНЬ много - нормальный человек в любом случае не может эффективно оперировать таким объёмом данных.

Задавать ограничение по количеству выбираемых записей вообще безотносительно условий отбора - спорное решение. Хотя, если задать order и где-нить ещё написать явно жирными красными буквами что "товарищ, ты видишь только первые хххх записей - на самом деле их, возможно, гораздо больше, уточняй критерии поиска" - ну может и норм быть.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Система на CursorAdapter
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Какая скука (фрекен Бок)
Ratings: 0 negative/0 positive
Re: Система на CursorAdapter
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Тебе в соседнюю тему, там настоящая веселуха. Не знаю сколько я смогу сдерживаться чтобы не сказать всё что думаю по поводу приведенного кода


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Система на CursorAdapter
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Не пугай. Сдержиаваемыми. Это уже болше психика, здоолроавая, или гн здороая...Пьяный я....лучшн свою психику коннтролтоать независимо от ... врачей )

> Не знаю сколько я смогу сдерживаться чтобы не сказать всё что думаю по поводу приведенного кода
Конечно скажи



Исправлено 1 раз(а). Последнее : of63, 23.02.19 01:38
Ratings: 0 negative/0 positive
Re: Система на CursorAdapter
sphinx
Автор

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
ssa
Зачем? Почему в главном, а не там, где нужно?

По двум причинам. Во-первых, пользователи просили, чтобы основная форма сразу разворачивалась на экране. Во-вторых, при относительно больших данных если будет наполняться курсор-адаптер во время каждого клика мышкой на той форме, которая (с данными) нужна пользователю - все время вычитывать? Да пользователи меня проклянут за издевательство над ними.

ssa
Саня, ты ТАК сильно отстал от жизни? Давным-давно придумано
CursorSetProp("Buffering", 3, .Alias)
Index On id_gruppo Tag id_gruppo
CursorSetProp("Buffering", .BufferModeOverride, .Alias)

Это я знаю. Просто с базовом классе КАДа стоит 5-я буфферизация, каждый раз для сортировки придется переходить в 3-ю. И такое пробовал, что-то у меня не получилось, а время поджимало. Может быть просто допинать надо было, не спорю.

ssa
Пример чего? Запроса в КАД? И что он тебе даст?
Давай ка ты лучше расскажешь что конкретно ты не понимаешь?
Как заполнять свойства КАД? Как обновлять весь курсор или только его часть? Как загонять данные на сервер? Что-то еше?

Просто пример, как на 100 тыс. строк данных не надо КАДом вычитывать все данные при каждом открытии формы. Порциями для грида? Как отслеживать, какие данные ушли вверх (вниз) и какие надо запросить в нужный момент времени?


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Система на CursorAdapter
pasha_usue

Сообщений: 3647
Откуда: Е-бург
Дата регистрации: 06.10.2006
У меня в одной форме всегда выбиралось TOP 10001. И если выходило больше 10000 записей, появлялся label "в выборке больше 10000 записей, уточните критерии поиска". Все. Никакого больше кодирования.
Ratings: 0 negative/1 positive
Re: Система на CursorAdapter
Sawradym

Сообщений: 2244
Откуда: Винница
Дата регистрации: 15.05.2007
В свое время хотел добиться чтобы данные тянулись с сервера по мере надобности. Игрался с FetchAsNeed и FetchSize, ничего не вышло.
Сейчас, благодаря самописному КА удалось добиться желаемого. Данные подтягиваются по мере прокрутки грида. До тех пор пока все данные не будут вытащены на клиента в статусбаре светится сообщение о том что выборка не полная.
В первом варианте докачка данных происходила при перемещении указателя на последнюю загруженную запись. Летом заморочился и переделал чтобы пустые строчки не были видны до тех пор пока есть что тащить с сервера. Получилось не идеально (механизм скрола у фоксового грида не очень однозначный), но достаточно удобно.
Ratings: 0 negative/0 positive
Re: Система на CursorAdapter
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
У меня в некоторых, огромных справочниках реализовано так.
Выбираю что то, показываю (ск. не тормозит пусть 10000), а дальше все равно юзер начинает поиск.
И тут делаю перевыборку, по ясному критерию, введенному юзером.
Поиск интерактивный. Потому, как то незаметно все для юзера.

Есть поиск договоров, и там они не знают точное название.
Потому в текстбокс вводят что то, жмут поиск.
Перевыбираю по Like

Без када, своя обертка над sqlexec.
Но думаю это не принципиально, главное подход найти.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 32 (Гостей: 32)

© 2000-2024 Fox Club 
Яндекс.Метрика