![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос на выборку [D7, access]
Fedor © (2009-05-21 16:48:00)Как при помощи sql запроса отображать только то количество записей, которое убирается в область отображения DBGrid? Например пусть DBGrid может отображать 10 записей.
Нат (2009-05-24 04:14:00) [1]Поправлю
If lenght(Edit2.Text) <3 then TextVal := "Ключ к записи, которая выводится по умолчанию"
else TextVal := Edit2.Text + "%";
"select id, tel, adr, director ..." + TextVal ;
Добавлять впереди "%" - нет смысла, это ограничит возможности.
Без первого "%" поиск осуществляется с начала строки.
Если пользователь желает, он сам добавит "%" в эдит, и поиск пойдет по вхождению подстроки с любого места.
Нат (2009-05-24 04:06:00) [2]Да, проблема не локализована.
По поводу ускорения.
1. Преступно формировать запрос "select ..." + Edit2.Text
Можно гарантировать, что в едите не всегда будут правильные данные.
2. Вы похоже обрабатываете запрос на ввод каждого символа.
Может быть стоит ужесточить условия отбора вводом как минимум 2..3-х символов. Кроме того, стоит проверять на пустоту едита.
Т.о. сначала присваиваете в переменную, если имеется пустое значение, подставляйте что-нибудь, что не позволит вывести все записи.
3. В большинстве случаев можно явно указать требуемые поля.
Выводите не все, а минимум, необходимый в гриде.
Для подробных сведений, делайте Детайл - все поля будете выводить только для одной записи.
Например.
If lenght(Edit2.Text) <3 then TextVal := "Ключ к записи, которая выводится по умолчанию"
else TextVal := Edit2.Text;
"select id, tel, adr, director ..." + TextVal + "%";
Таким образом, вы будете перекачивать по сети на порядок меньше информации.
sniknik (2009-05-23 13:09:00) [3]> Для фотки сделать отдельный запрос и датасет.
зачем? блоб поля и так не включаются в датасет, и скачиваются с сервера только при обращении т.е. тут при отрисовке.
> 2. ADODataSet сам (внутри себя) реализует то, что Вы пытаетесь сделать.
не совсем, есть похожий режим но это не то что хочет автор.
он хочет скачать 10 и показывать их пока страницу не перелистнут тогда скачать следующие 10 и т.д., т.е. делается скачка и показ кусками.
а то про что ты говоришь, это способ построения рекордсета, т.е. там скачивается на размер блока и сразу после этого рекордсет становится активным, данные отображаются но скачка не останавливается а продолжается в фоне пока не сформируется весь, неважно перелистнут страницу или нет.
разница однако.
скорее к тому что он хочет ближе серверный курсор, но и он работает не совсем так, не блоками, а по обращению непосредственно к записям. если смотреть только на листание то оно будет один в один как хочет. но без толку, т.к. проблема не в способе запросов. этим только "замылит" настоящую проблему (ну вот представим что на получение записи стоит какая то обработка и тормоз от нее, при локальном курсоре она прогоняется 500раз при открытии и тормоза заметны, при серверном будет только 10 (сколько получили для отображения грида), незаметно хотя проблемная обработка никуда не делась, т.е. тормоза сейчас сконцентрированные в одном месте просто "размажутся" по всему времени работы с датасетом, но стоит например сделать по нему цикл... все начнется заново.).
Нат (2009-05-23 00:56:00) [4]1. Зачем в гриде поле с фоткой?
Все равно толком не отобразить.
Для фотки сделать отдельный запрос и датасет.
2. ADODataSet сам (внутри себя) реализует то, что Вы пытаетесь сделать.
Для этого есть свойства CacheSize, BlockReadSize и MaxRecords и событие OnEndOfRecordSet
sniknik (2009-05-22 12:04:00) [5]> Это смотря какой запрос
в accecc особо сложных не бывает.
тем более здесь уже явно указан
> CustDS.CommandText:='select * from customers order by card';
выполняется 3 сек на Core2Duo с 4 гигами.
очевидно что то не так.
Игорь Шевченко (2009-05-22 11:58:00) [6]
> 1000 записей выбирается за 0,01 секунды максимум
Это смотря какой запрос
sniknik (2009-05-22 11:51:00) [7]> Но стоит очистить поле база замирает выполняя запрос
на выборке без условий, т.е. 500 записей? смешно. где то еще есть неучтенные тормоза, может у тебя какие то события привязаны к датасету.
проверь свой полный запрос в независимой проге, например -
http://webfile.ru/3635677
тоже 3 сек?
и потом, если есть выборка полностью то частичная она как бы уже лишняя, отбор произошел, смысла перезапрашивать нет, можно делать просто фильтром по выбранному.
Медвежонок Пятачок (2009-05-22 11:18:00) [8]Два раза. Например мы ввели символ "а" - у нас список фамилий на "а". Нажали "Backspace" - у нас таблица полностью.
Например он сначала ввел "ля-ля-тополя", а потом притопил backspace
MsGuns (2009-05-22 10:58:00) [9]>На слабых машина прога виснет. На моем ноуте Core2Duo с 4 гигами задержка примерно >секунды 3. Количество записей около 500 записей с фотками.
Во как !
Решение в [20] - т.е. извлекаются все поля, которые можно внятно (т.е. текстом) показать в сетке. А для фоток кнопульку, по нажатию на которую с сервера тянется блоб (блобы) ТОЛЬКО ПО ТЕКУЩЕЙ ЗАПИСИ. Ну примерно так, как это показано в фильмах, где смотрят разные досье
Сергей М. (2009-05-22 10:27:00) [10]
> в DataSet это не отмечено
Что значит "не отмечено" ?
Виталий Панасенко (2009-05-22 09:58:00) [11]А почему фотки не показывать отдельно? точнее, фетчить? бегай себе по гриду, нужно показать всю инфу(фото) - выборка ОДНОЙ ЗАПИСИ для показа
Ega23 (2009-05-22 09:55:00) [12]
> Очень нужен.
А зачем на OnChange вешать? Положи рядом кнопочку "Обновить".
Да, и если уж на то пошло, то:
procedure TForm1.Edit2Change(Sender: TObject);
begin
with CustDS do
begin
Close;
if (Edit2.text = '') then
CommandText := ....
else
CommandText := ....;
try
Open;
except
.....
end;
end;
Fedor (2009-05-22 09:51:00) [13]
> 1. У тебя поле card индексировано ?
Да. На уровне создания базы.
Вот в DataSet это не отмечено.
> 2. Курсор НД на клиентской или серверной стороне ?
Клиент.
> 3. Так ли уж необходим инкрементальный поиск/выборка ?
Очень нужен.
Сергей М. (2009-05-22 09:44:00) [14]
> Fedor (22.05.09 09:24) [12]
1. У тебя поле card индексировано ?
2. Курсор НД на клиентской или серверной стороне ?
3. Так ли уж необходим инкрементальный поиск/выборка ?
Fedor (2009-05-22 09:40:00) [15]
> ты посчитай сколько раз при этом вызывается onchange
Два раза. Например мы ввели символ "а" - у нас список фамилий на "а". Нажали "Backspace" - у нас таблица полностью.
Медвежонок Пятачок (2009-05-22 09:36:00) [16]>Когда он попадает на последнюю запись в гриде мы выполняем запрос типа:
Предварительно промедитировав куда именно в будущем направится юзер с этой записи. Вверх или вниз. Или вообще никуда не направится, а закроет программу через 10 секунд.
MsGuns (2009-05-22 09:29:00) [17]>Fedor (21.05.09 17:12) [3]
>А пользователю и нужны те записи что отображены в гриде. Кроме того он еще и скролирует его. >На вскидку, я думаю так: мы отображаем первые 10 записей.
>Затем пользователь начинает "бегать" по гриду изменяя позицию.
>Когда он попадает на последнюю запись в гриде мы выполняем запрос типа:
Эта.. вот собрались друзья отметить событие, сбегали в лавку, купили чекушку. Дернули - сбегали еще раз в лавку - купили по огурцу, закусили. Затем опять сбегали за новой чекушкой, дернули. Сбегали за 100 гр. колбаски - закусили.
И т.д.
Медвежонок Пятачок (2009-05-22 09:27:00) [18]ты посчитай сколько раз при этом вызывается onchange
Fedor (2009-05-22 09:24:00) [19]
> есть подозрения, что твои "тормоза" не имеют ничего общего
> с теми, что ты ищешь...
Возможно. Опишу проблему.
Поиск организован следующим образом:
procedure TForm1.Edit2Change(Sender: TObject);
begin
if Edit2.Text<>'' then
begin
CustDS.Close;
CustDS.CommandText:='select * from customers where surname like "'+Edit2.Text+'%" order by card';
CustDS.Open;
end
else
begin
CustDS.Close;
CustDS.CommandText:='select * from customers order by card';
CustDS.Open;
end;
end;
Когда мы вводим текст в поле Edit все работает замечательно. Но стоит очистить поле база замирает выполняя запрос
select * from customers order by card
На слабых машина прога виснет. На моем ноуте Core2Duo с 4 гигами задержка примерно секунды 3. Количество записей около 500 записей с фотками. Может так быть должно?
Ega23 (2009-05-21 17:55:00) [20]
> Если он привязан к гриду, то фетч идет до тех пор, пока
> не кончится место в его клиентской части.
Я бы не стал заходить так далеко и выражаться столь категорично. Всё от конкретной реализации TDataSet зависит.