Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > SQL запрос с групировкой и условием выбора


Автор: Skodina 20.5.2010, 21:00
добрый день.
у меня есть база данных написаная в Access состоящая из нескольких таблиц(Продажи, Товар, Магазины, Секции)
пользователь выбирает магазин, товар и период за который были проведены продажи
нужно вывести отчет по продажам за период по определенному магазину и определенному товару
я написала вот такой код

Код

procedure TForm14.Button2Click(Sender: TObject);
var
a, b, c, d :string;

begin
a:=DataModule3.ADOQuery2.FieldByName('код_магазина').AsString;
b:=DataModule3.ADOQuery4.FieldByName('код_товара').AsString;
c:=DataModule3.ADOQuery11.FieldByName('дата_продажи').AsString;
b:=DataModule3.ADOQuery12.FieldByName('дата_продажи').AsString;
DataModule3.ADOQuery13.Active:=False;
DataModule3.ADOQuery13.SQL.Clear;
DataModule3.ADOQuery13.SQL.ADD('SELECT Продажи.код_магазина, Магазины.название_магазина, Продажи.код_товара, Товар.наименование_товара, Товар.единица_измерения, Продажи.дата_продажи, Продажи.цена, Продажи.количество_проданного, Продажи.сумма_проданного');
DataModule3.ADOQuery13.SQL.ADD('FROM Товар INNER JOIN (Магазины INNER JOIN Продажи ON Магазины.код_магазина = Продажи.код_магазина) ON Товар.код_товара = Продажи.код_товара');
DataModule3.ADOQuery13.SQL.ADD('GROUP BY Продажи.код_магазина, Магазины.название_магазина, Продажи.код_товара, Товар.наименование_товара, Товар.единица_измерения, Продажи.дата_продажи, Продажи.цена, Продажи.количество_проданного, Продажи.сумма_проданного');
DataModule3.ADOQuery13.SQL.ADD('HAVING (((Продажи.код_магазина)=' + QuotedStr(a) + ' And (Продажи.код_магазина)=' + QuotedStr(a) + ') AND ((Продажи.код_товара)=' + b + ') AND ((Продажи.дата_продажи)>=#' + c + '# And (Продажи.дата_продажи)<=#' + d +'#));');
DataModule3.ADOQuery13.Active:=True;

end;


выдает такую ошибку
user posted image

что не так делаю?

Автор: Rodman 20.5.2010, 21:48
дочитай до конца запрос в ошибке... там даты нет. а значит сравнивать не с чем!

Автор: Skodina 21.5.2010, 09:56
Исправила, теперь стоит другая проблема smile 
дата у меня передается с точками(пример: 01.04.2010) почему-то программа на это ругается :( если я пишу вот так 01/04/2010, то 
все нормально работает, но у меня дата в базе данных именно с точкой :( как можно запрограммировать чтобы не менять 1000 дат в базе данных?

Автор: morpheyushka 21.5.2010, 12:57
Цитата(Skodina @  21.5.2010,  09:56 Найти цитируемый пост)
Исправила, теперь стоит другая проблема smile 
дата у меня передается с точками(пример: 01.04.2010) почему-то программа на это ругается :( если я пишу вот так 01/04/2010, то 
все нормально работает, но у меня дата в базе данных именно с точкой :( как можно запрограммировать чтобы не менять 1000 дат в базе данных? 

Передавай через параметры. например так
Код

with ADOQuery do begin
  Close;
  SQL.Clear;
  SQL.Add('select * from table where DatePlace = :DatePlc');
  Parameters.ParamByName('DatePlc').Value := Now();
  Open;
end;


PS а в обще не хорошо называть имена таблиц и поля латиницей.

Автор: Skodina 21.5.2010, 14:19
morpheyushka если честно, то не поняла как  smile 

а можно по подробнее объяснить? smile 

Автор: morpheyushka 21.5.2010, 15:44
Цитата(Skodina @  21.5.2010,  14:19 Найти цитируемый пост)
morpheyushka если честно, то не поняла как  smile 

а можно по подробнее объяснить?

так не совпадает формат времени:
Код

procedure TForm16.Button1Click(Sender: TObject);
var
  S: String;
begin
  S := FormatDateTime('dd.mm.yyyy', Now);
  with ADOQuery1 do begin
    Close;
    SQL.Clear;
    SQL.Add('select * from table where DatePlace = ' + S);
    Open;
  end;
end;


Но если записать так, то все будет нормально:
Код

procedure TForm16.Button1Click(Sender: TObject);
begin
  with ADOQuery1 do begin
    Close;
    SQL.Clear;
    SQL.Add('select * from table where DatePlace = :DatePlc');
    Parameters.ParamByName('DatePlc').Value := Now();
    Open;
  end;
end;

тут DatePlace - переменная в БД типа DateTime, DatePlc - параметр, который я потом задаю тут - ADOQuery1.Parameters.ParamByName('DatePlc').Value := Now();
параметр можно обозвать как угодно. Параметр в запросе пишется как :ParamName, в нашем случае - :DatePlc


Не знаю как в Access, но в MS SQL если я не знаю формата и нужно передать дату в виде строки, то я формирую строку в таком формате - в MS SQL работает. Формат должен быть такой: YYYYMMDD без точек и всего остального

Автор: Skodina 21.5.2010, 17:41
что-то я совсем не поняла ничего

Автор: Данкинг 21.5.2010, 17:48
Цитата(Skodina @  21.5.2010,  18:41 Найти цитируемый пост)
что-то я совсем не поняла ничего 

Нужное значение содержится в переменной, например :DatePlc (именно так, с двоеточием перед переменной). Значение же этому параметру передаётся так:
Код

AdoQuery1.Parameters.ParamByName('DatePlc').Value := Now();

Автор: Skodina 21.5.2010, 17:54
все, спасибо, разобралась smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)