Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Проблема синхронизации данных  [new]
vbnewb
Member

Откуда:
Сообщений: 4
Занимаюсь access первую неделю, так что просьба сильно не пинать, а дать рекомендации по subj:

Есть следующий код и две формы.

Форма №1 с combo (EditObject) без controlsource и куча нередактируемых textboxов с отображением контактных данных + две подчиненные формы, но они уже никакого отношения к вопросу не имеют.

в качестве источника Combo:
SELECT DISTINCT Objects.ObjectName, Objects.[Object ID] FROM Objects ORDER BY Objects.ObjectName; )
Column Count 1, Bound Column 1 - соответственно возвращаемые значения по умолчанию - objectname [column(0)]. object id - column(1)

в качестве источника формы №1:
SELECT Objects.[Object ID], Objects.ObjectName, Objects.[Contact1 ID], Objects.[Contact2 ID], Cont1.Name, Cont1.phone, Cont1.[e-mail], Cont1.ICQ, Cont2.Name, Cont2.phone, Cont2.[e-mail], Cont2.ICQ
FROM (Contacts AS Cont1 RIGHT JOIN Objects ON Cont1.[Contact ID] = Objects.[Contact1 ID]) LEFT JOIN Contacts AS Cont2 ON Objects.[Contact2 ID] = Cont2.[Contact ID]
ORDER BY Objects.ObjectName;)

Edit_Object - это кнопка для вызова формы №2 (также можно через dblclick на FindObject)

Источник формы №2 - это сама таблица objects, и соответственно она предназначена для редактирования этой самой таблицы

Для того, чтобы сделать синхронизация между комбо/формой №1 и формой №2 вставил me.refresh/Me.RecordSource = Me.RecordSource после вызова создания формы, т.к. она модальная.

Синхронизация работает следующим способом:
1) После редактировании и выхода из формы №2 текущего значения из combo на форме №1, значение в combo обновляется (делается в FindObject.gotfocus)
2) При удалении и выходе в форме №2 текущего значения из combo, значение в combo перемещается на первый найденный.

Но все равно. Слишком много перерисовок и кода:

1) Видно, что после выбора в combo НЕ первой записи и открытии, закрытии формы №2 (даже без мзменений) происходит сначала установка в combo первой записи, а потом текущей. Вызванно это тем, что после закрытия модальной формы № 2 делаю refresh и requery (Me.RecordSource = Me.RecordSource) для того, чтобы синхронизировать данные формы № 1 с изменившимися данными в таблице object. Как я понимаю. Requery и вызывает сброс значенич в combo. С одной стороны это надо в том случае, если текущее значение (из combo) было удалено, с другой вызывает лишнюю прорисовку. Т.е., по идее, надо делать проверку на изменение/удаление текущего значения (из combo) и в зависимости от этого делать или нет me.refresh и requery. Можно конечно создать public переменную и ставить ее в true, если были изменения... но как-то некрасиво. Есть ли другой способ?

2) Поиск в двух местах:
a) на findobject.afterupdate - ну это понятно. он тут и нужен
b) на findobject.getfocus - тоже вставил, но лишь для того, чтобы установить значение combo.value, в случае, если оно было отредактированно в диалоге (форма №2).
Возможно можно обойтись только одним, но не могу понять, как это сделать.

Вообщем коряво как-то. Чувствую, что половину кода можно выкинуть нафиг, как лишнюю. Знать бы только какую...

Private Sub EditObj(id As Long)
On Error GoTo Err_EditObj

Dim stDocName As String
Dim stLinkCriteria As String

stLinkCriteria = ""
If id > 0 Then
stLinkCriteria = "[Object ID]=" & id
End If
stDocName = "EditObject"
DoCmd.OpenForm stDocName, , , stLinkCriteria, , acDialog
Me.Refresh
Me.RecordSource = Me.RecordSource
' Me!FindObject.SetFocus

Exit_EditObj:
Exit Sub

Err_EditObj:
MsgBox Err.Description
Resume Exit_EditObj
End Sub

Private Sub Edit_Object_Click()
Call EditObj(Nz(Me![FindObject].Column(1), 0))
End Sub

Private Sub FindObject_AfterUpdate()
' обновляем контакты
Dim rs As Object
Dim id As Long
Set rs = Me.Recordset.Clone
id = Nz(Me![FindObject].Column(1), 0)
If id <> 0 Then
rs.FindFirst "[Object ID] = " & id
If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End If
End Sub
Private Sub FindObject_DblClick(Cancel As Integer)
Call EditObj(0)
End Sub

Private Sub FindObject_GotFocus()
On Error GoTo Err_FindObject_GotFocus
Dim rs As Object
Dim id As Long
Me.AllowEdits = True
Set rs = Me.Recordset.Clone
id = Nz(Me![FindObject].Column(1), 0)
If id = 0 Then
Me!FindObject = Me![ObjectName]
Else
rs.FindFirst "[Object ID] = " & id
If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End If
Err_FindObject_GotFocus:
End Sub

Private Sub FindObject_LostFocus()
Me.AllowEdits = False
End Sub

Private Sub Form_Load()
DoCmd.Restore ' автозагрузка формы
End Sub

Private Sub Form_Open(Cancel As Integer)
Dim rs As Object
Me.AllowEdits = False
' DoCmd.GoToRecord , , acFirst
Me!FindObject = Me![ObjectName]
Set rs = Me.Recordset.Clone
rs.FindFirst "[Object ID] = " & Nz(Me!FindObject.Column(1), 0)
If Not rs.EOF Then Me.Bookmark = rs.Bookmark
Me.ReqType = Me.ReqType.ItemData(0) ' сбросить значение фильтра
End Sub
11 мар 06, 14:17    [2438097]     Ответить | Цитировать Сообщить модератору
 Re: Проблема синхронизации данных  [new]
vbnewb
Member

Откуда:
Сообщений: 4
Опечатка вышла:

"Форма №1 с combo (EditObject) без controlsource и куча нередактируемых textboxов с отображением контактных данных + две подчиненные формы, но они уже никакого отношения к вопросу не имеют."

combo - FindObject
кнопка для вызова диалога2 - EditObject
11 мар 06, 14:21    [2438101]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить