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 :

Résultat différent pour DoCmd.FindRecord dans Access 2010


Sujet :

VBA Access

  1. #1
    Membre averti Avatar de skydive
    Homme Profil pro
    Chipoteur informatique
    Inscrit en
    Octobre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chipoteur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 23
    Par défaut Résultat différent pour DoCmd.FindRecord dans Access 2010
    Bonjour, je n'aime pas déranger mais là, je m'arrache les cheveux depuis une éternité sur une recherche d'enregistrement qui fonctionne bien au départ d'un sous formulaire avec une fenêtre pop-up où je donne le critère, mais pas du même sous formulaire avec un champ texte où je spécifie le critère et un bouton "search" juste à côté pour lancer l'action. En réduisant le cas, il reste :

    Dim vNom As Variant

    vNom = Forms!Carte!xNom.Value --> je vérifie dans la fenêtre d'execution et vNom vaut test
    DoCmd.FindRecord vNom, acAnywhere, False, acSearchAll, True, acAll, True --> cela ne donne rien, pas de sélection de l'enregistrement test
    Remarque, avant vNom était de type string, mais variant n'a rien amélioré.

    Par contre si j'écris :
    DoCmd.FindRecord "test", acAnywhere, False, acSearchAll, True, acAll, True --> là, mon écran par la suite affiche bien l'enregistrement test et ses caractéristiques.

    Qui pourrait m'aider à comprendre et solutionner cela ?

    Je cherche aussi à savoir s'il existe un moyen dans un outil de diagnostic ou une fenêtre du VB pour application de voir les enregistrements sélectionnés ou le contenu pendant l'execution du code et si oui comment.

    Merci de votre aide

  2. #2
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    9 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 9 002
    Par défaut
    Bonjour,
    Remarque, avant vNom était de type string, mais variant n'a rien amélioré.
    on utilise Variant uniquement si les types de données passées en paramètre peuvent être différentes (variantes si on prend le bon terme), alors pourquoi n'utilises-tu pas String ?

  3. #3
    Membre averti Avatar de skydive
    Homme Profil pro
    Chipoteur informatique
    Inscrit en
    Octobre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chipoteur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 23
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    Bonjour,

    on utilise Variant uniquement si les types de données passées en paramètre peuvent être différentes (variantes si on prend le bon terme), alors pourquoi n'utilises-tu pas String ?
    Bonjour tee_grandbois, merci de ton intérêt pour mon soucis.

    J'ai utilisé la définition Variant suivant un article de "Jeannot45" qui spécifiait :

    Le problème vient sans doute de la déclaration de variable MonCritère2 que tu as déclarée en STRING. En effet dans l'aide sur la méthode FindRecord, on peut trouver :

    Méthode FindRecord
    La méthode FindRecord exécute l'action TrouverEnregistrement dans Visual Basic.
    expression.FindRecord(ObjetÀRechercher, Correspondance, RespecterLaCasse, Rechercher, CommeFormaté, ChampActuelSeulement, TrouverPremier)
    .....
    ObjetÀRechercher Variant requis.

    Je ne sais pas comment référencer l'article mais c'est sur développez.net avec forums/d433851 dans l'URL (deuxième réponse)

    J'ai donc voulu "fermer une porte", mais avant j'utilisais string et cela n'allait pas mieux. Je viens d'ailleurs d'essayer à nouveau avec string et cela ne fonctionne pas.


    Je suis aussi fort intéressé par un moyen de visualiser le set des enregistrements ou celui sur lequel on est positionné, histoire de voir qu'elle est l'action de mon code sur les enregistrements.

    Merci

  4. #4
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    9 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 9 002
    Par défaut
    Méthode FindRecord
    La méthode FindRecord exécute l'action TrouverEnregistrement dans Visual Basic.
    expression.FindRecord(ObjetÀRechercher, Correspondance, RespecterLaCasse, Rechercher, CommeFormaté, ChampActuelSeulement, TrouverPremier)
    .....
    ObjetÀRechercher Variant requis.
    Je pense que l'information que tu as lue n'est pas correcte ou a été mal interprétée :
    il ne faut pas confondre le type de variable que tu passes à une commande comme FindRecord et le type de variable que la commande utilise : la raison pour laquelle ce paramêtre est de type variant c'est parce que tu peux faire un FindRecord avec du texte, un nombre ou une date ce qui évite de faire un FindRecord pour chaque type de variable.

    Tu sais que la commande fonctionne quand tu tapes directement la donnée. Ajoute un Debug.Print Len(vNom) pour vérifier le nombre de caractères que contient ta donnée juste pour vérifier qu'il n'y a pas un caractère espace que tu ne verrais pas.

  5. #5
    Membre averti Avatar de skydive
    Homme Profil pro
    Chipoteur informatique
    Inscrit en
    Octobre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chipoteur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 23
    Par défaut
    La longueur est bonne, le contenu aussi mais cela ne marche pas.
    J'ai eu un espoir car une variable tampon avait un masque de saisie et l'autre pas, mais ce n'est pas la solution.

    On dirait que suivant l'ordre d'appel ou la pile des appels cela donne un résultat différent.
    Le contenu est bon et affichable dans le débuggeur, mais pas dans l'interprétation qu'en fait le find record

    J'aimerais aussi chercher du côté des durées de vie ou niveau de visibilité des variables étant donné que je travaille avec un sous formulaires ...
    Est-ce que le fait d'afficher une forme pop-up dans un cas et pas l'autre pourrait avoir un impact (par exemple dans le positionnement sur le record) ?
    Est-ce que un set focus dans le champ d'une forme déplace le curseur des enregistrements ?

    Tout tourne dans ma tête

  6. #6
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    9 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 9 002
    Par défaut
    En général, quand on fait un FindRecord mieux vaut se positionner au premier enregistrement pour démarrer la recherche.

  7. #7
    Membre averti Avatar de skydive
    Homme Profil pro
    Chipoteur informatique
    Inscrit en
    Octobre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chipoteur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 23
    Par défaut
    Ok, je soupe (diner dans l'hexagone), on couche les enfants et je m'accroche car je sent que je ne suis plus seul et je veux mériter l'aide que l'on m'offre. Entretemps, j'étais entrain de relire en profondeur mon code et de toiletter certains endroits car on apprend aussi en codant et en écoutant les autres.

    Merci en tout cas.

  8. #8
    Membre averti Avatar de skydive
    Homme Profil pro
    Chipoteur informatique
    Inscrit en
    Octobre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chipoteur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 23
    Par défaut
    Bonjour, j'ai du m'interrompre un peu pour diverses raisons, mais en reprenant la chose, je vois bien que le dernier paramètre du findrecord est True donc normalement, je suis déjà en train de rechercher au départ du début (pas de l'enregistrement actuel).

  9. #9
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    9 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 9 002
    Par défaut
    Salut,
    c'est possible que cela vient dans la manière la recherche est effectuée. N'ayant pas souvent (voire jamais) eu l'occasion d'utiliser cette commande, je viens de créer un formulaire tout simple pour la tester : formulaire unique avec une table, j'ai créé une zone de texte dans l'entête de formulaire et un bouton qui permet la recherche, j'ai utilisé ton code en l'adaptant à mon formulaire. Résultat : rien ne se passe alors que la Recherche du ruban fonctionne bien.

    Jusqu'à ce que je comprenne qu'il se positionnait systématiquement sur la zone de texte me servant de champ de recherche.
    je ne sais pas si c'est une piste pour toi mais voici ce que j'ai fait pour m'en sortir : j'efface la zone de texte avant la recherche et je la restaure après.
    Voici ce que cela donne avec ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim vNom As Variant
    vNom = Forms!Carte!xNom.Value
    Forms!Carte!xNom.Value = ""
    DoCmd.FindRecord vNom, acAnywhere, False, acSearchAll, True, acAll, True
    Forms!Carte!xNom.Value = vNom

  10. #10
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 065
    Par défaut
    Avant d'utiliser DoCmd.FindRecord , il est recommandé de mettre le focus (éventuellement sur le formulaire puis) sur le controle lié dont on va rechercher la valeur
    Ainsi utilise 'DoCmd.GoToControl' pour garantir que le findrecord agira bien sur les valeurs du controle souhaité.
    Ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    DoCmd.GoToControl "nomDuControleLie"    
            DoCmd.FindRecord vNom
    ...
    Bonne année à tous

  11. #11
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    9 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 9 002
    Par défaut
    Bonsoir micniv,
    je prend note de ta remarque pertinente, mais comme la commande permet aussi la recherche sur les autres contrôles, le GoToControl n'agira pas si on ne modifie pas le paramètre OnlyCurrentField : il faudra lui donner la valeur acCurrent sinon il effectuera quand même la recherche dans tous les champs.

    Une Bonne Année toi aussi.

  12. #12
    Membre averti Avatar de skydive
    Homme Profil pro
    Chipoteur informatique
    Inscrit en
    Octobre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chipoteur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 23
    Par défaut
    Bonjour et meilleurs vœux à tous (et toutes).
    Comme expliqué, je suis en train de nettoyer mon code et je vais tester chaque de vos proposition et d'autres s'il s'en propose.
    En fait, je ne l'avais pas mentionné, mais mon code initial qui fonctionne avec la 1° fenêtre (mais pas le formulaire) avait aussi de mérite en cherchant dans tout le record de chercher sur le nom de la personne, mais aussi de sa / conjoint(e).

    Est-il possible de fixer la zone de recherche à 2 champs ?

  13. #13
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    9 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 9 002
    Par défaut
    Bonjour,
    Est-il possible de fixer la zone de recherche à 2 champs ?
    Le paramètre OnlyCurrentField dont je parle dans mon dernier post permet de rechercher soit sur le champ actif, soit sur la totalité des champs : donc non, ce n'est pas possible.

  14. #14
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 065
    Par défaut
    Est-il possible de fixer la zone de recherche à 2 champs ?
    On peut faire :
    chercher la valeur dans le 1er champ
    si aucune valeur trouvée
    chercher la valeur dans le 2eme champ

    voili, voilou

  15. #15
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    9 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 9 002
    Par défaut
    Bonsoir micniv,
    On peut faire :
    chercher la valeur dans le 1er champ
    si aucune valeur trouvée
    chercher la valeur dans le 2eme champ
    comment ferais-tu ? car le souci est que la commande FindRecord ne renvoie pas de valeur indiquant sa réussite ou son échec, comment savoir si cela a abouti la première fois et donc ne pas lancer la 2ème recherche ?

  16. #16
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 065
    Par défaut
    Bonjour,
    Une possibilité :
    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
     
    ....
    Dim rs1 As DAO.Recordset
     
    Set rs1 = Me.RecordsetClone
    If DCount("*", rs1.Name, "[NomChamp1] ='" & vnom &"'") > 0 Then
    DoCmd.GoToControl "NomChamp1"    
            DoCmd.FindRecord vNom
    ElseIf DCount("*", rs1.Name, "[NomChamp2] ='" & vnom &"'") > 0 Then
    DoCmd.GoToControl "NomChamp2"    
            DoCmd.FindRecord vNom
    else
    ' La valeur vnom n'existe pas
    End If
     
    Set rs1 =nothing

  17. #17
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    9 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 9 002
    Par défaut
    salut micniv,
    En effet, c'était tout simple avec le RecordSet. Je n'y avait pas pensé. Merci.
    @skydive : il n'y a plus qu'à...

  18. #18
    Membre averti Avatar de skydive
    Homme Profil pro
    Chipoteur informatique
    Inscrit en
    Octobre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chipoteur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 23
    Par défaut
    Ca marche enfin, dès demain je vous explique et je poste les conclusions de mes test car j'ai eu d'autres surprises avec access.
    Ici, j'ai une grosse grippe et je vais pouvoir enfin dormir un peu.

    Merci à tous, j'explique demain et je clôture le sujet.

  19. #19
    Membre averti Avatar de skydive
    Homme Profil pro
    Chipoteur informatique
    Inscrit en
    Octobre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chipoteur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 23
    Par défaut
    Quelques explications :

    Lors des tests, en arrêtant le code avec F9 et en remplaçant artificiellement le nom recherché par une partie plus courte du nom, j'ai bien vu sur l'écran que la partie sélectionnée du critère était plus courte. Ceci montre effectivement que la recherche se faisait sur le champ rempli de l'écran aussi comme le pensait tee_grandbois. Il faut donc effacer ce champ d'une manière ou de l'autre pour la recherche.

    Après, j'ai aussi du mettre un .setfocus sur le champ de la recherche. (Pour le petite histoire cela a perturbé une autre partie de mon code basée sur un lostfocus qui était sensé rempli une variable avec le contenu du champ). Il faut donc bien choisir son endroit.

    Après, j'ai aussi du faire un DoCmd.GoToControl nomducontrole.

    Pour l'instant, cela recherche toujours sur le nom principal et celui du conjoint donc je n'ai pas encore essayé les alternatives de doubles recherches proposées.

    Grand merci à vous deux micniv et tee_granbois


    Pour améliorer mes prochains post, j'aimerai vous demander comment insérer du code dans une discussion du forum dans une fenêtre déroulante avec les mots clefs en couleur.

  20. #20
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    9 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 9 002
    Par défaut
    Salut skydive,
    pour insérer les balises de code, c'est l'icône '#' tout au bout de la seconde rangée

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Commande DoCmd.OpenForm dans access
    Par pontoise dans le forum Access
    Réponses: 6
    Dernier message: 14/05/2013, 01h13
  2. [ZF 1.8] Résultats différents pour mêmes actions
    Par diagonale dans le forum MVC
    Réponses: 7
    Dernier message: 08/08/2009, 23h12
  3. gettime 2 résultats différents pour une meme date
    Par krolineeee dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 05/03/2007, 14h36
  4. Réponses: 5
    Dernier message: 04/01/2006, 19h34

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