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

Requêtes et SQL. Discussion :

tri sql/vba dans formulaire ACCESS


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut tri sql/vba dans formulaire ACCESS
    bonjour,
    en fait je veux faire un tri dans un formulaire, ce tri je le fais par une requette sql dans une fonction dans mon code vba lié au fomulaire.
    cette fonction elle créée une requette, la stocke puis la detruit. Voici le 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
     
    Function tri() As Recordset 
     
    Dim rs As DAO.Recordset 
    Dim Qry As DAO.QueryDef 
    Dim strSQL As String    
     
    strSQL = "SELECT FaultCode.Fault_ID, FaultCode.Code, FaultCode.English FROM FaultCode WHERE "     
    strSQL = strSQL & "((FaultCode.ProductLine)= """ & ProductLine.Column(1) & """ );"     
     
    DoCmd.DeleteObject acQuery, "req"       'supprime la requête
    CurrentDb.CreateQueryDef "req", strSQL  'crée une nouvelle requete     
    Set Qry = CurrentDb.QueryDefs("req") 
     
    End Function
    elle est bien appellée a chaque fois que j'en ai besoin (merci les breakpoints)
    mais ma liste qui s'affiche dans mon formulaire n'est triée qu'une seule fois....
    a la deuxieme fois, la liste affichée ne correspond plus au contenu de ma requette....
    dans les proprietes de mon champ du formulaire voici ce que je mets dans 'contenu':
    SELECT req.Fault_ID, req.Code, req.English FROM req;

    par contre je ne sais que mettre dans le champs source toujours dans les proprietes?
    ni pourquoi ca ne fonctionne pas....
    des idées?
    merci par avance

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour et bienvenue,

    Est-ce que tu essayé d'appeler la méthode Requery de ta liste après avoir appelé ta fonction Tri ?
    Au passage, tu n'as pas besoin de détruire ta requête et de la re-créer pour en modifier le SQL.
    Tu peux affectuer un nouveau code SQL à la propritété SQL de l'objet QueryDef.

    A+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 427
    Points : 520
    Points
    520
    Par défaut
    Bonjour,
    Tu devrais mettre "req" dans la propriété source de ton formulaire.
    Et comme l'a dit Led Zep rafraichir le formulaire après exécution de ton code.

    Pour éditer ton code SQL tu peux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ' Instancie un objet DAo.QueryDef
    Set Qry = CurrentDb.QueryDefs("req") 
    ' Remplace la string SQL de la requête
    Qry.SQL = strSQl
    ' Détruit l'objet (libération de mémoire)
    Qry.close
    Set Qry = Nothing
    Db.querydefs.refresh
    et sur fermeture de ton formulaire il faut que tu réitère l'opération pour remettre la requête dans l'état d'origine (sans paramètre)

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Oleff Voir le message
    et sur fermeture de ton formulaire il faut que tu réitère l'opération pour remettre la requête dans l'état d'origine (sans paramètre)
    Salut,

    J'ai bien rajouté ton code mais cela ni fait rien...
    que dois-je reiterer à la fermeture?
    Mais de toute facon, je ne le ferme pas mon formulaire...

    dsl, suis pas un pro d'access

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 427
    Points : 520
    Points
    520
    Par défaut
    Bonjour,
    Le code tout seul sans changer la source du formulaire ne sert à rien
    Pour vérifier que ça a bien été éxécuté, tu peux vérifier directement dans la requête "req".

    Quand tu fermes ton formulaire (même le soir quand tu rentres chez toi...) il faut que tu fasses l'opération inverse pour revenir à
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT req.Fault_ID, req.Code, req.English FROM req;
    sinon, le dernier tri appliqué restera la source du formulaire.

    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
    Dim rs As DAO.Recordset 
    Dim Qry As DAO.QueryDef 
    Dim strSQL As String    
     
    strSQL = "SELECT FaultCode.Fault_ID, FaultCode.Code, FaultCode.English FROM FaultCode WHERE "     
    strSQL = strSQL & "((FaultCode.ProductLine)= """ & ProductLine.Column(1) & """ );"     
     
    ' Instancie un objet DAO.QueryDef
    Set Qry = CurrentDb.QueryDefs("req") 
    ' Remplace la string SQL de la requête
    Qry.SQL = strSQl
    ' Détruit l'objet (libération de mémoire)
    Qry.close
    Set Qry = Nothing
    Db.querydefs.refresh
    Et après l'appel de la méthode tri tu ajoutes un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    tri()
    Me.requery

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    mais en regardant dans 'req' je vois bien que c'est executé...
    voici maintenant mon code complet y compris l'appel
    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
     
    Private Sub Ctl4_FaultCode_02_Change()
        Me.Ctl4_FaultCode_02 = Null
        tri
        Me.Ctl4_FaultCode_02.Requery
    End Sub
     
    Function tri() As Recordset
     
    Dim Qry As DAO.QueryDef
    Dim strSQL As String
     
        strSQL = "SELECT FaultCode.Fault_ID, FaultCode.Code, FaultCode.English FROM FaultCode WHERE "
        strSQL = strSQL & "((FaultCode.ProductLine)= """ & ProductLine.Column(1) & """ );"
     
        DoCmd.DeleteObject acQuery, "req"       'supprime la requête
        CurrentDb.CreateQueryDef "req", strSQL  'crée une nouvelle requete
    '    MsgBox strSQL                          'affiche la requete
        Set Qry = CurrentDb.QueryDefs("req")
    '    DoCmd.OpenQuery "req"                  'ouvre la requete
        ' Remplace la string SQL de la requête
        Qry.sql = strSQL
        ' Détruit l'objet (libération de mémoire)
        Qry.Close
        Set Qry = Nothing
        CurrentDb.QueryDefs.Refresh
     
    End Function
    je pense que le souci viens du fait que je ne ferme pas le formulaire mais change seulement les produits.... donc passe à une autre lignes de ma DB

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 427
    Points : 520
    Points
    520
    Par défaut
    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
    Private Sub Ctl4_FaultCode_02_Change()
        Me.Ctl4_FaultCode_02 = Null
        tri
        ' raffraichit le jeu d'enregistrement du formulaire
        Me.recordsource = "req"
        Me.requery
        Me.Ctl4_FaultCode_02.Requery
    End Sub
     
    Function tri() As Recordset
     
    Dim Qry As DAO.QueryDef
    Dim strSQL As String
     
        strSQL = "SELECT FaultCode.Fault_ID, FaultCode.Code, FaultCode.English FROM FaultCode WHERE "
        strSQL = strSQL & "((FaultCode.ProductLine)= """ & ProductLine.Column(1) & """ );"
     
    '    Inutile : tu réutilises continuellement cette requête, l'éditer est donc plus efficace que la supprimer et la recréer continuellement   
    '    DoCmd.DeleteObject acQuery, "req"       'supprime la requête
    '    CurrentDb.CreateQueryDef "req", strSQL  'crée une nouvelle requete
    '    MsgBox strSQL                          'affiche la requete
        Set Qry = CurrentDb.QueryDefs("req")
    '    DoCmd.OpenQuery "req"                  'ouvre la requete
        ' Remplace la string SQL de la requête
        Qry.sql = strSQL
        ' Détruit l'objet (libération de mémoire)
        Qry.Close
        Set Qry = Nothing
        CurrentDb.QueryDefs.Refresh
     
    End Function
    Par contre j'insiste sur le fait que ceci n'aura un effet que si "req" est la source de données du formulaire.
    J'ai testé, normalement tel quel ça doit marcher

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    voici un screenshot de mon formulaire....



    si ca aide....

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    les modifs de ton code ca me reset mon formulaire ??

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 427
    Points : 520
    Points
    520
    Par défaut
    Ca ne reset pas, ça change et raffraichit la source, puis le jeu d'enregistrement. si ta condition est bonne, ça restreint le jeu d'enregistrement selon le critère choisi.

    A la vue du formulaire, ce n'est pas la source du formulaire qu'il faut changer mais celle de la zone de liste
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        ' raffraichit le jeu d'enregistrement du formulaire
        Me.recordsource = "req"
        Me.requery
        Me.Ctl4_FaultCode_02.Requery
    est à remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        ' raffraichit le jeu d'enregistrement de la zone de liste
        Me.Ctl4_FaultCode_02.rowsource = "req"
        Me.Ctl4_FaultCode_02.Requery

  11. #11
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    je pense que le code suivant n'est pas placé dans le bon événement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Ctl4_FaultCode_02_Change()
        Me.Ctl4_FaultCode_02 = Null
        tri
        Me.Ctl4_FaultCode_02.Requery
    End Sub
    Il serait sans doute plus approprié dans l'événement "sur changement" de la liste ProductLine et dans l'événement "sur activation" du formulaire (Form_Current).

    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
    Private Sub Form_Current()
    ' Changement d'enregistrement
    tri
    End Sub
     
    Private Sub ProductLine_Change()
    tri
    End Sub
     
    Function tri()
    Dim Qry As DAO.QueryDef
    Dim strSQL As String
     
        strSQL = "SELECT FaultCode.Fault_ID, FaultCode.Code, FaultCode.English FROM FaultCode"
        If ProductLine.Column(1) <> "" Then
            strSQL = strSQL & " WHERE ((FaultCode.ProductLine)= """ & ProductLine.Column(1) & """ );"
        End If
     
        On Error Resume Next
        Set Qry = CurrentDb.QueryDefs("req")
        On Error GoTo 0
     
        If Qry Is Nothing Then
             CurrentDb.CreateQueryDef "req", strSQL
        Else
             Qry.SQL = strSQL
        End If
        CurrentDb.QueryDefs.Refresh
        Set Qry = Nothing
     
        Me.Ctl4_FaultCode_02.RowSource = "req"
        Me.Ctl4_FaultCode_02.Requery
    End Function
    A+

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    salut,

    Les deux idées fonctionnent bien, merci à tous les deux!
    Celle de LedZeppII est un peu plus complete et affine les cas où je passe d'un enregistrement à l'autre.
    Le probleme maintenant, car y a toujours un probleme , c'est que la liste est bien triée mais que je ne peux plus selectionner dans cette liste...
    par exemple dans la liste ci dessous je clique sur A1 et la ligne en bas de la fentre s'affiche mais lorsque je relache mon clique la liste reste ouverte.... sans avoir rien selectionné..


    sur la version de Oleff le problem est quasi le meme... apres la selection je refait un 'tour dans le code' et le second refresh remets mon champs a 0.
    donc là je selectionne bien la liste se ferme mais rien ne reste affiché et selectionné....

    merci

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    hop là.....
    il semble qu'un reboot de ACCESS lui a fait du bien....
    je vais faire des tests mais on dirait que depuis que j'ai relancer ACCESS ca marche.... j'aime pas trop ces fonctionnements aléatoires... mais si ce n'est plus aleatoire ca peut etre cool!
    je vous dis...

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    ok, c'est tout bon !

    au final j'ai mis le code de LedZeppII

    Merci beaucoup!!!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/07/2009, 18h41
  2. Réponses: 1
    Dernier message: 07/10/2006, 10h35
  3. Réponses: 1
    Dernier message: 04/10/2006, 14h21
  4. [SQL]vs[VBA] dans formulaire de recherche
    Par alex.a dans le forum Access
    Réponses: 3
    Dernier message: 28/07/2006, 16h20
  5. Barre de progression VBA pour formulaire Access
    Par beegees dans le forum Access
    Réponses: 1
    Dernier message: 30/10/2005, 12h10

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