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 (copier des donnees dans une autre table) à l'aide requête SQL et Graphik


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Points : 16
    Points
    16
    Par défaut Recordset (copier des donnees dans une autre table) à l'aide requête SQL et Graphik
    Bonjour,
    Mon projet est le suivant :
    Je dois développer une application qui permet de visualiser l’évolution d’un nombre d’indicateurs en fonction du temps (Date).
    Pour cela j’utilise un formulaire dans lequel j’ai intégré différentes listes déroulantes qui permettront aux futurs utilisateurs de filtrer les données qui les intéressent. S'y trouve également un graphique.
    (J’ai choisi Access car je travaille sur un très grand nombres de données (>400000 lignes) Donnée provenant d’une base interbase !


    Actuellement j’arrive à afficher les valeurs sur le graphique en fonction de ma requête.
    Pour arriver à ce résultat, j’utilise une requête qui rassemble toutes les données et c’est à travers ma requête SQL que je pointe sur ces données.

    Dans une version très allégée j’ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub cmd_ActualiserMaSelection_Click()
    Dim strSQL As String
     
    '(Initialisation des variables….)
     
    strSQL = "SELECT InfoAppareil.ID_Appareil,  ResultIsoOffset.U_Offset"
                strSQL = strSQL & " FROM Req_ISOOFFSET_EVOLUTION_Affichage_graphique "
    strSQL = strSQL & " WHERE   " & strFournisseurCapteur & " And DateModif Between " & strDateDebut & " AND " & strDateFin & " "
     
    Me.Gra_EvolutionIsoOffset.RowSource = strSQL
    Me.Gra_EvolutionIsoOffset.Requery
    End Sub
    Cette solution n’est pas tout a fait satisfaisante car je souhaite pouvoir compter le nombre d’enregistrements, mais aussi faire des calculs ou encore pouvoir exporter les données qui sont la base de mon graphique dans un fichier Excel.

    Je pense que l’unique solution est de passer par la méthode « Recordset ».
    Mon nouveau programme fonctionnera de la manière suivante.
    1) Sélection des filtres
    2) Exécution de la requête SQL (bouton cmd_ActualiserMaSelection)
    3) Création d’une table tampon
    4) Récolte les données filtrées (TABLE_Tampon)
    5) Pointage du graphique vers TABLE_Tampon)

    Je bloque au point 4 !

    Mon code est le suivant :
    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
    Private Sub cmd_ActualiserMaSelection_Click()
     
    Dim QR As Recordset
    Dim CurRecQuery As Recordset
                Dim RecTabCible As Recordset
     
                Ret = False
                Set DB = CurrentDb
     
    Dim strSQL As String
     
    '(Initialisation des variables suite….)
     
    strSQL = "SELECT InfoAppareil.ID_Appareil,  ResultIsoOffset.U_Offset"
                strSQL = strSQL & " FROM Req_ISOOFFSET_EVOLUTION_Affichage_graphique "
    strSQL = strSQL & " WHERE   " & strFournisseurCapteur & " And DateModif Between " & strDateDebut & " AND " & strDateFin & " "
     
    Set CurRecQuery = DB.OpenRecordset(strSQL)
                        RecTabCible = DB.OpenRecordset("select * from TABLE_Tampon")
     
                        If CurRec.RecordCount <> 0 Then
                        CurRecQuery.MoveFirst
                        RecTabCible.MoveFirst
     
                        Do While CurRecQuery.EOF = False
                            For Each FLD In CurRecQuery.Fields
                                RecTabCible![FLD] = CurRecQuery![FLD]
                                'faire un update
                            Next FLD
                            CurRecQuery.MoveNext
                            RecTabCible.MoveNext
     
                        Loop
     
                        Ret = True
                        End If
                        AtributBool_Existant = Ret
     
    Me.Gra_EvolutionIsoOffset.RowSource = strSQL
    Me.Gra_EvolutionIsoOffset.Requery
    End Sub
    Ce code ne fonctionne pas encore tout à fait!
    Avez vous une idée? qu'en pensez vous?
    merci

  2. #2
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    Pourquoi ne pas créer la requete
    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
     
    Sub UnFonction()
     Dim q As querydef, sql As String, NbEnregistrements As Long
     
     sql = "SELECT table1.titre FROM table1;"
     
     Set q = CurrentDb.CreateQueryDef("NomRequete", sql)
     
     NbEnregistrements = DCount("*", "NomRequete")
     
     DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "NomRequete", "C:\MaRequete.xls", True
     
     DoCmd.DeleteObject acQuery, "NomRequete"
     
    End Sub
    la requête est créée, le nombre d'enregistrements est récupéré, les données sont exportées dans un fichier Excel puis la requête est supprimée

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Salut helas et merci pour ta réponse,
    Actuellement, le fait de lancer un affichage graphique à partir de mes filtres prend quelques secondes, lorsque j'utilise ma requête avec des like cela peut prendre 15 s jusqu'a l'affichage.
    C'est pour cette raison que je souhaite dans un premier temps copier les donnée dans une table tampon en faisant mes traitements et uniquement si l'utilisateur le souhaite, enregistrer cette table tampon sous un fichier excel.

    Je pense qu'il faut que je procède par étape.
    Dans un premier temps je recherche donc une solution qui à travers ma requête (avec les filtres) me permet de copier les données dans la table tampon.

    J'ai essayé avec une requête ajout! ,je ne sais pas si c'est vraiment la bonne solution!

    merci à vous.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    En fait ton premier code suffit très bien. Il faut juste y ajouter une ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    strSQL = "SELECT InfoAppareil.ID_Appareil,  ResultIsoOffset.U_Offset"
                strSQL = strSQL & " FROM Req_ISOOFFSET_EVOLUTION_Affichage_graphique "
    strSQL = strSQL & " WHERE   " & strFournisseurCapteur & " And DateModif Between " & strDateDebut & " AND " & strDateFin & " "
     
    'Création de la table tampon
    Docmd.RunSQl ("INSERT INTO  TABLE_Tampon " & strSQL)
     
    Me.Gra_EvolutionIsoOffset.RowSource = strSQL
    Me.Gra_EvolutionIsoOffset.Requery
    Ensuite tu peux créer un bouton qui te permettra d'exporter vers excel selon le choix de l'utilisateur.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Merci à tous,
    j'ai également trouvé une solution:
    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
     
    Set CurRecQuery = DB.OpenRecordset(strSQL)
                        Set RecTabCible = DB.OpenRecordset("select * from TABLE_TamponIsoOffset")
     
                        If CurRecQuery.RecordCount <> 0 Then
                        CurRecQuery.MoveFirst
                        'RecTabCible.MoveFirst
     
                        Do While CurRecQuery.EOF = False
                            RecTabCible.AddNew
                            For Each FLD In CurRecQuery.Fields
                                RecTabCible.Fields(FLD.SourceField).Value = FLD
                            Next FLD
                            RecTabCible.Update
                            CurRecQuery.MoveNext
                            'RecTabCible.MoveNext
     
                        Loop
     
                        Ret = True
                        End If
                        AtributBool_Existant = Ret

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 06/08/2010, 15h00
  2. [AC-2003] Requête de sommation des valeur suivant des critères dans une autre table
    Par s.rais dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 01/06/2010, 19h53
  3. [AC-2003] Insérer des données dans une autre table
    Par franckimmo dans le forum VBA Access
    Réponses: 2
    Dernier message: 27/08/2009, 17h51
  4. Réponses: 2
    Dernier message: 04/06/2009, 14h49

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