IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Modifer tous les enregistrements d'un champ [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Points : 71
    Points
    71
    Par défaut Modifer tous les enregistrements d'un champ
    Bonsoir

    Je cherche à modifier tous les enregistrements d'un champ de ma table

    J'ai écrit le code ci dessous qui est activé à partir d'un bouton situé sur un formulaire

    Le champ Num de la table tmateriels est la clef primaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Private Sub BoutonMAJPrix_Click()
     Dim strNMin As String
     Dim strNmax As String
       strNMin = DMin("num", "tmateriels")
       strNmax = DMax("num", "tmateriels")
     
    Dim intI As Integer
     intI = strNMin
     For intI = strNMin To strNmax
     ' MsgBox (intI)
      Dim strPrixProv As String
       strPrixProv = MaterPrixUnitHT
       'MsgBox ("Le prix unitaire est " & strPrixProv)
       MaterPrixUValide = strPrixProv
      Next intI
     
    End Sub
    Les variables correspondent bien au 1er et au dernier champ de ma table

    Mon souci est que la mise à jour du champ MaterPrixUvalide ne se fait que pour le premier enregistrement et pas pour les autres .....

    Je me demande aussi si je n'aurai pas des soucis pour les enregistrements supprimés entre strNmin et strNmax

    MErci pour votre aide

    Daniel

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    bonsoir,
    on ne modifie pas tous les champs d'une table avec cette méthode cela serait trop simple.
    il faut passer par ADO ou DAO.
    sur 2007 le complément DAO est natif - par contre il faut l'ajouter pour ADO
    un peu plus de précision si tu n'y arrives pas ou maitrises mal VBA.
    - Détail des champs de ta table tmateriels
    - champ que tu veux modifier
    - avec quoi ? la valeur d'une autre champ de la table ?
    à +

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Points : 71
    Points
    71
    Par défaut
    Bonjour

    Aie aie, encore une nouvelle technique !

    Bon alors quelques éléments de réponse :

    - Détail des champs de la table tmatériels
    Tu veux tous les champs de ma table ou seulement ceux concernés par la manip ?
    Ceux qui sont concernés par la manip sont : Num, MAterPrixUnitHT, MaterPrixUValide, MaterOption

    - Champ que tu veux modifier ? avec quoi ?
    Je veux modifier MaterPRixUValide
    (Pour chacun de mes enregistrements Num)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Si materOption = "" Then MaterPrixUvalid = MaterPrixUnitHT
    Si materOption = "R" Then MaterPrixUvalid = 100
    Si materOption = "D" Then MaterPrixUvalid = 0
    J'espère avoir été clair

    Merci pour votre aide

    Daniel

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    bonjour,
    bien vu, cela me parait clair est conforte mon impression de régler cela par le parcours de ta table avec pour ma part ADO, pour la portabilité avec VB.NET par ailleurs, mais tu peux utiliser DAO.
    - je dois partir mais si tu as problème, cet après midi je te donne un exemple, a moins qu'un autre développeur passe par là et te donne la solution.
    Sinon à cet aprem,
    Un autre Daniel dit LE VIEUX.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    Re, bonjour
    Rien ne s’étant passé je me repenche sur ta demande :
    Je pars donc du postulat qu’il s’agit d’une table qui existe déjà et qui est bien remplie, provenant peut-être d’un téléchargement ou d’un import.
    Si ce n’était pas le cas et en cas de création, je devrais préciser comme à de multiples reprises ce qui se fait sur le forum, qu’il faut éviter d’avoir des champs calcules dans une table, les requêtes sont faites pour cela – exemple dans la petite base jointe, voir la requête « Req_Normalisée_Pour_Infor » qui fait très bien le travail sans une ligne de code.
    Mais soit s’il faut conserver la table, avec son champ et qu’il y en a beaucoup a changer access sait le faire, et c’est l’occasion si nécessaire de faire connaissance avec VBA, Les fonctions et les sub :
    Donc voir la base jointe à adapter bien sur, et si j’ai mal compris le problème, me relancer….
    ne pas oublier !!!!!j'avais oublié de le mentionner!!!! ajouter la référence :
    Microsoft ActiveX Data Objects 2.8 Library

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Points : 71
    Points
    71
    Par défaut
    Bonsoir Daniel et merci pour ces éléments de réponse

    J'ai inséré le code que tu m'as donné dans ma base
    J'ai créé un module appelé Affect
    Voici le code que j'y ai copié

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Option Compare Database
    Function Affectation()
    Dim cnc As New ADODB.Connection
    Dim rst As New ADODB.Recordset
     
    Set cnc = CurrentProject.Connection
    rst.Open "tMateriels", cnc, adOpenDynamic, adLockBatchOptimistic
     
        Do Until rst.EOF
        ValTest = rst("materOption")
        Select Case ValTest
            Case ""
            rst("MaterPrixUValide") = rst("MaterPrixUnitHT")
            Case "R"
            rst("MaterPrixUValide") = "100"
            Case "D"
            rst("MaterPrixUValide") = "0"
     
        End Select
      rst.UpdateBatch
      rst.MoveNext
    Loop
     
    rst.Close
    cnc.Close
    End Function

    Mon souci est qu'il ne se passe rien ; j'ai pourtant vérifié le nom de la table et des champs

    J'avais auparavant fait un essai avec cette ligne
    rst.Open "tMateriels_R", cnc, adOpenDynamic, adLockBatchOptimistic
    J'ai un message d'erreur
    Erreur 2147217900.... instruction SQL non valide, DELETE, INSERT, PROCEDURE, SELECT or UPDATE Attendus

    MErci de ton aide

    Daniel

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    bonsoir,
    peu de temps pour approfondir, erreur bizarre
    tu ne devrais pas avoir cette erreur mais as tu bien ajouter la référence ADO dans le VBE ?
    par où lances tu la procédure ?

    efface les données "MaterPrixUValide" dans la base que je t'ai transmise et lance avec le bouton sur le formulaire, chez moi cela marche sans problème ...
    à plus ...en fait a demain....matin.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Points : 71
    Points
    71
    Par défaut
    Bonjour Daniel

    J'ai testé ta base sur mon poste, et cela marche parfaitement : cela signifie donc que j'ai bien activé la référence ADO ?

    Je lance la procédure à partir d'un formulaire où est visualisée ma table.

    Est ce que le problème ne viendrait pas du fait que cette table comporte beaucoup d'autres champs ?

    Quelle est l'importance du "_R" mis à la suite du nom de ma table ?

    A bientot

    Daniel

  9. #9
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    bonjour,
    citation
    J'ai testé ta base sur mon poste, et cela marche parfaitement : cela signifie donc que j'ai bien activé la référence ADO ?
    non, cela signifie qu'ADO est bien référencé sur le modèle que je t'ai envoyé, pas forcément sur ta base.
    citation :
    Quelle est l'importance du "_R" mis à la suite du nom de ma table ?
    pas de signification particuliere, la fonction est basée sur une requête faite sur la table "tMateriels" que j'ai nommé "tMateriels_R", mais si tu mets seulement le nom de la base il n'y a aucun problème, tu mets a jour directement la table.
    problème sur les champs en principe non, mais je ne peux pas voir.
    pour aller plus vite, le mieux cela serait de faire une autre base dans laquelle tu importes seulement la structure de ta table que tu remplies avec quelques enregistrements bidons qui ressemblent au vrais et tu la postes.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Points : 71
    Points
    71
    Par défaut
    Merci Daniel pour ta patience

    J'ai mis ma base (avec quelques formulaires "vidés") en pièce jointe

    Pour ce qui est de ADO, dans ma base de données, je lance VBA (Alt F11), je clique sur Outils, références et j'ai Microsoft ActiveX Data Objects 2.8 Librairy de coché ... C'est bon ?

    A bientot

    Daniel

  11. #11
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    re,
    ci-joint ta base réparée qui fonctionne ches moi,
    pas de problème de message, simplement
    des appelations non respectant la casse
    les champs MaterPrixUvalide, et MaterPrixUvalide que j'avais mis ne connaissant pas ta base a texte au lieu de numérique il fallait donc mettre 100 et 0 au lieu de "100" et "0".
    cela n'aurait pas du entrainer l'erreur que tu avais, enfin, j'ai peu de temps
    contrôle si la base en retour fonctionne comme chez moi et informe.
    enfin si ... le plus important que j'ai rectifié machinalement en regardant la valeur par défaut de tes champs - quand on a pas l'intention de saisir obligatoirement la valeur d'un champ il faut soit lui mettre une valeur par defaut correspondant au type de champ "" pour texte soit en tenir compte au moment du code par NZ qui corrige le problème ; dans ta base cela se matérialise par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ValTest = Nz(rst("MaterOption"), "")
    à+

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Points : 71
    Points
    71
    Par défaut
    Bonjour Daniel

    Pas de chance

    Chez moi, la base "copie de matériels" ne fonctionne pas

    Je clique sur "la commande qui pose problème" et rien ne se passe, alors que j'ai modifié des valeurs du champ MaterOption

    Quelles pistes ?

    A bientot

    Daniel

  13. #13
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    bonjour,
    là !
    chez moi les tests marchent normalement - je te remets la base apres avoir effacé les données MaterPrixUValid et changer les valeurs materOption - plusieurs essais chez moi marchent tant en cliquant sur le bouton "commande qui pose problème" de la table FMat ou FAffetLocetMat" la mise a jour et conforme à ce que tu as posté.
    dans la base jointe les champs MaterPrixUvalid sont vides - sans rien changé, ni importer "directement dans la base jointe" cliques sur un des 2 boutons et regardes la mise a jour du champ il doit être conforme.
    a+

  14. #14
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Euh pourquoi pas une simple requête UPDATE ?

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Points : 71
    Points
    71
    Par défaut
    Bonsoir

    Réponse pour Daniel :
    Daniel

    Merci pour tout le temps passé à essayer de me dépatouiller de ce souci

    J'ai essayé ta base mise à jour : ça marche .... mais une seule fois ;(

    Je m'explique

    A l'ouverture de la table avec MaterPrixUValide vide, la fonction passe parfaitement

    Après, plus rien : les modifications de valeurs dans MAterOption sont sans effet, même après arrêt/redémarrage de Access

    Pour que les modifs soient prises en compte, il faut que j'efface toutes les valeurs du champ MaterPrixUValides

    Ca serait peut être une solution (effacer systématiquement toutes les valeurs de ce champ avant de les mettre à jour) mais ce n'est pas très orthodoxe.

    Qu'en penses tu ?

    Réponse pour Tofalu
    Requete Update ? Je vais regarder

    Bonne soirée à vous !

    Daniel

  16. #16
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    bonsoir Tofalu,
    c'est bien ce que j'ai suggéré dans mon post du 15/5 à 17H14, comme presque d'ailleurs à beaucoup de posts auquels je répond, il semble qu'en fait très souvent un minimum d'approche des base de conception d'access soit absent des connaissances des candidats à la création de base. dommage car il existe sur le forum tout ce qu’il faut.
    il est difficile pour moi de me limiter au principe qui vaut pour la quasi totalité des cas, il existe toujours des exceptions qui confirment la règle, comme il y a une solution technique je la donne, souvent en présentant les 2 solutions dans des bases jointes quand c’est possible : soit des bases que je fabrique moi-même.
    Par contre je suis tout à fait d’accord avec vos interventions, qui insistent sur la rigueur et le bon sens qui est un gage de réussite.

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Points : 71
    Points
    71
    Par défaut
    Bonsoir

    Euh, j'ai dit une bétise ?

    Daniel, j'avais bien vu le post où tu parlais de requete pour les champs calculés, mais je n'ai pas réagi car dans mon esprit, je ne faisais pas de "calcul"

    Pour moi, le calcul serait valable pour par exemple MAterPrixUvalide * MAterNombre que je ferai bien à un moment pour faire mes budgets totaux

    Désolé pour mon incompétence, mais je me débrouille pour apprendre sur le tas

    Bonne soirée et encore merci pour ta patience

    Daniel

  18. #18
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    Bonsoir,
    Non rassures toi, tu n’as pas dis de bêtise, en fait quand j’ai répondu à Tofalu, je n’avais pas vu ton dernier post, excuses moi, ne soit pas désolé de ton incompétence, on a tous commencé un jour, et on est tous, sur ce forum, l’incompétent de quelqu’un, l’avantage c’est que l’on s’aide pour l’être de moins en moins .
    je reprends le fil.
    Dans quoi tu changes la valeur materoption ? je n’ai pas trouvé dans tes formulaires, pour les tests je les ai changés directement dans la table pour voir si cela marche et chaque fois que je change les options dans la table et que j’envoi le programme ça fonctionne.

  19. #19
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut précision
    RE ,
    En regardant de plus près j’ai peut être compris !!!!!
    Il fallait le voir en mode création il semble que MaterOption est saisi sur récupérable l’étiquette récupérable. Ce contrôle est basé sur une table et on ne peut changer les items c’est soit vide soit
    Un des items de la table. A par le « « vide et le « R », ce n’est pas ce qui a été mis dans le code c’était l’exemple. Faut-il mettre autre chose dans le code. Mais surtout si tu saisis dans ce contrôle la colonne liée est a changée car dans l’état actuel tu récupères N° et non la lettre associée. Tu dois donc pour récupérer la lettre mettre dans la propriété colonne liée 2 au lieu de 1.
    Bon courage.
    ci-joint base corrigée :.

    précision :
    j'avais modifié mon post hier soir, mais ça n'a pas marché, en fait sur la nouvelle base et donc sur celle que je t'ai transmise la propriété limité a liste est à non, c'est pour cela que j'ai pu changer la lettre entrée conformément a la fonction et que cela a marché.

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Points : 71
    Points
    71
    Par défaut
    Bonjour Daniel

    Merci pour ton obstination

    Ce matin, j'ai pensé à un truc :

    Je pense que mon postulat de base est idiot : modifier toute la base à postériori

    Le plus "logique" est de mettre à jour le "MaterPrixUValide" à chaque modification d'option

    J'ai essayé cela pendant mon voyage en train

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Private Sub MaterOpt_Click()
    Dim strOptProv As String
     strOptProv = InputBox("saisir l'option : H, D, R ou espace pour matériel neuf")
    Dim strOptProv2 As String
     strOptProv2 = UCase(strOptProv)
     MaterOpt = strOptProv2
    Dim strPrixProv As String
     strPrixProv = MaterPrixUnitHT
     
    Select Case strOptProv2
    Case "R"
        strPrixProv = 100
    Case "H"
        strPrixProv = 0
    Case "D"
        strPrixProv = 0
    Case " "
        strPrixProv = strPrixProv
    Case Else
        MsgBox ("Erreur de saisie")
    End Select
     
    MaterPrixUValide = strPrixProv
    End Sub

    Cela fonctionne et répond à mes attentes

    Désolé de t'avoir fait bosser pour rien et je garde tes travaux pour de futurs usages

    Merci encore pour tes conseils et ta patience

    A bientot !

    Daniel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Remplissage d'un champ pour tous les enregistrements
    Par oliv45 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 16/04/2009, 16h31
  2. suppression de tous les enregistrements ayant deux champs vides
    Par adelsunwind dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 07/04/2009, 17h30
  3. Réponses: 4
    Dernier message: 18/08/2008, 15h11
  4. Réponses: 9
    Dernier message: 01/02/2007, 11h36
  5. Réponses: 4
    Dernier message: 23/08/2006, 15h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo