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

Access Discussion :

Problème avec une fonction créant des requêtes


Sujet :

Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Points : 15
    Points
    15
    Par défaut Problème avec une fonction créant des requêtes
    Dans un formulaire, j'ai une combolist et je veux qu'en choisissant un élément de la liste,
    une requête se crée automatiquement avec pour nom le nom de l'élément de la liste conacténé
    avec "requête". Si par exemple je choisis "Auto" dans la liste, je veux qu'il me crée une requête
    qui s'appelle "Autorequête". Et cette requête contient un critère qui dépend de l'élement choisi dans
    la liste.
    Quand je teste mon code, il me renvoie comme erreur: Erreur d'execution 3125.

    Voici mon 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
     
     
    Private Sub RequeteGroupe(ByVal str As String)
     
    Dim SQL As String
    Dim QR As Recordset
    Dim QD As QueryDef
    Dim FLD As Field
    Dim Texte As String
    Dim Nom As String
     
    Nom = str & "requete"
     
    SQL = "SELECT tblGroupes.Groupe, tblTiers.Tiers, tblTransactions.Nominal "
    SQL = SQL & "FROM (tblGroupes INNER JOIN tblTiers ON tblGroupes.GroupeID = tblTiers.GroupeID) INNER JOIN tblTransactions "
    SQL = SQL & "ON tblTiers.TiersID = tblTransactions.TiersID WHERE (((tblGroupes.Groupe)=" & str & "));"""
     
     
    Set QD = Application.CurrentDb.CreateQueryDef(Nom, SQL)
    Set QR = Application.CurrentDb.OpenRecordset(QD.Name, dbOpenDynaset)
     
    'Je ne sais pas si cette partie sert vraiment ???
    QR.MoveFirst
    Do While QR.EOF = False
        Texte = ""
        For Each FLD In QR.Fields
            Text = Text & FLD.Value & vbTab
        Next FLD
        Debug.Print Texte
        QR.MoveNext
    Loop
    QR.Close
    Set QR = Nothing
    Set FLD = Nothing
    End Sub
     
     
    Private Sub Modifiable1_Change()
    Call RequeteGroupe(Modifiable1.Text)
    End Sub

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Désolé, j'ai pas complété mon message. Est ce que quelqu'un voit l'erreur??

    Merci

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    As-tu besoin de conserver la requête (l'enregistrer dans le fichier MDB) ou bien s'agit-il juste de parcourir les données de façon occasionnelle ?

    Dans l'hypothèse où tu souhaites conserver la requête alors voici une correction code:
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set QD = CurrentDb.CreateQueryDef(Nom, SQL)
    Set QR = QD.OpenRecordset(dbOpenDynaset)

    Dans l'hypothèse où tu souhaites seulement parcourir le jeu de données, pas besoin d'un objet Querydef, tu peux travailler directement avec un objet Recordset:
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    Set QR = CurrentDb.OpenRecordset(SQL, dbOpenDynaset)

    Bonne journée !
    _

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par =JBO= Voir le message
    Bonjour,

    As-tu besoin de conserver la requête (l'enregistrer dans le fichier MDB) ou bien s'agit-il juste de parcourir les données de façon occasionnelle ?
    J'ai besoin de créer la requete si elle n'exite pas déjà. De l'ouvrir si elle existe déjà et de la créer puis de l'ouvrir si ce n'est pas le cas.
    J'ai apporté les changements que tu m'as proposé mais ça ne marche pas.
    Je pense que le problème vient de ma définition de SQL.
    J'ai l'impression qu'il y a un problème dans le bout de code & str &
    Je ne sais pas si c'est juste de concaténer avec un string qui est en argument de la procédure.

    Si tu as des idées, n'hésite pas, je suis encore bloqué.

    Merci

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Ce serait bien que tu précises sur quelle ligne l'erreur se déclenche.

    En ce qui concerne la construction du SQL, effectivement il ne faut pas oublier les guillemets si le champ tblGroupes.Groupe est de type chaîne de caractères.
    Dans le WHERE tu peux aussi te débarrasser des parenthèses inutiles (et même du point virgule final).

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL = "SELECT tblGroupes.Groupe, tblTiers.Tiers, tblTransactions.Nominal "
    SQL = SQL & "FROM (tblGroupes INNER JOIN tblTiers ON tblGroupes.GroupeID = tblTiers.GroupeID) "
    SQL = SQL & "INNER JOIN tblTransactions ON tblTiers.TiersID = tblTransactions.TiersID "
    SQL = SQL & "WHERE tblGroupes.Groupe=""" & str & """;"

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    C'est sur cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    Set QD = Application.CurrentDb.CreateQueryDef(Nom, SQL)

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Bon décidément, cette procédure ne m'aime pas , j'ai appliqué les changements que tu m'as suggéré, toujours même erreur, même ligne.
    Voilà le code que j'ai tapé.

    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
     
    Private Sub RequeteGroupe(ByVal str As String)
     
    Dim SQL As String
    Dim QR As Recordset
    Dim QD As QueryDef
    Dim Nom As String
     
    Nom = str & "requete"
     
    SQL = "SELECT tblGroupes.Groupe, tblTiers.Tiers, tblTransactions.Nominal "
    SQL = SQL & "FROM (tblGroupes INNER JOIN tblTiers ON tblGroupes.GroupeID = tblTiers.GroupeID) "
    SQL = SQL & "INNER JOIN tblTransactions ON tblTiers.TiersID = tblTransactions.TiersID "
    SQL = SQL & "WHERE tblGroupes.Groupe=""" & str & """;"
     
    Set QD = CurrentDb.CreateQueryDef(Nom, SQL)
    Set QR = QD.OpenRecordset(dbOpenDynaset)
     
     
    End Sub
     
     
    Private Sub Modifiable1_Change()
    Call RequeteGroupe(Modifiable1.Text)
     
    End Sub

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Voici le descriptif du message d'erreur 3125.

    3125 The database engine can’t find <name>. Make sure it is a valid parameter or alias name, that it doesn’t include invalid characters or punctuation, and that the name isn’t too long.
    Apparemment, c'est un problème de nom de table ou de nom de champ.
    Il faut contrôler ton code SQL, le mieux serait de l'exécuter directement sous Access.
    _

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Je n'ai pas de problème de table, j'ai fait plein de tests.

    L'erreur affichée est:

    Erreur '3125':

    Le moteur de base de données ne peut pas trouver 'ABB Ltd requete'. Assurez vous que le nom de paramètre ou d'alias est valide, qu'il ne comprend pas de caractère ou de ponctuation incorrecte et qu'il n'est pas trop long.


    ABB Ltd est le nom de l'élément selectionnée sur ma combolist. Ce qui est bizarre c'est le grand espace qu'il affiche entre ABB Ltd et requete alors que j'ai tout simplement concaténé les 2. Je pense c est justement la taille qui lui pose problème, mais je n'arrive pas à voir comment faire.

    Sinon si tu as des solutions à mon problème (c'est à dire faire autrement ce que je veux faire), je suis preneur.

    Ce que je veux faire, c'est créer des requetes qui dépendent (dans la commande SQL) de l'élément saisi dans ma combolist.

    Merci

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    J'ai testé un truc, j'ai remplacé la ligne là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set QD = CurrentDb.CreateQueryDef(Nom, SQL)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set QD = CurrentDb.CreateQueryDef("rqt", SQL)
    et ça marche, ça crée bien une requete "rqt",

    C'est à dire que le problème vient de l'argument de CreateQueryDef. Pourquoi il ne prend pas un string Nom défini par Nom = str & "requete"?

    Une idée??

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Si le problème vient des caractères espace parasites dans le paramètre str de ta procédure RequeteGroupe, tu peux les supprimer au préalable grâce à la fonction Trim().
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    str = Trim(str)
    Nom = str & "requete"
    Peux-tu essayer ?
    _

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Points : 15
    Points
    15
    Par défaut
    Bravo bravo, ça marche. Respect. La fonction Trim il fallait y penser. Je m'incline.

    Merci infiniment.

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

Discussions similaires

  1. Problème avec une fonction utilisateur !
    Par nalou dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/04/2006, 17h06
  2. Réponses: 1
    Dernier message: 22/12/2005, 09h39
  3. Problème avec une TImageList contenant des grandes images
    Par Manopower dans le forum Composants VCL
    Réponses: 8
    Dernier message: 17/11/2005, 15h20
  4. Problème avec une fonction et un array
    Par Neal Morse dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/08/2005, 12h04
  5. Problème avec une fonction date.
    Par kmayoyota dans le forum ASP
    Réponses: 8
    Dernier message: 09/09/2004, 12h33

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