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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Сумма по дате  (Прочитано 9020 раз)
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 » new

Да, интересная помощь, помогают тем, что я и сам могу и знаю, а вот как конкретно никто не подскажет, т.е. как конкретно определить границы месяца, чтобы посчитать сумму товара за этот месяц, причем месяц должен быть без "конкретики", т.е переменной.
Записан
zubr
Гость
« Ответ #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
Гость
« Ответ #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 » 

Решил задачу, все работает Улыбаюсь. Считается сумма с шагом 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