Сохранение изменений

Sorb
Дата: 01.03.2016 06:40:10
Приветствую всех. В Access только начинаю, но уже возникла такая проблема: имеется форма для редактирования записей. При открытии формы(так как граф много) делается запрос и заполняются поля, дабы пользователю все данные не пришлось вновь вносить. Вот только возникла одна проблема: как только заполняется любое поле-сразу же вносятся изменения в бд. Как возможно сделать так, чтобы изменения вносились сразу пачкой и только по нажатию кнопки?
Sorb
Дата: 01.03.2016 07:06:48
Забыл добавить, если это требуется: В самой форме 2 столбца: с начальными данными(заблокированы для редактирования) и с полями для редактирования делается все на vba. при открытии формы с главной передается аргумент, затем идет Form_Load для загрузки данных из таблицы в форму. Переменные "New_" - это переменные полей для редактирования.
Код формы:
+
Private Sub Form_Open(Cancel As Integer)
 If IsNull(Me.OpenArgs) Or Me.OpenArgs = "" Then
        MsgBox ("Возникла проблема")
    
 End If
End Sub

Private Sub Form_Load()

        
        Dim rs As dao.Recordset
    	Set rs = CurrentDb.OpenRecordset("SELECT * FROM [Все_ИП] WHERE ИП = '" & Me.OpenArgs & "';")
    If Not rs.EOF Then
        Me.ИП = rs!ИП
        Me.местонахождение = rs!местонахождение
        Me.Год = rs!Год
        Me.В_норме = rs!В_норме
        Me.Примечание = rs!Примечание
    End If
           
 End Sub

 
Private Sub ОК_Click()
If IsNull(Me.New_ИП) Or Me.New_ИП = "" Then
        MsgBox ("Введите ИП")
        

Else
     Dim rs0 As dao.Recordset
        Set rs0 = CurrentDb.OpenRecordset("Измененные_ИП", dbOpenDynaset)
        rs0.AddNew
        rs0!ИП= Me!ИП
        rs0!местонахождение= Me!местонахождение
        rs0!Год= Me!Год
        rs0!В_норме= Me!В_норме
        rs0!Примечание= Me!Примечание
        rs0!Дата_изменения = Date
                        
        rs0.Update
        rs0.Close
        Set rs0 = Nothing
        
        Dim entry As String
        entry = Me.New_ИП
        
          Dim sql2 As String
        sql2 = "DELETE * FROM [Все_ИП] " & _
              "WHERE ИП = '" & entry & "';"

        DoCmd.RunSQL sql2



         Dim rs As dao.Recordset
        Set rs = CurrentDb.OpenRecordset("Все_ИП", dbOpenDynaset)
        rs.AddNew
        rs!ИП= Me!New_ИП
        rs!местонахождение = Me!New_местонахождение
        rs!Год= Me!New_Год
        rs!В_норме = Me!New_В_норме  
        rs!Дата_изменения = Date
        rs!Примечание = Me!New_Примечание
                
        rs.Update
        rs.Close
        Set rs = Nothing
        
        
        
    End If
    DoCmd.Close
    DoCmd.OpenForm "ИП"
    DoCmd.Requery
    
End Sub

Private Sub Отмена_Click()
    DoCmd.Close
    DoCmd.OpenForm "Все_ИП"
    DoCmd.Requery
End Sub
MrShin
Дата: 01.03.2016 07:58:14
Акцесс устроен так, что при любой смене фокуса с текущей строки в форме на базе запроса изменения вносятся в базу. Поэтому решений для сохранения всего сразу только по кнопке не так много:

1. Использовать unbound поля, заполняя их кодом при открытии и затем кодом же разносить по таблице - самое муторное решение

2. Использовать временную таблицу для редактирования и переностить готовые данные в основную по кнопке - пожалуй, самое правильное решение

3. Сохранять копию данных перед началом редактировани и восстанавливать в случае отмены. Иногда это проще, чем №2, но не всегда логика приложения позволяет это сделать, если нужна транзакционная целостность.
Sorb
Дата: 01.03.2016 08:23:46
MrShin,

благодарю. Третий способ точно отметается, а первый эстетически будет выглядеть извращенно в коде легче уж 2 запроса сделать, чтобы делался запрос на копирование, а потом на удаление из временной таблицы.
ROI
Дата: 01.03.2016 08:55:57
MrShin
Акцесс устроен так, что при любой смене фокуса с текущей строки в форме на базе запроса изменения вносятся в базу. Поэтому решений для сохранения всего сразу только по кнопке не так много:

1. Использовать unbound поля, заполняя их кодом при открытии и затем кодом же разносить по таблице - самое муторное решение

2. Использовать временную таблицу для редактирования и переностить готовые данные в основную по кнопке - пожалуй, самое правильное решение

3. Сохранять копию данных перед началом редактировани и восстанавливать в случае отмены. Иногда это проще, чем №2, но не всегда логика приложения позволяет это сделать, если нужна транзакционная целостность.


4 Ну или использовать транзакции в рекордсет.
MrShin
Дата: 01.03.2016 09:13:23
ROI
4 Ну или использовать транзакции в рекордсет.


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