Dimanche 27 janvier 2008
Sur un formulaire d’interrogation vous avez disposé sept contrôles, texte ou combo ou cases à cocher, pour sélectionner des enregistrements selon un filtre composé des sept éléments si ceux-ci contiennent une valeur. Si un contrôle est Null, il n’entre pas dans le filtre. Vous faîtes donc une fonction, appelée dans tous les événements AfterUpdate des sept contrôles, qui génère et applique le filtre.
La façon la plus simple est d’utiliser des instructions If qui testent la valeur Null de ces contrôle :
Private Function loadFilter()
    Dim myFilter as String
    myFilter = ""
    If Not IsNull(Me!f_num) Then
        myFilter = myFilter & "[cli_code]= '" & Me!f_num & "' and "
    End If
    If Not IsNull(Me!f_lib) Then
        myFilter = myFilter & "[cli_rais] like '" & Me!f_lib & "' and "
    End If
    If Not IsNull(Me!f_nom) Then
        myFilter = myFilter & "[cli_nom] like '" & Me!f_nom & "' and "
    End If
    If Not IsNull(Me!f_vil) Then
        myFilter = myFilter & "[cli_vil]= '" & Me!f_vil & "' and "
    End If
    If Not IsNull(Me!f_pays) Then
        myFilter = myFilter & "[cli_pays]= '" & Me!f_pays & "' and "
    End If
    If Not IsNull(Me!f_rep) Then
        myFilter = myFilter & "[cli_rep]= '" & Me!f_rep & "' and "
    End If
    If Not IsNull(Me!f_sect) Then
        myFilter = myFilter & "[cli_secteur]= " & Me!f_sect & " and "
    End If
    If myFilter <> "" Then
        Me.Filter = Left$(myFilter, Len(myFilter) - 4)
        Me.FilterOn = True
    Else
        Me.Filter = ""
        Me.FilterOn = False
    End If
End Function
 
Vous pouvez commencer par réduire le code de cette fonction ainsi :
Private Function loadFilter()
    Dim myFilter As String
    myFilter = ""
    If Not IsNull(Me!f_num) Then myFilter = myFilter & "[cli_code]= '" & Me!f_num & "' and "
    If Not IsNull(Me!f_lib) Then myFilter = myFilter & "[cli_rais] like '" & Me!f_lib & "' and "
    If Not IsNull(Me!f_nom) Then myFilter = myFilter & "[cli_nom] like '" & Me!f_nom & "' and "
    If Not IsNull(Me!f_vil) Then myFilter = myFilter & "[cli_vil]= '" & Me!f_vil & "' and "
    If Not IsNull(Me!f_pays) Then myFilter = myFilter & "[cli_pays]= '" & Me!f_pays & "' and "
    If Not IsNull(Me!f_rep) Then myFilter = myFilter & "[cli_rep]= '" & Me!f_rep & "' and "
    If Not IsNull(Me!f_sect) Then myFilter = myFilter & "[cli_secteur]= " & Me!f_sect & " and "
    If myFilter <> "" Then
        Me.Filter = Left$(myFilter, Len(myFilter) - 4)
        Me.FilterOn = True
    Else
        Me.Filter = ""
        Me.FilterOn = False
    End If
End Function
Ce qui n'apportera qu'un gain de place sur l'écran. 
Mais, surtout, vous pouvez modifier le code, non seulement en le réduisant mais en l’optimisant, en appliquant les expressions conditionnelles de la propagation Null :
Private Function loadFilter()
    Dim myFilter As String
    myFilter = ""
    myFilter = myFilter & ("[cli_code]= '" + Me!f_num + "' and ")
    myFilter = myFilter & ("[cli_rais] like '" + Me!f_lib + "' and ")
    myFilter = myFilter & ("[cli_nom] like '" + Me!f_nom + "' and ")
    myFilter = myFilter & ("[cli_vil]= '" + Me!f_vil + "' and ")
    myFilter = myFilter & ("[cli_pays]= '" + Me!f_pays + "' and ")
    myFilter = myFilter & ("[cli_rep]= '" + Me!f_rep + "' and ")
    myFilter = myFilter & ("[cli_secteur]= " + Me!f_sect + " and ")
    If myFilter <> "" Then
        Me.Filter = Left$(myFilter, Len(myFilter) - 4)
        Me.FilterOn = True
    Else
        Me.Filter = ""
        Me.FilterOn = False
    End If
End Function
L’opérateur + placé dans les expressions conditionnelles indique de retourner une valeur Null pour l’expression entière si un de ses membres est Null. Donc si le champ de sélection est Null, toute l’expression sera null et rien ne sera ajouté dans myFilter. Non seulement vous économisez du code mais vous gagnez beaucoup de temps d’exécution.
Explications sur la propagation Null : http://officesystem.access.over-blog.com/article-15664382.html
 
 
Par Raymond - Publié dans : Astuces
Ecrire un commentaire - Voir les 1 commentaires
Retour à l'accueil

Commentaires

Bonjour, Si je puis me permettre, un tableau dont la taille dépend du nombre de critère ? en plus si on y ajoute 1 dimension on y colle des commentaires je ne l'ai jamais vu proposé c'est pourtant cool les tableaux!! A+
Commentaire n°1 posté par Naphta le 11/05/2008 à 17h09

Calendrier

Novembre 2009
L M M J V S D
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
<< < > >>

Rechercher

Créer un blog sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus