Форум: "Базы";
Текущий архив: 2002.05.16;
Скачать: [xml.tar.bz2];
ВнизПочему этот код ну очень медленно выполняется? Найти похожие ветки
← →
Борис (2002-04-17 12:14) [0]Есть код обновления полей в таблице:
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 минуты. Почему???
← →
arhelon (2002-04-17 12:17) [1]Потому как так оно навено и есть :((
Уходи с парадокса
← →
gek (2002-04-17 12:20) [2]Попробуй использовать
DisableControls
← →
sniknik (2002-04-17 12:26) [3]если в Query написать update вместо попозиционной записи то на все уйдет меньше сек. (даже в парадоксе)
если обращатся к полю по номеру Fields[0] вместо FieldByName время сократится до 5 сек.
← →
Delirium (2002-04-17 12:26) [4]А разве Post уже делать не обязательно?
form1.tsklad.edit;
form1.tsklad.FieldByName("P1").asinteger:=0;
form1.tsklad.FieldByName("P2").asinteger:=0;
form1.tsklad.post;
form1.tsklad.next;
← →
Alexandr (2002-04-17 12:34) [5]представь себе, необязательно
← →
gek (2002-04-17 12:34) [6]А почему так много полей - 255 ?
Надо бы это дело разбить.
← →
Alexandr (2002-04-17 12:35) [7]представь себе, необязательно
← →
Борис (2002-04-17 12:39) [8]> sniknik
Вначале надо выполнить select * from sklad.db
А потом написать Update, выполнить и вернуть select ?
> gek
А где его отключить?
← →
Delirium (2002-04-17 12:40) [9]> Alexandr
Но ведь Next без Post-а, должен Cancel-ить изменения ?!!
← →
Борис (2002-04-17 12:42) [10]> gek
Я тоже так думал. Но задавал вопросы по связям базы данны и не получил ответ.
Коротко:
есть таблица, в ней в первых 4 колонках название и краткая характеристика элемента (склад учета микрух, smd элементов и т.д.)
В следующих 240 полях находяться нормы производства для всех типов плат, на которые ставяться детали.
← →
Val (2002-04-17 12:42) [11]>Delirium © (17.04.02 12:40)
Почему? При Next Post выполняется неявно
← →
gek (2002-04-17 12:46) [12]
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;
← →
Delirium (2002-04-17 12:50) [13]Позор на мою седую голову - и правда Post-ится !!!
← →
Val (2002-04-17 12:53) [14]>Delirium © (17.04.02 12:50)
вы наверное сегодня не с той ноги, это даже в help по post"у есть ;)
← →
evgeg (2002-04-17 12:57) [15]Одно уже сказали: обязательно DisableControls.
Второе не используйте FieldByName. Т. к. в наборе 255 полей, а поиск поля проиходит простым перебором, кажется, что именно из-за него так тормозит. Создайте объекты-поля и обращайтесь непосредственно к ним:
tsKladP1.Value := 0;
tsKladP2.Value := 0;
← →
Борис (2002-04-17 12:59) [16]> evgeg
А коим образом их создать объектами-полями???
← →
Delirium (2002-04-17 13:02) [17]> Val
Просто help по TDataSet.Post я похоже и не читал ни разу в жизни - иначе бы запомнил :)
← →
sniknik (2002-04-17 13:06) [18]Борис ©
А потом написать 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;
и все. (сравни время!:)
← →
evgeg (2002-04-17 13:11) [19]Дважды щекнуть на форме на 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;
← →
Freezer (2002-04-17 13:11) [20]хм.. А такой выход не подойдет?
Сначала провести:
update
sklad.db
set
P1 = 0,
P2 = 0
А потом выполнить
select
*
from
sklad.db
← →
gek (2002-04-17 13:17) [21]Похоже и
Freezer (17.04.02 13:11) и
sniknik © (17.04.02 13:06)
предложили самые нормальные решения твоей проблемы
Но если уж не хочешь SQL использовать, то дело твое...
← →
Борис (2002-04-17 13:29) [22]Я написал так:
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 быстрее.
← →
evgeg (2002-04-17 13:40) [23]form1.tsklad.ExecSql;
form1.tsklad.Active:=True;
Выкиньте ExecSQL перед Active := true;
Сделайте Prepared := true перед ExecSQL и Active.
← →
gek (2002-04-17 13:41) [24]// 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:59) [25]Для выборки из Paradox-й базы быстрее TTable. Может быть и изменение циклов по нему быстрее, чем через Local SQL.
← →
evgeg (2002-04-17 14:00) [26]циклов
читать: циклом
← →
Turalyon (2002-04-17 14:32) [27]Согласен с evgeg TTable на локальных базах работает на порядок быстрее.
← →
Flex (2002-04-18 12:11) [28]Используй таблицу вместо запроса.
Кешируй изменения и обновляй все разом.
НЕ ИСПОЛЬЗУЙ 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;
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.05.16;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.007 c