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

VBA Access Discussion :

VBA Access : Fonction find qui ne marche pas


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 19
    Points : 15
    Points
    15
    Par défaut VBA Access : Fonction find qui ne marche pas
    Bonsoir le forum !

    Je viens faire appel à vos lumières à propos de mon code en vba pour access.

    Explication de la situation :
    J'ai une base de données qui entre autre permet d'établir une facture mensuelle. Et pour des raisons d'analyse, je voudrais mettre cette facture en historique tous les mois.

    Le code ci-dessous traite une table HISTORIQUE2008 qui comme son nom l'indique stock les différentes factures, et une requête FACTURE_MENSUELLE qui contient de nouvelles données tous les mois.

    A savoir : la première procédure appelée demande à l'utilisateur la date de fin de mois qu'il souhaite traiter, et comme elle est déclarée en global, je la récupère dans ce code.

    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
     
    Sub MISE_EN_HISTORIQUE()
     
    Call COUT_POSTE                                     'Appel de la fonction COUT_POSTE afin de mettre à jour la requête FACTURE_MENSUELLE
     
    'Déclarations des variables permettant de remplir la table HISTORIQUE2008
    Dim num_parc As String                              'Numéro du parc informatique
    Dim numero_uti As String                            'Numéro d'utilisateur
    Dim domaine As String                               'Domaine du bien
    Dim categorie As String                             'Type du bien
    Dim marq As String                                  'Marque du bien
    Dim model As String                                 'Modèle du bien
    Dim location As Double                              'Coût de la location
    Dim service As Double                               'Coût du service
    Dim maintenance As Double                           'Coût de la maintenance
    Dim logiciel As Double                              'Coût du logiciel
    Dim nom_uti As String                               'Nom de l'utilisateur
    Dim num_section As String                           'Section analytique du bien
    Dim date_comparaison As String                      'Cette variable va permettre d'utiliser la fonction find (utilisable seulement avec une chaîne de caractères (et non une date)
                                                        'Cela va permettre de vérifier que la date saisie n'est pas déjà en historique
     
     
    'Déclarations des objets en recordset
    'Un recordset correspond à l'image d'une table
    Dim FACTURE_MENSUELLE As New ADODB.Recordset
    Dim HISTORIQUE2008 As New ADODB.Recordset
     
     
    'Ouverture des recordsets
    FACTURE_MENSUELLE.Open "FACTURE_MENSUELLE", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
    HISTORIQUE2008.Open "HISTORIQUE2008", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
     
    'Transfert de la date saisie dans la variable texte date_comparaison
    date_comparaison = date_fin_saisie
     
    'Test pour voir si la date demandée n'est pas déjà en historique
    HISTORIQUE2008.Find (date_comparaison)          'Recherche dans la table HISTORIQUE2008 l'éventuelle présence de la date de fin de mois saisie
     
     
    If HISTORIQUE2008.EOF Then                      'Si cette date n'existe pas déjà dans la table HISTORIQUE2008, on peut passer à la mise en historique
        FACTURE_MENSUELLE.MoveFirst                 'Positionnement sur le premier enregistrement de la requête FACTURE_MENSUELLE
        Do Until FACTURE_MENSUELLE.EOF              'Jusqu'à la fin de la requête
     
            'Début du traitement de ligne de la requête FACTURE_MENSUELLE : Récolte des données
            'Récupération des valeurs de la requête FACTURE_MENSUELLE pour les mettre dans les variables afin de remplir la table HISTORIQUE2008
            num_parc = FACTURE_MENSUELLE![num_parc]                     'Copie du numéro de parc informatique de la table FACTURE_MENSUELLE vers la variable num_parc qui va permettre de remplir la table HISTORIQUE2008
            numero_uti = FACTURE_MENSUELLE![numero_uti]                 'Copie du numéro d'utilisateur de la table FACTURE_MENSUELLE vers la variable numero_uti qui va permettre de remplir la table HISTORIQUE2008
            domaine = FACTURE_MENSUELLE![domaine]                       'Copie du domaine du bien de la table FACTURE_MENSUELLE vers la variable domaine qui va permettre de remplir la table HISTORIQUE2008
            categorie = FACTURE_MENSUELLE![categorie]                   'Copie du type de bien de la table FACTURE_MENSUELLE vers la variable categorie qui va permettre de remplir la table HISTORIQUE2008
            marq = FACTURE_MENSUELLE![marq]                             'Copie de la marque du bien de la table FACTURE_MENSUELLE vers la variable marq qui va permettre de remplir la table HISTORIQUE2008
            model = FACTURE_MENSUELLE![model]                           'Copie du modèle du bien de la table FACTURE_MENSUELLE vers la variable model qui va permettre de remplir la table HISTORIQUE2008
            location = FACTURE_MENSUELLE![location]                     'Copie du coût de location du bien de la table FACTURE_MENSUELLE vers la variable location qui va permettre de remplir la table HISTORIQUE2008
            service = FACTURE_MENSUELLE![service]                       'Copie du coût du service du bien de la table FACTURE_MENSUELLE vers la variable service qui va permettre de remplir la table HISTORIQUE2008
            maintenance = FACTURE_MENSUELLE![maintenance]               'Copie du coût de la maintenance du bien de la table FACTURE_MENSUELLE vers la variable maintenance qui va permettre de remplir la table HISTORIQUE2008
            logiciel = FACTURE_MENSUELLE![logiciel]                     'Copie du coût des logiciels de la table FACTURE_MENSUELLE vers la variable logiciel qui va permettre de remplir la table HISTORIQUE2008
            nom_uti = FACTURE_MENSUELLE![nom_uti]                       'Copie du nom d'utilisateur du bien de la table FACTURE_MENSUELLE vers la variable nom_uti qui va permettre de remplir la table HISTORIQUE2008
            num_section = FACTURE_MENSUELLE![num_section]               'Copie de la section analytique de la table FACTURE_MENSUELLE vers la variable num_section qui va permettre de remplir la table HISTORIQUE2008
     
     
            'Les données ont toutes été récoltées, donc il ne reste plus qu'à les saisir
            'Écriture des données récoltées dans le recordset COUT_PAR_POSTE
            HISTORIQUE2008.AddNew                                   'On ajoute une ligne au recordset COUT_PAR_BIEN
            HISTORIQUE2008![date_historique] = date_fin_saisie      'On écrit la valeur du champ date de mise en historique
            HISTORIQUE2008![num_parc_historique] = num_parc         'On écrit la valeur du champ numéro de parc informatique
            HISTORIQUE2008![numero_uti_historique] = numero_uti     'On écrit la valeur du champ numéro d'utilisateur
            HISTORIQUE2008![domaine_historique] = domaine           'On écrit la valeur du champ domaine du bien
            HISTORIQUE2008![categorie_historique] = categorie       'On écrit la valeur du champ type du bien
            HISTORIQUE2008![marq_historique] = marq                 'On écrit la valeur du champ marque du bien
            HISTORIQUE2008![model_historique] = model               'On écrit la valeur du champ modèle du bien
            HISTORIQUE2008![location_historique] = location         'On écrit la valeur du champ coût de la location
            HISTORIQUE2008![service_historique] = service           'On écrit la valeur du champ coût du service
            HISTORIQUE2008![maintenance_historique] = maintenance   'On écrit la valeur du champ coût de la maintenance
            HISTORIQUE2008![logiciel_historique] = logiciel         'On écrit la valeur du champ coût du logiciel
            HISTORIQUE2008![nom_uti_historique] = nom_uti           'On écrit la valeur du champ nom de l'utilisateur
            HISTORIQUE2008![num_section_historique] = num_section   'On écrit la valeur du champ numéro de section analytique
            HISTORIQUE2008.Update                                   'Cette ligne retranscrit le recordset dans la réelle table
     
     
            FACTURE_MENSUELLE.MoveNext                              'Positionnement sur l'enregistrement suivant dans la requête FACTURE_MENSUELLE
     
        Loop
     
    Else
     
            MsgBox ("La date de mise en historique saisie existe déjà dans la table Historique2008 !")
     
    End If
     
     
    'Fermeture des recordsets
    HISTORIQUE2008.Close
    FACTURE_MENSUELLE.Close
     
    End Sub
    Si ma table HISTORIQUE2008 est vide, la mise en historique se passe à merveille !
    Par contre, lorsqu'il y a déjà des données, la vérification de prééxistance ne fonctionne pas et fait planter Access...
    (Je souhaite vérifier à chaque lancement de ce code que la mise en historique n'a pas déjà été faite pour la date demandée)

    Quelqu'un a-t-il une idée à me soumettre ?

    Merci beaucoup pour votre aide si précieuse !!!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Je ne penses pas que Find fonctionne de cette manière, si tu veux faire une recherche de ce type, je te conseille la fonction de domaine DLookup (Les Fonctions de Domaine dans Access.

    Cette fonction te retournera null si elle ne trouve rien, donc faire un test avec IsNull.

    Attention, penses aux # si tu gères des dates (il y'a des exemples dans l'article).

    Starec

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup pour cette réponse rapide !

    Je ne vais pas avoir le temps de tester ça ce soir mais je m'y atèle dès demain matin et je reviendrais poster pour vous dire ce que ça donne.

    Merci encore

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Bonjour,

    J'essaie en vain de tester la fonction DLookup...mais il y a quelque chose qui m'échappe.

    A la place de mon find dans le code précédent, j'ai mis ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    existence = DLookup("#date_historique#", "HISTORIQUE2008", "#date_historique# = #date_fin_saisie#")
     
    'If HISTORIQUE2008.EOF Then                      'Si cette date n'existe pas déjà dans la table HISTORIQUE2008, on peut passer à la mise en historique
    If existence Is Null Then
        FACTURE_MENSUELLE.MoveFirst                 'Positionnement sur le premier enregistrement de la requête FACTURE_MENSUELLE
        Do Until FACTURE_MENSUELLE.EOF
    J'ai déclaré une autre variable "existence" afin de stocker le résultat du DLookup mais quand j'exécute le code, j'ai une erreur "incompatibilité de type" qui apparaît.
    J'ai essayé en déclarant toutes mes dates en String, mais même message d'erreur à chaque fois.

    Merci de votre aide !

  5. #5
    Membre habitué
    Homme Profil pro
    Informaticien
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien
    Secteur : Service public

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 158
    Points
    158
    Par défaut
    Bonjour,

    Pour les fonctions find il ne faut pas tester .eof mais .nomatch

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Merci de cette aide mais...impossible de tester avec .nomatch. Il ne veut pas reconnaître cet élément.

  7. #7
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    il s'agit d'un problème de syntaxe pour Find et pour DLookup.
    En supposant que date_fin_saisie est une variable de type date.
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'Transfert de la date saisie dans la variable texte date_comparaison
    date_comparaison = "[date_historique]=#" & Format(date_fin_saisie, "mm\/dd\/yyyy") & "#"
    'Test pour voir si la date demandée n'est pas déjà en historique
    HISTORIQUE2008.Find date_comparaison
     
    If HISTORIQUE2008.EOF Then
    ...
    End If
    ou avec DLookup
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    existence = DLookup("date_historique", "HISTORIQUE2008", "date_historique = #" & Format(date_fin_saisie,"mm\/dd\/yyyy") & "#")
    DLookup renvoie la valeur de "date_historique" si un enregistrement répond au critère, ou Null dans le cas contraire.
    A la place de DLookup on peut utiliser DCount, qui avec "*" ne renvoie jamais Null.
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    existence = DCount("*", "HISTORIQUE2008", "date_historique = #" & Format(date_fin_saisie,"mm\/dd\/yyyy") & "#")
    DCount renvoie 0 si aucun enregistrement ne répond au critère ou un nombre >0 dans le cas contraire.

    Ce qu'il faut retenir c'est que dans tous les cas le critère est une expression SQL.
    <Champ> <Opérateur de comparaison> <Expression Valeur>
    Cette expression SQL doit satisfaire aux règles de syntaxe SQL.
    En particulier si <Expression Valeur> est une valeur date littérale elle doit être au format mm/jj/aaaa et encadrée par des #.

    A+

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup pour l'aide, les explications sont très claires !

    J'ai enfin réussi à faire fonctionner mon script. La mise en historique se fait nickel et la vérification de prééxistence aussi !

    Merci encore et bon week-end !

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

Discussions similaires

  1. fonction javascript qui ne marche pas
    Par roy-mustang dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 30/03/2009, 17h05
  2. Fonction simple qui ne marche pas
    Par Emotion dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/03/2009, 06h17
  3. [MySQL] fonction delete qui ne marche pas
    Par bassiste dans le forum PHP & Base de données
    Réponses: 22
    Dernier message: 10/05/2008, 00h58
  4. Réponses: 18
    Dernier message: 06/10/2007, 23h03
  5. requete SQl avec la fonction max () qui ne marche pas
    Par eclipse012 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/11/2006, 14h32

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