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 :

Transfert d'une table interne sur une table Access depuis VB


Sujet :

VBA Access

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Points : 1
    Points
    1
    Par défaut Transfert d'une table interne sur une table Access depuis VB
    Bonjour à tous, je ne savais pas trop ou placer ce sujet car il concerne du code VB mais egalement un peu d'access.

    Voici le problème :
    je dois transférer une dixaine de tables (dcéalrées comme tables appartenant a un objet myfunc.tables) de quelques 20000 enregistrements vers des tables Access.

    J'ai opté pour deux solutions : la premier en recordset qui s'execute cellule par cellule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    Set rsMyRS = dbMyDB.OpenRecordset("Matable", dbOpenDynaset)
       For Each Matable In Matable.Rows
              rsMyRS.AddNew
               For i = 0 To 3 '3 etant le nombre de colonnes
               rsMyRS.Fields(i) = Matable(i + 1)
               Next
               rsMyRS.Update
      Next
    La deuxieme par insertion SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      For Each matable In matable.Rows 
           dbMyDB.Execute "insert into matable(colonne1) values ('" & matable(1) & "');"   
     Next
    Ces deux méthodes fonctionnent bien mais sont malheureusement très lentes ... et je ne peux pas me permettre de telles performances.

    Ma question est donc y a t'il des méthodes plus performantes ? Mes tables source et origine ont exactement la même structure, peut etre existe t-il un copietable ou quelque chose comme ça ?

    Merci d'avance de vos réponse.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 622
    Points : 34 317
    Points
    34 317
    Par défaut
    salut,
    je partirais sur un rapide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentDb.Execute "INSERT INTO NouvelleTable (...) SELECT (...) FROM MaTable"

    les (...) représentant les différents champs.

    Si jamais tu ne sais pas à l'avance leur nom, tu peux passer en amont par une variable string du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim ListeChamps as String
    Dim tmpTable As TableDef
    Dim i as Integer
    ListeChamps = ""
    Set tmpTable = CurrentDb.TableDefs("MaTable")
    For i = 1 to tmpTable.Fields.Count
    ListeChamps = ListeChamps  & "[" & tmpTable.Fields(i).Name & "]," 
    Next i
    'on supprime la virgule en trop à droite
    ListeChamps =left(ListeChamps,Len(ListeChamps)-1)
    CurrentDb.Execute "INSERT INTO NouvelleTable " & ListeChamps & " SELECT " & ListeChamps & " FROM MaTable"
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Points : 1
    Points
    1
    Par défaut
    merci pour ta réponse très rapide !
    dans ta requète insert, je ne dois pas utiliser de for each pour parcourir toutes les lignes ?

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 622
    Points : 34 317
    Points
    34 317
    Par défaut
    ce n''set pas nécessaire, dans la mesure où tu insères le contenu d'une requête, pas un seul enregistrement
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Points : 1
    Points
    1
    Par défaut
    tu es vraiment très rapide, merci encore !
    je test ça et te tient au courant.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Points : 1
    Points
    1
    Par défaut
    J'ai donc testé cette méthode mais j'ai un dernier soucis au niveau de la requète :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    currentDB.Execute "INSERT INTO nouvelletable " & ListeChamps & " SELECT " & ListeChamps & " FROM " & matable & "
    car en fait matable (la table ou je vais chercher les données) est une table déclarée comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim MyFunc As Object
    Set matable = MyFunc.Tables("w_matable")
    Mais il me dit bad index j'ai peut être oublié quelque chose ?

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Points : 1
    Points
    1
    Par défaut
    (c'est pourquoi j'effectuais un for each matable.rows)
    peu-être que le select n'est pas apprprié ici puisque ce n'est pas une table ?
    en changeant par matable.rows dans la requetes select ou matable.data il me dit incompatibilité de type...
    la solution serait peut etre de transferer le contenu de cet objet dans une table interne mais encore une fois obligé de passer par un FOR EACH qui prend beaucoup de temps vu le nombre d'enregistrements.

  8. #8
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 622
    Points : 34 317
    Points
    34 317
    Par défaut
    les tables que tu gères sont avec des clés primaires, en autonumber ?
    auquel cas, il faut modifier le code pour ne pas prendre en compte cette clé dans la liste des champs.
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Points : 1
    Points
    1
    Par défaut
    en fait ce ne sont pas des tables comme expliqué au dessus, ce sont des objets.
    Dans ces objets, il y a des données (c'est pour ça que j'avais un for each matable.rows dans mon premier code) Je parcours en fait les 21000 lignes qui sont stockés dans matable.rows. Les lignes sont elles même divisées en colonnes, exactement les mêmes que ma table Access.
    Et dans le select j'ai beau indiquier matable.data au lieu de matable tout court il me donne une incompatibilité de type. Si je met matable.rows, ça ne marche pas non plus.
    Comme faudrait-il modifier le code si j'avais une clé unique ? Ai-je moyen de savoir pourquoi il y une incompatibilité de type ?

    J'espère qu je suis assez clair.
    Merci encore.

  10. #10
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 622
    Points : 34 317
    Points
    34 317
    Par défaut
    plutôt que de partir sur la problématique de ce que je propose, on va déjà voir ton histoire d'objet :
    - les données ne sont-elles donc pas dans une table accessible par SQL ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Points : 1
    Points
    1
    Par défaut
    j'arrive à y accéder par une requête SQL avec ce genre de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    For Each matable In matable.Rows 
           dbMyDB.Execute "insert into matable(colonne1) values ('" & matable(1) & "');"   
     Next
    Je ne sais pas trop si ça veut dire qu'elles sont accessibles depuis une requête SQL.

  12. #12
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 622
    Points : 34 317
    Points
    34 317
    Par défaut
    en fait, peux-tu requêter des données sur ta table par l'interface de requête, avec un "simple" :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM MaTable;

    ??
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Points : 1
    Points
    1
    Par défaut
    non je ne peux pas y accéder comme ça.
    (les données récupérées ne viennent pas de access)

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 197
    Points : 300
    Points
    300
    Par défaut
    Bonjour,

    De quel type est l'objet dbMyDB? On peut voir la ligne de déclaration?

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Points : 1
    Points
    1
    Par défaut
    C'est ma base access (current db) :
    elle est déclarée comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim dbMyDB As Database
    dbMyDB = OpenDatabase(Application.CurrentProject.FullName)

  16. #16
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 183
    Points : 1 362
    Points
    1 362
    Par défaut
    Tes données à transférer, c'est des tables liées ?

    Mais c'est quoi exactement (techniquement) ?
    Des tables dans une base de données relationnelle (Oracle, SQL Server, ...) ?
    Des tables Lotus Notes ?
    Autre ?
    [Access] Les bases du débogage => ici

  17. #17
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Points : 1
    Points
    1
    Par défaut
    ce sont des données de SAP

  18. #18
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 183
    Points : 1 362
    Points
    1 362
    Par défaut
    Ouaich. T'as pas choisi le plus simple.
    Tu ne peux pas accéder directement aux données. T'es obligé de passer par une couche SAP.
    Google est ton ami : fait une recherche sur RFC_READ_TABLE.
    (Quelle est la version de SAP ?)
    [Access] Les bases du débogage => ici

  19. #19
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Points : 1
    Points
    1
    Par défaut
    c'est SAP ecc6.
    la fonction RFC developpé du coté SAP me renvoie bien des tables en paramètres mais le problème c'est lors de la récupération, j'ai pas trouvé d'autres solutions que de le faire passer comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim MyFunc As Object
    Dim matable as object
    Set MyFunc = fns.Add("Z_RFC_CALL")
    Set Matable = MyFunc.Tables("nomdetabledansrfc")

  20. #20
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 183
    Points : 1 362
    Points
    1 362
    Par défaut
    Z_RFC_CALL => Spécifique.
    Va falloir voir avec les gars qui ont développé la RFC pour voir comment l'utiliser.
    [Access] Les bases du débogage => ici

Discussions similaires

  1. Imprimer sur une page web sur une imprimante spécifique
    Par bleuerouge dans le forum Windows Forms
    Réponses: 0
    Dernier message: 07/12/2009, 09h51
  2. Pb sur une requête DELETE sur une chaine
    Par astrolane dans le forum Sybase
    Réponses: 4
    Dernier message: 16/02/2009, 09h11
  3. Réponses: 3
    Dernier message: 25/10/2007, 11h47
  4. Réponses: 2
    Dernier message: 10/07/2007, 10h04
  5. Réponses: 7
    Dernier message: 17/03/2007, 13h52

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