Але ж як? (сделать транзакцию на субформе)

3,14fagor
Дата: 22.02.2008 11:10:11
Всем привет.
Как сделать транзакцию на субформе.
В некоторых сделал(люди добрые подсказали) в свойстве формы "до обновления"

Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim strMsg As String
strMsg = "Data has changed."
strMsg = strMsg & "@Вы хотите сохранить изменения?"
strMsg = strMsg & "@Нажмите Yes для записи или No для отмены изменений."
If MsgBox(strMsg, vbQuestion + vbYesNo, "Сохранить запись?") = vbYes Then
'do nothing
Else
DoCmd.RunCommand acCmdUndo
'For Access 95, use DoMenuItem instead
'DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70
End If
End Sub

Это работает, но если изменения внесены в каждую отдельную конкретную запись - и каждую сохранять (т.е. пипереходе на новую запись задается вопрос).

а в 1 случае надо изменения в несколько записей подформы скопом - и все разом сохранить.
Гетц не помогает :((аж странно, наверно, руки кривые)
Спасибо.
Анатолий ( Киев )
Дата: 22.02.2008 12:18:05
Судя по тексту процедуры - у вас Access97. В нем нет свойства .Recordset у форм, поэтому методика от дядюшки Гетса здесь не пройдет. Возможно вам нужно сохранять исходные данные в массиве, или в RS типа "Снимок", или во временной таблице. А при необходимости сравнивать два набора и откатывать изменения.
3,14fagor
Дата: 22.02.2008 12:41:44
Нет у меня Access 2003, вот только не удается повесить нормально транзакцию
Анатолий ( Киев )
Дата: 22.02.2008 13:13:09
В таком случае, если все делается по Гетсу, то что не получается? Вы в курсе, что форма и субформа не должны быть связаны?

ЗЫ. И как у вас в A2003 выглядит сообщение с символами "@"?
3,14fagor
Дата: 22.02.2008 14:03:23
Вообщем, мне надо повесить транзакции вот в таком варианте.
запускайте frm_pr
ответ на З.Ы. заодно можете посмотреть как выглидят @
спасибо
Анатолий ( Киев )
Дата: 22.02.2008 14:41:28
И что мы должны были там увидеть? Ни одной строчки, касающейся транзакций.
автор
Гетц не помогает :((аж странно
Действительно странно, а ведь должен был помочь.
Как в анекдоте:
- Боженька, ну почему ты не помоганшь выиграть в лотерею!
- Та ты б хоть раз лотерейный билет купил!!!
3,14fagor
Дата: 22.02.2008 15:12:16
Ой, простите не ту версию вложил.
При выборе в 1 субформе, во второй отображаются записи из другой таблицы.
Во 2 субформе необходимо сделать транзакцию.
3,14fagor
Дата: 22.02.2008 15:15:59
если убираю фильтры то все ок, но мне же надо чтобы фильтры работали :'(
Анатолий ( Киев )
Дата: 22.02.2008 16:16:57
Даже не знаю, с чего начать...
В примере у Гетса есть главная форма (с записями) и субформа. Весь основной код написан в главной. Это в ней при переходе на новую запись создается RS с указанными параметрами отбора и присваивается св-ву .Recordset подчиненной (заметьте, не изменение свойства Filter субформы, а присвоение RS с отфильтрованными записями).
А у вас есть главная (ГФ) без источника строк, есть субформа (СФ1) и зависимая субформа (СФ2).
Основной код лежит в ГФ, в которой событие Current происходит 1 раз, а событие Dirty не происходит вообще (как и событие Undo, которого нет в А2000 и нет (в моей книге) у Гетца).
Вам нужно:
Перенести основной код в СФ1, создать в ней Public процедуру, в нее перенести код из процедуры cmdRollbackSubform_Click и из последней вызывать.
Переделать запрос так, чтоб по Current СФ1 создавать RS (см. выше). И никаких .Filter, .FilterOn.
Удачи!
3,14fagor
Дата: 22.02.2008 17:11:35
Тема не закрыта, до понедельника :), за выходные постараюсь сделать.
Анатолий, спасибо за помощь.