Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ещё раз про поиск... [D7, Access]


Страницы:   1 2

Zif ©   (2004-11-22 21:56:00) 

Вот что у меня сейчас есть:

procedure ButtonClick
begin
 DataModule1.ADODataSetMain.Active:=False;
 DataModule1.ADODataSetMain.CommandText:='SELECT * FROM Программы WHERE Название LIKE :Name AND Версия LIKE :Version';
 DataModule1.ADODataSetMain.Parameters.ParamByName('Name').Value:='%'+suiEditProgName.Text+'%';
 DataModule1.ADODataSetMain.Parameters.ParamByName('Version').Value:='%'+suiEditProgVersion.Text+'%';
end;


Это работа с простым полем, все работает отлично, а как быть с полем формата Memo? Может упускаю какой-то параметр?


aus   (2004-12-01 04:08:00) [1]

насчет замедления iif - придумано не мной, я не тестировал, но прочитал в книге "Access руководство разработчика" (автора, к сожалению не помню, книга на работе).


sniknik   (2004-12-01 00:46:00) [2]

Barbos   (30.11.04 22:40) [35]
> Хм... Поясни
> ...
> что к чему???
> меня тож интересует!
where 1 = 1 - вот это наверное пример земедления работы запроса, а то тут на iif грешили ;о) (то что земедлится гарантировано, аксес не имеет встроеного оптимизатора, выполняет "as is")

> MyQ.SQL.Add(' and t.name = :pName ');
> MyQ.ParamByName('pName').AsString := '%что-то%'
вот это, это поиск на точное сравнение, "чтото" обрамленное знаком процента, и ничего более, не поиск пустых полей с картинками, как некоторые полагают.

> IsNull попробуй вместо ''. - пишет ошибку, если DataModule1.ADODataSetMain.Parameters.ParamByName('Picture').Value:=IsNull;
IsNull это функция движка (нужно внутри запроса использовать) а не дельфевая (впрочем если написать ее то и так можно, смотря для чего это нужно)


Val (from Donetsk)   (2004-11-30 22:49:00) [3]

>Barbos   (30.11.04 22:40) [35]
это к динамическому формированию текста запроса, в зависимости от чего угодно.
>Zif ©   (30.11.04 22:41) [36]
var MyQ: TQuery, скажем, или аналог.
where 1 = 1 - всегда true, используется для того, чтобы можно было прицепить ' and..'(условия), если понадобится.


Zif   (2004-11-30 22:41:00) [4]

а поподробнее можно? не совсем понятен код...
MyQ - это переменная или путь в Ado сокращенно?
where 1 = 1 '); - ?
'%что-то%' - вот это что-то мне и нужно сейчас, чтобы он хоть как-то искал пустые поля с картинками
IsNull попробуй вместо ''. - пишет ошибку, если DataModule1.ADODataSetMain.Parameters.ParamByName('Picture').Value:=IsNull;

у меня есть еще 3 значение CheckBox - Grayed, которое тоже наверное надо будет использовать, вернее ничего в этом случае не делать.


Barbos   (2004-11-30 22:40:00) [5]

Хм... Поясни
MyQ.Close;
MyQ.SQL.Clear;
MyQ.SQL.Add('select * from mytable t where 1 = 1 ');
if MyCheckBox.Checked then
begin
  MyQ.SQL.Add(' and t.name = :pName ');
  MyQ.ParamByName('pName').AsString := '%что-то%'
end;
MyQ.Open;

что к чему???
меня тож интересует!


Val (from Donetsk)   (2004-11-30 22:20:00) [6]

>Zif ©   (30.11.04 21:42) [33]
В данном случае, удобно было бы генерировать запрос динамически в зависимости от состояния флажка:

MyQ.Close;
MyQ.SQL.Clear;
MyQ.SQL.Add('select * from mytable t where 1 = 1 ');
if MyCheckBox.Checked then
 begin
   MyQ.SQL.Add(' and t.name = :pName ');
   MyQ.ParamByName('pName').AsString := '%что-то%'
 end;
MyQ.Open;


Zif   (2004-11-30 21:42:00) [7]

А как же все-таки правильно?


sniknik   (2004-11-30 20:26:00) [8]

> в Access нет IsNull, используй iif, хотя слышал что он сильно замедляет выборку.
и то и то неверно, и IsNull есть и iif не замедляет... замедляет то как пишут.


Zif   (2004-11-30 19:44:00) [9]

опять не работает


aus   (2004-11-30 19:17:00) [10]

в Access нет IsNull, используй iif, хотя слышал что он сильно замедляет выборку.


Zif   (2004-11-30 19:01:00) [11]

ругается, говорит неопознанный индитификатор...


msguns   (2004-11-30 18:47:00) [12]

IsNull попробуй вместо ''.


Zif   (2004-11-30 17:36:00) [13]

Мастера!!! подскажите пожайлуста! очень нужно


Zif   (2004-11-29 23:31:00) [14]

нужно сделать поиск типа "Есть картинка к фильму или нет". тобишь пустое поле или нет?
делаю так:

if CheckBoxPicture.State=cbUnchecked then
DataModule1.ADODataSetMain.Parameters.ParamByName('Picture').Value:='';  //если пустое поле

if CheckBoxPicture.State=cbChecked then
DataModule1.ADODataSetMain.Parameters.ParamByName('Picture').Value:='%'; //если в данном поле есть какое-либо значение


В первом случае он вообще ничего не ищет, пробовал много методов, ничего не получается... тем более надо ещё, наверное, учитывать то, что поле может быть заполнено каким-то значением, хотя там картинки нет (например при удалении картинки что-то осталось или если blob поле имеет какое-то значение по умолчанию)

во-втором ищет, все работает, но скорее всего надо подкорректировать - очень долго ищет, хотя и так пока сойдет...


Zif   (2004-11-27 17:05:00) [15]

еще такой вопрос: если у меня поле типа Boolean, то как надо записать строку:
DataModule1.ADODataSetMain.Parameters.ParamByName('Name').Value:='%'+EditFilmName.Text+'%';

CheckBox2 - здесь отмечать параметр поиска (вместо EditFilmName)


Zif   (2004-11-27 12:46:00) [16]

Спасибо за подсказку. вот что получилось:

procedure TFormMain.Button1Click(Sender: TObject);
begin
 if ((EditFilmName.Text<>'') or (EditOriginalFilm.Text<>'') or (EditFilmKratko.Text<>'')) then
 begin
   DataModule1.ADODataSetMain.Active:=False;
   DataModule1.ADODataSetMain.CommandText:='SELECT * FROM Фильмы WHERE Название LIKE :Name OR Оригинальное LIKE :Original OR КраткоОписание LIKE :Kratko';
   if  EditFilmName.Text='' then
     MessageBox(Handle, 'название', 'Пустые значения', MB_OK)
   else
     DataModule1.ADODataSetMain.Parameters.ParamByName('Name').Value:='%'+EditFilmName.Text+'%';
   if  EditOriginalFilm.Text='' then
    MessageBox(Handle, 'оригинальное', 'Пустые значения', MB_OK)
    else
    DataModule1.ADODataSetMain.Parameters.ParamByName('Original').Value:='%'+EditOriginalFilm.Text+'%';
   if  suiEditFilmKratko.Text='' then
     MessageBox(Handle, 'кратко', 'Пустые значения', MB_OK)
   else
     DataModule1.ADODataSetMain.Parameters.ParamByName('Kratko').Value:='%'+EditFilmKratko.Text+'%';
   DataModule1.ADODataSetMain.Active:=True;
 end
 else MessageBox(Handle, 'Не введено не одного значения!', 'Пустые значения', MB_OK);
end;


стоит ли ещё подкоррестировать этот код?


sniknik   (2004-11-25 20:45:00) [17]

пробую последний раз...

дополнение к задачке о холодильнике. в нем по 50 предметов в каждом отделении, и если считать и отсеивать по названию по первой букве насчитывается максимум 23 а если по цвету то 28 одинаковых на каждой полке (о как! ;). с чего бы это?

p.s. слово NULL о чем нибудь говорит? (овечать только после ответа на остальное мною задаваемое! ;о)))


Zif   (2004-11-25 17:36:00) [18]

выкладываю 2 кода? каждый испробывал отдельно:
просто поиск по string:
procedure TFormMain.Button19Click(Sender: TObject);
begin
 DataModule1.ADODataSetMain.Active:=False;
 DataModule1.ADODataSetMain.CommandText:='SELECT * FROM Фильмы WHERE Название LIKE :Name AND Оригинальное LIKE :Original';
 DataModule1.ADODataSetMain.Parameters.ParamByName('Name').Value:='%'+suiEditFilmName.Text+'%';
 DataModule1.ADODataSetMain.Parameters.ParamByName('Original').Value:='%'+EditOriginalFilm.Text+'%';
 DataModule1.ADODataSetMain.Active:=True;
 DataModule1.ADODataSetMain.Sort:='Название';
 Panel2.Caption :='Всего:  '+inttostr(DataModule1.ADODataSetMain.Recordset.RecordCount)+'  Фильмов';
end;


поиск по memo:
procedure TFormMain.Button9Click(Sender: TObject);
begin
 DataModule1.ADODataSetMain.Active:=False;
 DataModule1.ADODataSetMain.CommandText:='SELECT * FROM Фильмы WHERE КраткоОписание LIKE :Kratko or ПолноеОписание LIKE :Podrobno or Критика LIKE :Kritic or Субтитры LIKE :Subtitle';
 DataModule1.ADODataSetMain.Parameters.ParamByName('Kratko').Value:='%'+EditFilmKratko.Text+'%';
 DataModule1.ADODataSetMain.Parameters.ParamByName('Podrobno').Value:='%'+EditFilmPodrobno.Text+'%';
 DataModule1.ADODataSetMain.Parameters.ParamByName('Kritic').Value:='%'+EditKritic.Text+'%';
 DataModule1.ADODataSetMain.Parameters.ParamByName('Subtitle').Value:='%'+EditSubtitle.Text+'%';
 DataModule1.ADODataSetMain.Active:=True;
 DataModule1.ADODataSetMain.Sort:='Название';
 Panel2.Caption :='Всего:  '+inttostr(DataModule1.ADODataSetMain.Recordset.RecordCount)+'  Фильмов';
end;


в итоге что получается:
при пустых значениях Edit-ов в первом случае получается 1846 фильмов (всего данных 1878), во втором - 1859...
в чем прикол? почему так происходит?


ЮЮ   (2004-11-25 08:33:00) [19]

если использовать поиск по полю, полям типа memo, то работает...
если использовать поиск по полю, полям типа string, то работает...
если использовать одновременный поиск по этим полям, то не работает, вернее работает, но очень криво - вместо 79 значений выдает 3

Значит только в трех записей искомое слово есть ив мемо-поле ив string-поле. У тебя же AND стоит


sniknik   (2004-11-25 08:00:00) [20]

данные, что в записях которые не находятся но должны по твоим словам? что в запросе который "странно" по твоему работает?

скрин показывает картинку, которая нафиг не нужна, а нужны данные, для сравнения, которые не показаны...

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

приведи все соответствия, покажи данные в запросах, сами запросы, типы конкретных полей (а не ассортимент), покажи данные находяшиеся и то что не находится (по одному примеру).

(скорее всего если серьезно к этому отнесешся и попытаешся предоставить все нужное для анализа то сам поймеш в чем проблема... (вернее убедишся в ее отсутствии, и в своем непонимании))


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо