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

IHM Discussion :

Fonction Requête SQL pour zone de texte [AC-2007]


Sujet :

IHM

  1. #1
    Membre régulier Avatar de tiyo76
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Février 2013
    Messages : 86
    Points : 78
    Points
    78
    Par défaut Fonction Requête SQL pour zone de texte
    Bonjour à tous,

    J'ai un formulaire qui correspond à une fiche de suivi d'atelier.
    L'utilisateur choisit un item dans une liste, qui doit parl a suite actualiser plusieurs champs de ce même formulaire.

    Je souhaiterai que l'utilisateur puisse modifier les valeurs des zones de texte en cas de chamgement de dernière minute, donc je dois oublier les sources controles je pense sinon il pourra mettre le bordel dans ma base de données !

    J'ai donc essayé de juste remplir les zones de texte avec des requêtes SQL.

    J'ai trouvé ce code sur internet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    'variable : 
    Dim requete As Recordset 
    Dim sql As String 
    Dim resultat As Currency 
     
    'code d'exécution de la requête : 
    sql = " SELECT champ1, champ2, ... FROM table WHERE ... ;" 
    Set requete = CurrentDb.OpenRecordset(sql) 
    'première ligne de résultat : 
    requete.MoveFirst 
    resultat = requete("champ1")
    Je l'ai donc mis en fonction puisque je dois l'appeler pour plusieurs champs et voilà ce que cela donne pour le moment :

    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
    Function valeurQuantite(champ As String, table As String) As Integer
        'variable :
        Dim requete As Recordset
        Dim sql As String
        Dim resultat As Currency
     
        If table = "composant" Then
            'code d'exécution de la requête :
            sql = "SELECT Recette_Composant.quantite FROM (Recette INNER JOIN (Client INNER JOIN Recette_Client ON Client.id_client = Recette_Client.id_client) ON Recette.id_recette = Recette_Client.id_recette) INNER JOIN (Composant INNER JOIN Recette_Composant ON Composant.id_composant = Recette_Composant.id_composant) ON Recette.id_recette = Recette_Composant.id_recette WHERE Composant.libelle='" & champ & "' AND Client.short_item = " & Me.ListeShortItem.Column(1) & ";"
            Set requete = CurrentDb.OpenRecordset(sql)
            'première ligne de résultat :
            requete.MoveFirst
            resultat = requete("quantite")
        End If
     
        If table = "recette" Then
            'code d'exécution de la requête :
            sql = "SELECT Recette." & champ & " FROM Recette INNER JOIN (Client INNER JOIN Recette_Client ON Client.id_client = Recette_Client.id_client) ON Recette.id_recette = Recette_Client.id_recette WHERE Client.short_item = " & Me.ListeShortItem.Column(1) & ";"
            Set requete = CurrentDb.OpenRecordset(sql)
            'première ligne de résultat :
            requete.MoveFirst
            resultat = requete(champ)
        End If
     
        valeurQuantite = resultat
    End Function
    J'appelle cette fonction del a manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Me.P05 = valeurQuantite("sucre", "composant")
    Me.P21 = valeurQuantite("beurre_raffinage", "recette")
    Le problème que je rencotnre est le suivant :

    Ce code affiche bien la bonne valeur dans le premier champ texte mais lorsqu'il passe au deuxième j'ai une erreur sur le et je ne sais pas pourquoi ni comment la résoudre

    Merci d'avance pour votre aide et si vous avez besoin dep lus d'informations n'hésitez pas

  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 017
    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 017
    Points : 24 547
    Points
    24 547
    Par défaut
    Bonjour,
    Avant de faire des Move (first, last...) il faut s'assurer que le recordset est peuplé.

    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If not requete.eof then 
       requete.movefirst
       ...
    Endif

    Comme tu n'as pas posté la description de ton message je répond en aveugle.

    Cordialement,

  3. #3
    Membre régulier Avatar de tiyo76
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Février 2013
    Messages : 86
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par loufab Voir le message

    Comme tu n'as pas posté la description de ton message je répond en aveugle.
    Je n'ai pas compris à quoi tu fais référence en parlant de description de message

    Sinon pour le recordset, cela veut dire que si je veux m'en servir plus d'une fois, il faut que je le vide à chaque fois si j'ai bien compris ?

    Y aurait-il un moyen de le vider avec une fonction quej e puisse placer en début de code à chaque itération ?

  4. #4
    Membre régulier Avatar de tiyo76
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Février 2013
    Messages : 86
    Points : 78
    Points
    78
    Par défaut
    J'ai trouvé cet exemple sur le forum, pourrait-il faire l'affaire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    requete.close()
    requete=nothing

  5. #5
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    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 017
    Points : 24 547
    Points
    24 547
    Par défaut
    Je te cite :
    Ce code affiche bien la bonne valeur dans le premier champ texte mais lorsqu'il passe au deuxième j'ai une erreur sur le ...
    Qui dit erreur dit description de l'erreur.

    Sinon pour le recordset, cela veut dire que si je veux m'en servir plus d'une fois, il faut que je le vide à chaque fois si j'ai bien compris ?
    Pas du tout ! Où as-tu lu ça ? Tu peux réutiliser le même objet autant de fois que tu le souhaites sans forcément le fermer ou le vider, son contenu sera simplement écrasé (en mémoire) par le nouveau.

    Merci de me donner le lien que je corrige cette imbécilité qui de toute façon provoquera une erreur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    requete.close()
    requete=nothing
    Voici le bon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    requete.close        'méthode close
    set requete=nothing        'Set systèmatique en présence d'un objet
    à mettre à la fin de la procédure, laisser ouvert des recordset, d'une part c'est sale (on est pas là pour faire Q&D ) et d'autre part tu risques d'avoir quelques problèmes à la fermeture de l'appli.

    Cordialement,

  6. #6
    Membre régulier Avatar de tiyo76
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Février 2013
    Messages : 86
    Points : 78
    Points
    78
    Par défaut
    Alors pour l'exemple je l'avais trouvé ici mais je pense que c'était une faute de frappe : Vider le Recordset

    Ensuite j'avais quand même tenté d'essayer ce code en le corrigeant comme tu l'as fait et en le mettant à la fin de ma fonction, mais j'ai toujours le même problème :/

    Le message d'erreur étant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur d'éxecution '3021'
    Aucun enregistrement en cours.
    Voici ma fonction avec les quelques modifications apportées :

    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
    Function valeurQuantite(champ As String, table As String) As Integer
        'variable :
        Dim requete As Recordset
        Dim sql As String
        Dim resultat As Currency
     
        If table = "composant" Then
            'code d'exécution de la requête :
            sql = "SELECT Recette_Composant.quantite FROM (Recette INNER JOIN (Client INNER JOIN Recette_Client ON Client.id_client = Recette_Client.id_client) ON Recette.id_recette = Recette_Client.id_recette) INNER JOIN (Composant INNER JOIN Recette_Composant ON Composant.id_composant = Recette_Composant.id_composant) ON Recette.id_recette = Recette_Composant.id_recette WHERE Composant.libelle='" & champ & "' AND Client.short_item = " & Me.ListeShortItem.Column(1) & ";"
            Set requete = CurrentDb.OpenRecordset(sql)
            'première ligne de résultat :
     
            If Not requete.EOF Then
                requete.MoveFirst
            End If
     
            resultat = requete("quantite")
        End If
     
        If table = "recette" Then
            'code d'exécution de la requête :
            sql = "SELECT Recette." & champ & " FROM Recette INNER JOIN (Client INNER JOIN Recette_Client ON Client.id_client = Recette_Client.id_client) ON Recette.id_recette = Recette_Client.id_recette WHERE Client.short_item = " & Me.ListeShortItem.Column(1) & ";"
            Set requete = CurrentDb.OpenRecordset(sql)
            'première ligne de résultat :
     
            If Not requete.EOF Then
                requete.MoveFirst
            End If
     
            resultat = requete(champ)
        End If
     
        requete.Close
        Set requete = Nothing
        valeurQuantite = resultat
     
    End Function

  7. #7
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    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 017
    Points : 24 547
    Points
    24 547
    Par défaut
    Attention ! Même si VB6 et VBA on de syntaxe proche je te déconseille d'aller taper dans ce code à moins de connaitre suffisamment VBA pour l'adapter. Regarde plutôt le tuto sur DAO c'est mieux.

    Ceci étant dit 99% des erreurs sur un move est un recordset vide.

    Bonne continuation.

  8. #8
    Membre régulier Avatar de tiyo76
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Février 2013
    Messages : 86
    Points : 78
    Points
    78
    Par défaut
    J'ai un peu avancé et ai trouvé comment afficher les bons résultats grâce à ce tutoriel, je pense qu'il ne me reste plus qu'un seul problème à résoudre...

    'Erreur d'éxecution '-2147352567 (80020009)' :
    'Impossible de mettre à jour le Recordset.

    J'ai trouvé ce sujet sur le forum : Problème Recordset

    Il parle d'un problème de type de Recordset mais le mien est déjà en Dynaset

    Voici ma nouvelle fonction :

    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
    Function valeurQuantite(champ As String, table As String) As String
        'variable :
        Dim sql As String
        Dim oRst As DAO.Recordset
        Dim oDb As DAO.Database
        Set oDb = CurrentDb
     
        If table = "composant" Then
            'code d'exécution de la requête :
            sql = "SELECT Composant.libelle, Recette_Composant.quantite FROM (Recette INNER JOIN (Client INNER JOIN Recette_Client ON Client.id_client = Recette_Client.id_client) ON Recette.id_recette = Recette_Client.id_recette) INNER JOIN (Composant INNER JOIN Recette_Composant ON Composant.id_composant = Recette_Composant.id_composant) ON Recette.id_recette = Recette_Composant.id_recette WHERE Composant.libelle = '" & champ & "' AND Client.short_item = " & Me.ListeShortItem.Column(1) & ";"
     
            Set oRst = oDb.OpenRecordset(sql, dbOpenDynaset)
            If Not oRst.EOF Then resultat = oRst.Fields(1).Value
     
        End If
     
        If table = "recette" Then
            'code d'exécution de la requête :
            sql = "SELECT Recette." & champ & " FROM Recette INNER JOIN (Client INNER JOIN Recette_Client ON Client.id_client = Recette_Client.id_client) ON Recette.id_recette = Recette_Client.id_recette WHERE Client.short_item = " & Me.ListeShortItem.Column(1) & ";"
     
            Set oRst = oDb.OpenRecordset(sql, dbOpenDynaset)
            If Not oRst.EOF Then resultat = oRst.Fields(0).Value
     
        End If
     
        If table = "client" Then
            'code d'exécution de la requête :
            sql = "SELECT Client." & champ & " FROM Client WHERE Client.short_item = " & Me.ListeShortItem.Column(1) & ";"
     
            Set oRst = oDb.OpenRecordset(sql, dbOpenDynaset)
            If Not oRst.EOF Then resultat = oRst.Fields(0).Value
     
        End If
     
        'Libération des objets
        oRst.Close
        oDb.Close
        Set oRst = Nothing
        Set oDb = Nothing
     
        If Not resultat Then valeurQuantite = resultat Else valeurQuantite = Null
     
    End Function
    Le problème vient de là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'Infos principales
    Me.TFShortItem = valeurQuantite("short_item", "client")
    Me.TFCodeSupervision = valeurQuantite("code_supervision", "client")
    Me.TFFinesseMin = valeurQuantite("finesse_min", "recette")
    Je pense que lorsqu'il passe de la table Client à la Table Recette, il n'est pas très content ! Y aurait-il un autre type de recordset que je pourrais utiliser pour cela ou est-ce-que j'ai mal utilisé ma fonction ?

    Merci d'avance

  9. #9
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    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 017
    Points : 24 547
    Points
    24 547
    Par défaut
    Pas d'Edit pas d'Update ?!

    Je doute que cela fonctionne, tu as raté pas mal de truc dans ce tuto.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    set rst = db.openrecordset(....) 'ouverture du recordset
    ...
    rst.Edit  ' je passe en edit
    rst.fields(..)=truc 'je modifie le contenu
    ...
    rst.update 'je commite
    ...
    rst.close  'je ferme
    Attention les requêtes utilisant des jointures ne sont pas toutes modifiables. Logique car il s'agit de tuples et non d'enregistrements.

    Cordialement,

  10. #10
    Membre régulier Avatar de tiyo76
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Février 2013
    Messages : 86
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par loufab Voir le message
    Pas d'Edit pas d'Update ?!
    C'est pour cela que je bloque, justement je ne souhaite ni faire d'edit ni d'update je souhaite seulement accéder aux données, mais lorsque j'y accède il me met ce message d'erreur correspondant à un message concernant lesm ises à jour alors que je n'en fais aucune dans mon code

    EDIT : J'ai oublié de préciser que lorsque je met en commentaires tous les appels de cette fonction et que je ne laisse que les appels d'une seule table, je ne rencontre aucun soucis.

  11. #11
    Membre régulier Avatar de tiyo76
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Février 2013
    Messages : 86
    Points : 78
    Points
    78
    Par défaut
    C'est bon j'ai trouvé l'erreur, j'avais oublié d'enlever un source contrôle dans mon formulaire donc il y avait incompabilité je pense !

    Merci beaucoup pour ton aide loufab !

    Sujet résolu !

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/12/2015, 14h51
  2. [AC-2007] Pb Requête SQL liaison zone de texte.
    Par yezazell dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 07/08/2011, 22h06
  3. Requête SQL pour remplir une zone de texte déroulante
    Par uranium-design dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 17/10/2007, 12h15
  4. problème de requète SQL pour formulaire
    Par en_stage dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 21/06/2005, 12h21
  5. Requêtes SQL pour access
    Par cciocc dans le forum Langage SQL
    Réponses: 5
    Dernier message: 25/04/2005, 08h45

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