formateur informatique

Récupérer les données d'une base téléchargée

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Récupérer les données d'une base téléchargée
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
Sujets que vous pourriez aussi aimer :


Récupérer les données d'une autre base

A l'occasion des deux volets précédents, nous avons appris à télécharger un fichier distant et à le décompresser en local par le code VBA Access. Il en a résulté une base de données Access. Dans ce nouveau volet et pour parachever la solution, nous souhaitons accéder aux enregistrements de tables de cette base externe, pour les importer automatiquement dans la base de données en cours.

Base de données Access à télécharger
Pour terminer le développement, nous devons nous appuyer sur la base de données hébergeant les travaux précédents. Il est doté d'un sous-formulaire vierge pour l'instant. Il est censé restituer les données de la table societes. C'est précisément dans cette table que nous devons importer les enregistrements de la base de données téléchargée et décompressée.

Formulaire Access pour récupérer les informations d-une base de données téléchargée par le code VBA

A ce titre, si vous cliquez sur le bouton de téléchargement dans l'entête du formulaire, vous obtenez bien dans le dossier de l'application, le fichier compressé téléchargé et la base de données résultante après décompression. Elle se nomme base-distante.accdb.

La procédure d'importation
Aux deux procédures VBA existantes, nous devons en ajouter une troisième. Elle doit donc se charger d'accéder aux enregistrements de la base de données externe. Bien sûr, elle devra être appelée après le téléchargement et la décompression pour que la récupération des informations soit automatisée. Vous notez la présence de deux procédures VBA. Elles se nomment respectivement telecharger_MouseUp et decompresser. La première se lance au clic sur le bouton du formulaire. Elle se charge du téléchargement du fichier distant et appelle la seconde. La seconde se charge de décompresser le fichier téléchargé.
  • Sous la procédure decompresser, créer la procédure recuperer, comme suit :
Sub recuperer(cheminFichier As String)

End Sub


Nous la déclarons avec un paramètre en attente. Il s'agit du chemin d'accès à l'archive zippée que nous devons lui transmettre. Nous l'exploiterons pour reconstituer le chemin d'accès au fichier décompressé. Seule l'extension change.

La déclaration des variables
Nous avons besoin de plusieurs variables pour réaliser cette importation de masse. Tout d'abord des objets sont nécessaires pour piloter la base de données en cours mais aussi la base externe et ses enregistrements. Nous avons aussi besoin d'une variable pour mémoriser la syntaxe SQL d'insertion des données. Enfin, nous avons besoin de variables pour stocker les informations des champs de la table externe que nous allons parcourir. ...
Dim cetteBase As Database: Dim baseDistante As Database
Dim enr As Recordset: Dim requete As String
Dim nom As String: Dim act As String: Dim dep As String: Dim ville As String: Dim cp As String
...


Nous commençons par déclarer deux objets de type Database pour manipuler les deux bases de données. L'objet de type Recordset doit servir à atteindre les enregistrements de la base externe. La variable requete typée comme un texte (As String) doit accueillir la syntaxe Sql d'ajout pour chaque enregistrement externe que nous allons parcourir. Les cinq dernières variables de texte doivent récolter les informations de chaque champ pour chaque enregistrement.

L'initialisation des variables
Maintenant que ces variables sont déclarées, il est question de procéder à l'initialisation de certaines. Nous devons pointer sur les deux bases de données mais aussi sur les enregistrements de la seconde.
  • Après les déclarations, ajouter les affectations suivantes :
...
cheminFichier = Replace(cheminFichier, ".zip", ".accdb")

Set baseDistante = OpenDatabase(cheminFichier)
Set enr = baseDistante.OpenRecordset("societes")
Set cetteBase = CurrentDb()
...


Tout d'abord, nous exploitons la fonction Replace pour remplacer l'extension zip par l'extension accdb et ainsi pointer sur le fichier de la base de données décompressée. Ensuite, c'est la méthode OpenDatabase avec le chemin d'accès au fichier (cheminFichier) qui permet d'initialiser l'objet baseDistante sur la base de données téléchargée. Dès lors, sa méthode héritée OpenRecordset permet d'initialiser l'objet enr sur les enregistrements de la table societes de cette base. Enfin, c'est la fonction CurrentDb qui permet d'initialiser l'objet cetteBase sur la base de données en cours.

Parcourir les enregistrements de la base externe
C'est une boucle Do à exercer sur l'objet enr qui est maintenant nécessaire pour parcourir un à un, tous les enregistrements de la base de données externe.
  • A la suite du code, créer la boucle Do comme suit :
...
enr.MoveFirst
Do

enr.MoveNext
Loop While Not enr.EOF
...


Nous exploitons tout d'abord la méthode MoveFirst de l'objet enr pour placer le pointeur de lecture sur le premier enregistrement de la table societes de la base de données externe. Ensuite, nous parcourons tous les enregistrements (Do Loop) jusqu'au dernier (While Not enr.EOF). C'est la propriété EOF (End Of File) de l'objet enr qui renvoie cette indication. Bien sûr, pour ne pas faire du sur place, à chaque passage dans cette boucle, nous déplaçons le pointeur de lecture sur l'enregistrement suivant, grâce à la méthode MoveNext de l'objet enr.

Récupérer les informations de champs
Les champs de la table societes, que ce soit pour la base en cours ou pour la base de données externe, portent les mêmes noms (societes_nom, societes_activite etc...). Ces deux tables ont logiquement la même structure. C'est la propriété Fields de l'objet enr qui permet de les atteindre.
  • Dans la boucle Do, avant la méthode MoveNext, ajouter les instructions VBA suivantes :
...
Do
nom = enr.Fields("societes_nom").Value
act = enr.Fields("societes_activite").Value
dep = enr.Fields("societes_departement").Value
ville = enr.Fields("societes_ville").Value
If IsNull(enr.Fields("societes_cp").Value) Then
cp = ""
Else
cp = enr.Fields("societes_cp").Value
End If


enr.MoveNext
Loop While Not enr.EOF
...


Pour l'enregistrement en cours d'analyse, nous stockons donc chaque information de champ dans les variables prévues à cet effet. A chaque passage, elles porteront des données différentes qu'il est donc question d'insérer entre temps dans la table societes de la base de données en cours. Vous notez que nous réalisons une gestion d'exception sur le dernier champ (societes_cp). Il porte en effet des valeurs nulles, soit des informations qui n'ont jamais été insérées. Pour ne pas compromettre le programme, nous exploitons la fonction de test logique IsNull. Si le test est concluant, nous insérons une donnée textuelle vide ("") dans le champ en question.

Insérer les données dans la table
A chaque fois que les données de champs sont récoltées, elles doivent être insérées dans la table de la base de données en cours, pour pouvoir porter l'analyse sur l'enregistrement suivant grâce à la boucle Do. Pour cela, nous devons construire une classique syntaxe SQL d'insertion.
  • Toujours à la suite de la boucle et avant le MoveNext, ajouter les instructions suivantes :
...
End If

requete = "INSERT INTO societes(societes_nom, societes_activite, societes_departement, societes_ville, societes_cp) VALUES ('" & nom & "','" & act & "','" & dep & "','" & ville & "','" & cp & "')"
cetteBase.Execute requete


enr.MoveNext
...


Nous insérons (Insert Into) dans la table societes, pour tous les champs qu'elle contient et énumérés dans l'ordre entre parenthèses, les informations (VALUES) correspondantes détenues par les variables que nous venons d'affecter. Toutes ces données sont textuelles. C'est pourquoi nous les encadrons de côtes. Mais comme la syntaxe est déjà écrite entre doubles côtes, nous alternons les simples et les doubles. Nous exécutons cette syntaxe sur la base de données en cours grâce à la méthode Execute.

Détruire les objets inutilisés
Comme il est de coutume à l'issue du traitement, nous devons fermer et détruire les objets qui ne sont plus utilisés. C'est ainsi que nous libèrerons la mémoire de l'ordinateur.
  • Après la boucle, ajouter les instructions VBA suivantes :
...
Loop While Not enr.EOF

enr.Close
baseDistante.Close
cetteBase.Close
Set enr = Nothing
Set baseDistante = Nothing
Set cetteBase = Nothing

...


Grâce à laméthode Close, nous fermons chacun des trois objets que nous détruisons dans l'enchaînement en les réinitialisant (Set) à Nothing.

Rafraîchir le sous formulaire
Nous n'en avons pas tout à fait terminé. Souvenez-vous, le sous-formulaire est lié à la table societes de la base de données en cours. Pour qu'il restitue les informations importées à l'issue du processus, sa vue doit être rafraîchie. Une méthode simple et transparente pour l'utilisateur consiste à fermer et rouvrir le formulaire parent.
  • A la fin de la procédure, ajouter les instructions VBA suivantes :
...
Set cetteBase = Nothing

DoCmd.Close acForm, "fRecup"
DoCmd.OpenForm "fRecup"


End Sub
...


L'objet DoCmd est décidément précieux en VBA Access. Grâce à sa méthode Close sur un objet de type formulaire (acForm), nous ordonnons la fermeture du formulaire fRecup. Grâce à sa méthode OpenForm, nous ordonnons sa réouverture immédiate. L'utilisateur n'y verra que du feu.

Appeler la procédure
Enfin et ne l'oublions pas, ce code VBA doit être appelé au clic sur le bouton du formulaire après le téléchargement et la décompression du fichier distant.
  • Dans la procédure telecharger_MouseUp, ajouter l'appel suivant :
...
flux.Close
decompresser chemin, CurrentProject.Path & "\"
recuperer chemin
Else
...


Nous l'appelons naturellement en lui passant le chemin d'accès à l'archive à décompresser.
  • Enregistrer les modifications (CTRL + S) et revenir sur le formulaire (ALT + Tab),
  • Puis, cliquer sur le bouton de téléchargement en haut du formulaire,
Comme vous pouvez l'apprécier, les enregistrements de la base de données distante sont importés en un temps record dans la base de données active. Pourtant et entre temps, le code VBA a aussi procédé à son téléchargement et à sa décompression.

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn