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

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

Вернуться   Форум программистов > C/C++ программирование > C/C++ Базы данных
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2012, 14:51   #1
SlimFIT
 
Регистрация: 21.12.2010
Сообщений: 7
Печаль Цикл для обновления данных в БД

Добрый день. В таблице есть поле "raiting" который необходимо подсчитать по нажатию кнопки. Алгоритм подсчтета прост: сначала считаем общую сумму заказов, затем сумму заказов каждого магазина в отдельности и делим на общую сумму. Для данной операции использовал цикл while.

Код:
DataModule1->ADOTable1->First();
float b=0;
DataModule1->forchart->Close();
DataModule1->forchart->SQL->Clear();
DataModule1->forchart->SQL->Text="select SUM(price) as B from Orders";
DataModule1->forchart->Open();
b=DataModule1->forchart->FieldByName("B")->AsFloat;
FormatFloat("0.00",b);
int t=0;
bool stop=false;

DataModule1->ADOQuery8->Close();
DataModule1->ADOQuery8->SQL->Clear();
DataModule1->ADOQuery8->SQL->Text="select o.id_shop from Orders o, Shop sh where sh.id_shop=o.id_shop group by o.id_shop";
DataModule1->ADOQuery8->Open();

while (!DataModule1->ADOTable1->Eof)
{
float a=0.00;
        if (DataModule1->ADOQuery8->RecordCount!=0)
        {
                if (!stop)
                {
                        t=DataModule1->ADOQuery8->FieldByName("id_shop")->AsInteger;
                        DataModule1->forchart->Close();
                        DataModule1->forchart->SQL->Clear();
                        DataModule1->forchart->SQL->Text="select SUM(price) as A from Orders where id_shop=" + IntToStr(t);
                        DataModule1->forchart->Open();
                        a=DataModule1->forchart->FieldByName("A")->AsFloat;
                        FormatFloat("0.00",a);
                }
                else {a=0.00;
                        //FormatFloat("0.00",a);
                     }
        }
        else {a=0.00; //FormatFloat("0.00",a);
              }
DataModule1->forchart->Close();
DataModule1->forchart->SQL->Clear();
DataModule1->forchart->SQL->Text="update Shop set raiting='"+FormatFloat("0.00",a/b)+"' where id_shop=" + DataModule1->ADOTable1->FieldByName("id_shop")->AsInteger;
DataModule1->forchart->ExecSQL();

DataModule1->ADOTable1->Next();
DataModule1->ADOQuery8->Next();

        if (DataModule1->ADOQuery8->Eof) stop = true;
}
DataModule1->ADOTable1->Active=false;
DataModule1->ADOTable1->Active=true;
Во время тестирования обнаружил, что считает рейтинг правильно, но значение присваивает не корректно. Поясню на примере.
У магазинов 1,2,3,4 ... рейтинг 0.5, 0.5, 0, 0 ... соответственно. Добавляю заказ для 4 магазина, жму пересчет. По логике рейтинг поменяется у всех кроме 3 (у него нет заказов). Программа считает, и рейтинг присваивает первым 3 магазинам. Получется что рейтинг, который должен быть присвоен магазину 4, по факту присваивается магазину 3.
Может цикл написан не так? Где ошибка?
SlimFIT вне форума Ответить с цитированием
Старый 09.06.2012, 01:33   #2
SlimFIT
 
Регистрация: 21.12.2010
Сообщений: 7
По умолчанию

Нашел ошибки. Исправил, все работает.
Код:
DataModule1->ADOTable1->First();
float b=0;
DataModule1->forchart->Close();
DataModule1->forchart->SQL->Clear();
DataModule1->forchart->SQL->Text="select SUM(price) as B from Orders";
DataModule1->forchart->Open();
b=DataModule1->forchart->FieldByName("B")->AsFloat;
FormatFloat("0.00",b);

int t=0;
bool stop=false;

DataModule1->ADOQuery8->Close();
DataModule1->ADOQuery8->SQL->Clear();
DataModule1->ADOQuery8->SQL->Text="select o.id_shop from Orders o, Shop sh where sh.id_shop=o.id_shop group by o.id_shop";
DataModule1->ADOQuery8->Open();

while (!DataModule1->ADOTable1->Eof)
{
float a=0.00;
        if (DataModule1->ADOQuery8->RecordCount!=0)
        {
                if (!stop)
                {
                        t=DataModule1->ADOQuery8->FieldByName("id_shop")->AsInteger;
                        DataModule1->forchart->Close();
                        DataModule1->forchart->SQL->Clear();
                        DataModule1->forchart->SQL->Text="select SUM(price) as A from Orders where id_shop=" + IntToStr(t);
                        DataModule1->forchart->Open();
                        a=DataModule1->forchart->FieldByName("A")->AsFloat;
                        FormatFloat("0.00",a);
                }
                else {a=0.00;
                        FormatFloat("0.00",a);
                     }
        }
        else {a=0.00; FormatFloat("0.00",a);
              }
DataModule1->forchart->Close();
DataModule1->forchart->SQL->Clear();
DataModule1->forchart->SQL->Text="update Shop set raiting='"+FormatFloat("0.00",a/b)+"' where id_shop="+IntToStr(t);
DataModule1->forchart->ExecSQL();

DataModule1->ADOTable1->Next();
DataModule1->ADOQuery8->Next();

}
DataModule1->ADOTable1->Active=false;
DataModule1->ADOTable1->Active=true;
SlimFIT вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
макрос обновления данных из интернета Legame Microsoft Office Excel 14 01.10.2015 09:26
Не работает цикл обновления в Firebird artemavd Общие вопросы Delphi 8 30.11.2011 17:08
Программа для обновления чего-либо snake91135 Софт 0 29.01.2011 15:27
SP3 пакет обновления, для windows xp VintProg Windows 7 16.12.2010 00:05
Помогите плиз правильно написать макрос обновления данных из разных файлов Legame Microsoft Office Excel 10 10.09.2009 10:39