Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2008, 16:16   #1
Muchacho
Пользователь
 
Регистрация: 01.11.2008
Сообщений: 22
По умолчанию Помогите разобраться с ошибкой

Помогите пожалуста разобраться с ошибкой.Во вкладке Статистика>Статистика расхода почему то перестало работать: Дабавить запись, редактировать запись. При добавлении записи или ее редактирование программа вылетает.

Последний раз редактировалось Muchacho; 09.12.2008 в 19:24.
Muchacho вне форума Ответить с цитированием
Старый 08.11.2008, 16:49   #2
VVM
Форумчанин
 
Аватар для VVM
 
Регистрация: 06.06.2007
Сообщений: 282
По умолчанию

Ошибка переполнения стека в модуле DataModuleUnit.
Код:
procedure TDataModule1.BookTable2CalcFields(DataSet: TDataSet);
begin
BookTable2DSDesigner6.Value := BookTable2DSDesigner3.AsInteger*
BookTable2DSDesigner5.AsInteger;
BookTable2DSDesigner4.Value := 'шт.';
end;
Цитата:
Глава 36. TDataSet.OnCalcFields

Событие OnCalcFields Затрагиваемые объекты TDataSet
Назначение Событие OnCalcFields ссылается на процедуру обработчика событий, в которой можно указать пользовательскую обработку для определения значений любых вычисляемых полей в TDataSet.
Объявление Туре TDataSetNotifyEvent = procedure(DataSet: TDataSet) of object;
property OnCalcFields: TDataSetNotifyEvent;
Пример синтаксиса // Назначить или отменить назначение обработчика событий OnCalcFields
//в соответствии с флажком
procedure TTDataSetTestForm.OnCalcFieldsCheck BoxClick(Sender:TObject);
begin
if OnCalcFieldsCheckBox.Checked
then CustomerTable.OnCalcFields := CustomerTableCalcFields
else CustomerTable.OnCalcFields := Nil;
end;

// Процедура обработчика событий OnCalcFields
procedure TTDataSetTestForm.CustomerTableCalc Fields(DataSet: TDataSet);
begin
// Примечание: данная CustomerTableDaysSinceLastlnvoice вычисляется.
// TFloatField добавляется к CustomerTable через Fields Editor,
if not CustomerTableLastlnvoiceData.isNull then
CustomerTableDaysSinceLastInvoice.V alue := Int(Date —
CustomerTableLastlnvoiceDate.Value) ;
end;
Описание
Событие OnCalcFields в TDataSet включается всякий раз при считывании запись из базы данных. Событие OnCalcFields включается также и тогда, когда пользователь интерактивно модифицирует невычисляемые поля (когда TDataSet находится в состоянии Edit или Insert) и его свойство AutoCalcFields установлено в True. Обратите внимание, что во время выполнения процедуры обработчика событий OnCalcFields состояние TDataSet устанавливается в CalcFields. В то время, когда TDataSet находится в состоянии CalcFields изменять значения вычисляемых полей не следует. Знайте о том, что если любое невычисляемое поле TDataSet (или даже любое поле связанного TDataSet) модифицируется во время выполнения процедуры обработчика событий OnCalcFields, то скорее всего возникнет бесконечный цикл. Если процедуре обработчика событий OnCalcFields необходимо сослаться на поля из другого TDataSet, самое первое обращение к другому TDataSet (во время создания формы) может функционировать некорректно, если TDataSet, на который ссылаются, еще на создан. Для обеспечения правильного порядка создания TDataSet (тот TDataSet, на который ссылаются, чаще всего должен идти первым), следует использовать команду меню File|Creation Form Designer, с помощью которой можно установить желаемый порядок создания. Естественно, прежде чем ссылаться на вычисляемые поля внутри процедуры обработчика событий OnCalcFields необходимо использовать Fields Editor для их создания.
Не важно, как часто вы падаете. Важно, как часто вы поднимаетесь. Винс Ломбарди.

Последний раз редактировалось VVM; 08.11.2008 в 17:00.
VVM вне форума Ответить с цитированием
Старый 08.11.2008, 17:12   #3
VVM
Форумчанин
 
Аватар для VVM
 
Регистрация: 06.06.2007
Сообщений: 282
По умолчанию

Цитата:
Хитрость OnCalcFields


Событие OncalcFields генерится ОЧЕНЬ часто и может быть необязательным и занимать большое количество времени, например, у вас есть таблица с неким вычисляемым полем, и при каждом редактировании таблицы вызывается следующий код:
MyCalcField.AsInteger := Table1Field1.AsInteger + 10;



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

Мой совет следующий: выключите генерацию события OnCalcFields, обработайте все поля и снова включите генерацию данного события, к примеру так:
Procedure TForm1.BigProcessingFunction;
begin
Table1.OnCalcFields := nil;
// <Включите любые по сложности вычисления в этом месте!>
Table1.OnCalcFields := Table1OnCalcFields;
end;



Поля не вычисляются в течение времени обработки, которое может быть достаточно велико, но при наличие громоздких вычислений специфического поля (или даже нескольких полей), все вычисляется за один проход!

Данный метод позволяет исключить необязательный код и может быть использован повсюду, где применяются большие таблицы или сложный алгоритм калькуляции поля. Разница в скорости обработки таблицы довольно ощутима.
Таким образом преобразуем:
Код:
procedure TDataModule1.BookTable2CalcFields(DataSet: TDataSet);
begin
  BookTable2.OnCalcFields := nil;
  BookTable2DSDesigner6.Value := BookTable2DSDesigner3.AsInteger*
  BookTable2DSDesigner5.AsInteger;
  BookTable2DSDesigner4.Value := 'шт.';
  BookTable2.OnCalcFields := BookTable2.OnCalcFields;
end;
Не важно, как часто вы падаете. Важно, как часто вы поднимаетесь. Винс Ломбарди.

Последний раз редактировалось VVM; 08.11.2008 в 17:37.
VVM вне форума Ответить с цитированием
Старый 08.11.2008, 18:17   #4
Muchacho
Пользователь
 
Регистрация: 01.11.2008
Сообщений: 22
По умолчанию

Спасибо большое!

Последний раз редактировалось Muchacho; 08.11.2008 в 18:33.
Muchacho вне форума Ответить с цитированием
Старый 08.11.2008, 18:37   #5
VVM
Форумчанин
 
Аватар для VVM
 
Регистрация: 06.06.2007
Сообщений: 282
По умолчанию

Цитата:
как мне теперь сделать так чтобы в "Расходе" указывался только тот матераиал, который есть в "Приходе"
Ну мне только 2 варианта в голову приходит:
1. Во время добавления записи в "расход" идет проверка наличия соответствующих полей и их содержимого в "Приходе".
2. Во время добавления записи в "расход" появляется список-подсказка (как в delphi при нажатии ctrl + space во время написания кода) из которой можно выбрать готовый вариант, заведомо существующий в "Приходе".
Не важно, как часто вы падаете. Важно, как часто вы поднимаетесь. Винс Ломбарди.
VVM вне форума Ответить с цитированием
Старый 08.11.2008, 18:38   #6
Muchacho
Пользователь
 
Регистрация: 01.11.2008
Сообщений: 22
По умолчанию

Еще один вопрос. Как же мне все таки сделать так чтобы в "Расходе" мне можно было отображать только тот материал и его цену, которая числится за этим материалом в "Приходе"?
Muchacho вне форума Ответить с цитированием
Старый 08.11.2008, 18:41   #7
Muchacho
Пользователь
 
Регистрация: 01.11.2008
Сообщений: 22
По умолчанию

Цитата:
Сообщение от VVM Посмотреть сообщение
1. Во время добавления записи в "расход" идет проверка наличия соответствующих полей и их содержимого в "Приходе".
А как организовать такую проверку?
Muchacho вне форума Ответить с цитированием
Старый 08.11.2008, 18:46   #8
VVM
Форумчанин
 
Аватар для VVM
 
Регистрация: 06.06.2007
Сообщений: 282
По умолчанию

Цитата:
Цитата:Сообщение от VVM
1. Во время добавления записи в "расход" идет проверка наличия соответствующих полей и их содержимого в "Приходе".

А как организовать такую проверку?
Ну приблизительно следующим образом:
Лезем в таблицу "приход", перебираем записи и смотрим, есть ли там нужное количество указанного материала (колонка "Кол-во" по материалу). Цена, предположим, константа.
Не важно, как часто вы падаете. Важно, как часто вы поднимаетесь. Винс Ломбарди.
VVM вне форума Ответить с цитированием
Старый 08.11.2008, 23:39   #9
Muchacho
Пользователь
 
Регистрация: 01.11.2008
Сообщений: 22
По умолчанию

Спасибо!!!
Muchacho вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите с ошибкой Titan123 Общие вопросы Delphi 9 18.07.2008 15:12
Помогите с ошибкой IO 32 JIK Общие вопросы Delphi 4 21.06.2008 18:17
Помоги разобраться с ошибкой, пожалуйста Turok Паскаль, Turbo Pascal, PascalABC.NET 4 17.06.2008 22:58
помогите разобраться ара Помощь студентам 13 05.12.2007 17:50