2013-01-03 13 views
5

Szybkie pytanie tutaj, mając nadzieję na zwięzłe i rozsądne rozwiązanie.Zamknięcie powiązanego formularza bez zapisywania zmian

Mam formularz związany wyłącznie do wprowadzania danych (nie można przeglądać rekordów, tylko wstaw je). Będę miał wielu użytkowników, którzy zepsują. Aby uniknąć brudnych danych, chcę je potwierdzić przed wysłaniem rekordu.

Problem polega na tym, że zaraz po wpisaniu w formularzu WSZYSTKIEGO, dostęp tworzy i zapisuje rekord.

Chcę, aby rekord był TYLKO zapisywany i zatwierdzany, jeśli użytkownik kliknie przycisk "Prześlij". Jeśli klikną Zamknij lub wyjdą z aplikacji, nie chcę tego częściowo wypełnionego rekordu w bazie danych.

Bez używania formularza niezwiązanego i wywoływania funkcji wstawiania, czy istnieje proste rozwiązanie?

+1

Możesz cofnąć rekord, o ile nie masz podformularza. – Fionnuala

+0

@remou Jak wpływa to na automatyczne numerowanie? Załóżmy, że mam dwóch współbieżnych użytkowników w formularzu. Użytkownik 1 Otwiera formularz i rozpoczyna wprowadzanie danych jako pierwsze. Użytkownik 2 następnie otwiera formularz i sam wprowadza dane. Użytkownik 1 decyduje, że ma lepsze rzeczy do roboty niż wprowadzanie danych i klika przycisk "cofnij". Zgaduję, że spowodowałoby to luki w liczbach (jak wstawianie, a następnie usuwanie, a nie wycofywanie lub brak zatwierdzenia?) – Scotch

+0

Sprawdź również to [: możesz mieć wartość boolowską do sprawdzenia przed zaktualizowaniem formularza] (http://bytes.com/topic/access/insights/891249-how-stop-bound-forms-updating-automatically). Jeśli chodzi o zachowanie spójności autokorelacji, zawsze można uzyskać walidację przed wstawieniem wstawki ... – bonCodigo

Odpowiedz

6

Autonumerowanie ma charakter niepowtarzalny, a nie sekwencyjny. Jeśli potrzebujesz numeru sekwencyjnego, nie używaj automatycznego numerowania. Autonumerowanie nigdy nie powinno być pokazywane użytkownikowi. Nigdy nie można polegać na tym, by być czymś innym niż unikalnym, i jeśli nieźle sobie z tym poradzisz, nawet tego.

Private Sub Form_BeforeUpdate(Cancel As Integer) 
If Me.AText = "Invalid" Then 
    Me.Undo 
    Cancel = True 
End If 
End Sub 

Należy zauważyć, że forma z podformularzu może nie działać z cofania, ponieważ zapis stawia na zmianę z podformularzu do formularza głównego i odwrotnie, a to wszystko jest dość skomplikowane.

+0

Tak, mam podformularz z wieloma relacjami do formy nadrzędnej. Jeśli ktoś miałby anulować/cofnąć, wątpię, czy dotarłby do punktu wypełnienia podformularza, więc to może wystarczyć. Jeśli nie, mógłbym wykonać kwerendę usuwania w powiązanej tabeli przed cofnięciem. Dzięki. – Scotch

3

metoda Remou jest zdecydowanie najszybszy, tu jest inny oparty na mój komentarz;)

Option Explicit 

Private blnGood As Boolean 

Private Sub cmdSubmit_Click() 
    blnGood = True 
    Call DoCmd.RunCommand(acCmdSaveRecord) 
    blnGood = False 
End Sub 

Private Sub Form_BeforeUpdate(Cancel As Integer) 
    If Not blnGood Then 
     Cancel = True 
     Call MsgBox(Prompt:="click submit to save the record", Title:="Before Update") 
    End If 
End Sub 
2

Można użyć następującego kodu do stworzenia jasnej przycisk w przypadku, gdy użytkownik dokonał błędy i chce, aby wyczyścić cały formularz i zacznij od nowa.

Private Sub btnClear_Click() 
    If Me.Dirty = True Then 
    DoCmd.RunCommand acCmdUndo 
    Exit Sub 
    End If 
End Sub` 

czasami znaleźć before_update zdarzenie działać dziwne więc generalnie wyłączyć (x) przycisk zbliżony właściwościami i dodać przycisk zamykania mój własny, który pyta użytkownika, czy chce porzucić dane na ekran.

Private Sub close_Click() 
Dim Answer As Integer 
If Me.Dirty = True Then 
    Dim Response As Integer 
    ' Displays a message box with the yes and no options. 
    Response = MsgBox(Prompt:="Do you wish to discard data?", Buttons:=vbYesNo) 
    ' If statement to check if the yes button was selected. 
    If Response = vbYes Then 
     DoCmd.RunCommand acCmdUndo 
     DoCmd.Close 
     Else 
     Me.Clear.SetFocus 
    End If 
Else 
    ' The no button was selected. 
    DoCmd.Close 
    End If 
End Sub 
Powiązane problemy