2016-12-05 4 views
1

Ich hoffe, das ist eine einfache Frage für jemanden. Ich habe diese Methode, die zwei Formularfelder verwendet, um zu überprüfen, ob ein Datensatz in meiner Tabelle vorhanden ist und entweder einen Datensatz hinzufügt oder nichts tut. Wenn also patient_id 100 ist und visit_number 1, dann füge ich nur einen neuen Datensatz hinzu, wenn dieser noch nicht existiert.Zugriff, VBA: Find First funktioniert nicht richtig

Wenn also rst.NoMatch wahr ist, fügen Sie einen neuen Datensatz hinzu. Ich kann es jedoch nicht erkennen, ein Duplikat zu erkennen. Hier ist der Code:

Private Sub add_record_button_Click() 
Dim rst As DAO.Recordset 
Set rst = Me.RecordsetClone 

Dim dbs As DAO.Database 
Set dbs = CurrentDb 


If IsNull(Form.patient_id) Or IsNull(Form.visit_number) = True Then 
    MsgBox "Please fill in both fields." 
Else 
    rst.FindFirst "[patient_id] = " & Form.patient_id & " And [visit_number] = " & Form.visit_number 

    If rst.NoMatch Then 

     Set rst = dbs.OpenRecordset("Visits") 
     rst.AddNew 
     rst!patient_id = Form.patient_id 
     rst!visit_number = Form.visit_number 
     rst.Update 
     MsgBox "New patient visit has been added to the database." 
    Else 
     MsgBox "That visit already exists." 
    End If 
    rst.Close 
End If 
End Sub 

Ich glaube, dass meine FindFirst-Zeile nicht korrekt ist. In der Datenbank haben die Variablen den Namen patient_id und visit_number. Auf dem Formular sind sie gleich benannt.

Jede Hilfe wäre dankbar, danke.

BEARBEITEN.

Von den Kommentaren unten konnte ich meine Logik arbeiten, aber mit einem anderen vergleichen Feature, Dlookup.

IsNull(DLookup("[patient_id]", "MyTable", "[patient_id] = " & Forms("MyForm").patient_id & " AND [visit_number] = " & Forms("MyForm").visit_number) 

FINAL EDIT.

Die obige Zeile machte alles funktioniert, wenn ich das Formular direkt verwendet, aber wenn ich das Formular in ein Navigationsformular legte - es funktioniert nicht mehr. Die Zeichenfolge, die schließlich wurde es aus einer Navigations Form arbeitet wie folgt aussehen:

If IsNull(DLookup("[patient_id]", "Visits", "[patient_id] = " & Me!patient_id.Value & " AND [visit_number] = " & Me!visit_number.Value)) = True Then 

Vielen Dank für Ihre Hilfe.

+0

ein numerisches Feld in der DB ist patient_id? –

+0

@ A.S.H Ja, ich habe es auf "Nummer" –

+1

Ich habe nichts falsch mit Ihrem Code gefunden. Ist Ihr 'RecordsetClone' ein" Tisch "Recordset? –

Antwort

1

Ich habe auf diese Weise nie Form verwendet gesehen, und Sie sollten die Aufzeichnung direkt in Form hinzufügen können, so versuchen:

Private Sub add_record_button_Click() 

Dim rst As DAO.Recordset 
Set rst = Me.RecordsetClone 

Dim PatientId As Variant 
Dim VisitNumber As Variant 

PatientId = Me!patient_id.Value 
VisitNumber = Me!visit_number.Value 

If IsNull(PatientId) Or IsNull(VisitNumber) Then 
    MsgBox "Please fill in both fields." 
Else 
    rst.FindFirst "[patient_id] = " & PatientId & " And [visit_number] = " & VisitNumber & ""  
    If rst.NoMatch Then 
     rst.AddNew 
      rst!patient_id.Value = PatientId 
      rst!visit_number.Value = VisitNumber 
     rst.Update 
     MsgBox "New patient visit has been added to the database." 
    Else 
     MsgBox "That visit already exists." 
     Me.Bookmark = rst.Bookmark 
    End If 
End If 

End Sub 
+0

Dies bricht auf eine seltsame Weise. Für den ersten Eintrag, von dem Zeitpunkt an, als ich das Formular zum ersten Mal öffne, kann ich eine beliebige Option eingeben, obwohl ich eine bereits existierende eingeben möchte. Aber dann scheint es zu bemerken, dass es jetzt ein Duplikat ist und ich werde es nicht wieder betreten. Und dann kann ich auch das Formularfeld nicht ändern, ohne das Formular zu schließen und wieder zu öffnen. –

+0

Ja, Sie müssen möglicherweise ein wenig neu gestalten. Ich glaube, Sie haben Dateneingabe- und Datensuchfelder vertauscht. – Gustav