2016-04-13 14 views
1

Ich versuche Access integrierte msgbox über die Eingabe von doppelten Datensätzen zu vermeiden, indem Sie Einträge vor dem Update-Ereignis überprüfen. Code funktioniert, aber ein großes Problem - Sie können diese Datensätze nicht mehr bearbeiten. Jeder Weg, beides zu erreichen - erlauben Bearbeitungen und vermeiden Access msgbox?Zugriff auf VBA - doppelte Eingabe verhindern

Private Sub Form_BeforeUpdate(Cancel As Integer) 

Dim rs As Recordset 
Set rs = CurrentDb.OpenRecordset("MyTable", dbOpenDynaset) 

If Data_Changed Then 'Variable of Boolean that is set to True in Dirty event 

    If Not IsNull(ID_Field) Then 

     If MsgBox("You have done changes. you wish to save? ?" & vbCrLf & vBCrLf & "Click Yes for saving changes or NO for Undoing changes ! " & _ 
     , vbQuestion + vbOKCancel + vbDefaultButton1) = vbOK Then 

      rs.FindFirst "ID = " & Me.ID_Field 

      If Not rs.NoMatch Then 
       Cancel = True 
       MsgBox "Error. You cannot add another record with same ID!", vbCritical 
       DoCmd.RunCommand acCmdUndo 
       Exit Sub 
      End If 


     Else 

      DoCmd.RunCommand acCmdUndo 

     End If 

     Else 

      MsgBox "Error. you cannot save record with blank ID !", vbCritical 

      DoCmd.SetWarnings False 
      If Me.Dirty Then Me.Undo 
      DoCmd.SetWarnings True 

      Exit Sub 

     End If 

     Me.ID_Field.Locked = True 
     Me.Other_Field.Locked = True 

End If 

End Sub 
+0

Ich sehe. Ist Ihr 'ID_Field' der Primärschlüssel? Normalerweise sollten PKs für den Benutzer unsichtbar sein und definitiv nicht vom Benutzer bearbeitet werden können. Wie Sie herausgefunden haben, schafft es Probleme. Wenn es das PK ist, gibt es einen Grund, warum Benutzer es bearbeiten können? Wenn nicht, können Sie den PK verwenden, um den aktuellen Datensatz zu identifizieren und ihn von Ihrer Suche auszuschließen. – Andre

+0

@Andre, nein. ID_Field ist kein Primärschlüssel. Und PK ist für den Benutzer unsichtbar. Aber sowohl die ID als auch ID_Field (die einen anderen Namen hat - das habe ich vermasselt) haben den Index auf Keine Duplikate gesetzt. Die Änderung von Id_Field in Indexed No ändert jedoch nichts. – LuckyLuke82

+0

Wie kann ich den Datensatz von der Suche ausschließen, aber den Code beibehalten Wenn ein neuer Datensatz mit demselben Id_Field eingegeben wird? – LuckyLuke82

Antwort

1

Angenommen, Ihre Primärschlüsselspalte lautet myPK.

Um ID_Field für alle außer dem aktuellen Datensatz zu überprüfen, verwenden Sie kein Recordset und FindFirst, verwenden Sie stattdessen DLookup.

Dim TestID as Long 
TestID = Nz(DLookup("ID_Field", "MyTable", "ID_Field = " & Me.ID_Field & _ 
        " AND myPK <> " & Nz(Me.myPK, 0)), 0) 
If TestID > 0 Then 
    ' Dupe 
Else 
    ' ok 
End If 

Sie müssen möglicherweise myPK als unsichtbares Textfeld zum Formular hinzufügen zu können, um seinen Wert lesen.

+0

Großer Andre, das funktioniert !! Was für ein Albtraum, ich habe tausend Variationen probiert, aber nichts hat funktioniert. Ein großes Dankeschön! – LuckyLuke82

+0

Andre, was ist mit Wenn Kombination von zwei Feldern? wie ID_Field und SomeOther_Field? füge es einfach nach Me.ID_Field hinzu? – LuckyLuke82

+0

@ LuckyLuke82: Der dritte Parameter von DLookup ist wie eine WHERE-Klausel, Sie können beliebige Kriterien erstellen, die Sie mögen. z.B. '" ID_Field = "& Me.ID_Field &" AND SomeOther_Field = "& Me.SomeOther_Field &" UND myPK <> "& Nz (Me.myPK, 0)'. Bei Textkriterien schließen Sie sie in "" ein. – Andre

0

Ein "Schnappschuss" nimmt die Aufzeichnungen in ihrem aktuellen Zustand für z.B. Inspektion. Sie sind schreibgeschützt.

den Datensatz zu öffnen lesen/schreiben, verwenden dbOpenDynaset

+0

Ich habe versucht, aber das löst das Problem nicht, Datensätze können immer noch nicht bearbeitet werden. – LuckyLuke82

+0

Bitte zeigen Sie den vollständigen Code, wo Sie versuchen, die Datensätze zu bearbeiten. –

+0

Paul, mein Code zum Bearbeiten von Datensätzen ist ein einfacher Knopf, der die Felder in kontinuierlicher Form freischaltet. – LuckyLuke82

0

die Einbau-Nachricht zu vermeiden, ist es am besten, das Form.OnError Ereignis zu verwenden.
Siehe: https://msdn.microsoft.com/en-us/library/office/ff836345.aspx

z. wie folgt:

Private Sub Form_Error(DataErr As Integer, Response As Integer) 

    ' Error 3022 = "Cannot add a duplicate value because of a key constraint..." 
    If DataErr = 3022 Then 
     MsgBox "Your duplicate warning", vbExclamation 
     ' Remove duplicate ID and set focus into ID control 
     Me!ID_Field = Null 
     Me!ID_Field.SetFocus 
     ' Dont't show default error message 
     Response = acDataErrContinue 
    Else 
     ' Other errors: show default error message 
     Response = acDataErrDisplay 
    End If 

End Sub 
+0

danke dafür. Ich hatte so etwas schon einmal, aber immer noch ein Problem - Wenn Sie immer noch in der gleichen Form sind und versuchen, den Datensatz über DoCmd.RunCommand acCmdSaveRecord zu speichern, erscheint immer noch der Fehler "3022". Dies kann durch ein einfaches Error-Handle gelöst werden - If err.number = 3022 Then ... Form Fehlercode funktioniert jedoch, wenn Sie versuchen, in einem anderen Datensatz in kontinuierlicher Form zu gehen. ABER - Ich versuche dieses Problem nur mit einem Code zu lösen, deshalb habe ich alles verändert. – LuckyLuke82