2010-10-24 8 views
0

J'ai un sous-formulaire (customersAnswersSub) à l'intérieur d'un formulaire principal (customersAnswers). À l'entrée d'une nouvelle entrée customerAnswersSub, je voulais d'abord vérifier les doublons.MS Access - vérifier le sous-formulaire avant la saisie pour le doublon

Il doit vérifier dans 4 champs différents pour correspondre en premier.

C'est ce que j'ai jusqu'ici.

Private Sub Form_BeforeUpdate(Cancel As Integer) 
    Dim rsGlobals As ADODB.Recordset 
    Dim sql 
    Set rsGlobals = New ADODB.Recordset 
    sql = "Select * From CustomerAnswerD where subscriptionNo=" & _ 
     Me.subscriptionNo & " AND journal=" & Me.Journal & _ 
     " AND volume=" & Me.volume & " AND issue=" & Me.issue 
    rsGlobals.Open sql, CurrentProject.Connection, adOpenDynamic, adLockOptimistic, adCmdText 
    If Not rsGlobals.BOF And Not rsGlobals.EOF Then 
     MsgBox ("Already entered") 
     Cancel = True 
     Me.Undo 
    End If 
End Sub 

il ne fait rien - se trouve juste là. quand je ferme le formulaire, il apparaît une boîte de dialogue - existe déjà.

Une idée, je suis assez inexpérimenté en ce qui concerne Access VB.

merci

Répondre

1

il ne fait rien - se trouve juste là

Je vérifiais juste, puisque vous avez dit que vous êtes inexpérimenté avec Access ... l'événement de mise à jour du formulaire ne se déclenche pas jusqu'à ce que la l'enregistrement est tenté. Cela peut ne pas se produire automatiquement dès que l'utilisateur entre des données dans tous les champs. Toutefois, vous pouvez déclencher la mise à jour en accédant à un enregistrement différent dans le sous-formulaire ou en choisissant une méthode telle que le menu principal Enregistrements-> Enregistrer l'enregistrement à partir de l'accès (2003).

Je ne vois aucun problème avec votre procédure BeforeUpdate. Pourtant, je voudrais le convertir utiliser la fonction DCount() au lieu d'ouvrir un jeu d'enregistrements ADO. (Voir la rubrique d'aide de l'accès à DCount)

Private Sub Form_BeforeUpdate(Cancel As Integer) 
    Dim strCriteria As String 
    strCriteria = "subscriptionNo=" & Me.subscriptionNo & " AND journal=" & Me.Journal & _ 
     " AND volume=" & Me.volume & " AND issue=" & Me.issue 
    Debug.Print strCriteria 
    If Dcount("subscriptionNo", "CustomerAnswerD", strCriteria) > 0 Then 
     MsgBox ("Already entered") 
     Cancel = True 
     Me.Undo 
    End If 
End Sub 

Cela suppose subscriptionNo, journal, le volume de votre table, et les champs d'émission sont tous les types de données numériques. Si l'un d'entre eux est de type texte, vous devrez placer les valeurs entre guillemets dans strCriteria.

J'ai ajouté Debug.Print strCriteria afin que vous puissiez voir l'expression de chaîne complétée dans la fenêtre Exécution. Vous pouvez également résoudre cette chaîne en la copiant et en la collant dans la vue SQL d'une nouvelle requête sous la forme de la clause WHERE.

En outre, envisagez d'ajouter un index unique sur abonnementNo, journal, volume et problème à votre conception de table CustomerAnswerD. De cette façon, vous pouvez imposer l'unicité sans dépendre uniquement de votre forme pour le faire. L'index vous donnera également des performances plus rapides avec la fonction DCount, ou votre instruction SELECT recordset d'origine.

Si vous conservez votre approche de jeu d'enregistrements d'origine, fermez le jeu d'enregistrements et définissez la variable d'objet = Nothing avant de quitter la procédure.

+0

oh heck. Ouais c'était un couple de champs qui étaient texte et non numérique. geez. Merci pour les doubles yeux sur tout ça, je l'apprécie. – Chasester