Question

J'ai un formulaire Access 2007 consultable par une liste déroulante. Lorsque j'ajoute un nouvel enregistrement, je dois mettre à jour la liste déroulante pour inclure l'élément nouvellement ajouté.

Je suppose que quelque chose doit être fait dans l'événement AfterInsert du formulaire, mais je ne peux pas trouver quoi.

Comment puis-je relier la liste déroulante après l'avoir insérée pour que le nouvel élément apparaisse dans la liste?

Était-ce utile?

La solution

Le moyen le plus simple est de garantir que la liste déroulante est toujours à jour, il suffit de la réanalyser une fois qu'elle est centrée. Même si le jeu d'enregistrements est mis à jour ailleurs, votre liste déroulante est toujours à jour. Un simple TheCombobox.Requery dans l'événement OnFocus devrait suffire.

Autres conseils

Il y a deux réponses possibles ici qui sont efficaces:

  1. utilise l'événement AfterInsert du formulaire pour interroger la liste déroulante (ainsi que l'événement OnDeleteConfirm). Cela sera suffisant si la liste déroulante n'affiche pas les données que l'utilisateur peut mettre à jour et qui doivent être mises à jour si l'enregistrement sous-jacent est mis à jour.

  2. si les mises à jour des données doivent être reflétées dans la liste déroulante, il serait alors judicieux d’ajouter une interrogation dans les événements AfterUpdate des contrôles utilisés pour modifier les données affichées dans la liste déroulante. / p>

Par exemple, si votre liste déroulante répertorie les noms des personnes figurant dans le tableau, vous voudrez utiliser la méthode n ° 2 et, dans l'événement AfterUpdate de Me! txtFirstName et Me! txtLastName, actualisez la zone de liste déroulante. Étant donné que vous effectuez la même opération à quatre endroits différents, vous souhaiterez écrire un sous-programme pour effectuer la requery. Ainsi, le sous-marin ressemblerait à quelque chose comme ceci:

  Private Sub RequerySearchCombo()
    If Me.Dirty Then Me.Dirty = False
    Me!MyCombo.Requery
  End Sub

Si vous effectuez une nouvelle mise à jour des données affichées dans la liste déroulante, c’est parce que si vous la remplissez avec la liste de la table entière, la restitution peut prendre beaucoup de temps. temps si vous avez des dizaines de milliers d’enregistrements.

Une autre alternative permettant de sauvegarder toutes les requêtes consiste à avoir une source de lignes vide pour la liste déroulante, à ne la renseigner qu’après avoir tapé 1 ou 2 caractères et à filtrer les résultats affichés par la combo en fonction des caractères saisis. Pour cela, vous utiliseriez l'événement OnChange de la liste déroulante:

Private Sub MyCombo_Change()
  Dim strSQL As String

  If Len(Me!MyCombo.Text) = 2 Then
     strSQL = "SELECT MyID, LastName & ', ' & FirstName FROM MyTable "
     strSQL = strSQL & "WHERE LastName LIKE " & Chr(34) & Me!MyCombo.Text & Chr(34) & "*"
     Me!MyCombo.Rowsource = strSQL 
  End If
End Sub

Le code ci-dessus suppose que vous recherchez le nom d'une personne dans une liste déroulante affichant le mot "Nom, Prénom".

Autre mise en garde importante: si vous recherchez un formulaire lié à une table complète (ou une instruction SQL qui renvoie tous les enregistrements de la table) et utilisez la navigation par signet pour localiser les enregistrements, cette méthode ne sera pas très évolutive. , car il faut extraire tout l’index des champs recherchés sur le fil. Dans le cas de la liste déroulante imaginaire ci-dessus, vous utiliseriez FindFirst pour accéder à l'enregistrement avec la valeur MyID correspondante. Il s'agit donc de l'index de MyID à extraire (bien que le nombre de pages d'index nécessaire pour satisfaire la recherche serait en fait tirée). Ce n'est pas un problème pour les tables avec quelques milliers d'enregistrements, mais au-delà de 15-20 Ko, cela peut être un goulot d'étranglement du réseau.

Dans ce cas, au lieu de naviguer via le signet, vous utiliseriez votre liste déroulante pour filtrer le résultat défini en un seul enregistrement. Ceci est, bien sûr, extrêmement efficace, que vous utilisiez un serveur principal Jet ou un serveur principal. Il est hautement souhaitable d'incorporer ce type d'efficacité dans votre application dès que possible. Dans ce cas, il est beaucoup plus facile de migrer vers un serveur dorsal ou plus facile si vous atteignez ce point de basculement avec une masse de nouvelles données rendant l'ancienne méthode trop inefficace pour être conviviale.

Je suppose que votre liste déroulante est un contrôle d'un formulaire et non un contrôle dans une barre de commandes. Cette liste déroulante a une propriété appelée rowsource, qui peut être une liste de valeurs (mari; femme; fils; fille) ou une instruction SQL SELECT (SELECT relationDescription FROM Table_relationType).

Je suppose également que votre jeu d'enregistrements sous forme a quelque chose à voir avec votre jeu d'enregistrements combobox. Une fois que votre jeu d’enregistrements de formulaire est mis à jour correctement (après l’événement afterUpdate, je pense), vous devez réinitialiser la propriété rowsource du contrôle combobox

.

si le recordsource est une instruction SQL:

myComboBoxControl.recordsource = _
    "SELECT relationDescription FROM Table_relationType"

ou s'il s'agit d'une liste de valeurs

myComboBoxControl.recordsource = myComboBoxControl.recordsource & ";nephew"

Mais au fond, je trouve votre demande très étrange. Avez-vous une relation réflexive (parent-enfant) sur votre table?

J'utiliserais normalement l'événement NotInList pour ajouter des données à une liste déroulante avec

   Response = acDataErrAdded

Pour mettre à jour le combo.

La référence des développeurs Access 2007 contient tous les détails, y compris un exemple de code: http://msdn.microsoft.com/en-us/library/bb214329. aspx

Interrogez la zone de liste déroulante dans l'événement after du formulaire et l'événement delete. Votre liste déroulante est à jour chaque fois que l'utilisateur modifie le jeu d'enregistrements, qu'il s'agisse d'un nouvel enregistrement, d'une modification ou d'une suppression.

À moins que les utilisateurs ne subissent les modifications de tous les autres dès qu'ils ont été apportés, ne remettez pas la liste déroulante à nouveau chaque fois que le focus est activé, car non seulement l'utilisateur devra attendre (ce qui est perceptible avec les grands jeux d'enregistrements), inutile si le jeu d'enregistrements n'a pas changé. Mais si tel est le cas, le formulaire complet doit être modifié dès que quelqu'un d'autre effectue un changement, pas seulement la liste déroulante. Ce serait un scénario très inhabituel.

Après la mise à jour:

Private Sub Form_AfterUpdate()    
    On Error GoTo Proc_Err 

    Me.cboSearch.Requery   

    Exit Sub    
Proc_Err:    
    MsgBox Err.Number & vbCrLf & vbCrLf & Err.Description
    Err.Clear        
End Sub

Après suppression:

Private Sub Form_Delete(Cancel As Integer)    
    On Error GoTo Proc_Err 

    Me.cboSearch.Requery   

    Exit Sub    
Proc_Err:    
    MsgBox Err.Number & vbCrLf & vbCrLf & Err.Description
    Err.Clear        
End Sub
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top