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 :

Recordset en vba


Sujet :

VBA Access

  1. #1
    Membre éprouvé Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Points : 1 023
    Points
    1 023
    Par défaut Recordset en vba
    Bonjour,

    je rencontre un souci avec Acc 2k13.

    Soit une base, avec, 2 requêtes (entre autres), et une 3ème, résultat des 2.
    Un formulaire indépendant (form_saisie_année) permettant de saisir une année , via une zone de texte indépendante (texte1)

    Le but du tout est d'envoyer un mail à x personnes, résultant de la requête. Mais je n'en suis pas là, juste pour le moment à des tests.

    Les 2 tables :
    1 table "candidat", avec sa primary (ci_candidat), et une case à cocher (inscription) entre autres
    1 table "texte_candidat", avec comme clé ci_texte, et un champ 'ci_candidat', et un 'annee_texte' (un (-) candidat peut faire plusieurs textes par année)

    Pour lister les candidats dont la case à cocher est true (-1) et qui n'ont aucun texte saisi pour l'annee_texte, j'ai dû passer par 3 requêtes :
    La première :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "SELECT candidat.ci_candidat, candidat.Inscription, sexe.libelle_sexe, candidat.[Nom-famille], candidat.Prénom, candidat.annee_naissance, candidat.Adresse, candidat.Téléphone, candidat.Codepostal, candidat.Ville, candidat.Pays, candidat.[E-mail], candidat.[Date inscription], candidat.Commentaire, candidat.identité
    FROM sexe INNER JOIN candidat ON sexe.code_sexe = candidat.code_sexe
    WHERE (((candidat.Inscription)=True));"
    Elle liste tous les candidats dont la case à cocher est cochée (candidat_inscription)

    La seconde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PARAMETERS formulaires!saisie_annee_stats!Texte1 Short;
    SELECT texte_candidat.code_candidat
    FROM texte_candidat
    WHERE (((texte_candidat.annee_concours) Like [Formulaires]![saisie_annee_stats]![Texte1]));

    La troisième, regroupement des 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT [Nom-famille] & " " & [prénom] AS Expr1, selection_inscription_vrai.[E-mail]
    FROM selection_inscription_vrai LEFT JOIN stats_regrouper_textes ON selection_inscription_vrai.[ci_candidat] = stats_regrouper_textes.[code_candidat]
    WHERE (((stats_regrouper_textes.code_candidat) Is Null));
    Quand j'appelle cette troisième requête via le formulaire [Formulaires]![saisie_annee_stats]![Texte1], c'est OK.

    Voilà mon problème :
    Quand j'appelle via vba, cette même requête, j'ai une erreur "trop peu de paramètres. 1 attendu".
    J'ai regardé, et ai trouvé un solution, mais non satisfaisante : souci avec les paramètres de la requête.
    Si au lieu de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Like [Formulaires]![saisie_annee_stats]![Texte1]
    je mets "2016", cela fonctionne.

    Voià le code, avec les infos de dégugage (msgbox pour vérif), qui est la troisième requête, en fait

    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 rst As DAO.Recordset
      Dim strSQL As String
      Dim strMessageType As String
      Dim strTitre As String
      Dim strMsg As String
     
     
      strSQL = "SELECT [Nom-famille], "
      strSQL = strSQL & "[prénom], selection_inscription_vrai.[E-mail] FROM selection_inscription_vrai "
    strSQL = strSQL & "LEFT JOIN stats_regrouper_textes ON selection_inscription_vrai.[ci_candidat] = stats_regrouper_textes.[code_candidat] "
    strSQL = strSQL & "WHERE (((stats_regrouper_textes.code_candidat) Is Null));"
     
     
    MsgBox strSQL 'le requête est bonne à première vue
     
      Set rst = CurrentDb.OpenRecordset(strSQL) 'c ici que le paramètre du formulaire n'est pas pris en compte
    Merci de m'avoir lu et j'espère compris !

    A+

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Bonjour,

    Il est possible de remplacer les 3 requetes par une seule à plusieurs niveaux
    Ensuite en VBA le paramètre année sera simplement utilisé à la création de strSQL comme dans cet exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strSQL = "SELECT code_candidat FROM texte_candidat WHERE annee_concours Like '" & [Formulaires]![saisie_annee_stats]![Texte1] & "'"
    NB : je crois qu'il y a aussi une syntaxe pour passer un paramètre à openrecordset mais je ne l'utilise jamais...
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  3. #3
    Membre éprouvé Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Points : 1 023
    Points
    1 023
    Par défaut
    Bonjour et merci.

    Comment puis-je obtenir ce résultat avec une seule requête ?

    Merci

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Il me semble que les 2 premières se regroupent facilement
    Dans tous les cas, sans changer de syntaxe il est possible d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select ... from (select ... from (select ... from ...) where ...) where ...
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  5. #5
    Membre éprouvé Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Points : 1 023
    Points
    1 023
    Par défaut
    Merci Nico,

    j'avais essayé il y a quelques temps, mais j'avais eu une erreur de type "expression trop complexe" (de mémoire), d'où mon obligation de passer par 3 requêtes. J'avais testé aussi l'assistant de requête de non correspondance, sans résultat probant...

    Merci

  6. #6
    Membre éprouvé Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Points : 1 023
    Points
    1 023
    Par défaut
    Re,

    je crois avoir réussi à faire le tout en une seule requête (pourquoi j'avais eu une erreur, je ne sais pas).

    Par contre, s'il y a bien une chose avec lesquelles je m'arrache les cheveux (que je n'ai plus), ce sont les simples quotes ' et les doubles "

    Voici le code (j'ai décidé de ne plus passer par une zone de texte d'un form, mais par une inputbox) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim a As Integer
    a = InputBox("saisir l'année")
    
    strSQL = "SELECT [Nom-famille], "
      strSQL = strSQL & "[prénom] AS Expr1, requete1.[E-mail] "
      strSQL = strSQL & "FROM (SELECT candidat.ci_candidat, candidat.Inscription, sexe.libelle_sexe, candidat.[Nom-famille], candidat.Prénom, candidat.annee_naissance, candidat.Adresse, candidat.Téléphone, candidat.Codepostal, candidat.Ville, candidat.Pays, candidat.[E-mail], candidat.[Date inscription], candidat.Commentaire, candidat.identité "
      strSQL = strSQL & "FROM sexe INNER JOIN candidat ON sexe.code_sexe = candidat.code_sexe "
      strSQL = strSQL & "WHERE (((candidat.Inscription)=True))) AS requete1 "
      strSQL = strSQL & "LEFT JOIN (SELECT texte_candidat.code_candidat FROM texte_candidat "
      strSQL = strSQL & "WHERE (((texte_candidat.annee_concours) Like 2016))) AS requete2 "
      strSQL = strSQL & "ON requete1.[ci_candidat] = requete2.[code_candidat] "
      strSQL = strSQL & "WHERE (((requete2.code_candidat) Is Null));"
    J'ai un peu tout essayé, mais comment remplacer ce like 2016 par un like a ?

    Merci.

  7. #7
    Membre éprouvé Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Points : 1 023
    Points
    1 023
    Par défaut
    Et franchement, ce n'est pas faute d'avoir cherché.

    Si quelqu'un a une explication claire sur ce sujet, je suis preneur.

    J'ai horreur de ne pas comprendre, j'en ai les larmes aux yeux tellement que je me bats avec ce code.

    Car si j'essaie :
    [...]
    strSQL = strSQL & "WHERE (((texte_candidat.annee_concours) Like ' & a &'))) AS requete2 " cela ne filtre pas sur a

    [...]

    Si j'ai le malheur d'introduire un " dans ce strsql, access prend cela pour une fin de chaine... grrrrrrrrrrrrrr

    Merci

  8. #8
    Membre éprouvé Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Points : 1 023
    Points
    1 023
    Par défaut
    Après 2h,

    cela fonctionne, mais je ne sais pas pourquoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     strSQL = strSQL & "WHERE (((texte_candidat.annee_concours) Like ' " & a & " '))) AS requete2 "
    Quelqu'un peut m'expliquer, svp ?

    Merci.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ça ['] ça indique à Sql le début et la fin d'un texte.
    Ca ["] ça indique à Vba le début et la fin d'un texte.
    Ça [&] ça indique une concaténation.

    Que comprends tu à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    "Where champs =' & variable & '"
     
    "Where champs ='" & variable & "'"

  10. #10
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Qq remarques en vrac :

    - En cas de doute permet de voir ce qu'a compris access

    - Pour stocker une année il aurait été plus simple d'utiliser un entier et d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strSQL = strSQL & "WHERE texte_candidat.annee_concours=" & a & " AS requete2 "
    - les 2 premières requetes appellent toutes 2 la table candidat, elles se regroupent simplement en une seule

    - le 1er from (celui de requete1) appelle 15 champs mais n'en utilise que 3

    - le sql access autorise indifféremment ' ou " comme limiteur de string ce qui peut embrouiller mais en l'occurrence cela facilite la lecture et évite les affreux """" ou '''' qu'on doit utiliser ailleurs pour écrire une seule apostrophe au final

    - ton code écrit ' 2016 ' dans strsql alors qu'en toute logique il faudrait écrire '2016', là encore access est brave

    - la table sexe ne sert à rien puisqu'au final libelle_sexe n'est pas sélectionné

    En regardant de plus près tout cela peut s'écrire plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT [Nom-famille], [prénom], [E-mail] FROM candidat WHERE Inscription and not exists (select * from texte_candidat where candidat.code_candidat=candidat.ci_candidat and annee_concours='" & a & "')"
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  11. #11
    Membre éprouvé Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Points : 1 023
    Points
    1 023
    Par défaut
    Citation Envoyé par rdurupt Voir le message
    Bonjour,

    Ça ['] ça indique à Sql le début et la fin d'un texte.
    Ca ["] ça indique à Vba le début et la fin d'un texte.
    Ça [&] ça indique une concaténation.

    Que comprends tu à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    "Where champs =' & variable & '"
     
    "Where champs ='" & variable & "'"
    Merci,

    Franchement, rien !

  12. #12
    Membre éprouvé Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Points : 1 023
    Points
    1 023
    Par défaut
    Merci Nico,

    j'avais bien mis un msgbox.

    Pour le reste, la requête 1 me sert également à d'autres choses, j'ai donc besoin des champs du sexe par ailleurs.

    A+

Discussions similaires

  1. [AC-2003] Regle de syntaxe recordSet SQL/VBA
    Par aminnio dans le forum VBA Access
    Réponses: 2
    Dernier message: 03/05/2013, 15h14
  2. [AC-2007] Gestions des pièces jointes avec RecordSet sous VBA
    Par Oxopor dans le forum VBA Access
    Réponses: 4
    Dernier message: 12/07/2011, 10h59
  3. [AC-2000] Ouverture d'un recordset en VBA pour effectuer un SELECT
    Par Remus91 dans le forum VBA Access
    Réponses: 5
    Dernier message: 17/06/2009, 11h02
  4. Stocker et manipuler le Recordset en VBA
    Par Au2laDeNosReves dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 13/02/2009, 11h49
  5. lire et manipuler un recordset en vba excel
    Par DIDIDIDA dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 24/01/2008, 16h26

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