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 :

Initialisation de champs dans les codes évennements [AC-2003]


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut Initialisation de champs dans les codes évennements
    Bonjour

    J'ai une petite question toute bête : j'ai créé, dans les codes evennements, une fonction permettant d'initialiser tous les champs de mon sous formulaire à "", histoire de les remettre à zéro quand le sous formulaire est ouvert une nouvelle fois.

    J'ai appelé cette fonction dans Form_Load, mais le problème, c'est que mon sous formulaire possédant plusieurs lignes (une nouvelle se crée à chaque fois qu'on fait un enregistrement supplémentaire), ma fonction n'inilialise que la toute première =/

    Y a-t-il un moyen de répéter l'opération pour les lignes suivantes ?


    Merci d'avance

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2009
    Messages : 98
    Points : 115
    Points
    115
    Par défaut
    Euh, oui ... il suffit de passer en revu toutes les lignes du recordset sous jacent. Quelquechose du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim Rs as Recordset
    SET Rs=me.recordsetclone
    if not rs.bof then rs.movefirst
    do until Rs.eof
       <ta fonction> (Si celle-ci traite les controles et non les champs, faire une synchronisation: me.bookmark=rs.bookmark)
       rs.movenext
    loop

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut
    Ca fonctionne !!!
    Merci beaucoup =) !!!


    Encore une chose...

    Voyant que ce code marchait, j'ai essayé de m'en inspirer pour faire en sorte, cette fois, qu'il n'y ait plus qu'une seule ligne d'affichée (sinon, si le formulaire précédant contenait 30 lignes, alors que le nouveau n'en contient que 2, il va y avoir 28 lignes vides en dessous...)


    J'ai donc tenté ceci :

    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
     
    Private Sub Form_Load()
     
        Dim rst As Recordset
        Dim rst2 As Recordset
     
        Set rst = Me.RecordsetClone
        Set rst2 = Me.RecordsetClone
     
        rst.MoveLast
        rst2.MoveFirst
        If rst <> rst2 Then
            Do Until (rst.BOF)
                rst.Delete
                rst.MoveNext
            Loop
     
     
        Me.Bookmark = rst.Bookmark
        initial

    Le problème venant bien sûr du "rst <> rst2" , qui, apparemment, ne contient pas la valeur, puisqu'Access me parle d'"imcompatibilité de type". J'ai regardé dans les fonctions des rst, il n'y a rien s'approchant de la valeur...

    J'avais ajouté cette ligne, car sinon, j'avais un message d'erreur disant qu'il n'y avait aucun enregistrement. J'en ai donc déduis qu'il ne fallait pas entrer dans la boucle dans ce cas, pour ne pas faire le delete, et c'est pour cela que j'avais essayé ce test.
    (petite question en passant : dans ce cas, le programme va d'abord regarder si c'est le debut de file, et si cest le cas n'entrera pas dans la boucle, ou est-ce qu'il va d'abord entrer dans la boucle, puis vérifier si c'est le début de file, pour la fois suivante ?)

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut
    Je pensais avoir résolu le problème avec ce code-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim rst As RecordSet
     
    Set rst = me.RecordSetClone
     
    If not rst.BOF then rst.MoveFirst
       Do Until rst.BOF = rst.EOF
          rst.Delete
          rst.MoveNext
       loop
    Me.Bookmark = rst.Bookmark
    initial
    (initial étant ma fonction pour remettre à zéro)

    BOF et EOF étant des booléens, je pensais que ça fonctionnerait, mais mes lignes sont toujours là...
    J'ai beau refaire la fonction pas à pas, je ne comprends pas mon erreur..

  5. #5
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 664
    Points : 34 369
    Points
    34 369
    Par défaut
    Bonjour,
    et pourquoi ne pas utiliser une requête DELETE * à la place du parcours de tous les enregistrements

    sinon, penser à utiliser le

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut
    Parce que, si je ne me trompe pas, une requête DELETE effacerait les enregistrements présents dans ma table. Or je veux juste effacer l'affichage des données précédentes de mon formulaire, mais surtout pas les supprimer de la base.

    J'ai essayé d'ajouter un rst.Update à la fin de la boucle, mais pas plus de résultat =/

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2009
    Messages : 98
    Points : 115
    Points
    115
    Par défaut
    Desole mais si tu veux "Effacer" l'affichage mais pas les donnees, il faut pas faire cela car en faisant le delete, tu efface les enregistrements!
    Clarifie ce que tu veux faire car, perso, j'y vois plus rien dans ce que tu veux. Mais une chose est certaine, surtout pas le delete, il touche les donnees (le recordsetclone est pour faire simple, les memes enregistrements que ceux du formulaire)
    Peut etre qu"un filtre sur ton formulaire ferait l'affaire?

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut
    Clarifie ce que tu veux faire car, perso, j'y vois plus rien dans ce que tu veux.

    Je reprends ^^
    J'ai un formulaire contenant un sous formulaire, destinés à saisir les données de deux tables. La premiere fois qu'on l'affiche, le sous formulaire est evidemment vide, avec une seule ligne vierge pour entrer le nouvel enregistrement.
    Mon problème est que les fois suivantes, quand on ouvre à nouveau le formulaire principal en changeant les données qu'il contient, les anciens enregistrements du sous formulaire (qui ne correspondent plus aux données du formulaire, du coup) apparaissent encore.

    J'ai d'abord voulu remettre tous les champs de ces lignes à zéro, afin de pouvoir saisir normalement dans le sous formulaire, comme à la première fois qu'il saffiche, si tu préfères.

    Grâce à ton aide, ça a fonctionné.

    Mais, bien qu'elles soient vides, les lignes restent présentes. Ce qui fait que, par exemple :
    - si j'ouvre mon formulaire pincipal pour la première fois, pas de problème. Je saisis les données du formulaire, et j'entre par exemple 30 valeurs dans le sous formulaire.
    - je ferme ensuite ce formulaire, puis l'ouvre à nouveau, pour y rentrer de nouvelles valeurs. Les anciennes ne sont plus affichées, c'est parfait. Cependant, au lieu de n'avoir qu'une seule ligne prête à la saisie dans le sous formulaire, j'en ai cette fois 30.
    Ce n'est pas très grave, mais ce n'est pas très esthétique.

    J'essaie donc de supprimer les lignes en trop, pour n'en laisser qu'une, vide.
    Je ne veux donc pas modifier les données présentes dans la base, que j'ai entrées juste avant, je veux seulement qu'elles ne s'affichent plus quand le formulaire est chargé une nouvelle fois.


    Est-ce que c'est plus clair ?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2009
    Messages : 98
    Points : 115
    Points
    115
    Par défaut
    As-tu pense a lier ton sous formulaire a ton formulaire?

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut
    Euh, je crois, oui. Dans les propriétés du sous formulaire il y a bien un champ père et un champ fils.
    (Oh, j'ai aussi oublié de préciser : je débute dans access, je ne sais pas ce qu'est un filtre =/ . Je vais me renseigner de ce pas)

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2009
    Messages : 98
    Points : 115
    Points
    115
    Par défaut
    Et quand tu change d'enregistrement dans ton formulaire principal, cela ne change pas le sous formulaire? Dans ce cas, je pense qu'il y a une erreur dans le choix de tes champs de liaison.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut
    En fait, ça le change bien, mais uniquement quand on clique sur le sous formulaire. Mais surtout, même si ça change le champ de liaison, ça ne change pas les autres champs (enfin maintenant grâce à ton code, ça les remet à ""), ni le nombre de lignes.

    Et puis si on remet dans le champ de liaison du formulaire une valeur qu'on a déjà entrée auparavant, le sous formulaire n'affiche pas les valeurs correspondantes, qu'on avait entrées la fois précédente. Mais ça, à la limite, je peux m'en passer.

    Disons que ça le change à moitié, quoi... =/


    Autrement, mon sous formulaire étant basé sur une requête, j'ai essayé d'ajouter à celle-ci un critère pour le champ de liaison, qui dit [Forms]![F_princip]![champ_liaison] mais ça n'a pas l'air de fonctionner mieux




    Edit:

    Je me suis renseignée sur les filtres, et ai écrit ce code dans un bouton servant à valider le formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    f = ""
    If Not IsNull(Me.champLiaison) And Me.champLiaison <> "" Then
    f = "champLiaison LIKE ""*" & Me.champLiaison& "*"""
    End If
     
    Me.Filter = f
    Me.FilterOn = True

    Le problème, c'est que ne peux pas le tester, à cause de mes autres bugs T_T

    J'en reviens donc encore une fois à ce forum (ou alors je devrai le faire sur un nouveau post ?) pour implorer votre aide sur un problème de taille : Chaque validation de mon formulaire enregistre bien les données dans la table, mais le problème, c'est qu'à chaque fois il écrase les anciennes... =/

    Pour enregistrer les nouvelles données, j'ai créé un bouton contenant des RecordSet avec des AddNew ..

    Comment procéder ?

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2009
    Messages : 98
    Points : 115
    Points
    115
    Par défaut
    SIncerement, je pense que tu as un probleme de liaison entre tes 2 formulaires.
    Supposons que ta requete sur le formulaire principale soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT ID, Valeur1, Valeur2 FROM Table
    Supposons que ta requete dans ton sous formulaire soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT ID, P_ID, Valeur1, Valeur2 FROM Table2
    que P_ID et ID permette le lien entre les 2 tables

    dans les proprietes du control de sous formulaire (ctrlsub) devront etre lors de la definition de ton formulaire et de son control de sous formulaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ctrlsub.linkmasterfields="ID"
    ctrlsub.linkchildfields="P_ID"
    normalement, si tu changes d'enregistrement dans ton formulaire, alors ton sous formulaire doit changer de donnees. Tu remarqueras que les proprietes de liaison sont les champs de ta requete mais pas les controles.

    En passant je crois comprendre ce que tu fais et qui est une erreur de comprehension entre les liaisons de table, les liens formulaire/sousformulaire, controle/donnees sous jacente, update de liaison de table.

    Tu as Table1 et Table2 qui ont une liaison avec mise a jour sur Update entre ID (Table1) et P_ID (Table2)

    Tu as mis un control (ctrlID) qui a comme source de donnee le champ ID. Tu as mis alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ctrlsub.linkmasterfields="ID" ou ctrlID (ce qui revient au meme)
    ctrlsub.linkchildfields="P_ID"
    Donc quand tu changes la valeur de ctrlID, rien ne se passe sauf quand tu sort du control (c'est a ce moment la que des mise a jour des liaisons de ctrlSub ont lieu. De plus comme tu changes la valeur de ID (via ctrlID), quand tu rentres dans le sous formulaire, les donnees du formulaire principale sont mise a jour au niveau de la base (un afterupdate du formulaire sera declenche si tu veux le voir). Hors, comme Acces va changer (si tu fais une liaison avec update des changements sur la cle) les valeurs de P_ID (table2) par la nouvelle valeur de ID (table1), alors ton sous formulaire ne changera pas!
    Est-ce que je me trompe?

    En effet, si tu fais reference a

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut
    Je suis un peu perdue...

    Le problème ne vient pas de là, j'ignore ce qu'est un CtrlSub, et je n'ai pas fait de requête...

    Voilà ma démarche :

    J'ai créé mon formulaire, basé sur la Table1. J'ai mis tous les champs en entête, et ajouté un sous formulaire, basé sur une requête. Cette requête affiche les champs de Table2, ainsi qu'un champ calculé. Elle ne permet pas d'afficher l'ID de Table2 (l'ID étant un numéro automatique je ne voyais pas l'interêt de l'afficher), mais affiche en revanche le champ de liaison, ChampLiaisonCotéSousForm. Comme critère de ce champ, dans la requête, j'ai écrit [Forms]![F_princip]![ChampLiaisonCoteFormulaire] (le champ de liaison côté formulaire étant aussi l'ID de la Table1).
    En créant mon sous formulaire, j'ai lié les champs ChampLiaisonCoteFormulaire et ChampLiaisonCoteSousFormulaire.

    Lorsque l'on clique sur le sous formulaire après avoir rempli le formulaire (et uniquement à ce moment là), il affiche l'ID du formulaire dans le champ correspondant.
    Les problèmes, vous les connaissez...

    J'espère être à peu près claire..

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2009
    Messages : 98
    Points : 115
    Points
    115
    Par défaut
    Citation Envoyé par lil404 Voir le message
    Le problème ne vient pas de là, j'ignore ce qu'est un CtrlSub, et je n'ai pas fait de requête...
    ctrlSub est nom que j'ai donné au controle sous formulaire pour mes explications. Dans ton cas, il s'agit de ... je sais pas
    Citation Envoyé par lil404 Voir le message
    [...] ChampLiaisonCotéSousForm. Comme critère de ce champ, dans la requête, j'ai écrit [Forms]![F_princip]![ChampLiaisonCoteFormulaire] (le champ de liaison côté formulaire étant aussi l'ID de la Table1).
    Desole, je ne comprends pas pourquoi il y a cela. Je pense que tu melanges le formulaire qui est affiche avec le control de sous formulaire. Pour verifier ce point, clic sur ce que tu consideres comme le sous formulaire et regarde les porprietes affichees. Dans l'onglet "Données", tu dois avoir "Objet source","Champs fils", "Champs peres". Si oui, alors, champs fils doit contenir le nom d'un champs de ta table2 et champs pere le nom d'un champ de ta table1. Pour debuter(on compliquera plus tard), en aucun cas, il doit contenir le nom d'un control. Dans tes 2 formulaires, tu mets tous les controles dans la zone "Détail" et chaque formulaire doit contenir des controles dont la prorpiete "Source controle" contient juste le nom d'un champ de la table qui est "raccorde" a ton formulaire. Tu vires tout le reste, code, etc.. Au niveau de ton formulaire principale, tu mets les boutons de deplacements. Maintenant, tu regardes comment cela fonctionne en te deplassant d'enregistremnt dans le formuilaire principale.

  16. #16
    Membre confirmé Avatar de Tonioyo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 343
    Points : 518
    Points
    518
    Par défaut
    Bonjour,

    Si je reprends le post de lili à cet endroit 10/04/2009 12h08, pourquoi ne pas passer par des tables temporaires ?

    J'explique, d'après ce que j'ai compris au démarrage du formulaire principal tu souhaites avoir un sous-formulaire "vide" pour faire une nouvelle saisie. De toute évidence tout ce qui va être saisi à un moment donné va être stocké dans la ou les tables concernant la requête du sous formulaire. c'est à dire que si il y a des données dans la ou les tables de la requête, ces données s'afficheront.

    Donc peut-être que ton besoin exact face à ce problème ce sont une ou plusieurs tables temporaires, qui sont une copie exacte des tables réelles de la base, il suffit de lier le sous formulaire à ces tables temporaires ensuite il faut créer un bouton ou mettre sur le code de la fermeture du formulaire un petit message demandant la validation. Si l'utilisateur dit : "oui je valide", il faut transferer les données dans les bonnes tables (celles de la base) et effacer les tables temporaires - comme ça à la prochaine saisie ça serra vide - et dans le cas contraire (non validation) il suffit de juste supprimer le contenu des tables temporaires.

    voilà ;-) j'espère que ça aura aidé

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut
    Merci à vous deux de vos réponses
    (ainsi qu'à tous ceux qui ont accepté de m'aider)

    C'est le dernier post de Belu qui m'a fait réagir : en fait, mon problème était des plus stupides -_-'


    J'ignorais qu'il fallait passer par ces flêches, pour créer un nouvel enregistrement. Du coup, au lieu de "créer", à chaque fois je "modifiais".


    D'OU les formulaires qui ne se remettent pas à zéro
    D'OU les données écrasées
    D'OU le sous formulaire ne correspondant plus au formulaire.....


    Le reste de mes bugs est probablement dû aux très (très) nombreuses méthodes que j'ai essayées pour résoudre ces soucis, et qui ont dû petit à petit tout buguer...


    Dire que j'ai passé tant de temps, et essayé tant de choses, sur un problème aussi bête...
    bête, mais il fallait le savoir......

    Le bon côté est que j'aurai appris le VBA, le SQL, les filtres, les maccros, les requêtes, et j'en passe, sur ce seul détail... (quand je vous dis "nombreuses"...)


    Du coup, pas besoin de tables temporaires, mais merci quand même pour l'idée

    Et merci à tous de votre patience

  18. #18
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 664
    Points : 34 369
    Points
    34 369
    Par défaut
    Si tu estimes que le problème initial a bien été résolu, je t'invite à tagger la discussion

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

Discussions similaires

  1. trop peu de champs dans les requetes
    Par s3b_7 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 15/04/2008, 14h40
  2. Noms de champs dans les forms
    Par zonzon dans le forum Zend Framework
    Réponses: 3
    Dernier message: 03/09/2007, 11h12
  3. Réponses: 1
    Dernier message: 09/05/2007, 00h15
  4. Mettre de l'ordre dans les codes mal arrangés !
    Par Ardely dans le forum Delphi
    Réponses: 3
    Dernier message: 24/01/2007, 14h13
  5. Choix dans les codes algorithmiques
    Par O( N ) dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 08/09/2006, 13h51

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