Форум: "Базы";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
Внизпереполнение стека в 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c