подскажите правильный код: отследить изменение значения поля формы

Подскажите
Дата: 30.11.2009 14:08:20
Форма "Карточка товара"
Поле со списком "Товар" находится в заголовке формы. Источник формы: запрос с условием отбора WHERE IDтовар = Me!ПолеСоСписком1.
В области данных есть поле Цена. Если значение цены изменяется(оператором), то нужно занести это новое значение в таблицу ИсторияЦены.
На обновление ПоляСоСписком запоминаю цену в переменной:
 gl_СтараяЦена = Me![Цена]
Добавил кнопку и ее нажатие:
If gl_СтараяЦена <> Me![Цена] Then
   CurrentDb.Execute("INSERT INTO ИсторияЦены(IDтовар,Цена,Дата) Values(ПолеСоСписком,Me![Цена],Date)")
End If
Так работает, но неудобно, когда изменяются цены у нескольких товаров: можно забыть нажать кнопку.
Может как-то от ПоляСоСписком запускать код?
ё
Дата: 30.11.2009 14:16:48
...зачем вопще эта кнопка, запоминание старой цены..?
выполняйте этот ИНСЕРТ в АфтерАпдейт поля цена
отакота
Дата: 30.11.2009 14:26:10
Если форма редактирования цены связанная, то можно вашу проверку сделать в Form_BeforeUpdate - там и старое и новое значение поля цены есть - сравнить можно прямо их без запоминания цен в переменные.
Подскажите
Дата: 30.11.2009 14:29:25
Кнопка не нужна, Вы правы.
На AfterUpdate пробовал перенести код, но тогда так: в таблице ИсторияЦены оказывается запись такого содержания:
[код следующего выбранного товара], [измененная цена предыдущего]...
Т.е. если выбрать Товар1, потом поменять его цену и выбрать Товар2, то в таблицу запишется:
КодТовара2, новая цена товара1...
Подскажите
Дата: 30.11.2009 14:35:41
И через Form_BeforeUpdate таже картина - запоминается новый(уже выбранный код товара)
отакота
Дата: 30.11.2009 14:39:47
Подскажите
И через Form_BeforeUpdate таже картина - запоминается новый(уже выбранный код товара)
так вы в запросе insert код товара берите НЕ из поля со списком, а из связанного поля источника - по идее он у вас там должен быть.
ё
Дата: 30.11.2009 14:43:50
добавте в источник формы, выборку поля IDтовар - необязательно его даже выводить на форму, просто что бы он был в выборке
(в этот запрос - ...WHERE IDтовар = Me!ПолеСоСписком1.)
и тогда в АфтерИнсерт будет что-то типа
Dim strSQL As String
strSQL = ("INSERT INTO ИсторияЦены(IDтовар,Цена,Дата) Values(" & IDтовар.Value & ",Me![Цена],Date)"
CurrentDb.Execute(strSQL)
Подскажите
Дата: 30.11.2009 14:54:02
заменил на Me.IDтовар:
...Values(Me.IDтовар,Me![Цена],Date)...
теперь товар запоминается правильно и на BeforeUpdate, и на AfterUpdate.
На какое событие правильно-то?
ё
Дата: 30.11.2009 15:07:30
Подскажите
...
На какое событие правильно-то?


и то, и другое - "неочень")))
если оператор - изменит цену, перейдет к другому полю,
а потом передумает и нажмет Esc - то изменения отменятся,
но запись в таб.ИсторияЦены - уже будет сохранена

правильнее - в Form_AfterUpdate
но тогда надо какой-то флажок устанавливать, если было изменение цены
и Form_AfterUpdate - проверять его
и в зависимости от значения - делать инсерт
отакота
Дата: 30.11.2009 16:10:48
Подскажите
заменил на Me.IDтовар:
...Values(Me.IDтовар,Me![Цена],Date)...
теперь товар запоминается правильно и на BeforeUpdate, и на AfterUpdate.
На какое событие правильно-то?
отакота
в Form_BeforeUpdate - там и старое и новое значение поля цены есть - сравнить можно прямо их без запоминания цен в переменные.
If Me.Цена.Value <> Me.Цена.OldValue then currentdb.execute...