![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
---|Ветка была без названия|---
Avreliy © (2003-05-30 16:30:00)Здравствуйте мастера! (вкратце: FireBird->D7->BDE->DBGrid)
Есть подчинённая таблица и один из столбцов объявлен так:
SUMM Numeric(9,2)(он же - TableESUMM). При внесении данных без всякой самодеятельности (без попыток переприсвоить) - всё срабатывает. А вот, если я после серии проверок желаю изменить вносящиеся данные (в проц-ре OnChange), например, таким образом
TableESUMM.Value := 100 * TableESUMM.Value,
то Д7 выдаёт Debugger Fault Notification: "access violation at 0Xxxxxxxx: write of address 0Xyyyyyyy".
Когда я пытаюсь изменить данные этого поля через запрос, напр.,
QueryESUMM.Value := 100,
то всё срабатывает. В чём ошибка?
Zacho (2003-05-30 23:05:00) [1]
> Avreliy (30.05.03 22:48)
> Если помнишь, мы уже говорили на эту тему.
Уже забыл, что именно с тобой :(
Удачи !
Avreliy (2003-05-30 22:48:00) [2]Дело в том, что это мой первый проект БД...
и весьма вероятно, что последний с использованием BDE...
Если помнишь, мы уже говорили на эту тему.
Но в любом случае, спасибо за содействие.
Zacho (2003-05-30 22:35:00) [3]
> Avreliy (30.05.03 22:15)
Тогда попробуй разобраться с OnSetText. Imho, это самый правильный способ.
В крайнем случае - Zacho © (30.05.03 18:27) , но это все же изврат.
P.S. А почему BDE ? Старый проект ? Если есть возможность перейти на FIBPlus или IBX - крайне рекомендую.
Avreliy (2003-05-30 22:15:00) [4]Я вот подумал...
BeforePost не подходит, потому что мне нужно, чтобы результат отображался незамедлительно после ввода, а не перед попыткой отправить данные на базу.
Zacho (2003-05-30 22:14:00) [5]
> Avreliy (30.05.03 21:41)
> 2. taEMDETAILSUMM.Value := taEMDETAILSUMM.Value * (quJobCOEFF.Value
> / 100) заменить на
> Sender.Value :=StrToFloat(Text) * (quJobCOEFF.Value / 100)
> не помогает.
Странно. То ли я уже хорошенько забыл, как работает OnSetText, то ли в D7 он работает как-то по другому. То ли дело вообще в чем-то другом.
Попробуй сделать нужные тебе действия в BeforePost.
Похоже, больше ничем не могу помочь. :(
Avreliy (2003-05-30 21:41:00) [6]1. Это не lookup поле.
2. taEMDETAILSUMM.Value := taEMDETAILSUMM.Value * (quJobCOEFF.Value / 100) заменить на
Sender.Value :=StrToFloat(Text) * (quJobCOEFF.Value / 100) -
не помогает.
3. В BeforePost ещё не успел.
Zacho (2003-05-30 21:26:00) [7]
> Avreliy (30.05.03 20:52)
И, в догонку, это случаем не lookup поле?
Zacho (2003-05-30 21:21:00) [8]
> Avreliy (30.05.03 20:52)
Насколько я понял, это обработчик OnSetText именно поля taEMDETAILSUMM ?
Тогда можно попробовать следующее:
1. else taEMDETAILSUMM.Value := taEMDETAILSUMM.Value - убрать, все равно бессмысленно.
2. taEMDETAILSUMM.Value := taEMDETAILSUMM.Value * (quJobCOEFF.Value / 100) заменить на Sender.Value :=StrToFloat(Text) * (quJobCOEFF.Value / 100)
И, если не получится, как насчет обработки в BeforePost ?
Avreliy (2003-05-30 20:52:00) [9]if (ANSILowerCase(taEMDETAILRISETYPE.Value) = "ххххх") then begin
if quJob.Active then quJob.Close;
quJob.ParamByName("JOBTYPE").Value := taEMDETAILJOBTYPE.Value;
quJob.Open;
if (taEMPLOYEEGRADETYPE.IsNull) then
taEMDETAILSUMM.Value := taEMDETAILSUMM.Value * (quJobCOEFF.Value / 100)
else begin
if quGrade.Active then quGrade.Close;
quGrade.ParamByName("GRADETYPE").Value := taEMPLOYEEGRADETYPE.Value;
quGrade.Open;
taEMDETAILSUMM.Value := quGradeGRADESUM.Value * (quJobCOEFF.Value / 100)
end
end
else taEMDETAILSUMM.Value := taEMDETAILSUMM.Value
--------------------------------------------------
ta -таблицы, qu -запросы.
taEMDETAILSUMM.Value, quGradeGRADESUM.Value - TBCDField
quJobCOEFF.Value - TInteger
Zacho (2003-05-30 20:01:00) [10]
> Avreliy (30.05.03 19:34)
Честно признаюсь, потребность в OnGetText/OnSetText последний раз возникала у меня довольно давно, и было это на Дельфи 3 :-)
Но помню, что никаких проблем не возникало. Приведи свой код обработчика OnSetText.
Как вариант - попробуй TDataSet.BeforePost
Avreliy (2003-05-30 19:34:00) [11]В OnValidate я анализирую состояние переменных и в случае чего генерирую исключительную ситуацию. Например, анализирую на предмет возможного ввода отрицательного значения.
А вот после его ввода(отриц. зн-ния) поле ввода снова, как ни в чём и не бывало, оказывается пустым и исключительная ситуация не генерируется.
И ещё. Ведь OnSetText предназначен скорее для работы с текстом, чем для работы с числовыми переменными. И как-то бессмысленно работать со свойством Text вместо Value.
Или с этим обработчиком нужно работать по-другому?
Если код из OnChange просто перебросить в OnSetText, то данные после ввода исчезают.
Zacho (2003-05-30 19:00:00) [12]
> Avreliy (30.05.03 18:44)
Exception должен вызывать ты сам в OnValidate. Или ты о чем-то другом ?
Sandman25 (2003-05-30 18:55:00) [13]Не, вот так :)
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
Sandman25 (2003-05-30 18:54:00) [14]Zacho © (30.05.03 18:44)
Естественно метод. Ошибся.
procedure TForm1.DataSource1OnChange(Sender:TObjoect; Field:TField); Примерно так надо было... вроде :)
PS. Я сегодня встал в полпятого утра и хочу спать, а с работы уйти не могу - работаю до 19-00 по мск. Вот и приходится лазить по форуму, чтобы не уснуть. Ничего, через пару минут наконец-то пойду домой :)
Счастливо!
Zacho (2003-05-30 18:44:00) [15]
> Sandman25 © (30.05.03 18:33)
Да дело не столько в теме, сколько в том, что Table.OnChange := TableOnChange - неправильно. Возможно, ты все-таки имел в виду не процедуру, а метод ? :-)
Avreliy (2003-05-30 18:44:00) [16]> Zacho © (30.05.03 18:33)
В том-то и дело, что он не вызывает Exception.
Вводимые данные попросту исчезают из поля ввода, абсолютно игнорируясь.
Sandman25 (2003-05-30 18:37:00) [17]>Avreliy (30.05.03 18:30)
См.Zacho © (30.05.03 18:27), а еще лучше
Zacho © (30.05.03 17:31) ибо Sandman25 © (30.05.03 18:33)
Прошу прощения за нежеланное запутывание
Sandman25 (2003-05-30 18:33:00) [18]>Zacho © (30.05.03 18:27)
Я обычно ставил обработчик на DataSource.OnDataChange.
Для него и пример привел, только не в тему :)
Zacho (2003-05-30 18:33:00) [19]
> Avreliy (30.05.03 18:21)
Значит, как-то не так используешь OnSetText, у меня проблем не было.
А OnValidate предназначен исключительно для того, чтобы вызвать Exception если введенные данные не прошли проверку.
Avreliy (2003-05-30 18:30:00) [20]> Sandman25
Не совсем понял твой код???
Ведь у TTable нет обработчика OnChange.
И что такое Table.OnChange?