Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
1-1120823676
Still Swamp
2005-07-08 15:54
2005.07.25
Конвертировать строку в varian


3-1118566441
0123
2005-06-12 12:54
2005.07.25
Упаковка таблиц Paradox


1-1120478236
Pasha L
2005-07-04 15:57
2005.07.25
Чем TStringGrid отличается от TDrawGrid


14-1120131224
TQuery
2005-06-30 15:33
2005.07.25
Структура заголовков файлов


14-1119995888
Юсби
2005-06-29 01:58
2005.07.25
А можно ли к одному USB порту как нибудь два устройства подключит