|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
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; Код:
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
|
||||
|
||||
Код:
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; // к примеру Простыми словами, Вам в запросе должна быть строка "где дата продажи лежит в диапазоне..., и id равен такому-то". Последний раз редактировалось Guaho, 08.11.2024 в 00:08. |
#3
|
|||
|
|||
Цитата:
т.е. я правильно понимаю в моем случае Код:
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 ))); Последний раз редактировалось Filen, 08.11.2024 в 10:59. |
#4
|
|||
|
|||
Да там что-то не то с кавычками и скобками.
Если не ошибаюсь, то должно быть так: Код:
DataModule2.ADOQueryApteka.SQL.Add('WHERE ([DataProdagi] BETWEEN ' + d1 + ' AND ' + d2 + ') AND (idAA = ' + id +')'); а вообще, что бы было менще путаницы, я использую функцию 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
|
|||
|
|||
Код:
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
|
|||
|
|||
А тут проблема скорее всего со значением даты.
Надо смотреть в каком формате наде ее передавать. Возможно, д.б. YYYY-MM-DD и в кавычках. Посмтотри документацию на твою БД (скорее всего это либо Access, либо MS SQL Server, судя по синтаксису в имени поля). Тогда при получении значения в переменные d1 и d2 дату надо соотв. отформатировать. Код не даю - смотри сначала в каком формате ее надо передавать. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Filen (11.11.2024)
|
#7
|
|||
|
|||
Мозг уже набекрень с этими запросами..
Пошел другим путем , через временную таблицу Код:
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
|
|||
|
|||
open - когда есть возвращаемый результат, т.е. запросы SELECT
ExecSQL - когда выполняется запрос, который который не возвращает результат, т.е. INSERT, UPDATE, DELETE |