![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Построение баланса
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 или ХП, если база - не локалка. Для напрсания такого запроса нужно, конечно, иметь структуры таблиц и собственно знать, что надо сделать конкретно.