Событие Current - непонятное поведение

Алексей_030212
Дата: 29.12.2015 01:32:07
Столкнулся с непонятным для меня поведением программы.

Есть форма и подчиненная форма на ней.
Разместил на главной элемент управления - список. Источник строк для него формирую по событию Current подчиненной формы.
Private Sub Form_Current()
Dim group_id As Long
Dim strsql As String
'èñòî÷íèê äàííûõ äëÿ spKeys
group_id = Me.id
    If group_id > 0 Then
        strsql = "SELECT id, mp_groups, key_name, frequency_WS, frequency_WS1, frequency_WS2 FROM keys WHERE mp_groups = " & CStr(group_id) & " ORDER BY frequency_WS DESC"
        Debug.Print strsql
        Forms("Card_project").Controls("spkeys").RowSource = strsql
    End If
End Sub


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

Вот отладчик:
SELECT id, mp_groups, key_name, frequency_WS, frequency_WS1, frequency_WS2 FROM keys WHERE mp_groups = 9031 ORDER BY frequency_WS DESC
SELECT id, mp_groups, key_name, frequency_WS, frequency_WS1, frequency_WS2 FROM keys WHERE mp_groups = 9031 ORDER BY frequency_WS DESC
ну и так далее бесконечно
Akina
Дата: 29.12.2015 09:07:18
Автосрабатывающие события надо расцикливать. Ну как минимум (если потери событий не влияют на процесс) типа
Private Sub Form_Current()
Static IsWorking As Boolean
If IsWorking Then Exit Sub
IsWorking = True
' код обработчика
IsWorking = False
End Sub
Rivkin Dmitry
Дата: 29.12.2015 09:35:33
Алексей_030212,

Посмотри в хелпе "Order of events for database objects". По-видимому, где-то переводится фокус на форму или она активируется и потому наступает событие Current. В принципе, можно это выявить дебаггером если пройтись пошагово (F8) после остановки программы в процедуре Current
Анатолий ( Киев )
Дата: 29.12.2015 11:41:32
Алексей_030212
Разместил на главной элемент управления - список. Источник строк для него формирую по событию Current подчиненной формы.
Непонятность заключается в том, что событие зацикливается: хотя список на главной форме формируется как надо, что-то дергает событие обновление подчиненной формы, она обновляет список, снова ...
Как связаны главная и субформа. Участвует ли в этой связке ваш список?
Алексей_030212
Дата: 29.12.2015 12:08:54
Анатолий ( Киев ),
Основная форма и подчиненная - каждая на своей таблице. Связь один-много. Список ни к какому полю не привязан (свободный).
непоймучка
Дата: 29.12.2015 12:26:22
Алексей_030212
Анатолий ( Киев ),
Основная форма и подчиненная - каждая на своей таблице. Связь один-много. Список ни к какому полю не привязан (свободный).
Список может быть свободным, но при этом - участвовать в связке субформы (т.е. имя этого списка фигурирует в свойстве LinkMasterFields контрола субформы) - и тогда это вполне м.б. причиной за_Loop_ливания вашего кода - и именно об этом говорил Анатолий ( Киев ).
Алексей_030212
Дата: 29.12.2015 13:05:22
непоймучка,
Нет список не указан в LinkMasterFields/LinkChildFields
Алексей_030212
Дата: 29.12.2015 13:18:31
Akina,
попрбовал Ваш код. Не помогло
непоймучка
Дата: 29.12.2015 13:29:26
Алексей_030212
непоймучка,
Нет список не указан в LinkMasterFields/LinkChildFields

1) напишите, что там указано
2) есть ли какая-то обработка событий списка, которая затрагивает источник субформы?
непоймучка
Дата: 29.12.2015 13:31:56
Алексей_030212
Akina,
попрбовал Ваш код. Не помогло

а так поможет?
Алексей_030212
Private Sub Form_Current()
Dim group_id As Long
Dim strsql As String
'èñòî÷íèê äàííûõ äëÿ spKeys
group_id = Me.id
    If group_id > 0 Then
        strsql = "SELECT id, mp_groups, key_name, frequency_WS, frequency_WS1, frequency_WS2 FROM keys WHERE mp_groups = " & CStr(group_id) & " ORDER BY frequency_WS DESC"
        If Not Forms("Card_project").Controls("spkeys").RowSource = strsql Then '<----ВОТ ТАК
            Debug.Print strsql
            Forms("Card_project").Controls("spkeys").RowSource = strsql
        End If
    End If
End Sub