Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Сумма по дате  (Прочитано 6666 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Pava_Pav
Гость
« : 15-05-2009 17:48 » 

Есть 4 таблицы:
1-CVET (kod,nazv)
2 PROIZVODSVO (kod, data_izg, kol_izg, kod_cv); расшифровка полей (код, дата изготовления, количество, код цвета)
3-NAKLADNAYA (kod, data) ; (код, дата)
4-POZICIYA_NAKLADNOY(kod, Kol_prod, kod_cv,kod_nakl); (код, кол-во проданного, код цвета, код накладной)

Нужно считать даные по такому принципу, выбираем цвет и по выбранному цвету считаем сумму произведенного товара за последние месяцы, причем количество месяцев должно быть вводимой переменной.
Меня интересует, как посчитать сумму kol_izg и kol_prod за последние месяцы(котрые ввели)Не понял?
СУБД - InterBase. ПРиложение Borland C++. Можно Delphi-пойму.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 15-05-2009 19:57 » 

давай постепенно
Цитата
Нужно считать даные по такому принципу, выбираем цвет и по выбранному цвету считаем сумму произведенного товара за последние месяцы, причем количество месяцев должно быть вводимой переменной.
Выбираем цвет
select nazv, kod from cvet where nazv=:nazv_cvet

:nazv_cvet - переменная которую ввели

по цвету выводим товар

select proizvodstvo.*
from cvet, proizvodstvo
where
cvet.nazv=::nazv_cvet and proizvodstvo.kod_cv=cvet.kod

теперь используем агрегатную функцию count
дальше писать не буду - смотри справочники, как по мне, я сказал все.
« Последнее редактирование: 15-05-2009 19:58 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Pava_Pav
Гость
« Ответ #2 : 18-05-2009 05:39 » 

Да, интересная помощь, помогают тем, что я и сам могу и знаю, а вот как конкретно никто не подскажет, т.е. как конкретно определить границы месяца, чтобы посчитать сумму товара за этот месяц, причем месяц должен быть без "конкретики", т.е переменной.
Записан
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #3 : 18-05-2009 06:21 » 

Не понимаю, в чем сложность.
1. Составляем SQL-запрос по принципу как описал Sla.
2. В начало запроса добавляем 'SET DATEFORMAT dmy ' - это нужно чтобы не было разногласий при работе программы в разных системах. Не обязательно dmy (день, месяц, год).
3. В тело запроса добавляем что то типа:
Код:
Query1.SQL.Text := Query1.SQL.Text + 'AND date >=  ' + '''' + '01.'+ IntToStr(mn1) + '.' + IntToStr(year1) + '''' + ' AND date <  ' + ''''  +
                                '01.'+ IntToStr(mn2) + '.' + IntToStr(year2) + '''';
Где переменные mn1, mn2, year1, year2 - соответственно месяц и год начала и конца отсчета.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 18-05-2009 06:29 » 

Да, интересная помощь, помогают тем, что я и сам могу и знаю, а вот как конкретно никто не подскажет, т.е. как конкретно определить границы месяца, чтобы посчитать сумму товара за этот месяц, причем месяц должен быть без "конкретики", т.е переменной.
А как ты хотел? Чтоб я тебе написал сразу запрос, а ты при этом нифига не делал?
Это кому надо? Тебе или мне.
Если бы ты прривел готовые запросы, и сказал, например, что вот имею такое и такое, то и дальше бы мы вели совсем другой разговор.

Понятно?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Pava_Pav
Гость
« Ответ #5 : 18-05-2009 17:35 » 

Пишу такой запрос: считываю данные за последние 8 месяцев
IBQuery4->Active=false;
IBQuery4->SQL->Clear();
for(int i=0;i<8;i++)
IBQuery4->SQL->Add("SELECT Sum(KOL_IZG) FROM PROIZVODSVO WHERE DATA_IZG"<=+(Now()-30*i) AND ("DATA_IZG" >+Now()-30*(i+1)));
IBQuery4->Active=true;

Но при компиляции выдается ошибка E2015 Ambiguty between_fascall TDate Time: operator double() const and_fascal TDateTime:operator int() const'. Где ошибка, подскажите пожалуйста???
Ps:Sla, извини, просто я только учусь работать с БД.
Записан
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #6 : 18-05-2009 18:24 » 

Полная ерунда.
1.
Код:
for(int i=0;i<8;i++)
IBQuery4->SQL->Add("SELECT Sum(KOL_IZG) FROM PROIZVODSVO WHERE DATA_IZG"<=+(Now()-30*i) AND ("DATA_IZG" >+Now()-30*(i+1)));
В данном выражении у тебя текст запроса будет 8 раз складываться - что полная ерунда. БД выдаст ошибку.
2. Полное отсутствие понятия работы со строками типа AnsiString. Функция Now() возвращает тип double, а ты пытаешься его напрямую без преобразований добавить к строке. Для преобразования есть функция DateToStr.
3. Стоит почитать учебник.
Записан
Pava_Pav
Гость
« Ответ #7 : 18-05-2009 18:36 » 

Я пытаюсь, определить граница месяца, просто упростил задачу и сделал 30 дней
Записан
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 21-05-2009 15:18 » 

 Здесь была моя ладья...
« Последнее редактирование: 21-05-2009 15:30 от Oldy » Записан

С уважением, Oldy.
Pava_Pav
Гость
« Ответ #9 : 22-05-2009 19:09 » new

Решил задачу, все работает Улыбаюсь. Считается сумма с шагом 30 дней

// производство
n=StrToInt(Edit4->Text);
for(int i=0;i<n;i++)
{
AnsiString S1=DateToStr(Now()-30*i),S2=DateToStr(Now()-30*(i+1));
IBQuery4->Active=false;
IBQuery4->SQL->Clear();
IBQuery4->SQL->Add("SELECT Sum(KOL_IZG) FROM PROIZVODSVO WHERE kod_cv="+DBEdit5->Text);
IBQuery4->SQL->Add(" AND DATA_IZG<='"+S1+"'");
IBQuery4->SQL->Add(" AND DATA_IZG>='"+S2+"'");
IBQuery4->Active=true;
DBEdit6->DataField="Sum";
mass
  • =StrToInt(DBEdit6->Text);
}
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines