Import txt alimentant plusieurs tables Access

Fermé
Junior75002 Messages postés 4 Date d'inscription lundi 3 janvier 2011 Statut Membre Dernière intervention 3 janvier 2011 - 3 janv. 2011 à 12:50
blux Messages postés 26013 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 avril 2024 - 4 janv. 2011 à 09:21
Bonjour,

Je rencontre un problème, je réalise aujourd'hui un import de fichier .txt, cela fonctionne mais je voudrai le personnaliser via une petit « Macro » car cela me demande de nombreuses manipulations.

Je m'explique, je reçois plusieurs fois par jour des fichiers que je dois intégrer dans ma base Access pour alimenter plusieurs tables.

Voici mes différentes tables :

- Nomenclature (#100)

- Infos_cde (#300)

- Détails_cde (#400)

Ces tables doivent être alimentées par l'import d'un fichier texte nommé : « CDE_1140AAAAMMJJ CODE», contenant ceci :

#100||1140|20100501|01:05:01
#300|CS2010040052|20100430|0000|20100503|8|PADD RENNES|||LA HAIE GAUTRAIS||35170|BRUZ|FR|COL|CI60|||||SE|
#400|CS2010040052|1|805029|805029|1||17.00|
#400|CS2010040052|2|805028|805028|1||17.00|
#400|CS2010040052|3|808317|808317|1||30.00|
#400|CS2010040052|4|808455|808455|2||30.00|
#400|CS2010040052|5|806316|806316|1||30.00|
#400|CS2010040052|6|806320|806320|1||23.00|
#400|CS2010040052|7|806059|806059|1||30.00|
#400|CS2010040052|8|806006|806006|1||23.00|
#400|CS2010040052|9|803978|803978|1||30.00|
#400|CS2010040052|10|806028|806028|1||30.00|
#400|CS2010040052|11|801254|801254|1||30.00|
#400|CS2010040052|12|806029|806029|1||30.00|
#400|CS2010040052|13|806027|806027|1||30.00|
#400|CS2010040052|14|801103|801103|1||23.00|

Il faut donc que chaque ligne, alimente la table correspondant au code de début de ligne (#xxx).

J'ai donc déjà trouvé quelques lignes de code pour ouvrir une boite de dialogue me demandant de sélectionner le fichier à importer, le choix du séparateur de champ, ici « | ».

Mais je ne parviens pas à trouver la suite du code pour lui faire alimenter les tables adéquates.

Car pour le moment cet import n' alimente qu'une seule table, ce qui ne me convient pas tout a fait, car cela implique plusieurs manipulations ce qui est plus long. (Je reçois environs un fichier toutes les heures, donc je cherche a optimiser les traitements.)

Merci d'avance pour votre aide précieuse.

Amicalement,
Julien

A voir également:

3 réponses

blux Messages postés 26013 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 avril 2024 3 289
3 janv. 2011 à 12:55
Salut,

il y a une solution plus simple.

Tu importes tes données dans une table temporaire.

Ensuite, tu passes une série de requêtes qui vont avoir pour source ta table temporaire et grâce à un WHERE tu pourras faire des INSERT INTO.

INSERT INTO nomenclature (champ1, champ2) SELECT champ1, champ2 FROM table_tempo WHERE identifiant = "#100"

INSERT INTO infos_cde (champ1, champ2) SELECT champ1, champ2 FROM table_tempo WHERE identifiant = "#300"
0
Junior75002 Messages postés 4 Date d'inscription lundi 3 janvier 2011 Statut Membre Dernière intervention 3 janvier 2011
3 janv. 2011 à 13:08
Bonjour,

Merci pour cette réponse extrêmement rapide.

En réalité j'utilise déjà cette méthode, mais je trouve que cela serait plus simple et plus propre de faire un import sélectif.

Car je doit importer trois fichier CDE_1140........ toute les heures (3 flux différents), mais aussi un fichier EXP_1140....... toute les heures.

Les 96 fichiers me sont livrés par mail, donc après avec une petite automatisation des traitements courriers Outlook j'espère pouvoir lui faire faire la manip automatiquement.

Cela évite ainsi les interventions humaines et donc limite les erreurs, surtout pour une tache aussi répétitive.

Encore un grand merci pour ton retour.

Julien
0
blux Messages postés 26013 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 avril 2024 3 289
3 janv. 2011 à 13:35
Le seul import selectif que je peux te proposer, c'est de lire ton fichier en vba et d'insérer les lignes en fonction de tes critères... mais ce n'est pas dit que cela ira plus vite...
Ou sinon, tu automatises toute la séquence en VBA : import, insert...
0
Junior75002 Messages postés 4 Date d'inscription lundi 3 janvier 2011 Statut Membre Dernière intervention 3 janvier 2011
3 janv. 2011 à 14:49
Merci pour votre réponse Blux,

Mais comment puis-je formuler dans mon code mon souhait de ventiler les lignes commençants par un #100 dans la table Nomenclature ; les lignes commençants par un #300 dans la table Infos_cde; ect........

Merci d'avance.
Julien
0
blux Messages postés 26013 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 avril 2024 3 289
3 janv. 2011 à 14:58
Le mieux est d'insérer les données dans une table, de la lire avec un recordset et d'y faire les traitements que l'on veut.
Mais je le répète, plusieurs requêtes à la queue-leu-leu sont la solution la plus simple.
0
Junior75002 Messages postés 4 Date d'inscription lundi 3 janvier 2011 Statut Membre Dernière intervention 3 janvier 2011
3 janv. 2011 à 23:22
Je me rends compte que je n'ai pas été assez précis ou bien confus dans mon précédent post.
Car je parviens à faire l'import du .text et par des requêtes à alimenter des Tables en fonction du code ligne.
Actuellement, avec un petit bout de code j'ouvre une boite de dialogue pour la sélection du fichier à importer et dans ce même code j'ai indiqué les « options » d'import, comme le choix du séparateur (Ici « | »).
Mais là où je bloque, c'est pour que les lignes alimentent les tables correspondant à leurs code de ligne et que chaque champ du fichier initial alimentent les champs correspondants des tables de la base de donnés.

Ci-dessous dans la première ligne le champ initial, dans la seconde le nom du champ dans la table, dans la troisième des valeurs exemples.

- Nomenclature (#100)
Champ1 Champ3 Champ4 Champ5
Code ligne Code Cava Date fichier Heure fichier
#100 1140 20100501 01:05:01
Pour cette table, nous n'importons pas les champs : 2, 6, 7, 8, 9, 10,11, 12, 13, 14

- Infos commandes (#300)
Champ1 Champ2 Champ3 Champ5
Code ligne N° de commande Date commande Date expédition
#300 CS2010040052 20100430 20100503

Champ6 Champ7 Champ10 Champ11 Champ12 Champ13
N° client Nom client Adresse 1 Adresse 2 CP Ville
8 PADD RENNES LA HAIE GAUTRAIS 35170 BRUZ

Champ14
Code pays
FR
Pour cette table, nous n'importons pas les champs : 4, 8, 9


- Détails commandes (#400)
Champ1 Champ2 Champ3 Champ4
Code ligne N° de commande N° de ligne commande Référence
#400 CS2010040052 1 805029
#400 CS2010040052 2 805028
#400 CS2010040052 3 808317
#400 CS2010040052 4 808455


Champ6
Quantité commandé
1
1
1
2
Pour cette table, nous n'importons pas les champs : 5, 7, 8, 9, 10, 11, 12, 13, 14
Je n'arrive pas à écrire la suite de mon code, qui comme je vous l'expliquez plus haut, m'ouvre une boite de dialogue me permettant la sélection du fichier et le choix du délimiteur.

Je me rends compte que je me suis lancé dans un projet qui dépasse mes maigres compétences.

En espérant que l'un de vous parviennes à éclairer ma lanterne, car comme vous l'aurais peut être compris je débute et je rencontre beaucoup de difficultés.

En espérant être plus claire, moins brouillon!!!!

Julien
0
blux Messages postés 26013 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 avril 2024 3 289
4 janv. 2011 à 09:21
Mais là où je bloque, c'est pour que les lignes alimentent les tables correspondant à leurs code de ligne et que chaque champ du fichier initial alimentent les champs correspondants des tables de la base de donnés.
Ca se fait avec un INSERT INTO, où l'on sélectionne les champs à ajouter avec les valeurs qu'on souhaite, ce que j'ai expliqué plus haut...
0