![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вычисляемые поля. [D5]
Руслан © (2005-06-10 11:53:00)Добрый день! Можно ли как-то сделать так, чтобы при изменении какой-то одной записи не пересчитывались все видимые на экране вычисляемые поля? AutoCalcFields = False;
Руслан (2005-06-15 15:08:00) [1]Всем спасибо за обсуждение. Разобрался. Как я писал, основное время тратится не на вычисления в обработчике OnCalcFields, а на смену записей между вызовами этого обработчика. Вспомнил, что есть Lookup-поля. Посмотрел в эту сторону. Когда установил для всех этих полей LookupCache:=True, время выполнения гораздо ускорилось - до более менее терпимых величин.
evvcom (2005-06-14 09:44:00) [2]
> В этом случае все та же секунда куда-то все равно пропадает.
Запиши в лог-файл время входа и выхода в подозрительные процедуры. Так и ищи, куда девается секунда.
Anatoly Podgoretsky (2005-06-13 13:29:00) [3]Надо оптимизировать алгоритм расчета.
Руслан (2005-06-13 13:21:00) [4]2heatryk: Мне кажется, disablecontrols тут не при чем.
Я пробовал прибить обработчик: WorkTable.OnCalcFields := nil;
Потом я его восстанавливал. В этом случае все та же секунда куда-то все равно пропадает. :( И во всех записях, кроме отредактированной, вычисляемые поля отображаются пустыми. Придется наверно смириться с задержками...
heatryk (2005-06-12 00:09:00) [5]черт, у меня такая же проблема! буду следить за форумом....
у меня так: есть два датасета, в первом - калк поле, во втором - лукап, повешаный на это самое калк поле. при изменении значения лукап-поля следует рефреш первого датасета (recalc всех полей) и oncalcfields вызывается не только на видимые поля, а вообще на все.
думаю, стоит копать в сторону disablecontrols, хотя не знаю куда это пихать.
вот такая ботва.....
Руслан (2005-06-10 17:46:00) [6]на это теряется одна секунда.
и тормозит именно из-за пробегания по записям...
evvcom (2005-06-10 17:45:00) [7]
> Сортировок нет. Ставил на AfterScroll таблицы добавление
> строки в тестовое мемо. Ничего там не добавлялось, а пересчет
> по записям пробегал...
Ну а кто эту пробежку инициировал? Посмотри Call Stack (Ctrl+Alt+S)
Stanislav (2005-06-10 17:13:00) [8]Но не очень много, практически не заметно, может утебя тормозит из-зи выполнения других запросов?
Руслан (2005-06-10 16:53:00) [9]Да дело в том что если даже делать в OnCalcFields
Memo1.Lines.Add(DataSet.FieldByName('ProdName').AsString);
Exit;
То он все равно пробегает по всем записям и тратит на это время.
:(
Stanislav (2005-06-10 16:36:00) [10]Я только что пробовал с обычным гридом, тоже самое.
Это вызвано тем что после сохранения набора данных грид перерисовывается, и проходит по всем видимым записям набора данных.
Может попробывать на BeforePost запоминать ID, а на onCalckFields проверять если ID равен запомненому, то пересчитывать если нет, то нет.
Руслан (2005-06-10 16:34:00) [11]В обработчике BeforePost вызываются несколько SQL-ов, которые эту таблицу не трогают.
Stanislav (2005-06-10 16:26:00) [12]А на AfterPOst и BeforePost есть обработчик?
Руслан (2005-06-10 16:11:00) [13]Я нацепил тестовое мемо.
Делаю так:
Memo1.Clear;
WorkTable.Post;
В OnCalcFields первой строкой вот что:
Memo1.Lines.Add(DataSet.FieldByName('ProdName').AsString);
Посе редактирования записи в мемо1 я вижу все видимые записи (20 строк).
Stanislav (2005-06-10 15:55:00) [14]А почему ты решил что пересчет ведется во всех видимых записях?
ведь значения их не меняются!
Руслан (2005-06-10 15:49:00) [15]Сортировок нет. Ставил на AfterScroll таблицы добавление строки в тестовое мемо. Ничего там не добавлялось, а пересчет по записям пробегал...
Stanislav (2005-06-10 15:46:00) [16]А сортировок с помощью грида нет ?
Попробуй прописать что-то на AfterScroll, и поставь точку останова - сможешь увидеть в какой момент у тебя проводится перебор записей, и проводится ли он вообще.
Руслан (2005-06-10 15:42:00) [17]2 Stanislav: Да
2DigitMan: попробую. Но там просто грид не переткнушь. много чего переписывать надо.... Может попозже...
Digitman (2005-06-10 15:26:00) [18]
> суммы в нем не считаются
не факт.
поставь на время обычный DBGrid и сравни
Stanislav (2005-06-10 15:25:00) [19]А SumList.Active:=false ?
Руслан (2005-06-10 15:17:00) [20]СУБД: DBISAM.
Да, я использую DBGrid из EhLib. Но суммы в нем не считаются.