Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск по базе данных 
V
    Опции темы
royun
Дата 15.12.2011, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 22.8.2011

Репутация: нет
Всего: нет



Добрый день.

Есть код, который осуществляет поиск по набранному номеру (колонка abonenta) в таблице billing за период даты (колонка Date, sDateEdit1.Text - начальная дата, sDateEdit2.Text - конечная дата)

Код

procedure TForm1.Button1Click(Sender: TObject);
var
sql:string;
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
sql:= 'SELECT * FROM billing where [abonenta]='''+Edit1.Text+''' and Date >= '''+sDateEdit1.Text+''' and date <= '''+sDateEdit2.Text+'''';
ADOQuery1.SQL.Add(sql);
try
ADOQuery1.Open;
except
application.MessageBox( 'Не могу выполнить запрос', 'Ошибка',MB_OK);
end;
end;


и есть запрос

Код

sql:= 'SELECT * FROM billing where [abonenta]='''+Edit1.Text+''' and Date >= '''+sDateEdit1.Text+''' and date <= '''+sDateEdit2.Text+'''';


который не правильно работает. Если я хочу найти набранный номер по всей таблице, я не устанавливаю начальную и конечную даты. И когда я нажимаю кнопку "найти", на DBGrid ни чего не выводится. Хотя данные по этому номеру точно есть. И также, если я хочу найти набранный номер по всей таблице с начальной датой, то тоже на DBGrid ни чего не выводит.

Я понимаю что сам запрос не идеален, поэтому прошу вас усовершенствовать данный запрос.
PM MAIL   Вверх
Данкинг
Дата 15.12.2011, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(royun @  15.12.2011,  11:30 Найти цитируемый пост)
Если я хочу найти набранный номер по всей таблице, я не устанавливаю начальную и конечную даты. И когда я нажимаю кнопку "найти", на DBGrid ни чего не выводится.

Так меняй сам текст запроса в соответствии с условиями поиска. В данном случае просто убирай оба условия where.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Akella
Дата 15.12.2011, 13:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



КЭП подсказывает, что нужно строить условия запроса динамически smile
PM MAIL   Вверх
superVad
Дата 16.12.2011, 15:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



Добавлю, что еще стоит начать использовать параметры. Как бы боянисто это не звучало.
PM MAIL   Вверх
royun
Дата 19.12.2011, 05:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 22.8.2011

Репутация: нет
Всего: нет



Спасибо всем за участие, буду читать, читать и читать.
PM MAIL   Вверх
MMihan
Дата 19.12.2011, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.12.2011

Репутация: нет
Всего: нет



вот посмотри мой запрос...   работает к MSsql  и аксесс...    а у тебя дата чтоли через Edit вводится, а не проше  через   DateTimePicker
Код

with ADOQuery1 do
     begin
Close;
SQL.Clear;
  SQL.Add('select *' ) ;
  SQL.Add('from Клиент');
  SQL.Add('where ((КЛ  LIKE '''+Edit1.Text+'%'') AND (ФИО  LIKE   '''+Edit2.Text+'%'' OR ФИО IS NULL )  
AND (Оборудование  LIKE   '''+Edit4.Text+'%'' OR Оборудование IS NULL) 
AND (Телефон  LIKE   '''+Edit3.Text+'%'' OR Телефон IS NULL)  AND (Дата > :dt1  AND Дата <:dt2 ) )');
Parameters.ParamByName('dt1').Value:=DateToStr(DateTimePicker1.DateTime);
Parameters.ParamByName('dt2').Value:=DateToStr(DateTimePicker2.DateTime);
   Active:=true;
 DSSearchDoc.DataSet:=ADOQuery1;
 DbGrid1.DataSource:=DSSearchDoc;
ADOQuery1.FieldByName('Внешний вид').Visible:=false;
 DbGrid1.Fields[0].DisplayLabel:='Номер';
   end;  


думаю по этому можно без труда тебе переделать на совой запрос и если у тебя и если у тебя некоторые могут быть пусты ето нужно указывать OR ПОле IS NULL.

Это сообщение отредактировал(а) MMihan - 19.12.2011, 15:51
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0781 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.