Форум: "Базы";
Текущий архив: 2003.05.19;
Скачать: [xml.tar.bz2];
ВнизПостроение баланса Найти похожие ветки
← →
MVVD (2003-04-25 11:19) [0]В таблице 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}
При большой таблице выборка долгая. Есть ли у кого решения по убыстрению этого процесса?
← →
MsGuns (2003-04-25 11:35) [1]Баланс, надо полагать, не бухгалтерский ?
Надо полагать, что целью приведенного кода является выборка из т.н. "баланса" мах.дат в пределах указанной границы по каждому счету, и из записи раб.таблицы с этой самой датой что-то берется и куда-то кладется ?
Использовать для этого подобный алгоритм - извращение. Все делается либо одним запросом UPDATE/INSERT со встроенным SELECT или ХП, если база - не локалка. Для напрсания такого запроса нужно, конечно, иметь структуры таблиц и собственно знать, что надо сделать конкретно.
← →
MVVD (2003-04-25 11:43) [2]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 ");
Зацикливается насмерть
← →
NickBat (2003-04-25 11:55) [3]Запросы лучше проверять каким-нибудь SQl монитором, а не из под Делфи все это гонять.
← →
MVVD (2003-04-25 12:01) [4]так SQl монитор и гонял
← →
kravchuk (2003-04-25 12:06) [5]А пробовал смотреть план запроса, например в IBExpert?
← →
NickBat (2003-04-25 12:21) [6]> так SQl монитор и гонял
А пример запроса почему-то приводишь с компонентами. :))
← →
MVVD (2003-04-25 12:23) [7]NickBat! Гонял естественно текст
← →
ЮЮ (2003-04-25 14:13) [8]Зацикливается насмерть
потому что для каждой строки CountsAl выполняется запрос. Подожди маленько, пока для всех строк выполнится :-)
Не проще ли сначала выбрать только нужные записи
SELECT LS, MAX(Data), MAX(ID)
WHERE Data < :DATA
GROUP BY LS
а затем результаты связать с CountsAl для получения остальной информации из записи
← →
MVVD (2003-04-25 14:20) [9]Так то же самое делается в самом первом примере
← →
ЮЮ (2003-04-25 14:27) [10]Так связывать не в цикле с FindKey а запросом
SELECT Таблица.*
FROM <запрос>, Таблица
WHERE <запрос>.ID = Таблица.ID AND <запрос>.LC = Таблица.LC
БД какая?
← →
MVVD (2003-04-25 14:33) [11]и Парадокс и Interbase
← →
Zacho (2003-04-25 14:37) [12]
> MVVD © (25.04.03 14:33)
Не знаю, как там в LocalSQL, а для IB настоятельно рекомендую явно указывать алиасы таблиц в запросе.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.05.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c