Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.02;
Скачать: CL | DM;

Вниз

переполнение стека в Grid. Почему?   Найти похожие ветки 

 
MMF ©   (2002-11-13 14:14) [0]

Уважаемые, может кто знает как побороть проблему:
IBase6.0, IBX, D5, InfoPower3000. Две таблицы ШапкаЗаказа и ТабличнаяЧасть связаны Master-detal. В табличной части CachedUpdates=true. На форме показываю итог по полю Summa, который перерасчитываю по событию этого поля OnChange(). Изредка (может раз на 100 открытий документов) возникает исключение по переполнению стека. Где это может сидеть?


 
Johnmen ©   (2002-11-13 14:40) [1]

Значит этот единственный на 100 отличается от других 99...
А наиболее частая причина Stack Overflow - бесконечный рекурсивный вызов процедур(ы)/функций(и).


 
MMF ©   (2002-11-13 14:53) [2]

> Johnmen © (13.11.02 14:40)
как правильно определить итог по полю при несохраненных изменениях в таблице. Мне не хочется использовать буферную таблицу для хранения табличной части документа.


 
Johnmen ©   (2002-11-13 15:01) [3]

>MMF © (13.11.02 14:53)

Не совсем уловил...
Но так, как ты делаешь, это нормально...
Пробежаться по НД и подсчитать сумму.


 
MMF ©   (2002-11-13 15:06) [4]

Ошибка однозначно в этих трех строчках:
glDocSum:=0;
DM.T_ZakazT.First;
while Not(DM.T_ZakazT.Eof) do
begin
if Not(DM.T_ZakazT.fieldbyName("Summa").isNull) then
glDocSum:=glDocSum+DM.T_ZakazT.fieldbyName("Summa").AsFloat;
DM.T_ZakazT.Next;
end;
Может тут причина в кэшировании изменений? я в полных непонятках


 
Johnmen ©   (2002-11-13 15:11) [5]

if не нужен.


 
MMF ©   (2002-11-13 15:17) [6]

>Johnmen © (13.11.02 15:11)
А на новой вставленной записи разве не будет исключения при попытке для пустого поля сделать .AsFloat? Ну и все-таки он не может привести к переполнению стека.
Я вобщем-то, конечно зря задал вопрос в конференцию, без кода что тут можно ответить.


 
Johnmen ©   (2002-11-13 15:20) [7]

>MMF © (13.11.02 15:17)

Нет, не может...
Смотри в сторону обрабатываемых тобой событий НД и грида (если он использ-ся)...


 
MMF ©   (2002-11-13 15:30) [8]

>Johnmen © (13.11.02 15:20)
У меня на событие смены столбца в гриде делаются такие действия:
L_Sum.caption:="Всего: "+FloatToStr(glDocSum);
L_Sum.Refresh;
FName:=LowerCase(Trim(Grid1.SelectedField.FieldName));
if Fname="prodname" then
with grid1.DataSource.DataSet do
begin
if FieldByName("Format").IsNull then
FieldByName("Format").asInteger:=glMainFormat;
if FieldByName("Cena").IsNull then
FieldByName("Cena").asFloat:=Round(glMainCena*
1000)/1000;
end
else
IF (Fname="cena") or (Fname="amount") then
with grid1.DataSource.DataSet do
begin
FieldByName("Summa").asFloat:=FieldByName("cena").asFloat*
FieldByName("Amount").asFloat;
end;
Может он здесь как-то зацикливается? Хотя при изменении поля суммы эта процедура ничего не делает.


 
Johnmen ©   (2002-11-13 15:42) [9]

При смене столбца в гриде неявно вызывается OnChange на поле (если менялось) дальше, думаю, понятно !

PS
Может быть просто завести калькулируемое поле "Summa" ?


 
MMF ©   (2002-11-13 15:50) [10]

Калькулируемое не подходит, ну хотят бухгалтера подгонять копейки хоть ты тресни.
вот если бы он всегда зависал, а так я не могу выделить комбинацию условий при которых возникает исключение.


 
MMF ©   (2002-11-13 15:59) [11]

Я наверное просто буду пересчитывать суммы и подставлять значения по-умолчанию полей не на событие выхода из соответствующей колонки, а на Onchange() поля. И нет проблем (наверное)



Страницы: 1 вся ветка

Текущий архив: 2002.12.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
1-4506
DiHLoS
2002-11-20 15:20
2002.12.02
Масштабирование при печати TChart


6-4541
Дмитрий К.К.
2002-10-06 19:11
2002.12.02
MSHTML_TLB.pas


3-4237
Akhmadey
2002-11-12 20:42
2002.12.02
Проблема с DBChart


3-4223
Вопросник
2002-11-13 13:42
2002.12.02
Обращение к БД через Интербэйс. Тормозит!!!


3-4197
skirdov
2002-11-12 14:55
2002.12.02
Выборка данных с SQL Server во временную таблицу