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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2012, 18:43   #1
alexvav
Форумчанин
 
Регистрация: 23.11.2006
Сообщений: 152
По умолчанию Суммирование по условию

Подскажите пожалуйста такую штуку.
Есть база в access, необходимо получить сумму поля "K_vo" для всех строк с одинаковым "vid_p". Т.е.
Для vid_p - 1 = 1.6+4.7+5.04+5
Для vid_p - 2 = 6
Для vid_p - 7 = 5.5

Так я получил общую сумму, а вот сгруппировать не получается. И надо ли для этого индексировать подсчитывающие поля? Спасибо.

Код:
var
 s: real;
 n: integer;
begin
 s:=0;
 ADOQuery1.First;
 for n:=1 to ADOQuery1.RecordCount do
  begin
   s := s + ADOQuery1.FieldByName('Vid_p').AsFloat;
   ADOQuery1.Next;
   Label23.Caption :=FloatToStr(s);

end;
Изображения
Тип файла: jpg Безымянный.jpg (43.7 Кб, 44 просмотров)
alexvav вне форума Ответить с цитированием
Старый 17.06.2012, 19:29   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
select vid_p,sum(K_vo) as k_VO_SUMM from таблица group by vid_p
И далее просто проходом в цикле по набору от этого запроса - в поле k_VO_SUMM будут твои суммы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.06.2012, 21:06   #3
alexvav
Форумчанин
 
Регистрация: 23.11.2006
Сообщений: 152
По умолчанию

Хотел я отделаться малым куском кода, наверно надо уточнить.

1. Я из кучи данных сначала извлекаю нужные мне поля и записи:

Код:
ADOQuery1.SQL.Text:='SELECT n_dog,DATA,ZAK,k_vo,vid_p FROM rabota WHERE data BETWEEN :p1 AND :p2';
2. Затем полученные данные экспортирую в Excel:

Код:
DBGrid1.DataSource.DataSet.First; 
for i:=1 to DBGrid1.DataSource.DataSet.RecordCount do 
begin 
for j:=1 to DBGrid1.FieldCount do 
 sheet.cells[index,j]:=DBGrid1.fields[j-1].asstring; 
 inc(index); 
 DBGrid1.DataSource.DataSet.Next; 
end;
3.Но оказалось, что надо не просто экспортировать, а с итогами по каждой позиции vid_p

Тут то я и застрял. Я так понимаю, что надо какой-то цикл организовать, но как?
Изображения
Тип файла: jpg Безымянный.jpg (77.2 Кб, 51 просмотров)
alexvav вне форума Ответить с цитированием
Старый 17.06.2012, 21:27   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

У-у-у...
А вот енто, мил человек, не так делается...
Обычно чтоб не наступать на грабли настраивают Report-ы типа QReport или Fast Report, где группируют данные по содержимому. И межпрочим многие из репортов умеют в Экзель выгружать отчет
Впрочем если тебе всетки нужно именно так то придется делать сортировку по группам:
Код:
ADOQuery1.SQL.Text:='SELECT n_dog,DATA,ZAK,k_vo,vid_p FROM rabota WHERE data BETWEEN :p1 AND :p2 order by vid_p';
А в цикле:
Код:
with DBGrid1.DataSource.DataSet do begin
First; 
vid:=FieldByName('vid_p').AsInteger;
while not eof() begin 
 for j:=1 to FieldCount-1 do  sheet.cells[index,j]:=Fields[j-1].asstring; 
 if vid<>FieldByName('vid_p').AsInteger then begin
  sheet.cells[index,j]:='Группа '+IntToStr(vid);
  vid:=FieldByName('vid_p').AsInteger;
 end;
 Next;   inc(index); 
end;
Где vid:Integer; Судя по значениям этого поля.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.06.2012, 21:31   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

1. В запрос добавить ORDER BY vid_p
2.
Код:
DBGrid1.DataSource.DataSet.First;
xVidp:=-1;
WHILE NOT DBGrid1.DataSource.DataSet.EOF do begin
  if xVidp<>DBGrid1.DataSource.DataSet.FieldByName('vid_p').AsInteger do begin
    if xVidp<>-1 then begin
      //здесь обращение к процедуре формирование итого по группе, накопленная сумма в xKvo
    end;
    xKvo:=0;
    xVidp:=DBGrid1.DataSource.DataSet.FieldByName('vid_p').AsInteger;
    //здесь формирование заголовка группы
  end;
  xKvo:=xKvo+DBGrid1.DataSource.DataSet.FieldByName('k_vo').AsFloat;
  //здесь формирование строки деталиции
  DBGrid1.DataSource.DataSet.Next;
end;
if xVidp<>-1 then begin
  //здесь обращение к процедуре формирование итого по группе, накопленная сумма в xKvo
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.06.2012, 21:39   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Аватар
А с With красивее получилось
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.06.2012, 21:42   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А с With красивее получилось
Если чесно - практически не использую With, очень часто в заблуждение вводит и при отладке определенные трудности
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.06.2012, 22:16   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну это дело привычки
И даже при отладке можно подсмотреть, проследив за аргументом With, как за структурой.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.06.2012, 22:17   #9
alexvav
Форумчанин
 
Регистрация: 23.11.2006
Сообщений: 152
По умолчанию

Спасибо, пробую.

Цитата:
Сообщение от Stilet Посмотреть сообщение
И межпрочим многие из репортов умеют в Экзель выгружать отчет


Когда-то пользовался RaveReports, но оказалось, что он никуда не экспортирует, и я решил, что они все такие и мне не годятся. А какие "репорты" могут экспортировать в эксель, на будущее?
alexvav вне форума Ответить с цитированием
Старый 17.06.2012, 22:43   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну я через QReport выгружал...
FastREport должен уметь...
Я вообще честно скажу - Все репорты фтопку, да здравствует HTML. Лучше репорта не найдешь. Впрочем это только ИМХО.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
суммирование по условию Iskin Microsoft Office Excel 3 08.04.2011 15:33
Суммирование по условию artemavd Microsoft Office Excel 6 06.02.2011 10:20
Суммирование в футере DBGridEh по условию Прик БД в Delphi 4 28.01.2011 06:52
Суммирование колонок по условию Taurus1 Microsoft Office Excel 4 02.08.2010 13:45
Суммирование по условию. masterenergy Microsoft Office Excel 5 23.04.2010 12:05