Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: помогите с поиском  (Прочитано 9122 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Demidova Aigul
Гость
« : 10-09-2007 06:52 » 

Привет, программисты!  Улыбаюсь Помогите решить одну проблемку. Из-за этого у меня приложение к базе данных медленно работает. База данных у меня на SQL Server (е), приложение на Делфи.
У меня на главной форме есть вкладка с четырьмя страницами. На каждой странице имеется DBGrid, соединенный со своим Query.  В самом Query имеется обычный запрос к базе.
Так вот, если в этом запросе написать "SELECT TOP 10  и т.д." (и так в каждом Query),  то приложение работает быстро, но у меня не получается сделать поиск. А если в запросе написать "SELECT ...   и т.д." (без TOP 10), то приложение работает медленно, потому что в запросе выходят все записи, а их очень много. Зато тогда у меня поиск работает, но тоже медленно.

Я делала поиск по инвентарному номеру (поле InventoryID), вот так:

procedure TForm1.Button4Click(Sender: TObject);
begin
dm.Query1.Filtered:=True;
dm.Query1.Filter:='InventoryID= '''+inv_poisk.Text+'''';
dm.Query1.Close;
dm.Query1.Open;
//Label80.Caption:=cou(dm.Query1);
end;

Вот этот поиск работает, когда  в Query  "SELECT ...   и т.д." (без TOP 10).
А когда  "SELECT TOP 10  и т.д.", то поиск работает только в пределах тех десяти записей, которые показываются в DBGrid (е), остальные записи, имеющиеся в запросе, он просто не видит.
А мне нужно, чтоб в  DBGrid (е) показывалось только 10 первых записей (так приложение быстрей работает), но чтоб поиск осуществлялся среди всех имеющихся в запросе записей, даже которые не показаны в DBGrid.
Вот. Помогите мне, пожалуйста.  Скромно так...


Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #1 : 10-09-2007 07:43 » 

(до прихода тех, кто реально поможет - наводящие вопросы Улыбаюсь )
1) во первых, не мешало бы протестировать скорость без запросов. То есть имитировать вместо SELECT любые данные без реального обращения к базе, как в этом случае работает ? Тормозит ? Не должно

2) "TOP 10" - не будет правильно выбирать (случайные записи будут, насколько понимаю) , я бы применил SELECT FIRST(10) FROM ... WHERE ...

3) размер таблицы (количество записей), максимальный предполагаемый размер таблицы в базе - ?
Записан

Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 10-09-2007 09:19 » 

select top... заполнит грид результатом
если нужен поиск по всей выборке, то и нужна вся выборка
для этого можно вывести top, затем запустив форму поиска - сделать полный запрос и в полной выборке уже что-то искать

если нужен пейджинг, то можно поступить приблизительно так
Код:
DECLARE @PageSize int
SELECT @PageSize = 5
DECLARE @CurrentPage int
SELECT @CurrentPage = 1

CREATE TABLE #TempT
(
 [Count] int IDENTITY PRIMARY KEY,
 ...,
 ...,
 ...
)
INSERT INTO #TempT SELECT * FROM Таблица WHERE ...
DECLARE @First int, @Last int
 
SELECT @First = (@CurrentPage - 1) * @PageSize
SELECT @Last = (@CurrentPage * @PageSize + 1)
SELECT * FROM #TempT WHERE [Count] > @First AND [Count] < @Last
SELECT @TotalPages = ceiling(convert(decimal(18, 4), count(*)) / @PageSize) FROM #TempT

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #3 : 11-09-2007 04:01 » 

Попробуй вообще отказаться от фильтрации записи, а сделать фильтрующий запрос:
Код:
dm.Query1.SQL.Text:='SELECT TOP 10 * FROM Таблица WHERE InventoryID='+inv_poisk.Text;//если InventoryID-числовое поле
//или
dm.Query1.SQL.Text:='SELECT TOP 10 * FROM Таблица WHERE InventoryID='+''''+inv_poisk.Text+'''';//если InventoryID-текстовое поле
Ну и что бы более эффективно было, если не нужны все поля таблицы (не путать с количеством) в выше указанном запросе вместо '*' перечисление нужных полей.
Записан
Demidova Aigul
Гость
« Ответ #4 : 12-09-2007 05:38 » 

Спасибо большое всем за советы.   Отлично

Цитата
(до прихода тех, кто реально поможет - наводящие вопросы  )
1) во первых, не мешало бы протестировать скорость без запросов. То есть имитировать вместо SELECT любые данные без реального обращения к базе, как в этом случае работает ? Тормозит ? Не должно

2) "TOP 10" - не будет правильно выбирать (случайные записи будут, насколько понимаю) , я бы применил SELECT FIRST(10) FROM ... WHERE ...

3) размер таблицы (количество записей), максимальный предполагаемый размер таблицы в базе - ?

Алексей1153++ , скорость без запросов просто шикарная.  Да-да
Размер таблицы - кол-во записей у меня пока 3622 в одной таблице, в других таблицах - 5640, 2366, 41745, 3609, 3607, 3228, 4330, 3609. В дальнейшем возможно, что в каждой таблице может быть примерно 40000-60000 записей. Даже страшно подумать, как будет работать приложение.  Меня одолевают смутные сомнения

А как бы мне в Query написать запрос, чтоб выходили в DBGrid (е) не первые 10 записей, а последние 10 введенных записей? Так пользователям будет проще - они будут видеть, что ввели недавно.

Sla , спасибо за совет.  Улыбаюсь Но что-то так сложнее получается. Мне, как новичку, надо что попроще. Я там не все поняла.  Жаль

 zubr , попробовала на одном из  Query ваш способ - работает.  Класс! Спасибо! Сейчас я попробую и на всех остальных Query, надеюсь, что и там получится, особенно где 41745 записей.  Инвалид   
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 12-09-2007 08:16 » 

Belka*, записи в запросе могут быть не отсортированы, тебе нужно сортировка по... (а кто-его знает почем) например по ID, оно уникально, в основном всегда растет, или по дате создания записи, если есть такое поле, или по дате последнего изменения, если есть такое поле

если есть возможность добавлять свои функции, то можно сделать "пейджиговую" функцию возвращающую требуемый запрос, по приведенному мною примеру
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Demidova Aigul
Гость
« Ответ #6 : 12-09-2007 10:25 » 

На всех остальных Query тоже вроде работает, и сортировку сделала по 10 последним записям.  Отлично
Странно, а почему у меня DateTimePicker как-то неправильно стал работать?  Жаль  Вроде раньше нормально было, а сейчас при нажатии внизу календаря на "Сегодня" показывается 1 января 2001 г.  А черт его знает...
Вообще, как сделать так, чтобы в DateTimePicker по умолчанию была сегодняшняя дата?
Записан
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #7 : 13-09-2007 09:53 » 

Код:
DateTimePicker1.Date:=Now;
//или
DateTimePicker1.Date:=Date;
Записан
Demidova Aigul
Гость
« Ответ #8 : 13-09-2007 10:16 » 

Ура! Спасибо!  DateTimePicker работает.  Улыбаюсь

А может кто-нибудь подсказать, как сделать так, чтоб в комбобоксе люди могли выбирать только то, что там есть, чтобы ничего другого там не разрешалось заполнять самим? А то вот есть у меня, например, комбобокс со списком полезных ископаемых внутри. Так люди иногда путаются и сами там заполняют, да еще и с ошибками. Например, вместо "бокситы" вводят "бакситы".  Жаль
Записан
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #9 : 13-09-2007 14:47 » 

У комбобокса есть свойство Style, так вот если ComboBox1.Style=csOwnerDrawFixed то будет то что тебе нужно.

З.Ы. Советую почитать литературу по программированию в Delphi. Поверьте, множество простых вопросов сразу снимется.
Записан
Demidova Aigul
Гость
« Ответ #10 : 14-09-2007 04:21 » 

Спасибо большое за помощь.    Отлично
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines