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

 



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.06.2019, 13:51
svmt svmt вне форума
Прохожий
 
Регистрация: 10.06.2019
Сообщения: 4
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию Сумма по диапазону дат?

Доброго здоровья почтенные.
Чтото совсем между ушей замкнуло.
Делаю по таблице фильтр по диапазону дат (ADOQuery)
Код:
procedure TForm7.Button1Click(Sender: TObject);
begin
SortDate.SQL.Clear;
SortDate.SQL.Add('SELECT *FROM СкладАрх');
SortDate.SQL.Add('WHERE (Дата >=:FromDate) AND (Дата <=:ToDate)');
SortDate.Parameters.ParamByName('FromDate').Value:= FormatDateTime('dd.mm.yy', DateTimePicker1.Date);
SortDate.Parameters.ParamByName('ToDate').Value:= FormatDateTime('dd.mm.yy', DateTimePicker2.Date);
SortDate.Close;
SortDate.Open;
SortDate.Sort:='Дата DESC';

Теперь нужно в результате фильтра суммировать каждый столбец.
Код:
SELECT Sum(СкладАрх.М) AS М, Sum(СкладАрх.МС) AS МС...........
ну и т.д....
Собственно вопрос :
КУДА (именно куда а не как) запихнуть этот самый SELECT чтоб посчитало
Точнее чтото не пойму как сделать чтобы ADOQuery2 с запросом суммирования цеплялся к результатам выборки потом уже считал

Последний раз редактировалось svmt, 10.06.2019 в 13:56.
Ответить с цитированием
  #2  
Старый 10.06.2019, 18:30
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 101
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

По идее можно было бы написать
Код:
SELECT Sum(СкладАрх.М) AS М, Sum(СкладАрх.МС) AS МС WHERE
, и после WHERE дать текст первого запроса.
Можно использовать компоненты визуализации, которые могут сами безо всяких запросов считать агрегатные функции, например, EhLib.
Да, и закрывать датасет (SortDate.Close) нет смысла, он автоматически закрывается сам при изменении свойства SQL. И сортировку можно сразу в текст запроса засунуть (ORDER BY...).

Последний раз редактировалось Guaho, 10.06.2019 в 18:33.
Ответить с цитированием
  #3  
Старый 11.06.2019, 01:23
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,496
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

Guaho, только не WHERE, а FROM. Запрос должен принять вид:
Код:
select sum(A) as Sum_a, sum(B) as Sum_b
from
(
  select a, b from my_table where c between :date1 and :date2
)
Ответить с цитированием
  #4  
Старый 11.06.2019, 14:54
svmt svmt вне форума
Прохожий
 
Регистрация: 10.06.2019
Сообщения: 4
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Да хотелось бы разбить эти два запроса.
DBDrideh поковырял немного но так и не понял как результат суммы
(допустим) DBGridEh1.Columns[номер колонки] запихнуть в тот же самый Edit... Или DBEdit......
Ответить с цитированием
  #5  
Старый 11.06.2019, 17:21
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,714
Репутация: 52347
По умолчанию

Эк вы все намешали. У вас используется неродной компонент DBGridEh, который в отличии от стандартного DBGrid, умеет выводить итоги. К запросу это умение не имеет отношения. Вы подаете в DBGridEh какой-то набор данных и настраиваете DBGridEh на выдачу итогов по этому набору через свойство Footer
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
svmt (11.06.2019)
  #6  
Старый 11.06.2019, 18:57
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 101
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Да, виноват, "FROM" я пропустил, а он, конечно же, должен быть. DBGridEh отображает сумму в футере грида, а если Вам надо обязательно выводить в Edit, тогда можно попробовать
Код:
Edit1.Text := grid1.Columns[номер столбца].Footer.Value
(возможно, понадобится ещё преобразование типов). Только непонятно, зачем Вы хотите разбивать запрос на два, если одним задача должна решиться.

Последний раз редактировалось Guaho, 11.06.2019 в 19:03.
Ответить с цитированием
Этот пользователь сказал Спасибо Guaho за это полезное сообщение:
svmt (11.06.2019)
  #7  
Старый 11.06.2019, 20:39
svmt svmt вне форума
Прохожий
 
Регистрация: 10.06.2019
Сообщения: 4
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от Guaho
Да, виноват, "FROM" я пропустил, а он, конечно же, должен быть. DBGridEh отображает сумму в футере грида, а если Вам надо обязательно выводить в Edit, тогда можно попробовать
Код:
Edit1.Text := grid1.Columns[номер столбца].Footer.Value
(возможно, понадобится ещё преобразование типов). Только непонятно, зачем Вы хотите разбивать запрос на два, если одним задача должна решиться.
именно потому что не получается. я понимаю что радужно отношусь к этому. но между тем.
а представьте вариант что к результату сортировки цепляются еще несколько "продолжений". ну как вариант в каждом запросе описывать все с нуля. хотя походу Описывать все это всетаки правильно
Код:
Edit1.Text := grid1.Columns[номер столбца].Footer.Value

покажите реальный РАБОЧИЙ пример. готов на карту пиво слить.
заткнулся на преобразовании.....шибка говорит чтото типа стринг и ехэчегототам.... что за тип этот ехэ загадка. перерыл весь инет на предмет примера (ибо увы отмазка одна- поможыте я тут новенький) и примеров нолЪ. есть косвенные примеры на основе которых хочу чтото отписать но безрезультатно.
И опыт - сын ошибок трудных
и Гена - Чебурашкин друг

Последний раз редактировалось svmt, 11.06.2019 в 20:42.
Ответить с цитированием
  #8  
Старый 12.06.2019, 07:16
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,496
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

Ну, варианты.
1. Сделать view и из нее выполнять оба запроса. Первый - для получения данных для грида, второй - для получения сумм.
2. Тут не запросом суммы получаются, а перебором данных. Отключаем обновление, пробегаемся по датасету, суммируем все, выводим в нужные поля и включаем отображение обратно. Как-то так (пишу здесь, так что мелкие очепятки возможны):
Код:
var
  S1, S2 : Integer; // не знаю тип полей для суммированния, пуст будет кол-во
begin
  S1 := 0;
  S2 := 0;
  SortDateDataSource.DisableContols;
  Try
    SortDate.First;
    While Not SortDate.Eof Do
      Begin
        S1 := S1 + SortDate.FieldByName('M').AsInteger;
        S2 := S2 + SortDate.FieldByName('MC').AsInteger;
        SortDate.Next;
      End;
    Edit1.Text := IntToStr(S1);
    Edit2.Text := IntToStr(S2);
  Finally
    SortDate.First;
    SortDateDataSource.EnableContols;
  End;
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
svmt (12.06.2019)
  #9  
Старый 12.06.2019, 08:24
svmt svmt вне форума
Прохожий
 
Регистрация: 10.06.2019
Сообщения: 4
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Вот рабочий. Спасибо. Куда пивас лить?
Ответить с цитированием
  #10  
Старый 12.06.2019, 18:39
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,496
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

Себе в кружку
Ответить с цитированием
Ответ



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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter