Текущий архив: 2005.07.25;
Скачать: CL | DM;
Вниз
Вычисляемые поля. Найти похожие ветки
← →
Руслан (2005-06-10 11:53) [0]Добрый день! Можно ли как-то сделать так, чтобы при изменении какой-то одной записи не пересчитывались все видимые на экране вычисляемые поля? AutoCalcFields = False;
← →
Ega23 © (2005-06-10 11:55) [1]TDataSet.AutoCalcFields ?
← →
Руслан (2005-06-10 12:12) [2]Я же написал, что он установлен в False
← →
Ega23 © (2005-06-10 12:14) [3]Или тебе
DataSet.DisableControls - DataSet.EnableControls надо?
← →
Руслан (2005-06-10 12:17) [4]Нет, это не то. При редактировании и последующем DataSet.Post пересчитываются вычисляемые поля во всех видимых записях таблицы. Мне нужно от этого избавиться.
← →
evvcom © (2005-06-10 12:30) [5]
> все видимые на экране вычисляемые поля?
т.е. в других записях? Насколько я помню, пересчитываются только поля текущей записи (если ты только не переоткрываешь запрос :))) Если же ты делаешь Next/Prior/First/Last/MoveBy, то пересчитываются поля в двух записях. Во всяком случае у меня не было такой проблемы.
← →
Руслан (2005-06-10 14:09) [6]В том-то и дело, что у меня пересчитывается почему-то во всех видимых записях. А их видно около 20 штук. Теряется целая секунда на это. Поставил AutoCalcFields := False, но все равно пересчитываются все записи...
Запрос не переоткрываю. Происходит только DataSet.Post.
← →
Digitman © (2005-06-10 14:12) [7]
> Происходит только DataSet.Post
а состояние транзакции при этом контролируешь ?
← →
Руслан (2005-06-10 14:42) [8]Это как? В обработчике BeforePost вызываются несколько SQL-ов, которые эту таблицу не трогают.
← →
Digitman © (2005-06-10 14:44) [9]
> Это как?
автоподтверждение транзакции включено ?
← →
Руслан (2005-06-10 15:02) [10]Транзакции не задействованы.
← →
Digitman © (2005-06-10 15:05) [11]
> Транзакции не задействованы
СУБД какая ?
← →
Stanislav © (2005-06-10 15:08) [12]А у тебя может Grid какой-то, который подбивает сумму по колонке, а значит пробегается по всему запросу ?
← →
Руслан (2005-06-10 15:17) [13]СУБД: DBISAM.
Да, я использую DBGrid из EhLib. Но суммы в нем не считаются.
← →
Stanislav © (2005-06-10 15:25) [14]А SumList.Active:=false ?
← →
Digitman © (2005-06-10 15:26) [15]
> суммы в нем не считаются
не факт.
поставь на время обычный DBGrid и сравни
← →
Руслан (2005-06-10 15:42) [16]2 Stanislav: Да
2DigitMan: попробую. Но там просто грид не переткнушь. много чего переписывать надо.... Может попозже...
← →
Stanislav © (2005-06-10 15:46) [17]А сортировок с помощью грида нет ?
Попробуй прописать что-то на AfterScroll, и поставь точку останова - сможешь увидеть в какой момент у тебя проводится перебор записей, и проводится ли он вообще.
← →
Руслан (2005-06-10 15:49) [18]Сортировок нет. Ставил на AfterScroll таблицы добавление строки в тестовое мемо. Ничего там не добавлялось, а пересчет по записям пробегал...
← →
Stanislav © (2005-06-10 15:55) [19]А почему ты решил что пересчет ведется во всех видимых записях?
ведь значения их не меняются!
← →
Руслан (2005-06-10 16:11) [20]Я нацепил тестовое мемо.
Делаю так:
Memo1.Clear;
WorkTable.Post;
В OnCalcFields первой строкой вот что:
Memo1.Lines.Add(DataSet.FieldByName("ProdName").AsString);
Посе редактирования записи в мемо1 я вижу все видимые записи (20 строк).
← →
Stanislav © (2005-06-10 16:26) [21]А на AfterPOst и BeforePost есть обработчик?
← →
Руслан (2005-06-10 16:34) [22]В обработчике BeforePost вызываются несколько SQL-ов, которые эту таблицу не трогают.
← →
Stanislav © (2005-06-10 16:36) [23]Я только что пробовал с обычным гридом, тоже самое.
Это вызвано тем что после сохранения набора данных грид перерисовывается, и проходит по всем видимым записям набора данных.
Может попробывать на BeforePost запоминать ID, а на onCalckFields проверять если ID равен запомненому, то пересчитывать если нет, то нет.
← →
Руслан (2005-06-10 16:53) [24]Да дело в том что если даже делать в OnCalcFields
Memo1.Lines.Add(DataSet.FieldByName("ProdName").AsString);
Exit;
То он все равно пробегает по всем записям и тратит на это время.
:(
← →
Stanislav © (2005-06-10 17:13) [25]Но не очень много, практически не заметно, может утебя тормозит из-зи выполнения других запросов?
← →
evvcom © (2005-06-10 17:45) [26]
> Сортировок нет. Ставил на AfterScroll таблицы добавление
> строки в тестовое мемо. Ничего там не добавлялось, а пересчет
> по записям пробегал...
Ну а кто эту пробежку инициировал? Посмотри Call Stack (Ctrl+Alt+S)
← →
Руслан (2005-06-10 17:46) [27]на это теряется одна секунда.
и тормозит именно из-за пробегания по записям...
← →
heatryk (2005-06-12 00:09) [28]черт, у меня такая же проблема! буду следить за форумом....
у меня так: есть два датасета, в первом - калк поле, во втором - лукап, повешаный на это самое калк поле. при изменении значения лукап-поля следует рефреш первого датасета (recalc всех полей) и oncalcfields вызывается не только на видимые поля, а вообще на все.
думаю, стоит копать в сторону disablecontrols, хотя не знаю куда это пихать.
вот такая ботва.....
← →
Руслан (2005-06-13 13:21) [29]2heatryk: Мне кажется, disablecontrols тут не при чем.
Я пробовал прибить обработчик: WorkTable.OnCalcFields := nil;
Потом я его восстанавливал. В этом случае все та же секунда куда-то все равно пропадает. :( И во всех записях, кроме отредактированной, вычисляемые поля отображаются пустыми. Придется наверно смириться с задержками...
← →
Anatoly Podgoretsky © (2005-06-13 13:29) [30]Надо оптимизировать алгоритм расчета.
← →
evvcom © (2005-06-14 09:44) [31]
> В этом случае все та же секунда куда-то все равно пропадает.
Запиши в лог-файл время входа и выхода в подозрительные процедуры. Так и ищи, куда девается секунда.
← →
Руслан (2005-06-15 15:08) [32]Всем спасибо за обсуждение. Разобрался. Как я писал, основное время тратится не на вычисления в обработчике OnCalcFields, а на смену записей между вызовами этого обработчика. Вспомнил, что есть Lookup-поля. Посмотрел в эту сторону. Когда установил для всех этих полей LookupCache:=True, время выполнения гораздо ускорилось - до более менее терпимых величин.
Страницы: 1 вся ветка
Текущий архив: 2005.07.25;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.026 c