IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IHM Discussion :

Formulaire de recherche : vérification sélection de champ [AC-2000]


Sujet :

IHM

  1. #1
    Membre averti
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut Formulaire de recherche : vérification sélection de champ
    Bonjour à toutes et à tous !

    J'ai créé mon formulaire tout beau tout chic grâce au très bon tuto de loufab (dispo ici).
    J'y suis par ailleurs parvenue grâce à l'aide de certains d'entre vous.

    Par souci de perfection, je souhaite "sécuriser" la recherche via ce formulaire. Je précise :
    actuellement, lorsque l'utilisateur ouvre le formulaire, celui-ci est complètement vierge; rien n'est pré-saisi ou pré-sélectionné.
    Si l'utilisateur clique tel quel sur "Rechercher", fatalement un message d'erreur s'affiche (variable non définie).
    De même, s'il sélectionne une table mais ne sélectionne pas de champ, le même message d'erreur va s'afficher.

    Je souhaite éviter l'affichage de ce message par la mise en place d'une vérification de la sélection du champ et l'affichage, si aucun champ n'est sélectionné, d'un MsgBox type "Veuillez sélectionner un champ".

    Dans un module "Recherche", j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Function lf_GetTypeField(lfNameTbl As String, lfNameFld As String)
    'utilise la référence Microsoft DAO 3.6 Object Library
    'Renvoie le numéro du type du champ
    'lfNameTbl = nom de la table
    'lfNameFld = nom du champ
    
        Dim dbs As DAO.Database             ' Objet de la base
        Dim tbl As DAO.TableDef ' Objet de définition de table
        Dim qrd As DAO.QueryDef
    
        Set dbs = CurrentDb             ' ouvre la base courante
        dbs.TableDefs.Refresh
        Debug.Print (lfNameTbl)
        
        nom_champ = qrd.Fields(lfNameFld)
        
        If IsEmpty(nom_champ) Then
            MsgBox "Merci de sélectionner un champ."
        ElseIf IsEmpty(tbl.Fields(lfNameFld)) Then
            MsgBox "Merci de sélectionner un champ."
        End If
        
        If lfNameTbl Like "*RQS_*" Then
           Set qrd = dbs.QueryDefs(lfNameTbl)            ' ouvre la définition table
           lf_GetTypeField = qrd.Fields(lfNameFld).Type  ' renvoie le type de champ
        Else
           Set tbl = dbs.TableDefs(lfNameTbl)            ' ouvre la définition table
           lf_GetTypeField = tbl.Fields(lfNameFld).Type  ' renvoie le type de champ
        End If
    Ce qui est en rouge, c'est ce que j'ai ajouté mais qui ne fonctionne pas car l'erreur survient sur la ligne nom_champ=qrd.Fields(lfNameFld)

    Quelqu'un aurait-il une suggestion ?

    Merci d'avance !

    Kaera*
    .
    I'M BACK B*TCHEEEEEZZZZ

  2. #2
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonjour,

    A priori, il ne faut pas faire ton test dans cette fonction, mais directement dans le code de l'événement Sur Clic du bouton "Rechercher".

    Un début de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If IsNull(Me.NomDuChamp) Then
    Après, tu peux tester différemment, bien sûr, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not IsNull(Me.NomDuChamp) Then
    Ou sur plusieurs champs, avec l'opérateur And.

    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  3. #3
    Membre averti
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut
    Bonjour Domi2 !

    Merci pour ta réponse.

    Non, la vérification ne se fait pas au niveau du clic du bouton rechercher mais avant car lors de la sélection d'un champ, automatiquement le type du champ est vérifié et affiché (voir image jointe).

    Mon souci ne réside pas de le IsEmpty (ou IsNull) car ma msgbox s'affiche bien, le souci c'est APRES.
    Si je fais un Exit Function, ça plante.
    Si je fais un GoTo depart en plaçant le depart au début de la function, ça plante aussi.

    .
    I'M BACK B*TCHEEEEEZZZZ

  4. #4
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Je ne comprend peut-être pas le souci, mais je persiste à dire que le test doit s'effectuer dans l'événement Sur clic du bouton Recherche.

    Tu as du code "derrière" le bouton Recherche, je suppose, et sur tes deux listes. Pourrais-tu les poster ?

    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  5. #5
    Membre averti
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut
    Je comprends bien ce que tu dis et effectivement ça semble logique.
    Mais j'insiste moi aussi , il est nécessaire de faire cette vérification AVANT le clic sur le bouton de recherche car une fonction détecte et affiche le type du champ sélectionné et, en fonction de type, adapte la liste des critères (regarde l'image jointe, le cadre "La valeur trouvée doit:").

    Tout ceci se fait AVANT même de cliquer sur "rechercher".
    Du coup, même si je place la vérification dans le code de l'évènement sur clic du bouton rechercher, ça plantera car Access dira qu'il ne trouve pas de champ et ne peut donc pas déterminer le type du champ.

    Si ce n'est pas clair, dis-le moi.


    Voici quand même le code lié à l'évènement sur clic du bouton Recherche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    Private Sub cmd_recherche_Click()
     
    Dim strTable As String, strField As String, strCriteria As String, strSQL As String
    Dim Criter As Variant
    Dim intTypChamp As Integer
    Dim intOpeChamp As Integer
     
        strTable = "[" & Me.cbo_table & "]"         ' recupère le nom de la table
        strField = "[" & Me.cbo_champ & "]"         ' recupère le nom du champ
     
        intTypChamp = lf_GetTypeField(strTable, strField)  ' pour trouver le type du champs ...
        intOpeChamp = Me.opt_Recherche
     
        Select Case intTypChamp
     
            Case dbBoolean ' booleen
                    Select Case intOpeChamp
                       Case 1   ' oui
                           strCriteria = strTable & "." & strField & "=-1"
                       Case 2   ' non
                           strCriteria = strTable & "." & strField & "=0"
                       Case 3
                           strCriteria = "ISNULL(" & strTable & "." & strField & ")"
                       Case 4
                           strCriteria = "NOT ISNULL(" & strTable & "." & strField & ")"
                     End Select
     
            Case dbByte To dbBinary, dbLongBinary, dbBigInt To dbVarBinary, dbNumeric To dbTimeStamp
                    ' traite les champs de type numerique
                    If Not IsNull(Me.txt_critere) Then   ' si le null n'est pas la valeur à traiter
                       strCriteria = Me.txt_critere
                       ' traite la virgule si elle existe
                       If InStr(1, Me.txt_critere, ",") > 0 Then strCriteria = Replace(Me.txt_critere, ",", ".", 1)
     
                       ' type champ = date ; rajoute les dièses
                       If intTypChamp = dbDate And IsDate(Me.txt_critere) Then strCriteria = "#" & Me.txt_critere & "#"
                       End If
     
                     Select Case intOpeChamp                    ' numerique, date
                          Case 1 ' égal
                               If IsNull(Me.txt_critere) Then
                                  strCriteria = "ISNULL(" & strTable & "." & strField & ")"
                               Else
                                  strCriteria = strTable & "." & strField & "=" & strCriteria
                               End If
                          Case 2 ' supérieur ou égal
                               strCriteria = strTable & "." & strField & ">=" & strCriteria
     
                          Case 3 ' strictement supérieur
                               strCriteria = strTable & "." & strField & ">" & strCriteria
     
                          Case 4 ' inférieur ou égal
                               strCriteria = strTable & "." & strField & "<=" & strCriteria
     
                          Case 5 ' strictement inférieur
                               strCriteria = strTable & "." & strField & "<" & strCriteria
     
                          Case 6 ' différent
                               If IsNull(Me.txt_critere) Then
                                  strCriteria = "NOT ISNULL(" & strTable & "." & strField & ")"
                               Else
                                  strCriteria = strTable & "." & strField & "<>" & strCriteria
                               End If
                     End Select
     
           Case dbText, dbMemo, dbChar                      ' texte
                    Select Case intOpeChamp
                        Case 1 ' strictement egal
                            If IsNull(Me.txt_critere) Then
                               strCriteria = "ISNULL(" & strTable & "." & strField & ")"
                            Else
                               strCriteria = strTable & "." & strField & " Like """ & Me.txt_critere & """"
                            End If
                        Case 2 ' commence par
                            strCriteria = strTable & "." & strField & " Like """ & Me.txt_critere & "*"""
                        Case 3 ' contient
                            strCriteria = strTable & "." & strField & " Like ""*" & Me.txt_critere & "*"""
                        Case 4 ' fini par
                            strCriteria = strTable & "." & strField & " Like ""*" & Me.txt_critere & """"
                        Case 5 ' ne contient pas
                            If IsNull(Me.txt_critere) Then
                               strCriteria = "NOT ISNULL(" & strTable & "." & strField & ")"
                            Else
                               strCriteria = "NOT " & strTable & "." & strField & " Like """ & Me.txt_critere & """"
                            End If
                    End Select
     
            Case Else
                    MsgBox "Type de données non pris en charge."
                    Exit Sub
        End Select
     
     
     
    ' debut de selection des champs
    Dim strChamps As String
    Dim entCurrLigne As Integer
    Dim strLenCol As String  'taille de la colonne
    Dim lenVal  'Taille de la valeur
    Dim lenNam  'Taille du nom du champ
     
        For entCurrLigne = 0 To Me.lst_champs.ListCount - 1
            If Me.lst_champs.Selected(entCurrLigne) Then
                strChamps = strChamps & "[" & Me.lst_champs.Column(0, entCurrLigne) & "], "
                'Longueur valeur
                lenVal = Nz(DMax(Eval("""len([" & Me.lst_champs.Column(0, entCurrLigne) & "])"""), strTable, strCriteria), 0)
                'Longueur nom
                lenNam = Len(Me.lst_champs.Column(0, entCurrLigne))
     
                If lenVal < lenNam Then lenVal = lenNam 'Nom plus long que valeur
     
                ' Largeur de colonne dynamique
                If Not strLenCol = "" Then strLenCol = strLenCol & "; "
                'strLenCol = strLenCol & Round(((Nz(DMax(Eval("""len([" & _
                            Me.lst_champs.Column(0, entCurrLigne) & "])"""), _
                            strTable, strCriteria), 0) * 110) / 571), 2) & " cm"
     
               ' méthode WizHook.TwipsFromFont Voir tuto de Cafeine
               strLenCol = strLenCol & Round(GetTextLength(Me.lst_resultat, String(lenVal, "u"), False) / 571, 2) & " cm"
     
                ' fin Largeur de colonne dynamique
     
            End If
        Next entCurrLigne
     
     
        Me.lst_resultat.ColumnWidths = strLenCol    ' Affecte Largeur de colonne dynamique
     
        If Len(strChamps) = 0 Then
            strChamps = strTable & ".*"
        Else
            strChamps = Left(strChamps, Len(strChamps) - 2)
        End If
    ' fin de selection des champs
     
     
        ' construit la requête sql
    Dim ctrl_table As String
        If Me.Opt_RechCourante And Not Len(Me.lst_resultat.RowSource) = 0 Then
            ctrl_table = Left(strTable, Len(strTable) - 1)
            ctrl_table = Right(ctrl_table, Len(ctrl_table) - 1)
            If Not Me.lst_resultat.RowSource Like "*FROM [[]" & ctrl_table & "*" Then
              MsgBox "La recherche précédente ne porte pas sur la même table que la recherche actuelle.", _
                     vbExclamation + vbOKOnly, "Erreur"
              Exit Sub
           End If
            strSQL = Left(Me.lst_resultat.RowSource, Len(Me.lst_resultat.RowSource) - 3)
            strSQL = strSQL & " " & Me.cbo_operateur & " " & strCriteria & "));"
        Else
           ' construit la rq sql
           strSQL = "SELECT DISTINCTROW " & strChamps
           strSQL = strSQL + " FROM " & strTable
           strSQL = strSQL + " WHERE ((" & strCriteria & "));"
        End If
     
     
        Me.lst_resultat.RowSource = strSQL  ' affecte sql a lst_Resultat
        Me.lst_resultat.Requery             ' recalcule la liste
     
        Me.txt_ChaineSQL.Value = strSQL           ' affiche le code
     
        Me.lbl_nbRecord.Caption = IIf(Me.lst_resultat.ListCount _
            <= 1, 0, Me.lst_resultat.ListCount - 1) & "/" & _
                DCount(Me.cbo_champ, Me.cbo_table)
     
    End Sub
    .
    I'M BACK B*TCHEEEEEZZZZ

  6. #6
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    C'est plus clair, il me semble. En fait, je suis resté bloqué sur ça :

    Citation Envoyé par Kaera Voir le message
    Si l'utilisateur clique tel quel sur "Rechercher"
    Citation Envoyé par Kaera Voir le message
    car une fonction détecte et affiche le type du champ sélectionné et, en fonction de type, adapte la liste des critères
    Cette fonction, c'est lf_GetTypeField, je suppose ?

    Et tu y fais également appel dans le code du groupe d'option, c'est ça ?
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  7. #7
    Membre averti
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut
    Citation Envoyé par Domi2 Voir le message
    Cette fonction, c'est lf_GetTypeField, je suppose ?
    Exact.

    Et tu y fais également appel dans le code du groupe d'option, c'est ça ?
    Tout à fait.
    Dans le module principal lié à mon formulaire, j'ai une Sub qui met à jour les différents critères selon le type du champ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    Private Sub cbo_champ_AfterUpdate()
     
        ' initialise les étiquettes de l'opérateur
        Me.lbl_Etiq1.Visible = True
        Me.lbl_Etiq2.Visible = True
        Me.lbl_Etiq3.Visible = True
        Me.lbl_Etiq4.Visible = True
        Me.lbl_Etiq5.Visible = True
        Me.lbl_Etiq6.Visible = True
        Me.opt_Ope1.Visible = True
        Me.opt_Ope2.Visible = True
        Me.opt_Ope3.Visible = True
        Me.opt_Ope4.Visible = True
        Me.opt_Ope5.Visible = True
        Me.opt_Ope6.Visible = True
        Me.txt_critere.Visible = True
     
        Select Case lf_GetTypeField(Me.cbo_table, Me.cbo_champ)  ' pour trouver le type du champs
     
            Case Is = dbBoolean     ' Booléen
                Me.lbl_TypeChamp.Caption = "Oui/Non"
                Me.lbl_Etiq1.Caption = "Oui"
                Me.lbl_Etiq2.Caption = "Non"
                Me.lbl_Etiq3.Caption = "Est Null"
                Me.lbl_Etiq4.Caption = "N'est pas Null"
                Me.lbl_Etiq5.Visible = False
                Me.opt_Ope5.Visible = False
                Me.txt_critere.Visible = False   ' pas de critere
     
            Case dbByte To dbBinary, dbLongBinary, dbGUID To dbVarBinary, dbNumeric To dbTimeStamp
            ' Numériques / date
                 Me.lbl_TypeChamp.Caption = "Numérique"
                 Me.lbl_Etiq1.Caption = "Etre égale"
                 Me.lbl_Etiq2.Caption = "Etre supérieure ou égale"
                 Me.lbl_Etiq3.Caption = "Etre strictement supérieure"
                 Me.lbl_Etiq4.Caption = "Etre inférieure ou égale"
                 Me.lbl_Etiq5.Caption = "Etre strictement inférieure"
                 Me.lbl_Etiq6.Caption = "Etre différente"
     
            Case dbText, dbMemo, dbChar ' texte / mémo
                 Me.lbl_TypeChamp.Caption = "Texte"
                 Me.lbl_Etiq1.Caption = "Etre strictement identique"
                 Me.lbl_Etiq2.Caption = "Commencer par la valeur"
                 Me.lbl_Etiq3.Caption = "Contenir la valeur"
                 Me.lbl_Etiq4.Caption = "Finir par la valeur"
                 Me.lbl_Etiq5.Caption = "Ne pas contenir la valeur"
                 Me.lbl_Etiq6.Visible = False
                 Me.opt_Ope6.Visible = False
     
             Case Else
                 Me.lbl_TypeChamp.Caption = "Cas non prévu " & lf_GetTypeField(Me.cbo_table, Me.cbo_champ)
     
        End Select
     
    End Sub
    .
    I'M BACK B*TCHEEEEEZZZZ

  8. #8
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Ok.

    Donc, autant que je comprenne bien, tu peux avoir deux comportements utilisateurs indésirables :

    • choix d'une option sans avoir sélectionné un champ ;
    • clic sur le bouton Rechercher sans avoir sélectionné un champ, puisque tu fais également appel à la fonction lf_GetTypeField dans l'évènement Sur clic du bouton.


    Je suppose également qu'il est obligé pour l'utilisateur d'effectuer un choix dans le groupe d'option ?

    Si oui, ce que je ferais, c'est de désactiver le bouton Rechercher.

    Puis de faire le test sur les champs dans la procédure Private Sub cbo_champ_AfterUpdate() et d'activer le bouton Rechercher dans cette même procédure lorsque tout est ok.

    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  9. #9
    Membre averti
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut
    Donc, autant que je comprenne bien, tu peux avoir deux comportements utilisateurs indésirables :
    - choix d'une option sans avoir sélectionné un champ ;
    - clic sur le bouton Rechercher sans avoir sélectionné un champ, puisque tu fais également appel à la fonction lf_GetTypeField dans l'évènement Sur clic du bouton.
    Non, le premier comportement est tout à fait possible, la sélection d'un critère sans avoir choisi de champ n'a aucune incidence.

    Je suppose également qu'il est obligé pour l'utilisateur d'effectuer un choix dans le groupe d'option ?
    Un des critères est coché par défaut; pour le type texte c'est "Contenir la valeur", pour le type numérique c'est "Etre supérieure ou égale".

    Je peux t'envoyer la bdd sinon ? Ca te permettra de mieux te rendre compte du fonctionnement du formulaire.
    .
    I'M BACK B*TCHEEEEEZZZZ

  10. #10
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Citation Envoyé par Kaera Voir le message
    Je peux t'envoyer la bdd sinon ?
    Tu peux la poster en pièce jointe.

    Au format 2000 et en .zip. Si elle est trop volumineuse, tu peux n'envoyer que le formulaire de recherche et quelques données.

    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  11. #11
    Membre averti
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut
    Voici :
    Fichiers attachés Fichiers attachés
    .
    I'M BACK B*TCHEEEEEZZZZ

  12. #12
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bon, je viens d'essayer ton formulaire, je n'arrive à produire qu'une seule erreur.

    Soit ne faire aucune sélection de tables et/ou de champs et cliquer sur Rechercher provoque une erreur 3265, ça, c'est normal.

    Tu arrives à provoquer d'autres erreurs ? Peux-tu me donner la suite d'actions que tu effectues, ou pas ?
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  13. #13
    Membre averti
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut
    Exactement la même chose que toi, erreur 3265 uniquement.
    Je ne produis aucune autre erreur.
    .
    I'M BACK B*TCHEEEEEZZZZ

  14. #14
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bon, ben on revient au départ

    Dans l'événement Sur clic du bouton Rechercher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Private Sub cmd_recherche_Click()
     
    Dim strTable As String, strField As String, strCriteria As String, strSQL As String
    Dim Criter As Variant
    Dim intTypChamp As Integer
    Dim intOpeChamp As Integer
     
        If IsNull(Me.cbo_table) Or IsNull(Me.cbo_champ) Then
     
            MsgBox "Mon message d'erreur qui va bien"
     
            Exit Sub     ' l'un des champs est vide
     
        End If
     
        strTable = "[" & Me.cbo_table & "]"         ' recupère le nom de la table
        strField = "[" & Me.cbo_champ & "]"         ' recupère le nom du champ
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  15. #15
    Membre averti
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut
    Déjà testé (avant même de poster ce topic), sans succès
    .
    I'M BACK B*TCHEEEEEZZZZ

  16. #16
    Membre averti
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut
    Au cas où, j'ai remis le bout de code en question et ça fonctionne !
    C'est quoi cette anti-baraka ?!

    Bon, l'essentiel c'est que le formulaire fonctionne mais je t'assure que j'avais déjà mis ce code précédemment et ça ne fonctionnait pas.

    En tout cas, merci beaucoup pour ton aide ! Ce fût fastidieux mais nous y sommes arrivés !
    .
    I'M BACK B*TCHEEEEEZZZZ

  17. #17
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Non, ce n'est pas de l'anti-baraka, c'est le comportement normal d'Access quand on ne fait pas bien les choses (je rigole, là).

    En fait, ton bout de code, tu l'avais mis dans un autre événement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub cbo_champ_AfterUpdate()
     
        ==> Ici
     
        ' initialise les étiquettes de l'opérateur
        Me.lbl_Etiq1.Visible = True
        Me.lbl_Etiq2.Visible = True
    Il y est peut-être encore...

    Ceci dit, il est très bien ton formulaire.

    D'une manière générale, il faudra peut-être quand même penser à faire de la gestion d'erreurs dans ton application, cela t'évitera quelques soucis.

    Content d'avoir pu t'aider.

    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  18. #18
    Membre averti
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut
    Citation Envoyé par Domi2 Voir le message
    En fait, ton bout de code, tu l'avais mis dans un autre événement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub cbo_champ_AfterUpdate()
        ==> Ici
        ' initialise les étiquettes de l'opérateur
        Me.lbl_Etiq1.Visible = True
        Me.lbl_Etiq2.Visible = True
    Il y est peut-être encore...
    Busted....

    D'une manière générale, il faudra peut-être quand même penser à faire de la gestion d'erreurs dans ton application, cela t'évitera quelques soucis.
    Pour avoir précédemment fait quelques macro codées en VBA, j'ai toujours bien fait attention à la gestion d'erreur, j'ai conscience de l'importance d'une sécurisation de l'application.
    Cependant sur Access, comme je découvre petit à petit, je suis un peu plus paumée.
    Je n'ai pas encore vraiment idée de ce que l'on peut ou ne peut pas faire sous Access.

    Aurais-tu des suggestions ? Suite à des failles que tu aurais constatées par exemple.
    .
    I'M BACK B*TCHEEEEEZZZZ

  19. #19
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Des suggestions, non pas vraiment, sinon de lecture : Le débogage sous Visual Basic 6

    Ce n'est pas du VBA, mais c'est tout comme...

    Sinon, ce que je mets généralement en place, c'est une gestion d'erreur assez basique. Un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    'code de procédure...
     
    SortieApercuImpression:
     
        'Libération de l'objet
        rst.Close
        db.Close
        Set rst = Nothing
        Set db = Nothing
     
        'Sortie de la procédure
        Exit Sub
     
    GestionErreurs:
     
        Select Case Err.Number
     
            'L'ouverture de l'état a été annulée
            Case 2501
                'Affichage d'un message
                MsgBox "La largeur des codes-barres est supérieure à celle des étiquettes !", _
                vbCritical, "Erreur !"
     
                'Sortie de la procédure
                Resume SortieApercuImpression
     
            'La chaîne de caractères est de valeur Null
            Case 513
                'Affichage d'un message
                MsgBox "La chaîne de caractères n'est pas valide (Null) !" & vbNewLine & vbNewLine & _
                "Veuillez vérifiez votre saisie.", vbCritical, "Erreur !"
     
                'Sortie de la procédure
                Resume SortieApercuImpression
     
            'La chaîne de caractères contient un ou des caractères non supportés par le code 128
            Case 514
                'Affichage d'un message
                MsgBox "La chaîne de caractères n'est pas valide !" & vbNewLine & vbNewLine & _
                "Elle contient des caractères non supportés par le code 128," & vbNewLine & _
                "par exemple des caractères accentués.", vbCritical, "Erreur !"
     
                'Sortie de la procédure
                Resume SortieApercuImpression
     
            Case Else
                'Affichage d'un message
                MsgBox "Une erreur inattendue s'est produite !" & vbNewLine & vbNewLine & _
                "Erreur no : " & Err.Number & vbNewLine & _
                "Description : " & Err.Description, vbCritical, "Erreur !"
     
                'Sortie de la procédure
                Resume SortieApercuImpression
     
        End Select
    L'idée. Si je sais que des erreurs peuvent survenir dans une fonction ou procédure et que j'en connais le numéro, je les traite de manière spécifique.

    Et j'affiche le numéro d'erreur et sa description pour les erreurs inattendues.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Sortie de la procédure
    Resume SortieApercuImpression
    Et cette façon de procéder permet d'exécuter du code même en cas d'erreur, ici par exemple la libération d'un Recordset.

    C'est toujours mieux d'avoir un message personnalisé que le message d'Access. Et cela t'évite le plantage si tu fais de ton application un fichier .mde ou .accde.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  20. #20
    Membre averti
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut
    Un grand merci pour tes conseils avisés.
    Je vais tâcher de faire encore quelques tests histoire de volontairement provoquer des erreurs et ainsi récupérer leur numéro !

    Merci beaucoup Domi2 !
    .
    I'M BACK B*TCHEEEEEZZZZ

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Formulaire de recherche multi-critères avec champs variables
    Par chris1012 dans le forum IHM
    Réponses: 6
    Dernier message: 28/09/2009, 10h50
  2. [AC-2007] Formulaire de recherche et comparaison de deux champs
    Par howvrell dans le forum IHM
    Réponses: 5
    Dernier message: 27/06/2009, 00h07
  3. historisation du champ du formulaire de recherche
    Par legide dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 03/06/2008, 11h50
  4. Réponses: 3
    Dernier message: 21/05/2007, 15h31
  5. Réponses: 3
    Dernier message: 24/08/2006, 11h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo