Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Ответ
 
Опции темы
Старый 24.11.2012, 01:38   #1
chocolat
Новичок
Джуниор
 
Регистрация: 24.11.2012
Сообщений: 2
Вопрос Реализация БД

Создал базу для тестирования теорий, есть БД и в ней 2 таблицы 1на с данными а вторая с индексами(ключами), не знаю как правильно. ее размер просто огромной я говорю про десятки Гб. проблема с выборкой, есть 17 параметров, каждый последующий зависит от предыдущего. По этому получается очень большое количество вложенных циклов с SQL запросами. Потому что надо учитывать все изменения предыдущий выборки. Первая БД делаю для себя, кажись перестарался. Как с простить запрос или может надо по другому проектировать структуру?

Структура



Выборка в программе



Выборка в программе при выводе гистограммы



Пример кода
Код:
if CheckBox_high_low.Checked=true then begin
        if profit_transaction=1 then begin
           for index_hihg_low:=0 to 1 do begin
               if Form9.CheckListBox1.checked[index_hihg_low]=true then begin
                  for index_hour:=0 to 6 do begin
                      if Form8.CheckListBox1.checked[index_hour]=true then begin
                         if index_hour=0 then begin
                            hour_start:='9:31:00';
                            hour_finish:='10:30:59';
                         end;
                         if index_hour=1 then begin
                            hour_start:='10:31:00';
                            hour_finish:='11:30:59';
                         end;
                         if index_hour=2 then begin
                            hour_start:='11:31:00';
                            hour_finish:='12:30:59';
                         end;
                         if index_hour=3 then begin
                            hour_start:='12:31:00';
                            hour_finish:='13:30:59';
                         end;
                         if index_hour=4 then begin
                            hour_start:='13:31:00';
                            hour_finish:='14:30:59';
                         end;
                         if index_hour=5 then begin
                            hour_start:='14:31:00';
                            hour_finish:='15:00:59';
                         end;
                         if index_hour=6 then begin
                            hour_start:='15:01:00';
                            hour_finish:='16:00:00';
                         end;
                         for index_day:=1 to 31 do begin
                             if Form6.CheckListBox1.checked[index_day]=true then begin;
                                for index_month:=1 to 12 do begin
                                    if Form5.CheckListBox1.Checked[index_month]=true then begin
                                       for index_year:=0 to Form2.CheckListBox1.count-1 do begin
                                           if Form2.CheckListBox1.Checked[index_year]=true then begin
                                              ADOQuery1.SQL.Clear;
                                              ADOQuery1.SQL.Add('SELECT SUM(Profit) AS Sum_profit FROM report Where');
                                              ADOQuery1.SQL.Add('((year='''+Form2.CheckListBox1.Items[index_year]+'''))');
                                              ADOQuery1.SQL.Add('and (month='''+IntToStr(index_month)+''')');
                                              ADOQuery1.SQL.Add('and (day='''+Form6.CheckListBox1.Items[index_day]+''')');
                                              ADOQuery1.SQL.Add('and (time between '''+hour_start+''' and '''+hour_finish+''')');
                                              ADOQuery1.SQL.Add('and (HighLow='''+IntToStr(index_hihg_low+1)+''')');
                                              ADOQuery1.Active:=true;
                                              ADOQuery1.First;
                                              Sum_profit[index_hihg_low]:=Sum_profit[index_hihg_low]+ADOQuery1.FieldValues['Sum_profit'];
                                           end;
                                       end;
                                    end;
                                end;
                             end;
                         end;
                      end;
                  end;
               end;
           end;
           Form9.Show;
           Form9.Caption:='óñòîãðàìà ïðèáóòêó ïî High/Low';
           Form9.Chart1.Series[0].Clear;
           for index_hihg_low:=0 to 1 do begin
               chart_x:=index_hihg_low+1;
               chart_y:=sum_profit[index_hihg_low];
               Form9.Chart1.Series[0].AddXY(chart_x,chart_y);
           end;
        end;
chocolat вне форума Ответить с цитированием
Старый 24.11.2012, 11:36   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

Что-то перемудрили. Так нельзя к базе обращаться. Для каждого типа графика можно сделать свой отдельный параметризированный запрос и сразу вытащить всю необходимую информацию. Например по дням заданного месяца
Код:
SELECT day,SUM(Profit) AS Sum_profit
  FROM report
  Where year=:year and
        month=:month
  group by day
Возможно запрос и по другому нужно сделать, не очень понятна логика таблиц. Для обеспечения быстродействия нужно индексы с умом в таблицах базы создать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 24.11.2012 в 11:39.
Аватар вне форума Ответить с цитированием
Старый 24.11.2012, 12:15   #3
chocolat
Новичок
Джуниор
 
Регистрация: 24.11.2012
Сообщений: 2
По умолчанию

Цитата:
Что-то перемудрили
Согласен, смотрите, логика выборки такая:
Что отфильтровать я заранее не знаю. По этому и делаю выборку, по годам чтоб увидеть картину в целом, потом по месяцам, вплоть до часа, уже снимая добавляя галочки я опускаюсь ниже по выборке пока не нахожу то что ищу.


Код:
ADOQuery1.SQL.Add('SELECT SUM(Profit) AS Sum_profit FROM report Where');
ADOQuery1.SQL.Add('((year='''+Form2.CheckListBox1.Items[index_year]+'''))');
ADOQuery1.SQL.Add('and (month='''+IntToStr(index_month)+''')');
ADOQuery1.SQL.Add('and (day='''+Form6.CheckListBox1.Items[index_day]+''')')
ADOQuery1.SQL.Add('and (time between '''+hour_start+''' and ''+hour_finish+''')');
ADOQuery1.SQL.Add('and (HighLow='''+IntToStr(index_hihg_low+1)+''')');
Здесь идет выборка как на рисунку "Выборка в программе". Каждый последующий зависит от предыдущего.
chocolat вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
реализация в QT navolo4ka Qt и кроссплатформенное программирование С/С++ 0 10.02.2012 15:39
Реализация stopvirus Общие вопросы Delphi 12 24.12.2010 20:44
Реализация стека basilius90 Паскаль, Turbo Pascal, PascalABC.NET 0 03.06.2010 17:01
Реализация мультиплексирования Vampire Kain Помощь студентам 5 26.12.2009 15:43
Реализация страниц spein PHP 1 15.12.2009 00:54