Importer une table obdc attache

Résolu
cs_akzo Messages postés 133 Date d'inscription dimanche 23 juin 2002 Statut Membre Dernière intervention 3 janvier 2015 - 8 sept. 2010 à 17:07
c148270 Messages postés 303 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 3 octobre 2013 - 13 sept. 2010 à 09:42
Salut à tous,
Je voudrais savoir s'il existe une methode rapide et si oui laquelle (par exemple copier coller certain champ) pour importer des valeurs d'une table attache odbc situé sur un serveur vers une table access situé sur mon poste (en local)

Car à l'heure actuelle j'ai une methode mais cela prend plus de 15 minutes (environ 8000 ligne à recuperer)

etape 1:
je supprime ma table en local avec Drop [nom table]

etape 2:
je recrée la table avec Create Table

Ensuite je fais une requete pour trouver les champs que j'ai besoin sur mon serveur:

requeteServeur="SELECT 1,2,3,4 FROM maTableServeur WHERE Condition"
'execution de ma requete vers le serveur
' j'exploite le resultat par RstSer
    Do While (Not RstSer.EOF)
        requeteLocal = "INSERT INTO TableSurMonPoste "
        requeteLocal = requeteLocal &"(1,2,3,4)
        requeteLocal = requeteLocal & "VALUES(" & RstSer.Fields(1) &",...," & RstSer.Fields(4) &")
        'j'execute ma requete en local
      RstSer.MoveNext
   Loop


Merci pour votre aide
Salutation

4 réponses

c148270 Messages postés 303 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 3 octobre 2013 1
9 sept. 2010 à 09:40
Bonjour
je ne sais pas quel logiciel est utilisé
Sous access on a acces aux données de la table attachée.
Les valeurs sont celles au moment de l'ouverture de l'appli
Il suffit de faire une requête de création de table avec les critères voulus avec la table liée comme base du genre
SELECT matableserveur.1, matableserveur.2 INTO tablesurmonposte
FROM matableserveur
WHERE (((matableserveur.champselection)="a"))

bonne journée
3
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
9 sept. 2010 à 09:41
Bonjour !

Je te conseille de regarder sur se site, il est vraiment bien explicite au niveau des recordset !!

COmprendre les recordset ADO

ET il t'explique le fonctionnement de ADO !! Je te conseille de passer de ODBC à ADO, mais je ne suis pas un pro en la matière !

Toutefois, on me l'a conseillé il n'y as pas longtemps et ça marche bien : (j'importe sur un fichier excel avec mise en forme, environ 17000 lignes, en peut-être une minute !!)

Voici un exemple de code me permettant de faire des select et insert au niveau de mes tables (moi je suis sous foxpro) :

'PROCEDURE AFFICHANT LE RESULTAT DES REQUETES
Sub SelectSQL()
    Dim nbrecord As Integer
    Dim req_select As String
    Dim rs As ADODB.Recordset
    
    On Error GoTo SelectSQL_Error
        nbrecord = 0
        req_select = "SELECT * FROM client"
        'On déclare le recordset
        Set rs = New ADODB.Recordset
        'Exécute la requête
        rs.CursorLocation = adUseClient
        rs.Open req_select, CONNECT_FOXPRO, adOpenStatic, adLockReadOnly, adCmdText

        'On efface l'ensemble du contenu précédent
        Workbooks(NOM_FIC).Worksheets("Affichage").Cells.Clear
        
        'On vérifie que l'on a bien récupéré des enregistrements
        If Not rs.EOF Then
            rs.MoveFirst
            Workbooks(NOM_FIC).Worksheets("Affichage").Cells(1, 1).CopyFromRecordset rs
            'On récupère le nombre d'éléments traités :
            nbrecord = rs.RecordCount
            MsgBox "Import de " & nbrecord & " enregistrement(s) !"
        End If

        ' Ferme le jeu d'enregistrements s'il est toujours ouvert
        rs.Close
    
        Set rs = Nothing

   On Error GoTo 0
   Exit Sub

SelectSQL_Error:
    MsgBox "(Erreur n°" & Err.Number & ") " & Err.Description
    FLAG_ERREUR = True
End Sub


'FONCTION PERMETTANT D'INSERER LES DONNEES DANS LES TABLES
Sub InsertSQL()
    Dim req_insert As String

    On Error GoTo InsertSQL_Error

        req_insert = ""
        req_insert = req_insert & "INSERT INTO client(NUMCTR,CTRRAT,NOMCTR,NUMTVA,TYPACT,ADRPLG,ADRDRG,CODPOS,VILCLI,CODPAY,NUMTEL,NUMFAX,CODLAN,CODBAN,CODGUI,CPTBAN,CLEBAN,NOMCOM,CODMON,MOYPAI,NOMORG,ADRORG,ADRORG1,VILBAN,NOMTIT,DATSAI,DATSIG,FRSTRA,ADRFIS,ADRFIS1,FLGACT,FRSADH,DATDMD,FRSFOR,DATDEL,DATCIF,DATDPG,FLGBLQ,CODSWI,RESACT,RESEUR,MNTDGI,MNTDGE,TIPFRA,FLGEUR,CTCCLI,EMACLI,RDJCLI,LQJCLI,FLGPRP,DATENV,NUMPRP,CMTCLI,ADRPOS,ADRPOS1,CODPOS1,VILPOS,DATBLQ,FLGDLG,REFCTR,WEBUTI,WEBPAS,CODUTI,DATMOD,CMTDGP,IBAN,RESTIPFRA,DATRESACT,DATRESEUR,PAYBAN,FLGDPG,NUMPOR,FORCPT,NUMCCN,PAYPOS,RESTIPESP,TIPESP,NUMFCN,DATCRE,DATTRS,UTICRE,UTITRS,NUMSIR,ACCSVN,RESACCSVN,PORWEB)"
        req_insert = req_insert & " VALUES ('999999','123456','GARNIER Florian','FR454545454','TRANSPORT INTERNATIONAL DE MARCHANDISES','65 KINGSTON ROAD','KINGSTON Bld Station','44120','Vertou','FRA','0044.0645.545.445','0468284612','FRA','010101','00044','11111111','55','AS24 FR','EUR','Virement','BPBA','P/O BOX44','POOLE','KINGSTON','Test - Test Ajout',{^2005/06/18},{^2005/07/18},0.00,'TEST_ADR','TEST_ADR2',0,0,{^1900/01/01},0,{^1989/08/28},{^1995/02/15},{^1998/04/28},0,'BARCGB22',0,1,0.00,0.00,1,1,'TACTAC','test@test.fr',0,0,0,{^1999/03/24},'918456','Memo','13 rue machin chose','RUE MACHIN CHOSE','44120','NANTES',{^2002/03/04},0,'E1','fffffg','aaaaa','FG',{^2004/10/24},'','FR7618829224130086560464044',1,{^2008/03/24},{^2004/03/15},'GBR',0,'1234567890',2,'0007','FRA',0,0,'0007',{^2004/03/04},{^2004/03/04},'','','234598761',0,0,0)"
        
        'On exécute l'insert
        'adCmdText : correspond à la définition textuelle d'une commande
        'adExecuteNoRecords : à préciser lorsqu'une requête ne renvoie pas d'enregistrements ou lorsque l'on ne souhaite pas les récupérer.
        CONNECT_FOXPRO.Execute req_insert, adCmdText + adExecuteNoRecords
    On Error GoTo 0
    Exit Sub

InsertSQL_Error:
    MsgBox "(Erreur n°" & Err.Number & ") " & Err.Description
    FLAG_ERREUR = True
    
End Sub



Je ne sais pas si tu seras plus avancé, mais c'est tout ce que je peux faire pour toi ! Si, il faut que tu adapte la variable CONNECT_FOXPRO en fonction du type de connexion que tu fait : peut-etre déclarer deux connexions du type :

Dim CONNECT_SQLSERV As ADODB.connection
Dim CONNECT_ACCESS As ADODB.connection


Tu devrais te renseigner sur le protocole ADO en tout cas, il tend à rempalcer ODBC !

Dans l'espoir de t'avoir un peu avancé !

Peace


 
0
cs_akzo Messages postés 133 Date d'inscription dimanche 23 juin 2002 Statut Membre Dernière intervention 3 janvier 2015 3
11 sept. 2010 à 14:37
Salut,
J'ai essaye la méthode de c148270 cela effectue bien ce que je voulais mais dans la meme table le probleme c'est que que j'ai en faite deux bases une en reseau et l'autre en local dont les chemins de connection sont :


Pour connection sur le seveur:
ConnServeur.ConnectionString = "provider=sqloledb.1;user id = ***;password=***;data source=NomServeur;initial catalog = mabaseServeur"


Pour la connection sur mon poste (une base de donnée local)
Chemin base="C:\Mon Prog\MaBase.mdb"
CnxAdo.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CheminBase & ";Persist Security Info=False;Jet OLEDB:Database Password=***"

et je voudrais recuperer certain champs d'une table provenant de mabaseserveur et les copier dans ma table de MaBase.mdb

Merci à vous,
Bonne continuation
Ps:Meme si c'est pas tout à fait ce que je recherchais je valide l'idée
0
c148270 Messages postés 303 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 3 octobre 2013 1
13 sept. 2010 à 09:42
bonjour

Normalement les tables peuvent être liée quelque soit le "serveur" (serveur et ou base local)
la requête devient alors

INSERT INTO matablebaselocale
SELECT matablebaselocal.*
FROM matableserveur, matablebaselocale
WHERE (((matableserveur.Id_Activite)=3));

ceci dans le cas ou il y concordance entre les noms de champs
Sino il faut spécifier les champs du genre

INSERT INTO matablebaselocale( nomduchamprecepteur1, nomduchamprecepteur2 )
SELECT matableserveur.nomduchamporigine1, matableserveur.nomduchamporigine2
FROM matableserveur, matablebaselocale
WHERE (((matableserveur.Id_Activite)=3));

Pour obtenir une écriture sql facilement, construire la requête avec l'assistant puis demader l'affichage sql
il suffit alors de faire un copier/coller dans le code.

Je suis d'accord avec garnierflorian qu'il vaut mieux utiliser ADO plus récent si c'est possible.
Pour ma part mes appli sont distribuées sur des postes dont les niveaux sont différents. Il faut donc que je reste au niveau le plus bas.
Celà m'empêche aussi d'utiliser des nouveautés plus performantes.

bonne journée
0
Rejoignez-nous