Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Построение баланса


MVVD ©   (2003-04-25 11:19:00) 

В таблице CountsAL (TCALL) имеются данные в виде: счет, дата, сумма. Стоим баланс на дату d.

Dmod.qWork2.Active := False;
Dmod.qWork2.SQL.Clear;
Dmod.qWork2.SQL.Add("Select LS ,Max(DATA) as qMDD From CountsAL );
Dmod.qWork2.SQL.Add("Where DATA <="""+DateToStr(db)+"""");
Dmod.qWork2.SQL.Add("Group by LS");
Dmod.qWork2.Active := True;

Dmod.qWork2.First; While(not Dmod.qWork2.EOF) do begin {While}
ls:=Trim(Dmod.qWork2.FieldByName("LS").AsString);
d := Dmod.qWork2.FieldByName("qMDD").AsDateTime;
DMod.TCALL.FindKey([nels,d]);
<Занесение в таблицу с данными баланса>
Dmod.qWork2.Next;
end; {While}
При большой таблице выборка долгая. Есть ли у кого решения по убыстрению этого процесса?


Zacho   (2003-04-25 14:37:00) [1]


> MVVD © (25.04.03 14:33)

Не знаю, как там в LocalSQL, а для IB настоятельно рекомендую явно указывать алиасы таблиц в запросе.


MVVD   (2003-04-25 14:33:00) [2]

и Парадокс и Interbase


ЮЮ   (2003-04-25 14:27:00) [3]

Так связывать не в цикле с FindKey а запросом
SELECT Таблица.*
FROM <запрос>, Таблица
WHERE <запрос>.ID = Таблица.ID AND <запрос>.LC = Таблица.LC

БД какая?


MVVD   (2003-04-25 14:20:00) [4]

Так то же самое делается в самом первом примере


ЮЮ   (2003-04-25 14:13:00) [5]

Зацикливается насмерть
потому что для каждой строки CountsAl выполняется запрос. Подожди маленько, пока для всех строк выполнится :-)

Не проще ли сначала выбрать только нужные записи

SELECT LS, MAX(Data), MAX(ID)
WHERE Data < :DATA
GROUP BY LS

а затем результаты связать с CountsAl для получения остальной информации из записи


MVVD   (2003-04-25 12:23:00) [6]

NickBat! Гонял естественно текст


NickBat   (2003-04-25 12:21:00) [7]

> так SQl монитор и гонял
А пример запроса почему-то приводишь с компонентами. :))


kravchuk   (2003-04-25 12:06:00) [8]

А пробовал смотреть план запроса, например в IBExpert?


MVVD   (2003-04-25 12:01:00) [9]

так SQl монитор и гонял


NickBat   (2003-04-25 11:55:00) [10]

Запросы лучше проверять каким-нибудь SQl монитором, а не из под Делфи все это гонять.


MVVD   (2003-04-25 11:43:00) [11]

Dmod.qWork2.SQL.Add("Select * from CountsAl c");
Dmod.qWork2.SQL.Add("Where DATA <="""+DateToStr(d)+"""");
Dmod.qWork2.SQL.Add(" and DATA= (select max(DATA) from CountsAl");
Dmod.qWork2.SQL.Add(" where LS = c.LS ");
Dmod.qWork2.SQL.Add(" and DATA <="""+DateToStr(d)+""" )");
Dmod.qWork2.SQL.Add(" order by LS ");

Зацикливается насмерть


MsGuns   (2003-04-25 11:35:00) [12]

Баланс, надо полагать, не бухгалтерский ?
Надо полагать, что целью приведенного кода является выборка из т.н. "баланса" мах.дат в пределах указанной границы по каждому счету, и из записи раб.таблицы с этой самой датой что-то берется и куда-то кладется ?
Использовать для этого подобный алгоритм - извращение. Все делается либо одним запросом UPDATE/INSERT со встроенным SELECT или ХП, если база - не локалка. Для напрсания такого запроса нужно, конечно, иметь структуры таблиц и собственно знать, что надо сделать конкретно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо