Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.11.2024, 17:39
Filen Filen вне форума
Прохожий
 
Регистрация: 23.05.2024
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию SQL запрос с диапазоном дат

Добрый вечер. Пытаюсь сделать запрос на выборку из таблицы , т.е. в заданном диапазоне дат нужно выбрать все записи с одинаковым id .
С диапазоном дат разобрался ..

Код:
procedure TForm19.Button1Click(Sender: TObject);
var
d1,d2:TDateTime;
idAA:integer;

begin
d1:=(DateEdit1.Date);
d2:=(DateEdit2.Date) ;
DataModule2.ADOQueryApteka.SQL.Clear;
DataModule2.ADOQueryApteka.Active:=False;
DataModule2.ADOQueryApteka.SQL.Add('SELECT DataProdagi,idPrepar,NamPreparat FROM [AptekaProdaga] WHERE [DataProdagi] BETWEEN DateEdit1.Date and DateEdit2.Date ORDER BY NamPreparat ASC');
DataModule2.ADOQueryApteka.Parameters.ParamByName('DateEdit1.Date').Value := DateEdit1.Date;  /// Ïàðàìåòð D1 ïî óìîë÷àíèþ
DataModule2.ADOQueryApteka.Parameters.ParamByName('DateEdit2.Date').Value := DateEdit2.Date;   /// Ïàðàìåòð D2 ïî óìîë÷àíèþ
DataModule2.ADOQueryApteka.Active:=true;
но чтобы отобрать записи еще и с указанным id не соображу как ..

Код:
idAA:=92123134;
d1:=(DateEdit1.Date);
d2:=(DateEdit2.Date) ;
DataModule2.ADOQueryApteka.SQL.Clear;
DataModule2.ADOQueryApteka.Active:=False;
DataModule2.ADOQueryApteka.SQL.Add('SELECT DataProdagi,idPrepar,NamPreparat FROM [AptekaProdaga] WHERE [DataProdagi] BETWEEN DateEdit1.Date and DateEdit2.Date, idAA ORDER BY NamPreparat ASC');
DataModule2.ADOQueryApteka.Parameters.ParamByName('idAA').Value :=idAA;
DataModule2.ADOQueryApteka.Parameters.ParamByName('DateEdit1.Date').Value :=DateEdit1.Date;  /// Параметр D1 по умолчанию
DataModule2.ADOQueryApteka.Parameters.ParamByName('DateEdit2.Date').Value := DateEdit2.Date;   /// Параметр D2 по умолчанию
DataModule2.ADOQueryApteka.Active:=true;
DataModule2.ADOQueryApteka.First;

понимаю что не так , как правильно help my
Ответить с цитированием
  #2  
Старый 07.11.2024, 23:55
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 179
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Код:
DataModule2.ADOQueryApteka.SQL.Add('SELECT DataProdagi, idPrepar, NamPreparat FROM [AptekaProdaga]');
DataModule2.ADOQueryApteka.SQL.Add('WHERE [DataProdagi] ((BETWEEN ' + d1 + ' AND ' + d2 + ') AND (idAA = ' + id)));
DataModule2.ADOQueryApteka.SQL.Add('ORDER BY NamPreparat ASC');
где (отдельно прописать в обработчике)
Код:
var
d1, d2, id: String;
....
d1 := DateEdit1.Date;
d2 := DateEdit2.Date;
id := Edit1.Text; // к примеру
Поскольку текст SQL-запроса формируется динамически, то в данном примере параметры не используются, всё прописывается текстом.
Простыми словами, Вам в запросе должна быть строка "где дата продажи лежит в диапазоне..., и id равен такому-то".

Последний раз редактировалось Guaho, 08.11.2024 в 00:08.
Ответить с цитированием
  #3  
Старый 08.11.2024, 10:40
Filen Filen вне форума
Прохожий
 
Регистрация: 23.05.2024
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Guaho
Код:
DataModule2.ADOQueryApteka.SQL.Add('SELECT DataProdagi, idPrepar, NamPreparat FROM [AptekaProdaga]');
DataModule2.ADOQueryApteka.SQL.Add('WHERE [DataProdagi] ((BETWEEN ' + d1 + ' AND ' + d2 + ') AND (idAA = ' + id)));
DataModule2.ADOQueryApteka.SQL.Add('ORDER BY NamPreparat ASC');
где (отдельно прописать в обработчике)
Код:
var
d1, d2, id: String;
....
d1 := DateEdit1.Date;
d2 := DateEdit2.Date;
id := Edit1.Text; // к примеру
Поскольку текст SQL-запроса формируется динамически, то в данном примере параметры не используются, всё прописывается текстом.
Простыми словами, Вам в запросе должна быть строка "где дата продажи лежит в диапазоне..., и id равен такому-то".

т.е. я правильно понимаю в моем случае
Код:
var
d1,d2,id: String;
idAA:Integer;
......

idAA:=9212337; ///искомый id

d1 := DAteToStr(DateEdit1.Date);
d2 := DAteToStr(DateEdit2.Date);
id :=IntToStr(idAA);
??
в таком случае в строке
Код:
DataModule2.ADOQueryApteka.SQL.Add('WHERE [DataProdagi] ((BETWEEN ' + d1 + ' AND ' + d2 + ') AND (idAA = ' + id )));
ошибка 'END' expected but ')' found, так понимаю что то не то с типом данных ?

Последний раз редактировалось Filen, 08.11.2024 в 10:59.
Ответить с цитированием
  #4  
Старый 08.11.2024, 21:17
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,055
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да там что-то не то с кавычками и скобками.
Если не ошибаюсь, то должно быть так:
Код:
DataModule2.ADOQueryApteka.SQL.Add('WHERE ([DataProdagi] BETWEEN ' + d1 + ' AND ' + d2 + ') AND (idAA = ' + id +')');
PS. Возможно, даты надо тоже "закавычить" в запросе.

а вообще, что бы было менще путаницы, я использую функцию Format:
Код:
DataModule2.ADOQueryApteka.SQL.Add(Format('WHERE ([DataProdagi] BETWEEN %s AND %s) AND (idAA = %s)',[d1,d2,id]));
Если даты надо кавычить, то так:
Код:
DataModule2.ADOQueryApteka.SQL.Add(Format('WHERE ([DataProdagi] BETWEEN ''%s'' AND ''%s'') AND (idAA = %s)',[d1,d2,id]));
Ответить с цитированием
  #5  
Старый 08.11.2024, 22:07
Filen Filen вне форума
Прохожий
 
Регистрация: 23.05.2024
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Код:
1
	
DataModule2.ADOQueryApteka.SQL.Add('WHERE ([DataProdagi] BETWEEN ' + d1 + ' AND ' + d2 + ') AND (idAA = ' + id +')');
Код:
1
	
DataModule2.ADOQueryApteka.SQL.Add(Format('WHERE ([DataProdagi] BETWEEN %s AND %s) AND (idAA = %s)',[d1,d2,id]));
ошибка
Error.JPG
истина где то рядом ..

Последний раз редактировалось Filen, 08.11.2024 в 22:10.
Ответить с цитированием
  #6  
Старый 11.11.2024, 08:07
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,055
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А тут проблема скорее всего со значением даты.
Надо смотреть в каком формате наде ее передавать. Возможно, д.б. YYYY-MM-DD и в кавычках. Посмтотри документацию на твою БД (скорее всего это либо Access, либо MS SQL Server, судя по синтаксису в имени поля). Тогда при получении значения в переменные d1 и d2 дату надо соотв. отформатировать. Код не даю - смотри сначала в каком формате ее надо передавать.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Filen (11.11.2024)
  #7  
Старый 11.11.2024, 21:58
Filen Filen вне форума
Прохожий
 
Регистрация: 23.05.2024
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Мозг уже набекрень с этими запросами..
Пошел другим путем , через временную таблицу

Код:
DataModule2.ADOQueryApteka.SQL.Clear;
DataModule2.ADOQueryApteka.Active:=False;
DataModule2.ADOQueryApteka.SQL.Add('SELECT * FROM [AptekaProdaga] WHERE [DataProdagi] BETWEEN DateEdit1.Date and DateEdit2.Date ORDER BY NamPreparat ASC');
DataModule2.ADOQueryApteka.Parameters.ParamByName('DateEdit1.Date').Value :=DateEdit1.Date;  /// Параметр D1 по умолчанию
DataModule2.ADOQueryApteka.Parameters.ParamByName('DateEdit2.Date').Value := DateEdit2.Date;   /// Параметр D2 по умолчанию
DataModule2.ADOQueryApteka.Active:=true;
DataModule2.ADOQueryApteka.First;

DataModule2.DAtaSourceAptVrem.DataSet.Open;
For i:=1 To kol Do Begin
 DataModule2.ADOQueryAptVrem.Insert;
    DataModule2.ADOQueryAptVrem.FieldByName('NamePrep').AsString:=DataModule2.ADOQueryApteka.FieldByName('NamPreparat').AsString;
      DataModule2.ADOQueryAptVrem.FieldByName('IdName').Value:=DataModule2.ADOQueryApteka.FieldByName('IdPrepar').Value;
         DataModule2.ADOQueryAptVrem.FieldByName('EdIzm').Value:=DataModule2.ADOQueryApteka.FieldByName('edIzm').Value;
            DataModule2.ADOQueryAptVrem.FieldByName('CenaEd').Value:=DataModule2.ADOQueryApteka.FieldByName('CenEd').Value;
               DataModule2.ADOQueryAptVrem.FieldByName('Obem').Value:=DataModule2.ADOQueryApteka.FieldByName('ObemEd').Value;
                  DataModule2.ADOQueryAptVrem.FieldByName('KolProd').Value:=DataModule2.ADOQueryApteka.FieldByName('KolProdano').Value;
                     DataModule2.ADOQueryAptVrem.FieldByName('ItogSumm').Value:=DataModule2.ADOQueryApteka.FieldByName('ItogoSum').Value;
DataModule2.ADOQueryApteka.Next;
end;
DataModule2.ADOQueryAptVrem.Post;

DataModule2.ADOQueryAptVrem.SQL.Clear;
     DataModule2.ADOQueryApteka.Active:=False;
       DataModule2.ADOQueryAptVrem.SQL.Add('SELECT * FROM   AptekaVremenn WHERE [NamePrep] LIKE' + QuotedStr('%'+nP + '%'));
            DataModule2.ADOQueryAptVrem.Active := True;
               DataModule2.ADOQueryApteka.EXECSQL;

ShowMessage('TÔ     '+IntTOStr(DataModule2.ADOQueryAptVrem.RecordCount)); //Результат

//Очищаем временную таблицу

With DataModule2.ADOQueryAptVrem do begin
DataModule2.ADOQueryAptVrem.SQL.Clear;
DataModule2.ADOQueryAptVrem.SQL.Text :='DELETE * FROM AptekaVremenn'; //удаляем SQL запросом. Намного быстрее.
Prepared :=True;
DataModule2.ADOQueryAptVrem.EXECSQL;
end;

//// Воссстанавливаем ADOQueryApteka ///////////////////
DataModule2.ADOQueryApteka.Close;
DataModule2.ADOQueryApteka.Open;
DataModule2.ADOQueryApteka.SQL.Clear;
DataModule2.ADOQueryApteka.Active:=False;
DataModule2.ADOQueryApteka.SQL.Add('Select*From AptekaProdaga Where idDat=:Id_Daty');
DataModule2.ADOQueryApteka.Active:=true;
/////////////////////////////////////////////////////////

Работает 1 проход, но если повторить ошибка ..
err.JPG
понимаю что где то туплю 'неподецки', совсем запутался где OPEN где EXECSQL, (смешались в кучу люди кони), не сочтите за труд
Ответить с цитированием
  #8  
Старый 12.11.2024, 07:26
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,055
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

open - когда есть возвращаемый результат, т.е. запросы SELECT
ExecSQL - когда выполняется запрос, который который не возвращает результат, т.е. INSERT, UPDATE, DELETE
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter