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. #21
    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 moi qui ai dévelopé cette RFC. Elle renvoit bien une table tout comme fait la standard RFC READ TABLE. Le problème je pense vient de l'interprétation dans Access car je l'interprete en tant qu'objet et que par conséquent je dois faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     For each 
    monobjet.rows int monobjet
    pour récupérer le contenu.

  2. #22
    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
    La RFC standard renvoie une ligne par enregistrement de la table, chaque champ étant séparé par un caractère défini.
    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
            Set funcControl = CreateObject("SAP.Functions")
            Set ctlTableFactory = CreateObject("SAP.TableFactory.1")
            funcControl.Connection = objConnection
            Set iObj_RFC = funcControl.Add(iStr_RFC)
            Set tblOptions = iObj_RFC.Tables("OPTIONS")
            Set tblFields = iObj_RFC.Tables("FIELDS")
            Set tblData = iObj_RFC.Tables("DATA")
     
            Set strExport1 = iObj_RFC.exports("QUERY_TABLE")
            Set strExport2 = iObj_RFC.exports("DELIMITER")
            Set strExport3 = iObj_RFC.exports("ROWCOUNT")
            Set strExport4 = iObj_RFC.exports("ROWSKIPS")
            strExport1.Value = pStr_NomTableSAP ' => le nom de la table SAP
            strExport2.Value = "$" ' => Le séparateur de champ
            strExport3.Value = iLng_Pas ' => le nombre de ligne à ramener lors de l'interrogation
            strExport4.Value = iLng_Rowskip ' => le nombre de ligne à sauter lors de l'interrogation
     
            For i = 0 To UBound(pStr_NomChampsSAP) '=> Tableau des noms des champs SAP à ramener
                tblFields.AppendRow: tblFields(i + 1, "FIELDNAME") = pStr_NomChampsSAP(i)
            Next
     
            If Not IsNull(pStr_ClauseWhere) Then
            ' pStr_ClauseWhere => Tableau de la clause where d'interrogation
                If Not IsEmpty(pStr_ClauseWhere) Then
                    For i = 0 To UBound(pStr_ClauseWhere)
                        tblOptions.AppendRow: tblOptions(i + 1, "TEXT") = pStr_ClauseWhere(i)
                    Next
                End If
            End If
     
            If iObj_RFC.call = True Then ' Appel de la RFC
            Else
                MsgBox iObj_RFC.EXCEPTION
                GoTo Erreur
            End If
     
            If tblData.Rowcount > 0 Then
                "Début Insert."
                lLng_RecordCount = tblData.Rowcount ' Nb de lignes ramenées
                For iLng_Compteur = 1 To tblData.Rowcount
                    iLng_Pos = iLng_Compteur + iLng_Rowskip
                    iVar_Data = Split(tblData(iLng_Compteur, "WA"), "$") ' Split de la ligne ramenée par la RFC, selon le séparateur défini , $
    ...
    Tu peux pas t'inspirer de ça ?

    Pourquoi avoir réécrit la RFC ?
    [Access] Les bases du débogage => ici

  3. #23
    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 réécris la RFC car les données renvoyées ne proviennent pas toutes de la même table dans SAP.

    J'ai regardé le code que tu m'as donnée mais je ne crois pas que cela puisse m'aider. Pour résumer je voulais éviter le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    For Each matableSAPenobjet In matableSAPenobjet.rows
    next
    Maintenant j'essai de réduire un minimum les boucles et j'ai ça :
    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
     
    listeChamps = ""
    listechamps2 = ""
    Set tmpTable = dbMyDB.TableDefs("Matableaccess")
    For i = 0 To tmpTable.Fields.Count - 1
       ListeChamps = ListeChamps & "[" & tmpTable.Fields(i).Name & "],"
       listechamps2 = listechamps2 & "'"" & matableSAPenobjet!" & tmpTable.Fields(i).Name & "& "" ',"
    Next i
    ListeChamps = Left(ListeChamps, Len(ListeChamps) - 1)
     
    For Each matableSAPenobjet In matableSAPenobjet.rows
     
        dbMyDB.Execute "INSERT INTO Matableaccess(" & ListeChamps & ") VALUES ('" & listechamps2 & "');"
     
    Next
    Ca pourrait fonctionner mais celui qui pose problème c'est listechamps2 qui ressemble finalement à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    matableSAPenobjet!champs1 & " ','" & matableSAPenobjet!champs2 & " ','" ...
    Quand je remplace listechamps2 par l'ensemble des valeurs (donc sans passer par cette variable) ça marche, mais il me semble que le & dans le & de listechamps2 ne passe pas car impossible de récupérer les valeurs.

  4. #24
    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
    Tu veux dire que la RFC que tu as écrite te permet de renvoyer les données d'une requète utilisant plusieurs tables ?

    Sinon, je dirais qu'il faut utiliser un eval sur le sql que tu construis afin de récupérer les valeurs des champs de ta table SAP.
    [Access] Les bases du débogage => ici

  5. #25
    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
    la RFC me permet de renvoyer les données d'une vingtaine de tables différentes.
    Je regarde tout juste Eval ça à l'air plutôt pas mal. J'ai pas encore réussi à le faire fonctionner pour listechamps2, merci.

  6. #26
    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 veux dire quoi par utiliser eval sur la requète sql ? je ne vois pas trop comment l'ecrire sytaxiquement

  7. #27
    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
    Citation Envoyé par mathieuch Voir le message
    j...
    For i = 0 To tmpTable.Fields.Count - 1
    ListeChamps = ListeChamps & "[" & tmpTable.Fields(i).Name & "],"
    listechamps2 = listechamps2 & "'"" & matableSAPenobjet!" & tmpTable.Fields(i).Name & "& "" ',"
    Next i
    bonjour

    ce n'est pas une listechamps2 que tu doit avoir mais une ListeDeValeur.

    la RFC me permet de renvoyer les données d'une vingtaine de tables différentes.
    Serait-il possible de faire une requête sur ce résultat pour avoir la liste des valeur?
    Amicalement

  8. #28
    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
    Je m'interroge :
    - toutes tes tables SAP renvoyées ont la même structure ?
    - si ta RFC renvoie 20 tables, pourquoi ne pas faire 20 appels à la RFC_READ_TABLE ?

    - si tu peux faire une RFC qui interroge plusieurs tables à la fois dans une requète, je suis preneur.
    [Access] Les bases du débogage => ici

  9. #29
    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
    @DMboup oui mais a priori listechamps2 contient une liste de valeur en fait (car il représente l'ensemble des valeurs contenues dans une ligne) (effectivement c'est peut etre pas le meilleur nom...)

    Pour ce qui concerne la requete, oui effectivement j'obtiens la liste des valeurs retournées dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    For each matablesapenobjet.rows in matablesapenobjet
    matablesapenobjet(1) 'représente la colonne 1 ligne i
    matablesapenobjet(2) 'représente la colonne 2 ligne i
    .
    .
     
    next
    et je dois faire ça pour chaque tables retournées par SAP
    => 20 * 20000 lignes ça prend vite du temps surtout si je rajoute des boucles en plus la dedans.

    @Kloun la RFC renvoie 20 tables mais c'est parceque j'effectue des manipulation sur les données, c'est un peu compliqué. Les tables retournées on exactement la même structure que celles de access.

    Une RFC que va chercher des données dans pusieurs tables et qui renvoies une seule table mixant plusieurs tables, je l'ai déjà fait

  10. #30
    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
    Citation Envoyé par mathieuch Voir le message
    Pour ce qui concerne la requete, oui effectivement j'obtiens la liste des valeurs retournées dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    For each matablesapenobjet.rows in matablesapenobjet
    matablesapenobjet(1) 'représente la colonne 1 ligne i
    matablesapenobjet(2) 'représente la colonne 2 ligne i
    .
    .
    next
    OK. Est ce que tu peut présentée le résultat sous forme de liste du genre

    Ligne 1 : Col1 Col2 Col2
    Ligne 2 : Col1 Col2 Col2

    Il me semble qu'on peut faire une requête du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Select matablesapenobjet(1) as Col1, matablesapenobjet(2) as Col2, ... from matablesapenobjet
    Amicalement

  11. #31
    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
    oui tout à fait.
    j'ai une liste des colonnes pour chaque lignes.
    Seulement j'ai 28 colonnes et j'aimerais eviter de faire 20000 lignes fois 28 colonnes car ça met enormément de temps. ce multiplié par une vigtaine de table et ça met 30 minutes.
    Par ailleur j'aimerais aussi éviter de faire champs1,champs2,champs3...,champs28 pour chaque table. c'est pouquoi j'ai créé listechamps2.

  12. #32
    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
    Bien. Je crois qu'on peut faire la chose suivante.

    On fait une boucle sur toutes les tables retournées par SAP.
    Sur chaque table on crée la liste des champs et on fait un select sur cette table avec la variable liste des champs ainsi créée.

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    dim mestable as tabledef, ListeChamps as string
     
    for each mestable in la collectionDeTable 
          For i = 0 To mestable .Fields.Count - 1
               ListeChamps = ListeChamps & "[" & tmpTable.Fields(i).Name & "],"          
         Next i
     
         docmd.RunSQL("Select " & ListeChamps & " from " & mestable.Name)
    next
    NB:
    1 - Dans le For ... next il faut gérer la virgule de la fin
    2 - Dans le select il vaux mieux mettre select into pour avoir le résultat dans une table temporaire.
    Amicalement

  13. #33
    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
    est ce qu'il faut que je remplisse une table interne manuellement pour obtenir l'ensemble des tables sorties de SAP et faire un for each ?

    une fois que j'ai fais le select, comment je le réutilise ? je dois créer une table interne à l'image de la table du select et faire into afin de pouvoir y accéder dans la requète SQL ?

  14. #34
    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
    Citation Envoyé par mathieuch Voir le message
    est ce qu'il faut que je remplisse une table interne manuellement pour obtenir l'ensemble des tables sorties de SAP et faire un for each ?
    j'ai supposé que les tables provenant de SAP sont dans la base Access en cours. D'ailleurs c'est même pas un for ... each qu'il mais un for ...next. En lieu et place d'une table interne, tu peux utiliser une variable tableau et un boucle for dessus du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    dim MesTable as Variant
     
    MesTable=array("Table1","Table2","Table3",...)
    for i=0 to ubound(MesTable)-1
     
     
    next
    Citation Envoyé par mathieuch Voir le message
    une fois que j'ai fais le select, comment je le réutilise ? je dois créer une table interne à l'image de la table du select et faire into afin de pouvoir y accéder dans la requète SQL ?
    Non. le SELECT INTO permet d'inserer le résultat du select dans une table. Si la table n'existe pas, elle est créée automatiquement avec les champs du select.

    Donc en faisant pour une première fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    docmd.RunSQL("Select " & ListeChamps & " INTO [TableTempo] from " & mestable.Name)
    tu crée une table "TableTempo" avec pour champs les champs de ListeChamps.

    Si tu l'exécute une deuxieme fois, les données seront supprimées avant. Donc pour les autres exécution, il faudra faire une insertion avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    docmd.RunSQL("INSERT INTO TableTempo select " & ListeChamps & " from " & mestable.Name)
    Amicalement

  15. #35
    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
    le problème est que mes données SAP sont stockées dans des objets et je n'arrive pas à accéder aux données avec un select from, je suis bligé de faire un for each rows...

  16. #36
    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
    Je vois pas bien comment tu peux faire autrement que faire un insert ligne à ligne de tes données SAP.
    [Access] Les bases du débogage => ici

  17. #37
    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
    y a t'il un moyen d'interpréter autrement qu'en objet ce que SAP nous renvoie ?

  18. #38
    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
    Citation Envoyé par mathieuch Voir le message
    y a t'il un moyen d'interpréter autrement qu'en objet ce que SAP nous renvoie ?
    Seul ceux qui connaissent SAP peuvent te répondre.

    En attendant peut tu nous montrer la structure qui provient de SAP?

    Il faut qu'on sache si tu as une seule table; comment les données sont présentées; comment identifier les différentes tables et leurs données.

    Ce sera difficile de continuer si on a pas ces informations.
    Amicalement

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