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 :

Comment faire une requête sur des tables DBF de même nom mais stockées dans des répertoires différents ?


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Expert-comptable
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Expert-comptable
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Par défaut Comment faire une requête sur des tables DBF de même nom mais stockées dans des répertoires différents ?
    Bonjour,

    J'ai du mal à démarrer un projet de base de données de par la conception dynamique.

    Je souhaiterais établir différents états dans une BDD ACCESS basés sur des données qui sont stockées dans des fichiers de structure DBF. Ces fichiers DBF de même nom sont présents dans des répertoires différents. Pour ne pas à devoir attacher ou importer toutes ces tables DBF dans une BDD ACCESS, je voudrais en rendre l'accès dynamique à ces données via une requête SQL par code VBA.

    J'ai déjà pu mettre en place un système comparable en XL avec du code VBA grâce à de l'aide mais en ACCESS, je manque totalement de notions.

    Voici le shema :

    Les tables DBF :

    Répertoire principal de stockage: c:\données

    Sous-répertoires de stockage des tables DBF :

    c:\données\client1\table.dbf
    c:\données\client2\table.dbf
    c:\données\client3\table.dbf
    c:\données\client4\table.dbf
    ....


    Je dispose également d'une table DBF que j'ai attaché dans la BDD ACCESS et qui stocke dans un champ les noms de dossiers (sous-répertoires) mais pas le chemin du répertoire principal (c:\données). Cette table est mise à jour dans une autre application :
    c:\données\clients.dbf > champ "PATH" qui contient (client1, client2, client3,...)

    Ma question :
    Comment afficher une requête sql en VBA qui affiche le contenu du fichier table.dbf du client qui aurait été choisi via la table c:\données\clients.dbf ?

    En excel, j'utilise une combobox pour le choix du client alimenté par la table clients.dbf. Le choix du client sert ensuite à importer le fichier table.dbf concerné dans une feuille XL.

    D'avance merci pour vos lumières.

  2. #2
    Membre émérite Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 599
    Par défaut
    Bonjour rcan7412,

    J'avais développé un projet similaire il y a quelques année.
    Je te communique le module (à réimporter dans ton projet) d'attachement des tables. Il y aura surement du ménage et des adaptations à faire, mais il est parfaitement opérationnel.

    pour lancer les fonction, j'avais mis dans le formulaire de démarrage la procédure suivante :


    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
    Private Sub Form_Load()
      Me.TxtInfoRefTabAttache.Caption = ""
      ConnectX
        ' Essaie de voir si la base de données Accueil est disponible.
        If VérifierAttaches() = False Then
            ' Essaie de relier les tables; si cela rate,
            ' Solutions du développeur se termine.
            If RattacherTables() = False Then
               DoCmd.Close acForm, "Démarrage"
               Exit Sub
            End If
        End If
      Me.TxtInfoRefTabAttache.Caption = InfoTabAttache
     
    End Sub
    Tu n'aura plus qu'à l'adapter en demandant à l'utilisateur de choisir sur quelle base il souhaite se connecter.
    Fichiers attachés Fichiers attachés

  3. #3
    Membre confirmé
    Homme Profil pro
    Expert-comptable
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Expert-comptable
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Par défaut
    Bonjour Dumas.blr,

    Merci d'avoir répondu à mon post et de livrer ton projet.
    Comme précisé, je ne suis pas habitué à coder et j'avoue avoir du mal à comprendre ton code malgré le fait qu'il est commenté.

    Sans vouloir abuser, pourrais-je avoir un code VBA qui permet déjà l'affichage d'une requête basée sur un fichier DBF comme celui-ci c:\données\client1\table.dbf (avec CHAMP1, CHAMP2, CHAMP3) ou tout au moins un endroit où trouver mon bonheur.

    Je cherche de tout côté et je n'arrive pas à trouver ce préalable.

    Merci

  4. #4
    Membre émérite Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 599
    Par défaut
    Peux-tu nous communiquer le code VBA que tu avais écrit en Excel ?
    Je pense qu'il y a beaucoup d'éléments de code qui pourraient être réutilisés.

    L'avantage de la solution que j'avais implémenté est que je ne travaillais que sur une seule table liée. Je changeais juste la source de connexion par rapport au fichier .DBF, puisque la structure du fichier restait identique.

  5. #5
    Membre émérite Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 599
    Par défaut
    Sans vouloir abuser, pourrais-je avoir un code VBA qui permet déjà l'affichage d'une requête basée sur un fichier DBF comme celui-ci c:\données\client1\table.dbf (avec CHAMP1, CHAMP2, CHAMP3) ou tout au moins un endroit où trouver mon bonheur.
    Attention, si tu ouvre une requête via le VBA, tu sera obligé de gérer toutes les opérations d'accès en VBA par la suite, ce qui me parait une solution compliquée, surtout si tu n'est pas familiarisé avec la programmation.

    La solution la plus sage (pour moi), serait d'ajouter la nouvelle connexion (donc, dans le catalogue Access) sur ta table .DBF, et de travailler ensuite sur la table liée. La seule contrainte étant que les différentes tables .dbf auxquelles tu accèdent aient toutes une structure identique

  6. #6
    Membre confirmé
    Homme Profil pro
    Expert-comptable
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Expert-comptable
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Par défaut
    Encore merci pour ton attention et ton aide dumas.blr.

    Voici des réponses à tes questions :
    La solution la plus sage (pour moi), serait d'ajouter la nouvelle connexion (donc, dans le catalogue Access) sur ta table .DBF, et de travailler ensuite sur la table liée.
    Y-a-t-il une procédure pour y parvenir ?

    La seule contrainte étant que les différentes tables .dbf auxquelles tu accèdent aient toutes une structure identique
    Là je confirme, car ces tables sont créées en externe par un logiciel comptable.

    Je te livre ci-après le code VBA d'excel :

    Un userform qui permettait de choisir le client et alimenté par une table dbf qui contient le sous-répertoire du client :

    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
    Private Sub Userform_Initialize()
    'Private Sub CommandButton1_Click()
    'necessite d'activer la reference Microsoft ActiveX Data Objects x.x Lib rary
    Dim Cn As ADODB.Connection
    Dim Rs As ADODB.Recordset
    Dim Chemin As String, Cible As String, laBase As String
     
    'Chemin = ThisWorkbook.Path
    Chemin = Sheets("Calcul").Range("REPEVOL")
    laBase = "societes.dbf"
     
    With ComboBox1
    .Clear 'suppression anciennes données dans combobox
    .ColumnCount = 4 'nombre de colonnes
    'Il y aura 4 colonnes dans ComboBox
    .ColumnWidths = "130;0;0;0" 'largeur colonnes
    End With
     
    Set Cn = New ADODB.Connection
    Cn.Open _
    "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & _
    Chemin & ";"
     
    'pour la recuperation des champs RAIS ,PATH ,DATEDEB,DATEFIN
    Cible = "SELECT RAIS,PATH,DATEDEB,DATEFIN FROM " & laBase & " ORDER BY RAIS ;"
     
    Set Rs = New Recordset
    Rs.Open Cible, Cn, adOpenKeyset, adLockOptimistic
     
    Do While Not Rs.EOF
    ComboBox1.AddItem Rs.Fields(0).Value 'champ RAIS
    ComboBox1.List(ComboBox1.ListCount - 1, 1) = Rs.Fields(1).Value 'champ PATH
    If Not Rs.Fields(2).Value = "" Then _
    ComboBox1.List(ComboBox1.ListCount - 1, 2) = Rs.Fields(2).Value 'DATEDEB
    If Not Rs.Fields(3).Value = "" Then _
    ComboBox1.List(ComboBox1.ListCount - 1, 3) = Rs.Fields(3).Value 'DATEFIN
    Rs.MoveNext
    Loop
     
    Rs.Close
    Cn.Close
    End Sub
    Et voici la procédure d'importation des données du client choisi dans le userform ci-avant :

    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
    Private Sub ImportBalance()
    'Procédure d'importation du fichier balance.dbf
    Dim Cn As ADODB.Connection
    Dim Rs As ADODB.Recordset
    Dim Chemin As String, Cible As String, laBase As String
    Dim Fld As ADODB.Field
    Dim i As Integer
     
    If ComboBox1.ListIndex = -1 Then Exit Sub
     
    Chemin = "C:\evolution\" & ComboBox1.List(ComboBox1.ListIndex, 1)
    laBase = "Balance.dbf"
     
    'efface la feuille Balance
    Sheets("Balance").Select
    Range("A1").Select
    Selection.CurrentRegion.Select
    Selection.ClearContents
    Range("A1").Select
     
     
    Set Cn = New ADODB.Connection
    Cn.Open _
    "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & _
    Chemin & ";"
     
     
    Cible = "SELECT COMPTES, INTITULE, SOLDE FROM " & laBase & ""
     
    Set Rs = New Recordset
    Rs.Open Cible, Cn, adOpenKeyset, adLockOptimistic
     
    For Each Fld In Rs.Fields
    i = i + 1
    Sheets("Balance").Cells(1, i) = Fld.Name
    Next Fld
     
     
    Do While Not Rs.EOF
    Sheets("Balance").Range("A2").CopyFromRecordset Rs
    Loop
     
    End Sub
    Le shema thérorique détaillé en début de post adapté à mon exemple est le suivant :

    Les tables DBF :

    Répertoire principal de stockage: c:\evolution

    La table signalétique clients qui alimente le combobox dans le userform :
    c:\evolution\societes.dbf > champ "PATH" qui contient (client1, client2, client3,...)


    Sous-répertoires de stockage des tables DBF :

    c:\evolution\client1\balance.dbf
    c:\evolution\client2\balance.dbf
    c:\evolution\client3\balance.dbf

    Tous les fichiers balance.dbf ont donc la même structure.

    L'idée était comme dans un excel, d'avoir un formulaire alimenté par le fichier societes.dbf (signalétique client) pour faire le choix du client puis dès le choix opéré, afficher les données du fichier balance.dbf du client choisi avec requête éventuelle.

    Est-ce clair ?

Discussions similaires

  1. Comment faire une requête sur un intervalle
    Par niamo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 31/05/2010, 10h49
  2. Réponses: 4
    Dernier message: 29/12/2008, 09h04
  3. Comment faire une requête "AJOUT" multi-tables ?
    Par jinnk dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/01/2008, 09h26
  4. [BDE] Comment faire une requête sur 2 Ttables ?
    Par dim07 dans le forum Bases de données
    Réponses: 2
    Dernier message: 02/12/2006, 12h15
  5. faire une requête sur plusieurs tables
    Par julien.63 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 16/08/2006, 22h58

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