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 :

Select from SQL Server into Access table


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Blaede
    Profil pro
    Inscrit en
    Août 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 120
    Par défaut Select from SQL Server into Access table
    Bonjour à tous,

    J'ai un fichier .txt qui contient une liste de numéros.
    Je parcours le fichier ligne par ligne et pour chaque numéro je voudrais faire :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT a, b, c
    FROM SQLServer_table
    INTO Access_table
    WHERE SQLServer_table.id_numero = numero

    SQLServer_table est donc une table qui se trouve sur une instance SQLServer 2005 et Access_table est une table dans la DB Access dans laquelle se trouve le code VB.

    Parcourir le fichier n'est pas un problème mais je n'arrive pas à exécuter la commande et gérer les connections aux deux DB.

    Pourriez-vous m'aider ?

    D'avance merci !
    Blaede

  2. #2
    Expert confirmé
    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
    Par défaut
    Bonsoir,

    Je vois deux approches possibles.

    1. Avec une table liée ODBC.
      Access_table : table Access locale
      dbo_SQLServer_table : table liée ODBC vers table SQL Server SQLServer_table
      Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      Dim strSQL As String
      Dim db as DAO.Database, lRecs As Long
       
      set db=currentDb
       
      strSQL ="INSERT INTO Access_table (a, b, c) " & _
      "SELECT a, b, c " & _
      "FROM dbo_SQLServer_table " & _
      "WHERE dbo_SQLServer_table.id_numero = " & numero
      ' Exécution de l'instruction SQL
      db.Execute strSQL
      ' Nombre d'enregistrement(s) impliqué(s)
      lRecs = db.RecordsAffected
    2. Avec deux recordsets ADO.
      Dans cet exemple on recherche 7 code clients (type texte) dans une table SQL Serveur.
      Si un code client est trouvé, un enregistrement est ajouté à la table Access locale, avec les valeurs des champs de l'enregistrement SQL Server.
      Code vb : 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
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      Dim oCnSQLSvr As ADODB.Connection, rsSqlSvr As ADODB.Recordset
      Dim oCnAccess As ADODB.Connection, rsAcc As ADODB.Recordset
      Dim tab1() As Variant, i As Integer
      Dim strSql As String
       
      ' Réutilise connexion de la base de donnée Access
      Set oCnAccess = CurrentProject.Connection
      ' Nouveau recordset pour table Access
      Set rsAcc = New ADODB.Recordset
      rsAcc.CursorLocation = adUseClient
      ' Ouvre recordset sur table Access et fournit
      ' les paramètres du recordset via la méthode Open
      rsAcc.Open "Clients", oCnAccess, adOpenStatic, adLockOptimistic, adCmdTable
       
      ' Nouvelle connexion SQL Server
      Set oCnSQLSvr = New ADODB.Connection
      ' Etablit connexion à l'aide d'une chaîne de connexion
      oCnSQLSvr.Open "Provider=SQLOLEDB;Data Source=NomServeur\NomInstance;" & _
                     "Initial Catalog=NomBDD;Integrated Security=SSPI"
      ' Nouveau recordset pour SQL Server
      Set rsSqlSvr = New ADODB.Recordset
      ' Paramètres du recordset
      ' (on ne les fournira pas à la méthode open)
      rsSqlSvr.CursorLocation = adUseClient
      rsSqlSvr.CursorType = adOpenStatic
      rsSqlSvr.LockType = adLockReadOnly
      Set rsSqlSvr.ActiveConnection = oCnSQLSvr
       
      ' Liste des codes clients à chercher
      tab1 = Array("BERGS", "BLAUS", "ZZZZZ", "BOLID", "BONAP", "BOTTM", "BSBEV")
       
      For i = LBound(tab1) To UBound(tab1)
          ' Instruction SQL SELECT sur la table dbo.Clients du serveur SQL Server
          strSql = "SELECT CodeClient, Societe, Pays FROM dbo.Clients " & _
                   "WHERE CodeClient='" & tab1(i) & "'"
          ' Ouvre recordset sur Instruction SQL SELECT
          rsSqlSvr.Open strSql
          If Not rsSqlSvr.EOF Then
             ' Ajoute un enregistrement à la table Access
             rsAcc.AddNew
             rsAcc.Fields("CodeClient") = rsSqlSvr.Fields("CodeClient")
             rsAcc.Fields("Societe") = rsSqlSvr.Fields("Societe")
             rsAcc.Fields("Pays") = rsSqlSvr.Fields("Pays")
             rsAcc.Update
          End If
          rsSqlSvr.Close
      Next
       
      'Fermeture et libération des variables objets
      oCnSQLSvr.Close
      Set oCnSQLSvr = Nothing
       
      rsAcc.Close
      Set rsAcc = Nothing
      Set oCnAccess = Nothing


    La deuxième approche est plus rapide s'il y a beaucoup d'interrogations à faire sur le serveur SQL server.

    A+

  3. #3
    Membre confirmé Avatar de Blaede
    Profil pro
    Inscrit en
    Août 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 120
    Par défaut
    J'avais essayé la première solution mais le temps de réponse était beaucoup trop long et les données récupérées étaient incohérentes.

    La deuxième solution fonctionne parfaitement. Merci mille fois !
    Je n'aurais jamais trouvé ça tout seul

  4. #4
    Membre confirmé Avatar de Blaede
    Profil pro
    Inscrit en
    Août 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 120
    Par défaut
    Je profite de ce post pour poser une nouvelle question.

    Que dois-je modifier dans le code donné plus haut pour que le résultat de la requête soit affiché et non pas inséré dans une table Access ? (autrement dit chaque passage dans ma boucle ajouterait un record dans le record set mais sans faire d'insert dans une table et j'afficherais le contenu du record set en sortant de la boucle)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    While not EOF
    numero = readline
    SELECT a, b, c
    FROM SQLServer_table
    WHERE SQLServer_table.id_numero = numero
    WEND
     
    Afficher résultat final
    Encore merci pour votre aide !

  5. #5
    Expert confirmé
    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
    Par défaut
    Bonjour,

    Un recordset (ADO ou DAO) ne s'affiche pas.
    C'est un moyen logiciel de manipuler des données stockées dans des tables.
    Dans mon exemple, en remplissant le recordset rsAcc, je remplis la table Clients.
    C'est comme si je faisais des INSERT en SQL.

    Au lieu de remplir un recordset, tu pourrai remplir une zone de liste.
    Mais je trouve que le plus simple est de remplir une table.
    C'est quand même le support idéal dans une base de données pour stocker des données

    Ceci dit, voici mon deuxième exemple remanié pour remplir un recordset qui n'est rattaché à rien.
    Pas de connexion, pas de table ou requête source.
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Dim oCnSQLSvr As ADODB.Connection, rsSqlSvr As ADODB.Recordset
    Dim rsLst As ADODB.Recordset
    Dim tab1() As Variant, i As Integer
    Dim strSql As String
     
    ' Nouveau recordset ADO
    Set rsLst = New ADODB.Recordset
    rsLst.CursorLocation = adUseClient
    ' Crée les champs
    rsLst.Fields.Append "CodeClient", adVarChar, 5
    rsLst.Fields.Append "Societe", adVarChar, 40
    rsLst.Fields.Append "Pays", adVarChar, 15
    ' Ouvre le recordset sans connexion et sans source
    rsLst.Open
     
    ' Nouvelle connexion SQL Server
    Set oCnSQLSvr = New ADODB.Connection
    ' Etablit connexion à l'aide d'une chaîne de connexion
    oCnSQLSvr.Open "Provider=SQLOLEDB;Data Source=NomServeur\NomInstance;" & _
                   "Initial Catalog=NomBDD;Integrated Security=SSPI"
    ' Nouveau recordset pour SQL Server
    Set rsSqlSvr = New ADODB.Recordset
    ' Paramètres du recordset
    ' (on ne les fournira pas à la méthode open)
    rsSqlSvr.CursorLocation = adUseClient
    rsSqlSvr.CursorType = adOpenStatic
    rsSqlSvr.LockType = adLockReadOnly
    Set rsSqlSvr.ActiveConnection = oCnSQLSvr
     
    ' Liste des codes clients à chercher
    tab1 = Array("BERGS", "BLAUS", "ZZZZZ", "BOLID", "BONAP", "BOTTM", "BSBEV")
     
    For i = LBound(tab1) To UBound(tab1)
        ' Instruction SQL SELECT sur la table dbo.Clients du serveur SQL Server
        strSql = "SELECT CodeClient, Societe, Pays FROM dbo.Clients " & _
                 "WHERE CodeClient='" & tab1(i) & "'"
        ' Ouvre recordset sur Instruction SQL SELECT
        rsSqlSvr.Open strSql
        If Not rsSqlSvr.EOF Then
           ' Ajoute un enregistrement au recordset 'sans source'
           rsLst.AddNew
           rsLst.Fields("CodeClient") = rsSqlSvr.Fields("CodeClient")
           rsLst.Fields("Societe") = rsSqlSvr.Fields("Societe")
           rsLst.Fields("Pays") = rsSqlSvr.Fields("Pays")
           rsLst.Update
        End If
        rsSqlSvr.Close
    Next
     
    'Fermeture et libération des variables objets
    Set rsSqlSvr = Nothing
    oCnSQLSvr.Close
    Set oCnSQLSvr = Nothing
    A la fin de ce code, je me retrouve avec les résultats des requêtes successives dans le recordset rsLst.
    Admettons que j'ai un formulaire ouvert fmList ayant une zone de liste lstResultat.
    Voici comment copier le recordset dans la zone de liste lstResultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim strLst As String
     
    If rsLst.RecordCount > 0 Then rsLst.MoveFirst
    strLst = rsLst.GetString(adClipString, , ";", ";", "")
    Forms!fmList!lstResultat.RowSourceType = "Value List"
    Forms!fmList!lstResultat.ColumnCount = 3
    Forms!fmList!lstResultat.RowSource = strLst
    Voila, c'est tout ce que j'ai comme idée.

    Ha non. Une autre idée : Créez des formulaires sans table avec le Data Shaping ADO

    A+

  6. #6
    Membre Expert

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 186
    Par défaut
    Ou bien, tu crées une requète SQL Direct et tu t'en sers comme source de ton formulaire.
    (ce qui fait un peu moins usine à gaz)
    [Access] Les bases du débogage => ici

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

Discussions similaires

  1. [AC-2003] INSERT INTO de SQL SERVER vers ACCESS en ADO
    Par FMJ dans le forum VBA Access
    Réponses: 6
    Dernier message: 05/11/2009, 17h31
  2. Lier une table sql server dans access
    Par PICANTO dans le forum Access
    Réponses: 1
    Dernier message: 11/04/2007, 11h42
  3. Réponses: 1
    Dernier message: 04/03/2007, 15h40
  4. lier une table Sql Server sur Access
    Par JerBi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/01/2006, 16h27
  5. Transferer une table de SQL Server vers Access
    Par Oluha dans le forum Bases de données
    Réponses: 18
    Dernier message: 24/06/2005, 10h53

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