![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему этот код ну очень медленно выполняется? [D5, Paradox]
Борис © (2002-04-17 12:14:00)Есть код обновления полей в таблице:
while not form1.tsklad.eof do
begin
form1.tsklad.edit;
form1.tsklad.FieldByName("P1").asinteger:=0;
form1.tsklad.FieldByName("P2").asinteger:=0;
form1.tsklad.next;
end;
tsklad - TQuery с запросом select * from sklad.db
В таблице 255 полей и 400 записей.
На машине Cel 500 выполняется 9 секунд, на 200 пне - до 1 минуты. Почему???
Flex (2002-04-18 12:11:00) [1]Используй таблицу вместо запроса.
Кешируй изменения и обновляй все разом.
НЕ ИСПОЛЬЗУЙ FieldbyName (255 полей!)
var P1,P2 : Integer;
with form1.tsklad do
begin
P1 := FieldDefList.IndexOf("P1");
P2 := FieldDefList.IndexOf("P2");
CachedUpdates := true;
TRY
while not form1.tsklad.eof do
begin
Edit;
Fields[P1].asinteger:=0;
Fields[P2].asinteger:=0;
Next;
end;
TRY
ApplyUpdates;
EXCEPT
CancelUpdates;
END;
FINALLY
CachedUpdates := false;
END;
end;
Turalyon (2002-04-17 14:32:00) [2]Согласен с evgeg TTable на локальных базах работает на порядок быстрее.
evgeg (2002-04-17 14:00:00) [3]циклов
читать: циклом
evgeg (2002-04-17 13:59:00) [4]Для выборки из Paradox-й базы быстрее TTable. Может быть и изменение циклов по нему быстрее, чем через Local SQL.
gek (2002-04-17 13:41:00) [5]// form1.tsklad.Active:=True;
form1.tsklad.Active:=false;
form1.tsklad.SQL.Clear;
form1.tsklad.SQL.Add("select * from sklad.db");
form1.tsklad.Active:=True;
Я вот что-то не пойму зачем все поля выбирать.
Ну не может быть, что они тебе все в данный момент нужны.
Может не все, тогда еще быстрее будет
evgeg (2002-04-17 13:40:00) [6]form1.tsklad.ExecSql;
form1.tsklad.Active:=True;
Выкиньте ExecSQL перед Active := true;
Сделайте Prepared := true перед ExecSQL и Active.
Борис (2002-04-17 13:29:00) [7]Я написал так:
form1.tsklad.SQL.Clear;
form1.tsklad.SQL.Add("update sklad.db set");
form1.tsklad.SQL.Add(" P1 = 0, P2 = 0");
form1.tsklad.ExecSql;
// form1.tsklad.Active:=True;
form1.tsklad.SQL.Clear;
form1.tsklad.SQL.Add("select * from sklad.db");
form1.tsklad.ExecSql;
form1.tsklad.Active:=True;
Стало работать секунд на 3 быстрее.
gek (2002-04-17 13:17:00) [8]Похоже и
Freezer (17.04.02 13:11) и
sniknik © (17.04.02 13:06)
предложили самые нормальные решения твоей проблемы
Но если уж не хочешь SQL использовать, то дело твое...
Freezer (2002-04-17 13:11:00) [9]хм.. А такой выход не подойдет?
Сначала провести:
update
sklad.db
set
P1 = 0,
P2 = 0
А потом выполнить
select
*
from
sklad.db
evgeg (2002-04-17 13:11:00) [10]Дважды щекнуть на форме на tsklad. Появится контекстное меню. В нем выбрать Add field. Выбрать нужные, нажать Ok. Только в Дельфи 5, кажется, к ним надо обращатся не form1.tseditP1, а
form1.tsedit.P1. Разберетесь, вобщем.
Можно и с FieldByName, но вызывать его не в цикле, а до него.
var FP1, FP2: TIntegerField;
dt: TDataSet;
begin
dt := form1.tsklad;
FP1 := form1.tsklad.FieldByName("P1");
FP2 := form1.tsklad.FieldByName("P2");
dt.DisabledControls;
dt.first;
while not dt.eof do
begin
dt.edit;
FP1.Value := 0;
FP2.Value := 0;
dt.next;
end;
dt.EnabledControls;
end;
sniknik (2002-04-17 13:06:00) [11]Борис ©
А потом написать Update, выполнить и вернуть select ?
не потом а вместо, задача в том чтобы данные в таблице обновить?
из хелпа
UPDATE table_reference
SET column_ref = update_atom [, column_ref = update_atom...]
[WHERE predicates]
в твоем случае пишеш вместо
while not form1.tsklad.eof do
begin
form1.tsklad.edit;
form1.tsklad.FieldByName("P1").asinteger:=0;
form1.tsklad.FieldByName("P2").asinteger:=0;
form1.tsklad.next;
end;
Query1.SQL:= "UPDATE TableName SET P1=0, P2=0";
Query1.ExecSql;
и все. (сравни время!:)
Delirium (2002-04-17 13:02:00) [12]> Val
Просто help по TDataSet.Post я похоже и не читал ни разу в жизни - иначе бы запомнил :)
Борис (2002-04-17 12:59:00) [13]> evgeg
А коим образом их создать объектами-полями???
evgeg (2002-04-17 12:57:00) [14]Одно уже сказали: обязательно DisableControls.
Второе не используйте FieldByName. Т. к. в наборе 255 полей, а поиск поля проиходит простым перебором, кажется, что именно из-за него так тормозит. Создайте объекты-поля и обращайтесь непосредственно к ним:
tsKladP1.Value := 0;
tsKladP2.Value := 0;
Val (2002-04-17 12:53:00) [15]>Delirium © (17.04.02 12:50)
вы наверное сегодня не с той ноги, это даже в help по post"у есть ;)
Delirium (2002-04-17 12:50:00) [16]Позор на мою седую голову - и правда Post-ится !!!
gek (2002-04-17 12:46:00) [17]
with form1.tsklad do
try
DisableControls;
while not eof do
begin
edit;
FieldByName("P1").asinteger:=0;
FieldByName("P2").asinteger:=0;
next;
end;
finally
EnableControls;
end;
Val (2002-04-17 12:42:00) [18]>Delirium © (17.04.02 12:40)
Почему? При Next Post выполняется неявно
Борис (2002-04-17 12:42:00) [19]> gek
Я тоже так думал. Но задавал вопросы по связям базы данны и не получил ответ.
Коротко:
есть таблица, в ней в первых 4 колонках название и краткая характеристика элемента (склад учета микрух, smd элементов и т.д.)
В следующих 240 полях находяться нормы производства для всех типов плат, на которые ставяться детали.
Delirium (2002-04-17 12:40:00) [20]> Alexandr
Но ведь Next без Post-а, должен Cancel-ить изменения ?!!