[]
Nombre de membres 1 membre
Connectés : ( personne )
 

La Charte du Forum - La Charte du Forum

Forum - Forum
Problèmes Access des débutants - Problèmes Access des débutants


clos par 3Stone le 29/06/2012 : 03:01  Sujet n° 595  AIDE EN Programmation VBA SOUS ACCESS

le 22/05/2012 : 18:29
par Yannick

Anonyme

visiteur

Salut à tous,je débute en access et j'ai des petits soucis.

J'ai une grosse base de données de plus de 150 tables et naturellement ces tables ont plusieurs champs. Il se fait que je veux faire des modifications sur 5 champs précis se retrouvant dans la plupart de toutes les tables
Donc j voudrais savoir comment on peut:
1-parcourir toutes les tables
2-ensuite parcourir chaque champ et voir s'il correspond à l'un de mes 5 champs recherchés.                       & amp; nbsp;                        & amp; nbsp;                        & amp; nbsp;              3-Enfin appliquer les modifications (calculs) à chacun de ces champs precis là .
avec du code VBA avec des requetes ou autres .                          ; ;                     4-les nouvelles valeurs des 5champs devront se retoruver dans les mêmes tables,c'est `dire que je veux lire et ecrire dans la même base de données
Je ne sais pas si je me suis bien fait comprendre,mais en gros c'est ca la situation. si besoin de plus de précision faites moi signe
Jusqu'à present j peux retrouver et modifier ces champs la en faisant appel à une seule table. Mais l'ideal serait un code qui fait ca pour toutes les tables d'un seul coup,parce qu'à chaque fois l'utilisatuer ne devra pas rentrer le nom de la table pour faire les modifications.Merci si quelqu'un pouvait vraiment m'aider
Ecrire à Yannick  sujet clos  Haut

[]   

DébutPrécédent [ 1 2 ] SuivantFin
Réponse n° 1
--------
le 22/05/2012 : 22:46
par Yannick

Anonyme

visiteur

Bref j 'ai reecrit un autre code de base pour tester au moins si ca marche. L'idée de depart reste la même ,à savoir que je veux modifier des valeurs numeriques dans des champs spécifiques dans une base de donnees avec une multitude de tables.
Dans ce code je recherche juste dans toutes les tables le champ SEG_type et je veux multiplier ces valeurs par 2. Le code compile sans erreur mais je ne vois aucun resultat ni changement dans mes table d'origine.


Code :
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim rst As DAO.Recordset
Dim fld As DAO.Field
Sub ReplaceFieldValeur()
'On Error GoTo Err_ReplaceFieldValeur
Set db = CurrentDb
For Each tdf In db.TableDefs ' on parcourt toutes les tables
If tdf.Attributes <> dbSystemObject And tdf.Attributes <> dbHiddenObject Then
For Each fld In tdf.Fields 'On parcourt tous les champs

If fld.Name Like "*" & "SIG_type" & "*" And IsNumeric(fld) Then 'si un champ s'appelle SIG_type et est de type numerique
Set rst = dbs.OpenRecordset(fld.Name, dbOpenDynaset) 'on ouvre le recordset
If Not rst.EOF Then
Do While Not rst.EOF 'tant qu'on n'a pas fini ttes les lignes du champ
s_type = rst.Fields("SEG_ID").Value ' on recupere la valeur de la ligne dans la colonne SIG_type

requete = " Update fld(fld.Name) As s_type * 2 " ' on cree la requete ki va modifier l'enregistrement de la ligne sur lakel on se trouve
db.Execute requete ' On execute la requete


' rst.Fields(fld.Name).Value = NewValue (un commentaire perso dans mon code)
Loop
End If
rst.Close
' Set rst = Nothing

End If
Next fld
End If

Next tdf


db.Close
' on reinitialise tout
Set rst = Nothing
Set fld = Nothing
Set tdf = Nothing
Set db = Nothing
End Sub
   
Ecrire à Yannick   clos par 3Stone le 29/06/2012 : 03:01  Haut
Réponse n° 2
--------
le 22/05/2012 : 23:04
par 3Stone

Anonyme

Administrateur

Bonjour,
 
Citation :

J'ai une grosse base de données de plus de 150 tables et naturellement ces tables ont plusieurs champs

 
Cela doit être une sacré base que celle-là... d
 
Citation :

Donc j voudrais savoir comment on peut:
1-parcourir toutes les tables
2-ensuite parcourir chaque champ et voir s'il correspond à l'un de mes 5 champs

 
Ce souhait semble indiquer un gros problème de conception!

Pour y voir plus clair, il serait bon de transmettre un copie d'écran de la fenêtre des relations (en utilisant ceci).

Cordialement,


3stone

  clos par 3Stone le 29/06/2012 : 03:01  Haut
Réponse n° 3
--------
le 23/05/2012 : 01:17
par Yannick

Anonyme

visiteur
Je vous ai répondu en privé,juste pour confirmer que vous avez reçu ?.Parce que je n'ai pas eu d'accusé de réception.
MErci
Ecrire à Yannick   clos par 3Stone le 29/06/2012 : 03:01  Haut
Réponse n° 4
--------
le 23/05/2012 : 13:56
par 3Stone

Anonyme

Administrateur

Bonjour,

Oui, j'ai reçu la base (que je n'ai pas demandée), mais cela ne dit rien par rapport à ma demande:
 
Citation :

un copie d'écran de la fenêtre des relations

 
Si tu cherches à faire cette manipulation sur 150 tables, c'est qu'il y a un vrai problème.
Car, lorsque tu souhaites:
 
Citation :

1-parcourir toutes les tables
2-ensuite parcourir chaque champ

 
cela sous-entend que tu ne sais pas où se trouvent les données à modifier!!

Ce genre de besoin (parcourir toutes les tables) ne peut être utile que lorsque on souhaite reconstruire une base qui à été réalisée sans respecter la moindre règle, mais certainement pas pour y modifier les données. Dans le cas présent, cela indique plutôt que l'on se trouve dans le (mauvais) cas décrit.

Le b. a. -ba de toute base de données est expliquée ici.
Ne pas le respecter ne permet en aucun cas de gérer une base de 150 tables!

Cordialement,


3stone

  clos par 3Stone le 29/06/2012 : 03:01  Haut
Réponse n° 5
--------
le 23/05/2012 : 16:20
par Yannick

Anonyme

visiteur

Apparement tu n'as pas du tout compris mon probleme.

1-La base de donnes dont je parle (certes n'a pas ete conçue par moi mais a bel et bien respecté toutes les spécifications et r`gles en rapport avec une bd access.

2-Le probleme pour en revenir à un niveau basique concerne des champs de distance initialement rentrés en ''pieds''. Ce qui se passe aujourdh'hui est qu'on veut convertir ces enregistrements de ''pieds"  en "mètres". Naturellement il faudrait etre attardé sinon vraiment lunatique pour imaginer rentrer à la main pres de 200 lignes d'enregistrements par tables sur un total d'environ 150 tables.

3-L'idee serait alors d'écrire un code qui parcourt toutes les tables,passe en revue tous les champs de chaque table et s'arrete sur les champs (préalablement identifiés) où les valeurs sont en pieds ,et ensuites les convertit en mètres par uen simple règle de trois.

4-Les donnees à modifier sont donc connues,bien repertorìées et le ba-ba de la base de donnée est parfaitement connue,mais par contre en vba c'Est autre chose vu que j'ai dit que je suis débutant.

5-Ci-dessous tu trouveras mon code qui fait le travail de juste reconnaitre les champs (exemple) SEG_trip et SEG-fonction dans toutes mes tables  et multiplie leurs valeurs par 2 et 4 respectivement.Ce code marche sans problème

6-Mon problème si tu m'as finalement compris jusqu'au point 5 est le suivant: si pour modifier les valeurs contenues dans SEG_trip il me faut faire appel dans ma formule à la valeur située sur la même ligne dans SEG_fonction,comment dois je m'y prendre pour parcourir les champs en parallèle et updater juste la valeur du champ sur lequel le code se trouve à l'instant t? par exple:

Nouvelle valeur de SIG_type= (ancienne valeur de SIG_type)*2 + (ancienne valeur de SIG_valeur *10).

Code :
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field

Sub ReplaceFieldValeur()

'On Error GoTo Err_ReplaceFieldValeur
Set db = CurrentDb

For Each tdf In db.TableDefs ' on parcourt toutes les tables

If tdf.Attributes <> dbSystemObject And tdf.Attributes <> dbHiddenObject Then

For Each fld In tdf.Fields 'On parcourt tous les champs

If fld.Name Like "*" & "SEG_trip" & "*" And _
(fld.Type = dbLong Or fld.Type = dbDouble Or _
fld.Type = dbInteger Or fld.Type = dbSingle Or _
fld.Type = dbCurrency Or fld.Type = dbFloat Or _
fld.Type = dbDecimal Or fld.Type = dbNumeric Or _
fld.Type = dbBigInt) Then 'si un champ s'appelle SIG_type et est de type numerique

requete = "Update [" & tdf.Name & "] SET [" & fld.Name & "] = [" & fld.Name & "]*2 Where [" & fld.Name & "] is not null;"
'Debug.Print rst ' afficher le SQL de la requete dans la console d'exécution au cas où

' On execute la requete


DoCmd.RunSQL (requete)

ElseIf fld.Name Like "*" & "SEG_fonction" & "*" And _
(fld.Type = dbLong Or fld.Type = dbDouble Or _
fld.Type = dbInteger Or fld.Type = dbSingle Or _
fld.Type = dbCurrency Or fld.Type = dbFloat Or _
fld.Type = dbDecimal Or fld.Type = dbNumeric Or _
fld.Type = dbBigInt) Then 'si un champ s'appelle SIG_type et est de type numerique

requete = "Update [" & tdf.Name & "] SET [" & fld.Name & "] = [" & fld.Name & "]*4 Where [" & fld.Name & "] is not null;"
'Debug.Print requete ' afficher le SQL de la requete dans la console d'exécution au cas où

' on exécute la requete

DoCmd.RunSQL (requete)



End If


Next fld
End If

Next tdf


db.Close
' on reinitialise tout
Set fld = Nothing
Set tdf = Nothing
Set db = Nothing

End Sub
Ecrire à Yannick   clos par 3Stone le 29/06/2012 : 03:01  Haut
Réponse n° 6
--------
le 24/05/2012 : 20:33
par Yannick

Anonyme

visiteur

Code écrit et exécute sans erreurs pour une base aussi énorme que 300 tables et pour modifier autant de champs que souhaités avec une formule

Si quelqu'un a un problème similaire un jour n'hésitez pas à me contacter

Ecrire à Yannick   clos par 3Stone le 29/06/2012 : 03:01  Haut
Réponse n° 7
--------
le 25/05/2012 : 14:07
par 3Stone

Anonyme

Administrateur

Bonjour,
 
Citation :

Apparement tu n'as pas du tout compris mon probleme.

 
En effet, car tu n'avais pas soufflé mot de :
 
Citation :

Ce qui se passe aujourdh'hui est qu'on veut convertir ces enregistrements de ''pieds" en "mètres".

 
Ce qui change totalement la raison de cette manoeuvre...
Habitué aux souhaits non raisonnables, je ne pouvais te laisser t'engager dans une telle voie, sans te le faire remarquer.

Pour ce qui est de la réalisation, c'est simple wink
Des boucles imbriqués sur les collections (tabledefs, les enregistrements, puis fields), si trouvé, se placer en edit, modifier et sauver.

Expliquer les circonstances qui amènent cette demande, à priori bizarre étant donné l'étiquette "débutant", aurait évité ce quiproquo.

Cordialement,


3stone

  clos par 3Stone le 29/06/2012 : 03:01  Haut
Réponse n° 8
--------
le 25/05/2012 : 16:51
par Yannick

Anonyme

visiteur

Good!! on se comprrend finalement.

En passant comment tu t'y prends pour mettre ce ou ou ces modules dans un bouton automatique à cliquer dans access (dans un formulaire par exemple) pour que ça exécute la macro...au lieu d'aller ouvrir l'editeur de macro et compiler de là

Ecrire à Yannick   clos par 3Stone le 29/06/2012 : 03:01  Haut
DébutPrécédent [ 1 2 ] SuivantFin
actif sujet actif   clos sujet clos   Important! Important!   Nouveau Nouveau message   -   Rectifier Rectifier message   Clôturer Clôturer sujet   Remonter Remonter
[]
Catégories de discussion  Forum 



Haut