Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выполнение процедуры на обновление в группре полей?
 
 автор: никк   (29.11.2008 в 17:05)   личное сообщение
 
 

В форме при обновлении поля, одного из однотипных полей, необходимо выполнить процедуру. Как это сделать?

  Ответить  
 
 автор: Pasat   (29.11.2008 в 17:17)   личное сообщение
 
 

Private Sub MyField_AfterUpdate()
...
End Sub

  Ответить  
 
 автор: никк   (29.11.2008 в 17:21)   личное сообщение
 
 

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

  Ответить  
 
 автор: Pasat   (29.11.2008 в 17:29)   личное сообщение
 
 

Тогда придёится писать для каждого поля

  Ответить  
 
 автор: никк   (29.11.2008 в 17:32)   личное сообщение
 
 

Надеюсь сущесвует програмный способ!

  Ответить  
 
 автор: Pasat   (29.11.2008 в 17:42)   личное сообщение
 
 

Как вариант можно еще написть одну процедуру MySub
и для каждого поля афтер апдейт писать
Call MySub

  Ответить  
 
 автор: час   (29.11.2008 в 17:49)   личное сообщение
 
 

А на этой форме имеются поля, кои не вписываются в необходимость с ними это делать???77

а то действительно можно
Есть варианты
Вот первый
http://hiprog.com/forum/read.php?id_forum=1&id_theme=4294&page=1

  Ответить  
 
 автор: никк   (29.11.2008 в 17:52)   личное сообщение
 
 

Да имеются еще группы, на обновление которых нужно выполнять другую процедуру.
Поля названы так, что можно определить к какой группе они относятся. Поэтому достаточно выяснить имя обновляемого поля.

  Ответить  
 
 автор: никк   (29.11.2008 в 17:49)   личное сообщение
 
 

Сама процедура не такая большая, а вот полей около 20.
Нарерное как-то можно сделать с перехватом клавиш.

  Ответить  
 
 автор: час   (29.11.2008 в 17:53)   личное сообщение
 
 

Второй вариант
http://hiprog.com/index.php?option=com_content&task=view&id=251661594&Itemid=35

Одна процедурка - много полей.....

  Ответить  
 
 автор: никк   (29.11.2008 в 20:32)   личное сообщение
 
 

Не все понятно, для моего случая много лишнего.
Вот если-бы увидеть как работает изменение поля0 изменяя значения поля2!
Спасибо!

  Ответить  
 
 автор: Lukas   (29.11.2008 в 20:42)   личное сообщение
 
 

Если назвать элементы управления, участвующие в расчетах типа "fld1", "fld2", "fld..", "fld20", то на загрузке формы им можно прописать:

For i=1 To 20
Me.Controls("fld" & i).OnChange="=Calc()" 'Здесь имя процедуры расчета
Next i

или лучше на .OnLostFocus ?

  Ответить  
 
 автор: никк   (29.11.2008 в 22:10)   личное сообщение
 
 

Где-то ошибка:

Me.Controls("lh11").OnChange = "=heightUp(Me.Controls("lh11"), Me.Controls("lh12"),"lh1")"

Процедура heightUp присваивает некое среднее полю lh1при изменении одного из полей (в данном случае lh11, :
Forms!Test.Controls("lh1") = (h1 + h2 + 0.49) / 2
Что не правильно?

  Ответить  
 
 автор: Bellerofont   (29.11.2008 в 22:17)   личное сообщение
 
 

>Что неправильно?
По крайней мере то, как вы используете кавычки. Если вы хотите добавить символ кавычек в строку, то его надо удваивать.

  Ответить  
 
 автор: никк   (29.11.2008 в 22:26)   личное сообщение
 
 

1 Me.Controls("lh11").OnChange = "=heightUp(Me.Controls("lh11"), Me.Controls("lh12"),"lh1")"
подчеркивает то, в ковычках Controls("lh11"), ...

Пришлось для параметров ввести переменные, 1 прошло, но всетаки не понию ошибки
Про ковычки не понял, в Me.Controls("lh11").OnChange не ругается, а heightUp(Me.Controls("lh11"), ... в выделяет?

2 На событие обновление не находит функцию (не пишет какую)

  Ответить  
 
 автор: Lukas   (29.11.2008 в 22:35)   личное сообщение
13 Кб.
 
 

Me.Controls("lh11").OnChange = "=heightUp(Me.Controls("lh11"), Me.Controls("lh12"),"lh1")"
1. Ругается на те кавычки, которые в жирном.
2. Зачем передавать аргументы функции heightUp, она у Вас что, во внешнем модуле?
Если в модуле формы, то их можно получить в самой функции.
Пример в прицепе.

  Ответить  
 
 автор: никк   (29.11.2008 в 22:51)   личное сообщение
 
 

Да на те которые жирным.

М.б. проблеме в том, что нужно не вычислить функцию, а присвоить 3 полю значение по изменению значений в одном из двух. Поэтому процедуре нужно передать значения полей и имя поля которому нужно присвоить значение.

  Ответить  
 
 автор: Lukas   (29.11.2008 в 22:56)   личное сообщение
 
 

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

  Ответить  
 
 автор: никк   (30.11.2008 в 09:47)   личное сообщение
 
 

Уточнение.
В функции необходимо передавать параметры для определения какое поле нужно изменить и какие поля в этом учавствуют. Попробовал изменить ваш пример, появилась ошибка.
Изменения:
Public Function funCalc(i,j m As Integer)

Me.Controls("lh" & i) = (Me.Controls("lh" & i &"1") + Me.Controls("lh" & i & "2") + m) / 2

End Function

Private Sub Form_Load()
Dim i, j As Integer

For j = 1 To 3
For i = 1 To 2
Me.Controls("lh" & j & i).OnLostFocus = "=funCalc(j,i)"
Next i
Next j
End Sub

  Ответить  
 
 автор: час   (30.11.2008 в 10:20)   личное сообщение
 
 

Из того, что я предлагал выше взята суть обращения к одной функции - всеми полями.
Минимум кода.
Может посмотрите это-
http://hiprog.com/index.php?option=com_content&task=view&id=251661600&Itemid=35

У Вас получиться в форме:
Private Sub Form_Current()
Call Effect(Me)
End Sub
Вот и весь код.

и модуль, вынесеный с одной процедуркой.

Public Function Effect(frm As Form)
Dim ctl As Control
On Error Resume Next ' Если вдруг ошибка - идём дальше
For Each ctl In frm.Controls ' бегаем по всем элементам управления формы
    If ctl.ControlType = acTextBox Then ' Если находим поле
    ctl.OnEnter = "=SetName(" & ctl.NAME & ")" '
    End If
Next
End Function

  Ответить  
 
 автор: час   (30.11.2008 в 10:30)   личное сообщение
 
 

Но в Вашем случае , как и говорил выше Lukas
проблеме в том, что нужно не вычислить функцию, а присвоить 3 полю значение по изменению значений в одном из двух. Поэтому процедуре нужно передать значения полей и имя поля которому нужно присвоить значение.

  Ответить  
 
 автор: никк   (30.11.2008 в 13:46)   личное сообщение
 
 

Так может запускать процедуру, а не вычислять функцию.
Только процедере нужно передать несколько параметров и проблема решится.
Пример Lukas для функции нужно дополнить передачей параметров.

  Ответить  
 
 автор: Lukas   (30.11.2008 в 14:05)   личное сообщение
 
 

Зачем передавать аргументы функции. Все ссылки на значения контролов можно поиметь в самой функции. Например:
Поле3=Поле1+Поле2
Поле5=Поле3/Поле4
Поле7=(Поле1+Поле6)*Поле6
Только циклических ссылок не надо допустить.

Пусть функция считает полный расчет, при изменении любого поля. Меньше будет ошибок.
если есть нелинейность расчетов, используем Select Case, If Then и др.

  Ответить  
 
 автор: никк   (30.11.2008 в 16:09)   личное сообщение
 
 

Продолжение. Вопрос для Lukasd!
.onExit = true вызывает ошибку, так пытался определить имя поля которое теряет фокус.
Как правильно это сделать

  Ответить  
 
 автор: Lukas   (30.11.2008 в 16:33)   личное сообщение
 
 

А это что за ...:
.onExit = true

Зачем определять поле, которое потеряло фокус? Спрашиваю не в первый раз.
Если расчет в функции полный, на...ь какое поле теряет фокус. Тупо пересчитываем все подряд.
Единственно, можно добавить условие проверки, что бы функция не считала при перемещении по контролам без изменений данных в них:
If Me.Dirty Then
считаем
Me.Dirty=False
End If

  Ответить  
 
 автор: никк   (30.11.2008 в 16:47)   личное сообщение
 
 

Я уже несколько раз в обсуждении пытался обьяснить (м.б. не очень правильно).
В зависимости от того какое поле обновляется:
1. разные вычисления (в вычислении принимают участие разные поля)
2. результат вычисления присваивается разным полям
Осталось в функции определить имя обновляемого поля или передать его в фкнкцию.
На основе ваших примеров пытаюсь это сделать, пока безрезультатно.
В примере LBLastBTM понимаю, что где-то имя поля получающего фокус есть, но не понимаю как его вытащить.

  Ответить  
 
 автор: Lukas   (30.11.2008 в 16:57)   личное сообщение
 
 

1. разные вычисления (в вычислении принимают участие разные поля)
2. результат вычисления присваивается разным полям


В моем посте (14:05) тоже производятся разные вычисления, и результаты присваиваются разным полям. В чем загвоздка?

Screen.ActiveControl.Name - имя контрола, имеющего фокус.

  Ответить  
 
 автор: никк   (30.11.2008 в 17:02)   личное сообщение
 
 

Все зависит от того какое поле обновляется, а вашем примере обновляемое поле принимает пассивное участие и не определяет как считать и какому полю присвоить!

  Ответить  
 
 автор: Lukas   (30.11.2008 в 17:09)   личное сообщение
 
 

...поле принимает пассивное участие и не определяет как считать и какому полю присвоить...
Так поле и не должно по определению этим заниматься.
Как считать и какому полю присваивать значение определяет программист в коде в соответствии с методологией расчета.

  Ответить  
 
 автор: никк   (30.11.2008 в 17:16)   личное сообщение
 
 

Вот мне и надо запрограмировать в зависимости от имени поля которое обновляется.
Такова задача и алгоритм.
Вот поэтому при выполнении функции нужно знать какое поле обновляется.

  Ответить  
 
 автор: Lukas   (30.11.2008 в 17:36)   личное сообщение
 
 


For i=1 To 20
Me.Controls("fld" & i).OnLostFocus="=Calc(" & i & ")"
Next i 

Вот Вам параметр в функцию калькуляции.

  Ответить  
 
 автор: никк   (30.11.2008 в 18:01)   личное сообщение
 
 

Lukas спасибо за терпение!
Me.Controls("fld" & i).OnLostFocus="=Calc(" & i & ")"
Оказывается справа просто конконтенация, только сейчас на это обратил внимание, из-за этого большинство ошибок которые я наделал.
Параметром передаю Index обновляемого поля. Надеюсь дальше проблем не будет.

  Ответить  
 
 автор: никк   (30.11.2008 в 13:51)   личное сообщение
 
 

Знает ли функция какое обновляемое поле ее запустило.
Если в функции это можно определить, параметры передавать не надо.
Для моей задачи этого будет достаточно. Имя обновляемого поля все определяет!

  Ответить  
 
 автор: час   (30.11.2008 в 14:10)   личное сообщение
 
 

Кстати называйте как хотите функция или прцедура и та и другая может вернуть результат вычисления. Давайте назовём её функция, тогда в функцию передаём через запятую - все необходимые данные(параметры)

Имя обновляемого поля можно передать двумя способами

В функцию вот так:
Public Function Моя_Функция (Имя_поля, Имя_формы, Чё_Делать)
где Имя_поля - Имя обновляемого поля

end Function

или короче
Public Function Моя_Функция (Имя_поля,)
где Имя_поля - Имя обновляемого поля
Msgbox "Так вот ты какое поле " & Имя_поля
end Function

А в процедуру

Public Имя_Передаваемого_поля AS string

Имя_Передаваемого_поля = Имя_поля


Public sub Чё_делать ()
получили переменную
Имя_Передаваемого_поля

end sub

  Ответить  
 
 автор: никк   (30.11.2008 в 14:19)   личное сообщение
 
 

Я же выше приводил код Lukas (пример) в который пытался добавить параметры, появляется ошибка. Ответ от 09:47. Так, что там я сделал не так?

  Ответить  
 
 автор: никк   (30.11.2008 в 14:26)   личное сообщение
70 Кб.
 
 

Сообщение об ошибке в файле.

  Ответить  
 
 автор: час   (30.11.2008 в 14:36)   личное сообщение
 
 

Эт надо точку останова на Load поставить и пройтись в обработчике ошибок смотря где там Empty
или ещё чего

  Ответить  
 
 автор: никк   (30.11.2008 в 14:50)   личное сообщение
 
 

Сэтой ошибкой справился.
Теперь к основному вопросу: как передать правильно параметр или функция знает какое поле (имя) ее запустило и в ней это можно вытащить.
Me.Controls("lh" & j & i).OnLostFocus = "=funCalc(j,i)" так не работает!

  Ответить  
 
 автор: час   (30.11.2008 в 19:34)   личное сообщение
 
 

Me.Controls("lh" & j & i).OnLostFocus = "=funCalc(j,i)"
Me.Controls("lh" & j & i).OnLostFocus =funCalc(j,i)



Кстати называйте как хотите функция или прцедура и та и другая может вернуть результат вычисления. Давайте назовём её функция, тогда в функцию передаём через запятую - все необходимые данные(параметры)

Имя обновляемого поля можно передать двумя способами

В функцию вот так:
Public Function Моя_Функция (Имя_поля, Имя_формы, Чё_Делать)
где Имя_поля - Имя обновляемого поля

end Function

или короче
Public Function Моя_Функция (Имя_поля,)
где Имя_поля - Имя обновляемого поля
Msgbox "Так вот ты какое поле " & Имя_поля
end Function

А в процедуру

Public Имя_Передаваемого_поля AS string

Имя_Передаваемого_поля = Имя_поля


Public sub Чё_делать ()
получили переменную
Имя_Передаваемого_поля

end sub


есть ещё способ:
КокоеПоле=Screen.activeControl
КакаяФорма=Screen.activeForm
(Возможно я написал с синтаксической ошибкой)

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList