Mise à jour d’une base Access par fichier CSV ou Excel – Episode 5

Je continue la série d’articles sur l’importation de données CSV ou Excel dans Access.
Dans cet article : comment traiter le cas d’un fichier CSV dont le délimiteur est particulier ? Par exemple un point-virgule au lieu d’une virgule.
Si vous avez manqué le début
Relisez les articles précédents, si vous ne l’avez pas déjà fait. Sinon, rien ne marchera… 😉
Le fichier source
Cette fois, j’utilise une autre table (tbl Clients
) et le fichier CSV correspondant (clients.csv
). Mon souci principal est que le séparateur de champs, dans ce fichier, est le point-virgule… et je n’ai bien sûr par l’intention de modifier le fichier manuellement. 😉
"Numéro Client";"Titre";"Nom Client";"Prénom Client";"Adresse 1";"Adresse 2";"Code Ville";"Téléphone personnel";"Téléphone mobile";"Téléphone bureau";"Email";"Site web";"Remarques";"Date de création";"Date de modification";"Archiver" 1;"Madame";"KUNTZ";"Anne";"Impasse des Jambettes";;13;"03 11 12 13 14";;"03 12 13 14 15";"anne.kuntz@orange.fr#mailto:anne.kuntz@orange.fr#";;"";14/5/2007 12:25:40;14/5/2007 12:29:57;1 2;"Mademoiselle";"DELISLE";"Marie";"Résidence les Goélettes";;12;"01 07 08 09 10";;;"marie.delisle@sfr.fr#mailto:marie.delisle@sfr.fr#";;"";14/5/2007 12:30:34;13/7/2007 19:29:40;0 3;"Monsieur";"LAMARK";"Paul";"4, rue Bouchain";;1;"02 10 11 12 13";"06 70 71 72 73";;"paul.lamark@free.fr#mailto:paul.lamark@free.fr#";;"";14/5/2007 13:01:19;14/5/2007 13:04:10;0 4;"Monsieur et Madame";"MARTIN";"Yves";"109, avenue de Galbord";;2;"05 11 12 13 14";;;"yves.martin@free.fr#mailto:yves.martin@free.fr#";;"";14/5/2007 13:04:13;14/5/2007 13:05:59;0 5;"Monsieur et Madame";"KELLER";"Maxime";"8, boulevard Virures";;3;;"06 80 81 82 83";;"maxime.keller@free.fr#mailto:maxime.keller@free.fr#";;"";14/5/2007 13:06:02;14/5/2007 13:08:20;0 6;"Monsieur et Madame";"HERMAND";"Marc";"Traverse Les Barrots";;4;"04 08 09 10 11";;"04 09 10 11 12";"marc.hermand@sfr.fr#mailto:marc.hermand@sfr.fr#";;"";14/5/2007 13:08:23;14/5/2007 14:29:09;0
Le principe
D’une manière générale, si le fichier CSV n’est pas complètement standard (séparateur, colonnes à importer, format des dates…), l’idée est de créer une spécification d’importation, et de l’utiliser au moment de l’importation.
Cet article ne détaille pas le principe des spécifications d’importation, mais elles sont traitées sur cet autre article du blog. Dans ce qui suit, je dispose d’une spécification appelée « Import Clients
« , dont la forme est :
Le code de test
Pour tester tout ça (à supposer que vous ayez le fichier Clients.csv
de départ), ajoutez cette procédure dans le module mod Tests TableUpdater
(que vous avez créé dans les articles précédents) :
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 |
' --- ' TEST DE MISE A JOUR DE TABLE - CLIENTS ' --- ' Sub TestTableUpdaterClients() Dim tu As TableUpdater Dim strMessage As String ' Initialiser un TableUpdater Set tu = New TableUpdater With tu ' Fichier à importer (chemin, type, version) .Source = SourcePath() & "Clients.csv" .SourceType = Csv ' Informations sur les données .Headers = True .Target = "tbl Clients" .TempTable = "tbl Clients TEMP" .ImportSpecs = "Import Clients" ' Importation .Import End With ' Message final BilanImportation tu ' Libérer les ressources Set tu = Nothing End Sub |
La nouveauté est la ligne qui précise d’utiliser nos spécifications d’importation :
20 |
.ImportSpecs = "Import Clients" |
Sans les spécifications d’importation, le séparateur de champs ne serait pas reconnu, et l’importation échouerait :
Et comme l’importation échoue, Access crée une table d’erreurs appelée ici Clients_ImportErrors
qui liste les enregistrements fautifs (tous !).
Clients.csv
.
Bonjour, je voulais télécharger le fichier test de cet article mais dans la section téléchargement il n’y apparait pas.
J’ai toujours une erreur 3 clé primaire, et j’ai beau tout essayer ça ne fonctionne pas alors je voulais comparer avec votre fichier pour trouver l’erreur.
Le fichier test n’est effectivement pas dans la section Téléchargements. Pour le récupérer, il suffit :
1. De sélectionner directement le code dans cet article (paragraphe « Le fichier source »).
2. De le copier.
3. De le coller dans un éditeur de texte (du type PSPad ou Notepad++).
4. D’enregistrer avec une extension .csv ou .txt.
bonjour
comment je peux faire ma mise a jour dans ma table en gardant toujours l’anciennes mise a jour sachant que mon fichier CSV il a une clé primaire pour chaque employee
j’ai fais tous ces épisodes mais j’ai trouver que la mise a jour ecrase toujours les données qui existe déjà
merci d’avance !
merci d’avance
Ce qui doit se passer, en principe :
– Les employés avec une clef existante dans la table vont être mis à jour.
– Les employés dont la clef n’existe pas vont être ajoutés à la table.
Si j’ai suivi ta question : il est normal qu’une mise à jour remplace les données déjà existantes dans la table.
Qu’est-ce que tu appelles « garder l’ancienne mise à jour » ?
Merci de votre répense
garder les anciennes mise a jour ça veut dire garder les données qui existe déjà dans la table
par exemple si je fais une mise a jour des employees avec leurs données de mois Juillet, la prochaine mise a jour du mois Aout elle doit ajouter a nouveau les même employees avec leur données mais de garder aussi les données du mois Juillet et ainsi de suite 🙂
( pour moi la mise a jour doit ajouter des lignes et non pas ecrasser les lignes qui existes dejà par ce que meme si j’ai mis la ligne CurrentDb.Execute « DELETE * FROM [Table1] » ) en commentaire la mise a jour exrasse toujours les données qui existe déjà par ce qu’elle trouver que la clé primaire existe déjà !!
je doit obtenir au final par exemple
ID,Nom,Prenom,heure_de_travail,période
Id1,nom1,prenom1,45,juillet
Id2,nom2,prenom2,43,juillet
id1,nom1,prenom1,40,Aout
id2,nom2,prenom2,42,Aout
j’éspère que j’ai détaillé le mieu possible mon problème 😀
En fait, le problème ne vient pas de l’importation CSV. Il s’agit plutôt d’un problème de conception de la base : avec ta structure, il est impossible de créer plusieurs lignes par employé (puisque la clef primaire doit être unique dans la table).
Il faut revoir ton schéma de relations : 1 employé peut être lié à plusieurs périodes de travail, et 1 période de travail précise n’est liée qu’à un seul employé. Tu as donc besoin de 2 tables :
– Les employés
– Les périodes de travail
Avec une relation « 1 à plusieurs » entre les deux. A partir de là, on peut gérer autant de périodes de travail qu’on le souhaite, pour chaque employé.
Bonjour Hervé Inisan
un problème au niveau de la spécification d’importation
quand j’exécute le code il me donne l’erreur #5 : erreur d’imporation
et quand je met la ligne « 20 » en commentaire il me donne l’erreur numero #6
j’ai esseayé aussi avec la table « tbl Destinataires Newsletter » et le meme problème existe toujours
Est-ce qu’il peut y avoir une erreur sur le nom de la spécification ? Sur un réglage de la spécification ?
J’ai enregister les spécifications et j’ai pu éviter les erreur #5 et #6
mais là ! je rencontre une autre erreur situer dans le module tableupdater
dans le bloc de « suppression des objets temporaires »
voilà la ligne mentionnée en jaune : CurrentDb.QueryDefs.Delete UPDATE_QUERY
L’erreur se produit même alors qu’il y a un On Error Resume Next avant ?
merci infiniment pour votre aide
la méthode fonctionne correctement mais comment je peux l’appliquer a une table qui contient 2 colonnes qui ont le meme Nom
j’ai essayé mais il m’a afficher l’erreur » #6 : erreur d’insertion des lignes »
et quand j’ai vérifié la table temporaire j’ai trouvé que le nom de la 2eme colonne s’appel ( Champ ) et non pas son vrai nom
Une table ne peut pas avoir 2 colonnes de même nom. Le fichier CSV de départ a 2 en-têtes identiques ?
(si oui, il faut le modifier avant l’importation)
oui le fichier CSV de départ a 2 en-têtes identiques
-je fais l’exportation de fichier CSV depuis un autre système chaque mois et le ce fichier contient plus de 50 colonnes
-je ne peux pas accéder au système pour modifer ses colonnes
est ce qu’il ya une solution a part la modification des en-têtes identiques chaque mois ?
Il faut effectivement modifier les titres de colonnes du CSV à chaque fois, avant intégration dans Access. Soit manuellement, soit par code (avec les fonctions de fichier VBA).
ratapoilu > Est-ce qu’il peut s’agir d’un autre problème ? Par exemple, est-ce que la date cible a une clef primaire de type NuméroAuto ?
Bonjour,
J’ai suivi tout ce qui est notifié, j’ai créé mon propre fichier csv (qui s’appelle affaire.csv avec des points virgule), j’ai enregistré une importation (Import Affaire), je l’appel bien dans la nouvelle procédure TestTableUpdaterClients, j’ai créé une table correspondante, et quand je lance la procédure de test le message erreur 6 apparait tout de meme.
J’ai essayé d’executer l’importation que j’ai créé et cela fonctionne très bien. Je ne vois pas ou il peux y avoir une erreur. Pour info, je suis sous access 2013, avec Win 7 64 bits