|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Expert-comptable Inscription : février 2007 Messages : 53 ![]() |
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. |
|
|
00
|
|
|
#2 | ||
|
Membre éprouvé
![]() Jean-Yves DUMASConsultant informatique Inscription : juin 2010 Messages : 325 ![]() |
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'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!si tout est OK, n'oubliez pas de cliquer sur
|
||
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Expert-comptable Inscription : février 2007 Messages : 53 ![]() |
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 |
|
|
00
|
|
|
#4 |
|
Membre éprouvé
![]() Jean-Yves DUMASConsultant informatique Inscription : juin 2010 Messages : 325 ![]() |
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.
__________________
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!si tout est OK, n'oubliez pas de cliquer sur
|
|
|
00
|
|
|
#5 | |
|
Membre éprouvé
![]() Jean-Yves DUMASConsultant informatique Inscription : juin 2010 Messages : 325 ![]() |
Citation:
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
__________________
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!si tout est OK, n'oubliez pas de cliquer sur
|
|
|
|
00
|
|
|
#6 | ||||||
|
Invité régulier
![]() Expert-comptable Inscription : février 2007 Messages : 53 ![]() |
Encore merci pour ton attention et ton aide dumas.blr.
Voici des réponses à tes questions : Citation:
Citation:
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 :
Code :
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 ? |
||||||
|
|
00
|
|
|
#7 |
|
Membre éprouvé
![]() Jean-Yves DUMASConsultant informatique Inscription : juin 2010 Messages : 325 ![]() |
Bonjour rcan7412,
Ayant des impératif, je ne pourrai pas te répondre complètement tout de suite. Je voulais juste savoir si le fichier societes.dbf était toujours utilisé dans ton projet ? Dans ce cas, on peut lier la table de manière permanente et l'utiliser pour alimenter la listbox/combobox. Il resterait juste à effectuer un rafraichissement dynamique sur la table cible (chose qui est déjà présente dans mon code).
__________________
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!si tout est OK, n'oubliez pas de cliquer sur
|
|
|
00
|
|
|
#8 | ||
|
Invité régulier
![]() Expert-comptable Inscription : février 2007 Messages : 53 ![]() |
Re,
Citation:
Citation:
A te lire |
||
|
|
00
|
|
|
#9 |
|
Membre éprouvé
![]() Jean-Yves DUMASConsultant informatique Inscription : juin 2010 Messages : 325 ![]() |
Très bien,
Peux-tu commencer à : - lier ta table societes.dbf dans ta BDD (en utilisant le ruban "données externes") - créer ton formulaire de choix de la BDD cible avec la listbox ou combobox ? Après, on pourra passer à la deuxième partie. A bientôt sur le forum
__________________
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!si tout est OK, n'oubliez pas de cliquer sur
|
|
|
00
|
|
|
#10 | ||
|
Invité régulier
![]() Expert-comptable Inscription : février 2007 Messages : 53 ![]() |
Bonjour,
Voilà, j'ai donc lié la table societes.dbf (elle l'était déjà) et j'ai crée un formulaire qui reprend une combobox qui permet de choisir le client. J'alimente la combobox avec cette requête : Code :
J'ai également une textbox qui affiche le nom du sous répertoire. Je joins en annexe une image écran du formulaire. ![]() Voilà est-ce en ordre ? Merci |
||
|
|
00
|
|
|
#11 | ||
|
Membre éprouvé
![]() Jean-Yves DUMASConsultant informatique Inscription : juin 2010 Messages : 325 ![]() |
Bonjour rcan7412,
J'espère avoir un peu de temps à te consacrer aujourd'hui, mais ce n'est pas garanti. Le chemin est renseigné. C'est bien. il serait encore mieux d'y faire figurer le chemin complet (ex : c:\documents\essai), car nous en avons besoin pour actualiser la connexion. si la racine de base reste identique, ce n'est pas grave, mais c'est moins maintenable. Les opérations suivantes seront à réaliser :
ces opérations seront codées dans la procédure du validerbouton_click (ou équivalent) Voici un squelette de code sur lequel travailler Code :
N'hésite pas à demander plus de précisions si besoin est
__________________
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!si tout est OK, n'oubliez pas de cliquer sur
|
||
|
|
00
|
|
|
#12 | ||
|
Invité régulier
![]() Expert-comptable Inscription : février 2007 Messages : 53 ![]() |
Bonjour Dumas.blr,
Pas évident de tout bien comprendre ! Je confirme que la racine de base est identique pour tous les clients. Je ne vois autrement comment faire figurer le nom complet. Dans le fichier dossier.dbf le champ path n'indique que le nom du sous-dossier du client. Je ne peut pas modifier le contenu de ce champ car il sert à l'application externe. Peut-être ta remarque vaut seulement pour le code vba ci-après. J'ai donc créé un bouton dans mon formulaire à laquelle j'ai attaché la procédure événementielle . Petite question : "sub" ou "private sub", la nuance est importante ? J'ai glissé le reste du code dans un module. Si j'ai bien compris on va rendre dynamique l'attache de la table "balance.dbf" du client choisi. Le nom d'attache de cette table sera "Accueil" ? Je sèche un peu sur ce code : Code :
Code :
dirTab = "c:\evolution\<F_clients.CHEMIN>" Le nom du formulaire : F_clients Le nom du champ du formulaire à récupérer : CHEMIN Dois-je adapter autre chose ? En cliquant sur le bouton, il y a une erreur 3265 "élément non trouvé dans cette collection" Sur débogage, il m'arrête sur la ligne suivante : bds.TableDefs.Delete ("Accueil") 'suppression du lien Merci pour tes lumières. |
||
|
|
00
|
|
|
#13 | |
|
Membre éprouvé
![]() Jean-Yves DUMASConsultant informatique Inscription : juin 2010 Messages : 325 ![]() |
Ouppsss !!
Je suis allé un peu vite dans le nettoyage de mon code ! En préambule, une petite question : est-tu familiarisé avec la programmation VBA ? La nature de tes question me fait penser le contraire. Dans ce cas, je te conseille de lire les FAQ et tutoriels associés sur le forum. Ils sont très bien fait. Regarde par exemple ici. Tout d'abords pour la procédure événementielle : Ne touche pas au sub. Il vaut mieux qu'il reste Private. Cela signifie que la portée de ta procédure sera limitée à ton formulaire. Si tu veux qu'un procédure/fonction soit visible sur l'ensemble d'un projet, il vaut mieux la mettre en PUBLIC, mais aussi, il faut la mettre dans un module externe. Ensuite, sur les procédures et fonctions au niveau module : 1. Quand j'écris <formulaire.chemin>, cela signifie que tu doit remplacer cet chaine de caractère par la variable issue de ton formulaire Par exemple, si ton formulaire possède un controle nommé "chemin", utilise la variable me.chemin (ou me!chemin. N'hésite pas à utiliser les listes de choix proposées. Dans ce cas j'écrirais alors 2. pour la suppression du lien : Il fallait lire bien sur Code :
bds.TableDefs.Delete ("balance") 'suppression du lien Citation:
NB : C'est pour cela que je t'ai conseillé d'écrire une routine de gestion d'erreur : en effet, il se peut très bien (en tout cas, pour la première fois) que tu n'aie pas encore lié ta table BALANCE à ta base de donnée. Cette erreur est donc "normale", et ne devrait pas interrompre l'exécution de ton traitement. Il faut donc intégrer une routine de gestion d'erreur de type ON ERROR (regarde l'aide Access si tu ne connais pas la syntaxe, ainsi que les FAQ et tutos du forum)
__________________
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!si tout est OK, n'oubliez pas de cliquer sur
|
|
|
|
00
|
|
|
#14 |
|
Invité régulier
![]() Expert-comptable Inscription : février 2007 Messages : 53 ![]() |
Re-
Oui, me voilà démasqué. Effectivement je ne suis pas familié avec la programmation et de surplus avec le VBA. J'ai suivi quelques formations rudimentaires en VBA pour EXCEL mais c'est tout. Tu pourras le constater, mon métier s'éloigne du tien. Je voudrais consacrer toute mon énergie à établir des requêtes et états sur base des données produites par la fameuse application externe qui est un progiciel de comptabilité. Mais pour faciliter l'automatisation quelques procédures en VBA devraient me suffire. Excel offre l'avantage d'être plus accessible au profane mais dès qu'on souhaite aller plus loin avec une base de données relationnelle, access semble incontournable. J'ai pu obtenir en excel vba le résultat escompté (obtenir de manière dynamique des données stockées dans fichiers dbf et gérés par un logiciel externe) que je n'arrive pas à concrétiser en access. Je tâcherai de prendre un peu de temps sur les tutoriels du site pour me familiariser avec cette programmation. Pour revenir à mon projet, j'ai suivi tes instructions mais le résultat est le même (erreur 3265). |
|
|
00
|
|
|
#15 | |
|
Membre éprouvé
![]() Jean-Yves DUMASConsultant informatique Inscription : juin 2010 Messages : 325 ![]() |
Dammned, Sherlock Homes a encore frappé ...
![]() ![]() Concernant ton erreur 3265, te rappelles-tu ce que j'avais noté ? Citation:
__________________
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!si tout est OK, n'oubliez pas de cliquer sur
|
|
|
|
00
|
|
|
#16 |
|
Invité régulier
![]() Expert-comptable Inscription : février 2007 Messages : 53 ![]() |
Bonjour,
J'ai attaché la table manuellement et j'ai un autre code d'erreur : erreur d'exécution 91 - variable objet ou variable de bloc With non définie il s'arrête sur cette expresse : Cnn.Close, juste aprsè celle-ci : bds.TableDefs.Delete ("BALANCE") 'suppression du lien Or j'ai attaché la table au préalable ? |
|
|
00
|
|
|
#17 |
|
Membre éprouvé
![]() Jean-Yves DUMASConsultant informatique Inscription : juin 2010 Messages : 325 ![]() |
Et oui ... le ménage du code n'a pas été bien fait ...
![]() ![]() Tu peux supprimer cette instruction que j'ai oublié d'enlever. N'oublie pas de ré-attacher ta table (parce ça, cç s'est bien passé !!!)
__________________
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!si tout est OK, n'oubliez pas de cliquer sur
|
|
|
00
|
|
|
#18 |
|
Invité régulier
![]() Expert-comptable Inscription : février 2007 Messages : 53 ![]() |
Bonjour,
Sorry, je n'ai pas pu répondre plus tôt. Faut-il supprimer uniquement l'expression : Cnn.Close ? En le faisant, j'ai encore un message d'erreur : Erreur de compilation : type défini par l'utilisateur non défini et il s'arrête sur : Dim RetCherchAccueil As MSA_OUVRIRNOMFICHIER Dans la procédure : Sub attacherTable() Pas facile pour moi tout ça |
|
|
00
|
|
|
#19 |
|
Membre éprouvé
![]() Jean-Yves DUMASConsultant informatique Inscription : juin 2010 Messages : 325 ![]() |
Bonjour,
si RetCherchAccueil n'est pas utilisé dans le reste du code, tu peux supprimer cette déclaration. A l'origine, cette variable était déclarée (ainsi que le type MSA_OUVRIRNOMFICHIER) pour récupérer la sélection d'un répertoire à partir de la fenêtre explorateur de windows. Comme ton répertoire est diectement renseigné dans ta table .DBF, tu ne devrais pas en avoir besoin
__________________
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!si tout est OK, n'oubliez pas de cliquer sur
|
|
|
00
|
|
|
#20 |
|
Invité régulier
![]() Expert-comptable Inscription : février 2007 Messages : 53 ![]() |
J'ai la poisse !
Arrêt sur me. Erreur de compilation : utilisation incorrecte du mot clé Me |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com