Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];

Вниз

Lookup поле и его событие OnChange   Найти похожие ветки 

 
alex_ran   (2002-11-04 16:58) [0]

Уважаемые мастера!
Помогите, плиз, разобраться с такой проблемой:
Мне необходимо прицепить обработчик события OnChange на Lookup поле в котором при изменениях в поле я программно изменяю значения других полей (fkData). При этом я заметил, что процедура обработки этого события входит в бесконечную рекурсию.
Итог ес-но - Stack Overflow. Когда попытался разобраться в этой проблеме, то выяснил что при изменении значений других полей (все fkData) все равно вызывается обработчик события OnChange для Lookup поля. Почему?
А для поля данных так не происходит - их обработчики вызываются только когда изменения происходят именно в них. Почему?
Спасибо всем.


 
passm   (2002-11-04 17:36) [1]

alex_ran (04.11.02 16:58)> Вероятно, изменение других полей приводит к изменению Lookup поля. Вероятнее всего - изменение TField.KeyFields. Это, разумеется, лучше избежать.
Но, для "безопасности" попробуй:
procedure TDataModule1.Query1FIELD1Change(Sender: TField);
var
f: TFieldNotifyEvent;
begin
f:= Sender.OnChange;
Sender.OnChange:= nil;
try
{ Меняем другие поля }
finally
Sender.OnChange:= f
end
end;


 
alex_ran   (2002-11-04 18:01) [2]

я примерно так и делал, но в моей ситуации это не выход, т.к. при таком методе те другие поля устанавливаются каждый раз и при попытке вручную изменить значение такого поля - оно вновь возвращает значение определенное такой процедурой.
Вышеприведенная процедура избавляет только от рекурсии.
Мне это надо для того, чтобы устанавливать для некоторых полей значения по умолчанию, но которые при желании можно изменить.
Вот изменения и не получаются.
И еще, эти поля данных не являются ключевыми - и я не могу понять что приводит к изменению Lookup поля. они определены как обязательные.


 
passm   (2002-11-04 18:20) [3]

alex_ran (04.11.02 18:01)> Теперь понятно, что тебе нужно :)
Для установки значения Lookup поля по умолчанию необходимо изменить поле TField.KeyFields не трогая сам TField. На примере:
Есть: Query1ID, Query1CURRENCY, Query1CURRENCY_NAME (Lookup) где CURRENCY - код валюты, а CURRENCY_NAME - ее наименование.
И CurrencyQueryID, CurrencyQueryNAME - справочник валют.
Далее:
procedure TDataModule1Query1NewRecord(DataSet: TDataSet);
begin
{ Подставляется первая валюта из справочника }
Query1CURRENCY.Value:= CurrencyQueryID.Value
end;
Кратко, но, надеюсь, идея понятна.


 
alex_ran   (2002-11-05 10:30) [4]

Не понял. Опишу подробнее.
Есть справочник рабочих, в котором у каждого есть уникальное, ключевое поле "ИД", и поля "Фамилия", "Тарифная ставка", "Премия"
Есть табель в котором определены ключевые поля "Месяц, год", "ИД", поля "День_1", ... "День_31", и тоже "Тарифная ставка", "Премия".
Дублирование 2 последних полей необходимо в связи с тем, что они в общем случае могут не совпадать со справочником, но каждый раз вводить их вручную влом.
Для этого я ввожу Lookup поле дабы не возиться с "ИД", а работать с "Фамилия". Но по его изменению в процедуре
TfmZavod.tblDetailFIOWorkersChange(Sender: TField);
я заполняю поля "Тарифная ставка", "Премия" значениями из справочника... И попадал в рекурсию, пока в самой процедуре не отключал обработчик.
Но после отработки процедуры и установки значений по умолчанию, попытка изменить поля "Тарифная ставка", "Премия" снова приводит к вызову процедуры TfmZavod.tblDetailFIOWorkersChange(Sender: TField); и как следствие к возврату значений по умолчанию.
Как это обойти?
И почему срабатывает эта процедура?


 
passm   (2002-11-05 10:55) [5]

alex_ran (05.11.02 10:30)> Обрабатывай изменения не Lookup полей, а изменения ключевых полей для Lookup. Это "ИД", "Тарифная ставка", "Премия".


 
alex_ran   (2002-11-05 11:27) [6]

passm © Огромное спасибо, заработало когда прицепился к ключевому "ИД": TfmZavod.tblDetailId_CodeChange(Sender: TField);
Буду знать.
Но пока не понимаю почему? А хотелось бы. :)
Да, "Тарифная ставка", "Премия" не ключевые, а Required Field , поэтому я и не могу понять почему для именно этих не ключевых полей их изменение вызывало тот обработчик onChange для LookUp поля?


 
passm   (2002-11-05 13:41) [7]

alex_ran (05.11.02 11:27)> Здесь понятие ключевое поле означает ключевое поле для Lookup поля, а вовсе не для таблицы. А теперь смотри, почему произошла рекурсия:
1. Ты изменяешь Lookup поле.
2. Изменение Lookup поля приводит к изменению "ключевого поля" например, "Премия".
3. Изменение ключевого поля для Lookup поля приводит к изменению Lookup поля.
4. Идем на пункт 1.



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

Форум: "Базы";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.015 c
4-83073
dredd
2002-10-12 11:32
2002.11.25
udp


14-82938
Геннадий
2002-11-05 16:02
2002.11.25
А есть ли компонент типа TWinRAR ?


3-82595
iNew
2002-11-05 03:58
2002.11.25
В BLOB поле храню фотографии, как сделать чтобы если есть


7-83018
lds78
2002-09-25 16:13
2002.11.25
Работа с датой.


7-83030
progger
2002-09-24 18:04
2002.11.25
Как организовать поиск файла в каталоге и вложенных папках?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский