2016-08-02 24 views
0

Okay, also habe ich eine Datenbank in Access, und wenn ich ein Formular geöffnet habe (für eine Bewerbung), und klicken Sie auf eine Schaltfläche, wird dies ausgeführt Code:Me.OpenArgs gibt immer Null zurück, wenn versucht wird, ein neues Formular im Zugriff zu öffnen

Private Sub cmdAddDemo_Click() 

DoCmd.OpenForm "sfrmAppDemographics", , , , , , txtApplID.Value 

End Sub 

Wo txtApplID ein Textfeld mit einem numerischen Wert für „Anwendungs-ID“ Nummer in einer Tabelle für Anwendungen gefüllt ist. Ich möchte, dass dieser Wert an das Formular "sfrmAppDemographics" übergeben wird, damit die korrekten demografischen Informationen für den Benutzer im zuvor genannten Formular für die Anwendung angezeigt werden.

Also, ich tat dies in den Code für die Demographie bilden:

Private Sub Form_Open(Cancel As Integer) 

Dim rs As DAO.Recordset 
Set rs = Me.Recordset 
If rs.RecordCount = 0 Then 
    rs.AddNew 
    rs!ApplID = Me.OpenArgs 
    rs.Update 
Else 
    MsgBox Me.OpenArgs 
End If 
Me.Requery 

End Sub

Also, die Idee ist, wenn es keine demographischen Daten ist, wird es eine neue mit dem erstellen ApplID von den übergebenen Openargs, und wenn demographische Daten für diesen Benutzer vorliegen, erscheint eine Meldung mit den Openargs (als Test, um zu sehen, ob es funktioniert). Ich bekomme IMMER einen Fehler "Laufzeitfehler '94': Ungültige Verwendung von Null" - in der Zeile für die MsgBox. (Weil die Datenbank Datensätze für demografische Daten enthält). Wenn ich die Else MsgBox Me.OpenArgs herausnehme, zeigt es nur die ersten demografischen Informationen in der db mit ApplID 1. Seltsam. Es scheint, ich bin nicht in der Lage, Pass oder die AppID über die OpenArgs-Funktionalität in dem Code Form_Open zu übergeben. Irgendeine Hilfe?

+0

Das macht keinen Sinn für mich. Sie versuchen, das Re-Cord-Set basierend auf dem Re-Cord-Set des Formulars festzulegen? Es wurde möglicherweise noch nicht einmal geladen - und Sie fangen nicht für OpenArgs, es sei denn, es gibt keine Daten im Recordset - es überprüft nicht einmal die AppID. Setzen Sie ein 'Debug.Print Me.OpenArgs' an den Anfang Ihres Codes und es sollte zeigen, dass es an das Form_Open-Ereignis übergeben wird – dbmitch

Antwort

1

OpenArgs ist eine Zeichenfolge, die an das Formular übergeben wird, nicht mehr. Wenn Sie die genannte Form filtern möchten, verwenden Sie den WhereCondition Parameter:

Private Sub cmdAddDemo_Click() 

    DoCmd.OpenForm "sfrmAppDemographics", WhereCondition:="ApplID = " & txtApplID.Value 

End Sub 

Wenn Sie den Datensatz erstellt werden soll, wenn es nicht vorhanden ist, macht es Sinn, die ID zusätzlich als OpenArgs weitergeben müssen:

DoCmd.OpenForm "sfrmAppDemographics", WhereCondition:="ApplID = " & txtApplID.Value, _ 
        OpenArgs:=txtApplID.Value 

und dann

Private Sub Form_Open(Cancel As Integer) 

' No need for a separate recordset here 
If Me.RecordsetClone.EOF Then 
    ' We are already in a new record, just set the bound ID control to create it 
    Me!ApplID = Me.OpenArgs 
    ' if you want to save the new record immediately 
    Me.Dirty = False 
End If 

End Sub 

PS Wenn Me.OpenArgs Null in Ihrem Code ist, dann war txtApplID Null. Ich sehe keinen anderen Grund.

+0

Vielen Dank! Das hat den Trick gemacht. –

+0

Es scheint jedoch zu brechen, wenn ich einen Datensatz öffne, der nicht bereits demographische Daten enthält, sagt es mir "Laufzeitfehler '2448' Sie können diesem Objekt keinen Wert zuweisen" in der Zeile Me! ApplID = Ich.OpenArgs. Wie kann ich ein neues, leeres demographisches Datum erstellen? –

+0

Haben Sie ein Steuerelement mit dem Namen "ApplID" (und an die Spalte ApplID gebunden) auf dem Formular? Wenn nein, erstellen Sie ein Textfeld dafür - wenn alles funktioniert, können Sie es auf "Sichtbar = Falsch" setzen. Wenn ja, ist es gesperrt oder so? – Andre

0

Nur DoCmd.GoToRecord, hinzuzufügen brauchte, arbeitete acNewRec, um den Code von Andre und es ohne Probleme ...

Private Sub Form_Open(Cancel As Integer) 

    If Me.RecordsetClone.EOF Then 

     DoCmd.GoToRecord , , acNewRec 

     Me!ApplID.Value = Me.OpenArgs 

     Me.Dirty = False 

    End If 

End Sub