Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];

Вниз

Ещё раз про поиск...   Найти похожие ветки 

 
Zif ©   (2004-11-22 21:56) [0]

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

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? Может упускаю какой-то параметр?


 
Zif ©   (2004-11-22 22:00) [1]

в итоге надо вывести список получившихся значений, а не переходить от одного поля к другому
вот где я использую:
http://www.x-softix.com/images/film/find.png


 
Zif ©   (2004-11-23 15:39) [2]

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


нужно добавить строки, выделенные жирным текстом, поиск при этом производится по полям в БД типа memo. Что-то нужно ещё наверно дописать, т.к. не работает...


 
Zif ©   (2004-11-23 23:48) [3]

Люди!!! плиз, подскажите, неужели никто не знает?


 
Johnmen ©   (2004-11-24 00:10) [4]

Сомневаюсь, что так вообще можно извращаться с полем типа Memo в Аксесе. Ведь мемо - это просто двоичные данные. И как их интерпретировать - дело приложения (или движка, но вряд ли).


 
Zif ©   (2004-11-24 00:29) [5]

а как нем тогда искать?


 
sniknik ©   (2004-11-24 00:34) [6]

> т.к. не работает...
?, одно из двух, либо по почкам либо зарплату прибавить. лучше первое, а то взяли моду не работать. ;о))

> Люди!!! плиз, подскажите, неужели никто не знает?
а в чем проблема? непонятно совсем.


 
Zif ©   (2004-11-24 00:36) [7]

тогда так: нужно произвести поиск по полям типа Memo, как это сделать?


 
sniknik ©   (2004-11-24 00:42) [8]

SELECT * FROM Программы WHERE ПолеМемо LIKE :Memo
вполне пойдет


 
Johnmen ©   (2004-11-24 00:52) [9]

>sniknik ©  (24.11.04 00:42) [8]

Николай, у него же так вроде бы и написано...

"- В чём правда, брат ?
- В силе. Кто сильней, тот и прав."  (с) по следу "Брат-2"


 
Zif ©   (2004-11-24 00:55) [10]

он ищет, но только по первым ..10-30 записям


 
Johnmen ©   (2004-11-24 00:59) [11]

>Zif ©  (24.11.04 00:55) [10]

Гон, однако...:)
Или ищет, или нет.


 
sniknik ©   (2004-11-24 01:22) [12]

> Николай, у него же так вроде бы и написано...
правильно написано, непонятно что же не работает.

> он ищет, но только по первым ..10-30 записям
вот это интересно, записи как считаеш? (в смысле это записи или например строки в мемо поле)

> Гон, однако...:)
адназначно! ;о))


 
Zif ©   (2004-11-24 02:11) [13]

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


 
sniknik ©   (2004-11-24 07:16) [14]

задавать значения для поиска которые есть в базе.


 
Zif ©   (2004-11-24 11:12) [15]

к примеру? подробнее можно?


 
sniknik ©   (2004-11-24 18:27) [16]

можно. давай подробности о том что ишещ (и хочеш найти).


 
Zif ©   (2004-11-24 19:06) [17]

я использую такой поиск:
http://www.x-softix.com/images/film/find.png

сразу по всем полям. имеются типы: String, Memo, Boolean


 
sniknik ©   (2004-11-24 22:10) [18]

Zif ©   (24.11.04 19:06) [17]
угу, а у меня холодильник розовый, с наклейкой хонды на боку. перечисли что в нем лежит?

в нем три отделения заморозка, для овощей и общее.

p.s. в решении вопросов совершенно не важна форма, важно содержание... (если никто раньше не говорил то © мой ;о)))


 
Zif ©   (2004-11-24 23:16) [19]

а что мне ещё надо указать? вроде все элементы есть, если скрин видел, то понятен и запрос... может что упустил?


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

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

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

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

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

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


 
ЮЮ ©   (2004-11-25 08:33) [21]

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

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


 
Zif ©   (2004-11-25 17:36) [22]

выкладываю 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...
в чем прикол? почему так происходит?


 
sniknik ©   (2004-11-25 20:45) [23]

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

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

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


 
Zif ©   (2004-11-27 12:46) [24]

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

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;


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


 
Zif ©   (2004-11-27 17:05) [25]

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

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


 
Zif ©   (2004-11-29 23:31) [26]

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

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-30 17:36) [27]

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


 
msguns ©   (2004-11-30 18:47) [28]

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


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

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


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

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


 
Zif ©   (2004-11-30 19:44) [31]

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


 
sniknik ©   (2004-11-30 20:26) [32]

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


 
Zif ©   (2004-11-30 21:42) [33]

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


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

>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;


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

Хм... Поясни
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 22:41) [36]

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

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


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

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


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

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 это функция движка (нужно внутри запроса использовать) а не дельфевая (впрочем если написать ее то и так можно, смотря для чего это нужно)


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

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



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.038 c
4-1099691264
GanibalLector
2004-11-06 00:47
2004.12.26
Handle is edit???


14-1102278234
Youri1
2004-12-05 23:23
2004.12.26
Проэкт базы даных


9-1093018611
Ландграф Павел
2004-08-20 20:16
2004.12.26
Помогите с геометрией 9-го класса


1-1102661652
Kerk
2004-12-10 09:54
2004.12.26
Глюк кодогенератора или мой?


1-1102497058
TUser
2004-12-08 12:10
2004.12.26
Одна консоль на двоих и много на одного





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский