ACCESS 2003 vba pb requete

Dyr3e Messages postés 85 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 4 juillet 2006 - 6 avril 2006 à 17:15
cs_jperre Messages postés 268 Date d'inscription lundi 9 janvier 2006 Statut Membre Dernière intervention 19 janvier 2017 - 7 avril 2006 à 17:42
Bonjour à tous,

je dois réaliser une application dont la base de donnée tourne actuellement sous access. Le précédent créateur à fait certain choix hasardeux. La BD comporte environ 40 tables, et chacune d'entre elle comporte un n° de Tri, un champ "test effectué le", et un champ "test effectué par".

Afin d'éviter la redondance de données, j'aimerais regrouper ces trois champs dans une table, mais j'ai d'énorme problème à le faire. Comment puis je faire comprendre a Access que les 40 champs n° de tri doivent aller dans un seul et meme champ ? ( il en va de même pour les 2 autres champs et les 40 tables qui doivent aller chacun dans un champ)

mon code pour le moment est le suivant :

Public Sub test()
Dim Db As DAO.Database
Dim tbd As DAO.TableDef
Set Db = CurrentDb
For Each tbd In Db.TableDefs MonSQL "Select * From " & tbd.Name & " Where MONCHAMP [Test effectué le] "
MaReq = "Update ESSAI Set [Test effectué le]=" & MonSQL
Debug.Print MaReq
'Db.Execute "Update ESSAI Set [Test effectué le]=" & MonSQL
Next
End Sub

j'ai tenté de faire ici un essai pour le champ test effectué le simplement. mais j'obtiens une erreur au niveau de la ligne Db.execute (lorsque celle ci n'est pas en commentaire)

le debugger me dit :

Update ESSAI Set [Test effectué le]=Select * From Classmark 2 et 3 Where MONCHAMP = [Test effectué le]

je vois bien que ce n'est pas bon , mais je ne sais que faire pour arriver au bon résultat... SVP aidez moi !!!!

Merci d'avance

6 réponses

cs_jperre Messages postés 268 Date d'inscription lundi 9 janvier 2006 Statut Membre Dernière intervention 19 janvier 2017 2
6 avril 2006 à 17:45
Il faut :
* Créer une nouvelle table,
* Ajouter le contenu des 40 tables dans cette table de cumul.

Dim Db As DAO.Database, tbd As DAO.TableDef
Set Db=CurrentDb
'Création de la table de cumul
Db.Execute "CREATE TABLE CumulTest(NumTri LONG, TestEffectueLe DATETIME, TestEffectuePar TEXT(50));"
'Ajout des données dans la table de cumul
For Each tbd In Db.TableDefs
If Left(tbd.Name,4)<>"MSys" And tbd.Name<>"CumulTest" Then
Db.Execute "INSERT INTO CumulTest(NumTri, TestEffectueLe, TestEffectuePar) SELECT [n° de tri], [Test effectué le], [Test effectué par] FROM " & tbd.Name & ";"
End If
Next tbd
Voilà toutes les tables seront recopiées à l'exception des tables système d'access et de la table cumul elle même. Bien entendu, s'il y avait d'autres tables dans la base de données, il faudrait les exclure de la sélection. Vous remarquerez que j'ai nommé les champs de la table de cumul en un seul mot et sans caractères accentués ou spéciaux. C'est recommandé pour éviter bien des soucis.
0
Dyr3e Messages postés 85 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 4 juillet 2006
7 avril 2006 à 09:33
Bonjour,

merci de ta reponse, il m'indique toujours une erreur, et lorsque j'utilise le debugger, je prend une ligne au hasard et j'obtient :

INSERT INTO CumulTest(NumTri, TestEffectueLe, TestEffectuePar) SELECT [n° de tri], [Test effectué le], [Test effectué par] FROM ~TMPCLP68001;

jai donc 2 questions : que sont ces tables TMP car ce n'est pas moi qui les aient créé? ( le programme prend aussi les tables normal)

pourquoi il ne veut pas le faire ? Je pense que c'est peut etre car toute les table ne contiennent pas se champ. Je pourrais peut etre faire un test supplémentaire sur chaque table testant si les champs sont présents. comment le ferais tu ?

merci pour ta réponse et merci par avance.
0
cs_jperre Messages postés 268 Date d'inscription lundi 9 janvier 2006 Statut Membre Dernière intervention 19 janvier 2017 2
7 avril 2006 à 11:15
Le plus simple serait de savoir comment s'appellent les tables qui contiennent les données à cumuler. Si elles portent le même début de nom, il suffit de faire la boucle suivante si les tables commencent par exemple par "TOTO":
For Each tbd In Db.TableDefs
If Left(tbd.Name,4)= "TOTO" Then
Db.Execute "INSERT INTO CumulTest(NumTri, TestEffectueLe, TestEffectuePar) SELECT [n° de tri], [Test effectué le], [Test effectué par] FROM " & tbd.Name & ";"
End If
Next tbd
N'ayant pas la base de données devant les yexu, je suis bien dans l'impossibilité de savoir ce que sont les tables TMP.
0
Dyr3e Messages postés 85 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 4 juillet 2006
7 avril 2006 à 15:49
comme je te lai dit , il y a 40 table qui contiennent ce que je voudrait, 10 qui ne le contienne pas donc je pensais plutot exclure les 10. c'est ce que jessaye de faire avec le code suivant mais visiblement ca ne fonctionne pas car qd je releve le debugger, je vois qu'il parcourt toutes les tables sans exeption.... je craqque

Public Sub test()


Dim Db As DAO.Database, tbd As DAO.TableDef, fld As DAO.field
Set Db = CurrentDb
'Création de la table de cumul
'Db.Execute "CREATE TABLE CumulTest(NumTri LONG, TestEffectueLe DATETIME, TestEffectuePar TEXT(50));"
'Ajout des données dans la table de cumul
For Each tbd In Db.TableDefs
If Left(tbd.Name, 4) <> "3G_details" And tbd.Name <> "3G_CORRESPONDANCE" And tbd.Name <> "3G_E2E_PREPERF" And tbd.Name <> "3G_VT" And tbd.Name <> "CumulTest" And tbd.Name <> "AVP" And tbd.Name <> "Carte SIM" And tbd.Name <> "Dernmodif" And tbd.Name <> "Détails" And tbd.Name <> "Liste des tests" And tbd.Name <> "Mobile" And tbd.Name <> "Situation" And tbd.Name <> "Situation AVP" Then
MaReq = "INSERT INTO CumulTest(NumTri, TestEffectueLe, TestEffectuePar) SELECT [n° de tri], [Test effectué le], [Test effectué par] FROM " & tbd.Name & ";"
'Db.Execute (MaReq)'
Debug.Print MaReq
End If
Next tbd


End Sub

normalement il devrait ne pas me les prendre .... :(

une ligne du debugger :

INSERT INTO CumulTest(NumTri, TestEffectueLe, TestEffectuePar) SELECT [n° de tri], [Test effectué le], [Test effectué par] FROM Classmark 2 et 3;

et lerreur : code d'execution 3131, erreur de syntaxe dans la clause FROM

merci par avance pour votre aide
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jperre Messages postés 268 Date d'inscription lundi 9 janvier 2006 Statut Membre Dernière intervention 19 janvier 2017 2
7 avril 2006 à 17:40
Dans mon précédent message, j'ai vous ai demandé d'identifier les noms des tables à cumuler, elles doivent bien posséder un nom générique??? et donc de faire la sélection uniquement sur ces noms (en sélectionnant par exemple les trois premiers caractères avec une fonction left) au lieu d'éliminer tous les noms d'autres tables ce qui devient effectivement impossible. D'autre part, mais ceci n'est à utiliser que lorsque la fonction de cumul s'effectuera correctement, il est possible d'ajouter une fonctionde suppression de table dans la boucle de façon à ne conserver que la table de cumul à la fin:
For Each tbd In Db.TableDefs
If Left(tbd.Name,4)= "TOTO" Then
Db.Execute "INSERT INTO CumulTest(NumTri, TestEffectueLe, TestEffectuePar) SELECT [n° de tri], [Test effectué le], [Test effectué par] FROM " & tbd.Name & ";"
Db.Execute "DROP TABLE " & tbd.Name & ";"
End If
Next tbd
0
cs_jperre Messages postés 268 Date d'inscription lundi 9 janvier 2006 Statut Membre Dernière intervention 19 janvier 2017 2
7 avril 2006 à 17:42
J'oubliais autre chose, si les noms des tables comportent des espaces (ce que je ne fais jamais moi même, il faut mettre le nom de table entre crochets :
Db.Execute "INSERT INTO CumulTest(NumTri, TestEffectueLe, TestEffectuePar) SELECT [n° de tri], [Test effectué le], [Test effectué par] FROM [" & tbd.Name & "];"
0
Rejoignez-nous