Форум: "Базы";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];
ВнизРегулировка закачки данных Найти похожие ветки
← →
Андрусь (2002-06-18 11:27) [0]Помогите,люди знающие добрым советом! Такая проблема:есть база с большими таблицами.Нужно запретить пользователю выкачивать инфу на клиента большими порциями,которые соответственно будут отнимать время. Так вот задачка в том,чтобы регулировать подкачку. Может кто сталкивался с проблемой. Зараннее спасибо!
← →
roottim (2002-06-18 11:38) [1]а в чем проблема? и какие компоненты доступа?
помоему феч есть везде и в БДЕ тоже
← →
Андрусь (2002-06-18 11:45) [2]Проблема в скролинге,я извиняюсь за не совсем корректно заданный вопрос. Когда пользователь кликает в конец скролинга на клиент начинается закачка большого количества инфы(попросту смещение на последнюю запись). Спасибо за участие.
← →
Sergey13 (2002-06-18 11:50) [3]А каким макаром они выкачивают? Сами запросы пишут? Или где? Если сами то по рукам бить - административный путь. Если каким то приложением - то лопатить это проложение на предмет оптимизации.
← →
Андрусь (2002-06-18 12:13) [4]Не ругайся Серегей_13! Вопрос общий. Приложение моё. И я его хочу оптимизировать для удобства пользователей. Они запросов не пишут. А впрочем это не совсем то.. Вопрос то в чём. Когда пользователь кликает на конец скролинга грида,то происходит закачка на клиента,которая в виду больших объёмов может занимать некоторое время,чего и хочется не допускать,регулируя подкачку.
Но всё равно спасибо.
← →
Mike_Goblin (2002-06-18 12:34) [5]Раз приложение твое и пользователь не делает прямых SQL запросов из него, значит ты построил его так что САМ допускаешь возможность получения больших выборок. Попробуй оптимизировать.
В МS SQL когда делал поиск по заданным пользователем условиям писал хранимую процедуру, которая сначала анализировала число записей выборки и если оно превышало порог просто выдавала ошибку
← →
Johnny Smith (2002-06-18 12:37) [6]2Андрусь (18.06.02 12:13)
Вопрос общий
Ну, я бы не сказал, что общий. Очень даже не общий.
Решений я вижу по крайней мере два.
1) Выкачивать на клиента ВСЕ данные до того момента, как пользователь из увидит в гриде. Тогда пусть он хоть обскроллится - все будет летать. Но это будет не совсем клево - время на выкачивание будет просто перераспределено.
2) Более сложный вариант - разработать политику выкачивания отдельных блоков в зависимости от действий юзера.
← →
Андрусь (2002-06-18 13:40) [7]>Johnny Smith, извиняюсь - Вопрос общий - для меня он такой
Я иду по пути 2. И возникшая проблема - сколинг - очередной шаг по этой дорожке.Как по клику на конец скролинга ограничивать порцию закачки. Спасибо.
← →
Внук (2002-06-18 13:51) [8]Андрусь (18.06.02 13:40)
Очень понятная проблема. Сам в свое время решил следующим образом: перписал DbGrid (унаследовал), чтобы при перетаскивании ScrollBar"а он читал не все (как по умолчанию), а очередной пакет. Плюс кнопка Last для особо пытливых пользователей. Посмотри исходники DOA и DBGrid (его реакцию на VM_SCROLL) и станет понятно, как нужно изменить Grid.
← →
Внук (2002-06-18 13:57) [9]А, вот, нашел... Вроде вырезал все лишнее без ошибок...
type
TNSIDBGrid=class(TDBGridEH)
private
procedure WMVScroll(var Message:TWMVScroll);message WM_VSCROLL;
protected
public
published
end;
procedure TNSIDBGrid.WMVScroll(var Message:TWMVScroll);
var SI: TScrollInfo;
begin
if not AcquireFocus then Exit;
if Datalink.Active then
with Message,DataLink.DataSet do
case ScrollCode of
SB_LINEUP: DataLink.DataSet.MoveBy(-Datalink.ActiveRecord - 1);
SB_LINEDOWN: DataLink.DataSet.MoveBy(Datalink.RecordCount - Datalink.ActiveRecord);
SB_PAGEUP: DataLink.DataSet.MoveBy(-VisibleRowCount);
SB_PAGEDOWN: DataLink.DataSet.MoveBy(VisibleRowCount);
SB_THUMBPOSITION:
begin
if IsSequenced then
begin
SI.cbSize := sizeof(SI);
SI.fMask := SIF_ALL;
GetScrollInfo(Self.Handle, SB_VERT, SI);
if SI.nTrackPos <= 1 then First
else if SI.nTrackPos >= RecordCount then DataLink.DataSet.MoveBy(DataLink.DataSet.RecordCount-RecNo+1)
else RecNo := SI.nTrackPos;
end
else
case Pos of
0: First;
1: DataLink.DataSet.MoveBy(-VisibleRowCount);
2: Exit;
3: DataLink.DataSet.MoveBy(VisibleRowCount);
4: begin
First;
DataLink.DataSet.MoveBy(DataLink.DataSet.RecordCount);
end;
end;
end;
end;
end;
← →
roottim (2002-06-18 14:02) [10]вот насколько большие обьемы.. и от этого зависит..
методы DOA и ODAC оптимизированы и неплохо управляю запрашиваемыми вами требованиями
но
допустим список лиц
ид, ф, и, о, возр, пол, паспорт, и тд и тп
если действительно нужен весь этот список... то достаточно ограничится выводом в грид
скажем
ид, ф
а лучше вообще один ид... а в остальном детайл запросы на этот ид.. и по ним лучше иметь индексы (это для сортированного списка) будет и информативно и быстро.
конечно метод не единственный
← →
Андрусь (2002-06-18 14:59) [11]Спасибо.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.019 c