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 :

Problème pour pointer dans une table [AC-2016]


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    technicien
    Inscrit en
    Janvier 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Janvier 2023
    Messages : 10
    Par défaut Problème pour pointer dans une table
    Bonjour,

    Suite à l'aide qui m'a été apportée par ce forum et ne maitrisant pas toutes les subtilités, je vous soumets cet extrait de code pour lequel je rencontre un problème.

    Objectif : dans une table appelée "traitement_fiabilité" avec un champ nommé "fiabilité", je voudrais que la requête aille pointer dans cette table pour concaténer, par fournisseur la fiabilité séparée par un ;
    avec la ligne ci-dessous, il me dit qu'il y a une erreur de syntaxe mais n'arrive pas à solutionner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    varsql = "SeLect  [traitement_fiabilite]![Fiabilite] where [fournisseur]='" _
    chr(34) & fiab & chr(34)

    j'avais essayé de remplacer ! par . mais sans succès.
    Peut être manque t'il un complément mais ?????


    En revanche, si dans ma requête je sélectionne la table "traitement fiabilité", et avec la ligne ci-dessous, aucun soucis mais ce n'est pas ce qui m'intéresse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sql = "SELECT fiabilite FROM traitement_fiabilite wHERE [fournisseur]=" & _
              Chr(34) & fiab & Chr(34)
    appel de la fonction dans ma requête :

    Nom : capture.png
Affichages : 152
Taille : 2,3 Ko



    code complet :


    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
    Public Function Recupfiab(fiab As String) As String
     
    Dim res As DAO.Recordset
    Dim sql As String
     
     
    sql = "SELECT fiabilite FROM traitement_fiabilite wHERE [fournisseur]=" & _
              Chr(34) & fiab & Chr(34)
     
     
     
     
    Set res = CurrentDb.OpenRecordset(sql)
    'Concatene les différents enregistrement
    While Not res.EOF
        Recupfiab = Recupfiab & res.Fields(0).Value & ";"
        res.MoveNext
    Wend
    'Enleve le dernier ;
    Recupfiab = Left(Recupfiab, Len(Recupfiab) - 1)
    'libere la mémoire
    Set res = Nothing
     
       End Function
    Merci.

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 137
    Par défaut
    Bonjour,

    Donc entre ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    varsql = "SeLect  [traitement_fiabilite]![Fiabilite] where [fournisseur]='" _
    chr(34) & fiab & chr(34)
    et ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sql = "SELECT fiabilite FROM traitement_fiabilite wHERE [fournisseur]=" & _
              Chr(34) & fiab & Chr(34)
    On voit une très grosse différence + une clause obligatoire manquante dans les 2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT colonne1,...,colonneX FROM table WHERE condition;
    Ici il manque "FROM table", tu dois indiquer la table.

    Et il y une ' qui traine dans ton WHERE.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  3. #3
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 622
    Billets dans le blog
    67
    Par défaut
    Bonjour à vous,

    En complément :

    Citation Envoyé par dav872
    En revanche, si dans ma requête je sélectionne la table "traitement fiabilité", et avec la ligne ci-dessous, aucun soucis mais ce n'est pas ce qui m'intéresse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sql = "SELECT fiabilite FROM traitement_fiabilite wHERE [fournisseur]=" & _
              Chr(34) & fiab & Chr(34)
     
    ...
    Quand tu dis que ce n'est pas ce qui t'intéresse peux-tu préciser pourquoi ?

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  4. #4
    Membre averti
    Homme Profil pro
    technicien
    Inscrit en
    Janvier 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Janvier 2023
    Messages : 10
    Par défaut
    Bonjour et merci pour le retour,

    Je ne vois toujours pas car on va bien l'appel de la table via le from ?
    Et effectivement, une correction a été apporté après le = ou le ' a été ajouté avant " en vain

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sql = "SELECT fiabilite FROM traitement_fiabilite wHERE [fournisseur]=" & _
              Chr(34) & fiab & Chr(34)
    Quelle serait la bonne construction ?

    Merci

  5. #5
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 622
    Billets dans le blog
    67
    Par défaut
    Avec cette instruction :

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    sql = "SELECT fiabilite FROM traitement_fiabilite Where [fournisseur]=" & Chr(34) & fiab & Chr(34)

    Si fiab contient "DUPONT" Tu vas lui transmettre un sql sous cette forme :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT fiabilite FROM traitement_fiabilite Where [fournisseur]="DUPONT";

    Il faut que la chaîne sql respecte la bonne syntaxe.

    Cdlt
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  6. #6
    Membre averti
    Homme Profil pro
    technicien
    Inscrit en
    Janvier 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Janvier 2023
    Messages : 10
    Par défaut
    Merci pour le retour.

    Youpi, ça fonctionne

    Quand je précisais que ce n'est pas ce qui m'intéresse, à savoir en création de requête choisir la table "traitement_fiabilité" dans laquelle, il y a effectivement le champ "fiabilité" non concaténé ,
    ce que je souhaite, c'était aller le chercher directement dans une table et non via la requête elle-même .

    En complément de la réponse, je me retrouve avec 1,2 voire plus de ; avant d'avoir des valeurs.

    Exemple, j'ai une ligne avec fiabilité : RCCP puis une autre ligne avec RCPL........... tout cela séparé par un ;

    Si comme décrit dans le code, la première valeur du champ fiab est null alors il met un ; et parfois j'ai x ; avant RCCP;RL............. terminé par un ";"
    peut on reboucler ou inclure un bout de code pour supprimer les ; avant et en dernier. ? quel code ?
    En précision, les valeurs de fiab ne sont jamais numérique.

    Merci encore pour votre aide et la réactivité à tous les sujets.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 527
    Par défaut
    Citation Envoyé par dav872 Voir le message
    ce que je souhaite, c'était aller le chercher directement dans une table et non via la requête elle-même .
    Quelque chose de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT fiabilite
    FROM traitement_fiabilite
    WHERE fournisseur IN (
        SELECT fournisseur
        FROM   <table>
        WHERE <criteres> );
    Ou faire une jointure ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT fiabilite
    FROM traitement_fiabilite INNER JOIN <table>
        ON traitement_fiabilite.fournisseur = <table>.<colonne>
    WHERE <criteres>

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 527
    Par défaut
    Astuces:

    Utilises des points d'arrêt, et affiche le contenu de ta variable dans le fenêtre d'exécution pour vérifier si ta requête est bien construite.
    Soit via l'instruction Debug.Print,
    Ou en entrant la syntaxe ?<variable> (dans ton cas ce sera ?sql) dans la fenêtre d'éxecution.

    Point d'amélioration:
    SI ta variable fiab (j'assume que ca provient d'une saisie utilisateur) contient des cottes, double-cottes (et autre cochonneries de ce genre), ou une sous requête (technique de hacker appelée Injection SQL), ta requête va planter ou pire: ouvrir une porte d'entrée vers le système de fichier, voir le système d'exploitation (en d'autre termes: c'est une faille de sécurité).
    On peut cependant s'en prévenir, via un requête paramètrée.

    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
    Sub test()
        Const Fiab As String = "Dupont"
     
        Dim Sql As String
        Sql = vbNullString
        Sql = Sql & "PARAMETERS" & vbCrLf       '// déclaration des paramètres
        Sql = Sql & "   ParamFournisseur Text ( 255 );" & vbCrLf
        Sql = Sql & "SELECT fiabilite" & vbCrLf
        Sql = Sql & "FROM   traitement_fiabilite" & vbCrLf
        Sql = Sql & "WHERE  fournisseur = [paramFournisseur];"  '// crochets obligatoir autour du nom du paramètre
     
        Dim Db As DAO.Database
        Set Db = CurrentDb
     
            '// crée une requête temporaire
        Dim Qd As DAO.QueryDef
        Set Qd = Db.CreateQueryDef("TempQD", Sql)
     
            '// alimente les paramètres
        Qd.Parameters("paramFournisseur").value = Fiab
     
            '// execute la requête
        Qd.Execute dbFailOnError
     
            '// nettoyage: supprime la requête temporaire
        Db.QueryDefs.Delete Qd.Name
    End Sub
    Avantages:
    - La requête fonctionne quelque soit le contenu de la variable Fiab, que ce soit "Dupont", ou "Mon ""Beau"" fournisseur", ou une sous requête.
    - Les types de donnée sont vérifiés (si tu fournis une donnée nom convertible dans le type demandé, tu obtiendra une erreur sur l'assignation de paramètre fautive. Ce qui est plus précis que le message d'erreur que fournira access lorsque tu procède par concaténation (en l'occurrence: Erreur de syntaxe).
    - Les valeur null sont supportées, donc il n'est pas utile d'écrire des instructions If vérifiant l'absence de saisie pour adapter la requête (attention: Ca ne veux pas dire qu'il ne faut pas vérifier les saisies utilisateur). Une fois la requête écrite, elle ne bouge plus (elle pourrait être déclarée en constante, je n'ai pas choisit cette option pour raison de lisibilité).
    - C'est très versatile.

    Désavantages:
    - C'est plus long à écrire.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/06/2016, 09h03
  2. Problème de Type dans une table liée
    Par tangueros78 dans le forum Access
    Réponses: 19
    Dernier message: 16/03/2006, 09h14
  3. Problème d'insertion dans une table MYSQL
    Par greg69 dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/10/2005, 11h34
  4. Problème de suppression dans une table
    Par Splinter dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/10/2005, 10h55
  5. Problème de dépendances dans une table
    Par PrinceMaster77 dans le forum Outils
    Réponses: 1
    Dernier message: 22/11/2004, 12h39

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