Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2011, 13:42   #1
Oksana_Cher
 
Регистрация: 16.03.2011
Сообщений: 5
По умолчанию Данные в диапазоне дат

Всем доброго времени суток!)

Такая вот проблемка: мне необходимо вывести данные в диапазоне дат совместно с поиском по нескольким полям. Отдельно эти запросы работают, а вот вместе у меня не получилось их соединить.

Вот коды:
Код:
// поиск в диапазоне дат
  Query7.Active:= False;
  Query7.ParamByName('date1').Value:= Form1.DateTimePicker1.Date;
  Query7.ParamByName('date2').Value:= Form1.DateTimePicker2.Date;
  Query7.SQL.Text:='SELECT * FROM control1.db WHERE Data_isp BETWEEN : date1 AND : date2';
  Query7.Active:= True;

// поиск по нескольким полям
Query4.Active := False;
  Query4.SQL.Clear;
  Query4.SQL.Add('SELECT mro.kod_mro, control.Id, control.MRO, control.Data_doc, control.Number_doc, control.Data_isp, control.Number_UD, control.Sledovatel, control.Control, control.Prim, control.Vid_doc');
  Query4.SQL.Add('FROM control, mro');
  if (Length(Edit3.Text) > 0) or
       (Length(Edit4.Text) > 0) or
       (Length(Edit5.Text) > 0) or
       (Length(ComboBox2.Text) > 0) or
       (Length(ComboBox1.Text) > 0) or
       (Length(ComboBox3.Text) > 0) or
       (Length(ComboBox4.Text) > 0) then
     begin
       Query4.SQL.Add('WHERE mro.mro_name=control.mro AND ');  //отделы
       Query4.SQL.Add(' control.Number_UD LIKE' + #39 + Edit3.Text + '%' + #39 +' AND ');
       Query4.SQL.Add(' control.Number_doc LIKE' + #39 + Edit5.Text + '%' + #39 +' AND ');
       Query4.SQL.Add(' control.Sledovatel LIKE' + #39 + ComboBox2.Text + '%' + #39 +' AND ');
       Query4.SQL.Add(' control.Control LIKE' + #39 + ComboBox1.Text + '%' + #39 +' AND ');
       Query4.SQL.Add(' control.MRO LIKE' + #39 + ComboBox3.Text + '%' + #39 +' AND ');
       Query4.SQL.Add(' control.Data_isp LIKE' + #39 + Edit4.Text + '%' + #39 +' AND ');
       Query4.SQL.Add(' control.Vid_doc LIKE' + #39 + ComboBox4.Text + '%' + #39);
       Query4.SQL.Add('ORDER BY mro.kod_MRO');  //сортировка
       Query4.Active := True;
     end
   else
     begin
       Query4.Active := True;
       Query4.First;
     end;
Буду благодарна за помощь)))

Последний раз редактировалось Баламут; 16.03.2011 в 13:52.
Oksana_Cher вне форума Ответить с цитированием
Старый 16.03.2011, 14:05   #2
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Код:
if (Length(Edit3.Text) > 0) or
       (Length(Edit4.Text) > 0) or
       (Length(Edit5.Text) > 0) or
       (Length(ComboBox2.Text) > 0) or
       (Length(ComboBox1.Text) > 0) or
       (Length(ComboBox3.Text) > 0) or
       (Length(ComboBox4.Text) > 0) then
Может, все-таки AND, а не OR ?
И даты лучше вводить через DateTimePicker, а не через Edit, где юзер может ввести что попало...
Это я про
Код:
Query4.SQL.Add(' control.Data_isp LIKE' + #39 + Edit4.Text + '%' + #39 +' AND ');
Query4.Active := True; ??? Есть же нормальная команда Query.Open... То же - Query4.Active := False; -> на Query4.Close;
Или вы тренируетесь в наборе текста ?
И конструкция вида #39 + Edit3.Text + '%' + #39 заменяется на QuotedStr(Edit3.Text+'%')...

Последний раз редактировалось asmodey1; 16.03.2011 в 14:15.
asmodey1 вне форума Ответить с цитированием
Старый 16.03.2011, 14:15   #3
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Ну, во первых смущает вот этот кусок кода
Код:
if (Length(Edit3.Text) > 0) or
       (Length(Edit4.Text) > 0) or
       (Length(Edit5.Text) > 0) or
       (Length(ComboBox2.Text) > 0) or
       (Length(ComboBox1.Text) > 0) or
       (Length(ComboBox3.Text) > 0) or
       (Length(ComboBox4.Text) > 0) then
Т.е. если хотя бы в одном из контролов есть текст, то выполнить весь вот этот код
Код:
begin
       Query4.SQL.Add('WHERE mro.mro_name=control.mro AND ');  //отделы
       Query4.SQL.Add(' control.Number_UD LIKE' + #39 + Edit3.Text + '%' + #39 +' AND ');
       Query4.SQL.Add(' control.Number_doc LIKE' + #39 + Edit5.Text + '%' + #39 +' AND ');
       Query4.SQL.Add(' control.Sledovatel LIKE' + #39 + ComboBox2.Text + '%' + #39 +' AND ');
       Query4.SQL.Add(' control.Control LIKE' + #39 + ComboBox1.Text + '%' + #39 +' AND ');
       Query4.SQL.Add(' control.MRO LIKE' + #39 + ComboBox3.Text + '%' + #39 +' AND ');
       Query4.SQL.Add(' control.Data_isp LIKE' + #39 + Edit4.Text + '%' + #39 +' AND ');
       Query4.SQL.Add(' control.Vid_doc LIKE' + #39 + ComboBox4.Text + '%' + #39);
       Query4.SQL.Add('ORDER BY mro.kod_MRO');  //сортировка
       Query4.Active := True;
     end
Что-то здесь не то. Я делаю примерно так
Код:
var s: string;
if (Length(Edit1.Text) > 0) then s:= s+ ' AND (ПОЛЕ1 = ЧЕМУ-ТО )';
if (Length(Edit12.Text) > 0) then s:= s+ ' AND (ПОЛЕ2 = ЧЕМУ-ТО )';
А потом к запросу добавляю содержимое s. Думаю смысл понятен.
По теме... Добавь ко второму запросу
Код:
var date1, date2: TDateTime;
date1:= Form1.DateTimePicker1.Date;
date2:= Form1.DateTimePicker2.Date;

' AND Data_isp BETWEEN :date1 AND :date2'

 Query4.ParamByName('date_begin').AsDateTime := date1;
  Query4.ParamByName('date_end').AsDateTime := date2;
Указывай ParamByName после запроса, а не до него.
P.S. asmodey1, как мы синхронно один и тотже кусок кода вставили...

Последний раз редактировалось _SERGEYX_; 16.03.2011 в 14:18.
_SERGEYX_ вне форума Ответить с цитированием
Старый 16.03.2011, 14:25   #4
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Да уж...
А я немного по-другому:
Код:
if (Length(Edit1.Text) > 0) then 
s:= s+ ' AND (ПОЛЕ1 = ЧЕМУ-ТО )' else
begin
ShowMessage('Вы не заполнили ПОЛЕ1 !');
exit;
end;
asmodey1 вне форума Ответить с цитированием
Старый 17.03.2011, 00:19   #5
Oksana_Cher
 
Регистрация: 16.03.2011
Сообщений: 5
По умолчанию

да отдельно друг от друга они нормально работают, мне нужно их в один собрать, одной процедурой сделать.

P.S. Код конечно не очень красивый))) пишем, как умеем)))
Oksana_Cher вне форума Ответить с цитированием
Старый 06.04.2011, 15:34   #6
Oksana_Cher
 
Регистрация: 16.03.2011
Сообщений: 5
По умолчанию

Правильный ответ:

Query8.DisableControls;
Query8.Close;
Query8.SQL.Clear;
Query8.SQL.Add('SELECT * WHERE');
Query8.SQL.Add('Data_isp BETWEEN ate1 AND ate2');
if Trim(ComboBox8.Text) <> '' then
Query8.SQL.Add('and Control like' + QuotedStr(ComboBox8.Text + '%'));
if Trim(ComboBox9.Text) <> '' then
Query8.SQL.Add('and Vid_doc like' + QuotedStr(ComboBox9.Text + '%'));
if Trim(ComboBox10.Text) <> '' then
Query8.SQL.Add('and MRO like' + QuotedStr(ComboBox10.Text + '%'));
Query8.ParamByName('date1').AsDate: = Form1.DateTimePicker1.Date;
Query8.ParamByName('date2').AsDate: = Form1.DateTimePicker2.Date;
Query8.SQL.Add('ORDER BY mro.kod_mro, control1.data_isp');
Query8.Filtered:= True;
if CheckBox1.Checked then Query8.Filter:= Edit9.Text else
Query8.Filtered:= False;
Query8.Prepare;
if Query8.Prepared then
Query8.Open;
Query8.EnableControls;


Может кому пригодится...
Oksana_Cher вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выбрать данные из диапазона дат в ADOQuery antoni БД в Delphi 4 27.07.2010 19:08
Числа в диапазоне Patrick Паскаль, Turbo Pascal, PascalABC.NET 3 18.09.2009 19:37
функция поиска в диапазоне Neonoff Microsoft Office Excel 1 18.02.2008 03:52
как найти данные в диапазоне Tanya2007 Microsoft Office Excel 2 20.11.2007 19:33