![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
переполнение стека в Grid. Почему? [D5, IB6.x]
MMF © (2002-11-13 14:14:00)Уважаемые, может кто знает как побороть проблему:
IBase6.0, IBX, D5, InfoPower3000. Две таблицы ШапкаЗаказа и ТабличнаяЧасть связаны Master-detal. В табличной части CachedUpdates=true. На форме показываю итог по полю Summa, который перерасчитываю по событию этого поля OnChange(). Изредка (может раз на 100 открытий документов) возникает исключение по переполнению стека. Где это может сидеть?
MMF (2002-11-13 15:59:00) [1]Я наверное просто буду пересчитывать суммы и подставлять значения по-умолчанию полей не на событие выхода из соответствующей колонки, а на Onchange() поля. И нет проблем (наверное)
MMF (2002-11-13 15:50:00) [2]Калькулируемое не подходит, ну хотят бухгалтера подгонять копейки хоть ты тресни.
вот если бы он всегда зависал, а так я не могу выделить комбинацию условий при которых возникает исключение.
Johnmen (2002-11-13 15:42:00) [3]При смене столбца в гриде неявно вызывается OnChange на поле (если менялось) дальше, думаю, понятно !
PS
Может быть просто завести калькулируемое поле "Summa" ?
MMF (2002-11-13 15:30:00) [4]>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:20:00) [5]>MMF © (13.11.02 15:17)
Нет, не может...
Смотри в сторону обрабатываемых тобой событий НД и грида (если он использ-ся)...
MMF (2002-11-13 15:17:00) [6]>Johnmen © (13.11.02 15:11)
А на новой вставленной записи разве не будет исключения при попытке для пустого поля сделать .AsFloat? Ну и все-таки он не может привести к переполнению стека.
Я вобщем-то, конечно зря задал вопрос в конференцию, без кода что тут можно ответить.
Johnmen (2002-11-13 15:11:00) [7]if не нужен.
MMF (2002-11-13 15:06:00) [8]Ошибка однозначно в этих трех строчках:
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:01:00) [9]>MMF © (13.11.02 14:53)
Не совсем уловил...
Но так, как ты делаешь, это нормально...
Пробежаться по НД и подсчитать сумму.
MMF (2002-11-13 14:53:00) [10]> Johnmen © (13.11.02 14:40)
как правильно определить итог по полю при несохраненных изменениях в таблице. Мне не хочется использовать буферную таблицу для хранения табличной части документа.
Johnmen (2002-11-13 14:40:00) [11]Значит этот единственный на 100 отличается от других 99...
А наиболее частая причина Stack Overflow - бесконечный рекурсивный вызов процедур(ы)/функций(и).