| |
|
|
| | Добрые люди подскажите кто знает - как определить в каком режиме открыта форма в acFormEdit или в acFormAdd. И как можно при закрытии отменить изменение данных в форме, открытой как FormEdit (например когда пользователь жмет кнопку не 'сохранить', а 'отменить') | |
| |
| |
| |
|
|
| | может проще контейнер - временная табла - тогда и морочить не чего | |
| |
| |
| |
|
|
| | как определить в каком режиме открыта форма в acFormEdit или в acFormAdd |
Проверить Me.DataEntry
как можно при закрытии отменить изменение данных в форме |
Выполнить Me.Undo (лучше дважды). Учтите, что при закрытии формы новая или измененная запись сохраняется. Если сохранение нужно выполнять только кнопкой 'сохранить', то отмену изменений нужно выполнить и на Form_Unload. | |
| |
| |
| |
|
|
| | а если ленточная форма и источник таблица - как отменить все что наворотили  | |
| |
| |
| |
|
|
| |
а если ленточная форма и источник таблица - как отменить все что наворотили
|
В этом случае на открытии формы создается новый WorkSpace - в нем дубль БД, - в ней запрос, дубль источника формы, и присваивается св-ву Recordset формы - включается транзакция.
На кнопках "Сохранить" и "отменить" CommitTrans или RollBack соответственно.
На закрытии формы - RollBack и уничтожение объектов.
Пример можно посмотреть у Гетса. | |
| |
| |
|
|
| |
|
|
| | Вопрос в том, что отменять и сколько.
1.Отменить изменения
2.Отменить удаления записей
3.Отменить добавленные записи.
Если полей и изменений немного можно использовать свои методы необязательно с таблицами.
Если много - транзакции.Но.
Транзакции, если я не ошибаюсь, не отменяют удаление, а также не позволяют обновлять форму при добавлении, если только она не табличная. Нет?
Пример без транзакций.
На форме поля DataPr, KolOtgr (Дата и Количество)
Dim idnew As String, idnewizm As String
Private Sub DataPr_AfterUpdate()
idnewizm = idnewizm & ";" & Me.IdPred & ";" & Me.DataPr & ";" & Me.KolOtgr & ";"
'Me.IdPred - Id
Me.Requery
End Sub
Private Sub KolOtgr_AfterUpdate()
idnewizm = idnewizm & ";" & Me.IdPred & ";" & Me.DataPr & ";" & Me.KolOtgr & ";"
Me.Requery
End Sub
....
На добавление записи
...
idnew = idnew & Me.IdPred & ";"
....
На кнопку "Отменить" вызов проц. OTKAT:
Public Sub OTKAT()
Dim rst As DAO.Recordset, j As Integer, vmasdel As Variant, jj As Integer
Me.RecordSource = Me.RecordSource 'это для подч формы можно не применять
On Error GoTo errortkat
'Отменяем добавленные записи
If idnew <> "" Then
vmasdel = Split(idnew, ";")
Set rst = Me.RecordsetClone
With rst
If .RecordCount > 0 Then
.MoveFirst
For j = 0 To UBound(vmasdel) - 1
.FindFirst "IdPred=" & vmasdel(j)
.Delete
Next j
End If
End With
End If
Me.Requery: Me.Refresh
Set rst = Nothing
idnew = ""
''Отменяем изменения в записях
If idnewizm <> "" Then
vmasdel = Split(idnewizm, ";")
Set rst = Me.RecordsetClone
With rst
.MoveFirst
'IdPred
For j = 1 To UBound(vmasdel) - 1 Step 3
.FindFirst "IdPred=" & vmasdel(j)
.Edit
!DataPr = vmasdel(j + 1)
!KolOtgr = vmasdel(j + 2)
.Update
Next j
End With
Set rst = Nothing
idnewizm = ""
End If
Me.Requery
On Error Resume Next
DoCmd.GoToRecord , , acLast
Exit Sub
errortkat:
MsgBox "Err" & "тартаата"
End Sub
|
| |
| |
| |
| |
|
|
| |
До такого кода мне не дорасти. А не проще ли думать, прежде чем что-то удалять или изменять? Если удаленное возвращать, стало быть все, что удалено из таблицы, должно находиться в некоем буфере памяти. Вот оттуда и брать. Пошагово. Как в ворде например.
Или вы не об этом.
| |
| |
| |
| |
|
|
| | именно!  | |
| |
| |