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 :

Modifier les proprietes d'un Recordset [AC-2010]


Sujet :

VBA Access

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 125
    Points : 62
    Points
    62
    Par défaut Modifier les proprietes d'un Recordset
    Bonjour a tous,

    Soit "Tasks" un recordset, je sais que pour modifier la valeur d'un de ses champs il faut le code suivant qui marche nickel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            With Tasks
                .FindFirst "[ID_Tasks]=" & ID 'cherche l'enregistrement qui a la meme cle que la variable ID'
                .Edit
                ![Champ1] = "Un truc"
                .Update
            End With
    J'aimerai changer la propriété ENABLED du champ, avec un code à peu près comme ça je pense

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            With Tasks
                .FindFirst "[ID_Tasks]=" & ID 'cherche l'enregistrement qui a la même clé que la variable ID'
                .Edit
                ![Champ1].Enabled = True
                .Update
            End With
    Evidemment cela ne marche pas, quelqu'un aurait t'il la bonne syntaxe ?

    Merci d'avance

  2. #2
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 670
    Points : 2 489
    Points
    2 489
    Par défaut
    A ma connaissance, cette propriété n'est disponible que via un formulaire.
    Si vous voulez figer/restreindre la valeur d'un champ, utiliser plutôt la "validation" en mode création de la table.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 125
    Points : 62
    Points
    62
    Par défaut
    Cette propriete est modifiable via VBA avec un code tel que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    Forms![Form1]![Sous_Formulaire1].Form![Champ1].Enabled = True
    Il doit bien y avoir une facon de faire la meme chose dans un recordset...non ?

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 621
    Points : 14 577
    Points
    14 577
    Par défaut
    Il doit bien y avoir une facon de faire la meme chose dans un recordset...non ?
    ben non on ne peut pas, le jeu d'enregistrements ou Recordset, sont les données issues d'une table ou d'une requête, si on ne peut pas le faire directement dans ces objets, je ne vois pas comment on peut le faire dans un formulaire.
    Par contre, on peut toujours le faire sur le contrôle du formulaire associé au champ du Recordset
    Si tu nous disais pourquoi tu souhaites faire cela, peut-être qu'on pourrait t'aiguiller sur une autre solution.
    Est-ce un formulaire continu et est-ce que tu veux inactiver un champ selon une condition ?
    Si oui, la mise en forme conditionnelle permet de rendre inactif des champs en mode formulaire continus ...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 125
    Points : 62
    Points
    62
    Par défaut
    Ah ben oui ça parait logique en fait

    Oui voila j'ai un formulaire continu, et j'utilise le recordset pour fouiller dans le jeu d'enregistrements celui qui a sa clé primaire qui correspond à une variable.

    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
    27
    28
    29
    30
    31
    32
    33
     
    Private Sub Finished_AfterUpdate()
     
    Dim ID As Integer
    Dim Tasks As DAO.Recordset 'Premier sous formulaire'
    Set Tasks = Forms![frm_HOME]![frm_Project].Form![frm_Project_Tasks].Form.RecordsetClone
    Dim SubTasks As DAO.Recordset 'Deuxieme sous formulaire dependant du premier'
    Set SubTasks = Forms![frm_HOME]![frm_Project].Form![frm_Project_SubTasks].Form.RecordsetClone
     
     
    With SubTasks
        .FindFirst "[Finished]=" & False ' cherche si il existe un enregistrement qui n'est pas fini'
        If .NoMatch Then 'si tout est fini'
            MsgBox ("Il n'y en a pas de vide")
            .MoveFirst
            ID = SubTasks("ID_Tasks") 'enregistre la cle etrangere du deuxieme sous formulaire'
            MsgBox (ID)
            With Tasks
                .FindFirst "[ID_Tasks]=" & ID 'cherche dans le premier sous formulaire l'enregistrement qui a la meme cle'
                .Edit
                ![Finished].Enabled = True 'ET LA j'aimerai changer la propriete enabled du contrôle du formulaire associé au champ du Recordset'
                .Update
            End With
        Else 'sinon tant pis on fait rien'
            MsgBox ("Il y en a au moins un de pas check")
        End If
    End With
     
     
    Set Tasks = Nothing
    Set SubTasks = Nothing
     
    End Sub
    Il faut donc que je trouve un moyen de modifier ce contrôle du formulaire associé au champ du recordset, mais uniquement pour cet enregistrement du coup

  6. #6
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 621
    Points : 14 577
    Points
    14 577
    Par défaut
    cela semble un peu compliqué à mettre en œuvre ...
    Pourrais-tu poster ta base (en pièce jointe, au format zip) et sans données confidentielles ?
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 125
    Points : 62
    Points
    62
    Par défaut
    Mince a ce point la...

    Le problème c'est que je peux toujours essayer de fournir une copie sans données confidentielles, tout ajout de fichier sur internet est bloqué par ma boite...

    Pour rendre cela plus visuel voici quelques screens : https://www.noelshack.com/2019-30-2-1563893409-home.png
    Voici les relations : https://www.noelshack.com/2019-30-2-...3-relation.png

    On a ici le premier sous-formulaire continu qui contient des tâches "parents" (source = tbl_Tasks), et le deuxième sous-formulaire continu qui contient les sous tâches "filles" (source = tbl_SubTasks) de la tâche "parent" sur laquelle nous sommes en train de pointer. J'aimerai faire en sorte que le champ FINISHED de l'enregistrement parent ne soit disponible QUE si toutes les taches filles ont leur champ FINISHED check...

  8. #8
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 621
    Points : 14 577
    Points
    14 577
    Par défaut
    J'aimerai faire en sorte que le champ FINISHED de l'enregistrement parent ne
    soit disponible QUE si toute les taches filles ont leur champ FINISHED check...
    dans ce cas, il faudrait modifier la requête source du premier sous-formulaire, c'est à dire ajouter un champ calculé qui vérifie que tous les enregistrements de la table tbl_SubTasks sont non "Finished" (Finished=0) pour l'enregistrement associé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     IIf(DCount("Finished","tbl_SubTasks","Finished=0 and ID_Tasks=" & [tbl_Tasks].[ID_Tasks])=0,-1,0) AS AllFinished
    Ensuite, on utilise la valeur de ce champ (AllFinished) pour activer ou non le contrôle Finished dans le 1er sous-formulaire.
    On ne peut malheureusement pas utiliser la mise en forme conditionnelle avec les contrôles de type booléen, mais on peut simuler le fonctionnement en testant la valeur du champ sur chaque enregistrement avec ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_Current()
    Me.[Finished].Locked =Not (Nz(Me.[AllFinished], 0))
    End Sub
    Le tout petit souci est que cela s'applique à tous les enregistrements mais la propriété est recalculée à chaque fois qu'on change d'enregistrement, du coup c'est invisible.
    Note aussi que j'ai utilisé Locked parce que visuellement cela ne se voit pas, contrairement au Enabled.

    A faire également pour appliquer les modifications faites sur le 2ème sous-formulaire (si ajout, modification ou suppression): il faut rafraichir les données du 1er sous-formulaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     'code sur suppression d'un enregistrement dans le sous-formulaire frm_Project_SubTasks
    Private Sub Form_AfterDelConfirm(Status As Integer)
    Me.Parent![frm_Project_Tasks].Form.Recalc
    End Sub
     
    ' code si ajout ou modification d'un enregistrement
    Private Sub Form_AfterUpdate()
    Me.Parent![frm_Project_Tasks].Form.Recalc
    End Sub
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 125
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    Merci pour ta reponse, je comprend l'idee mais j'ai du mal avec le :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IIf(DCount("Finished","tbl_SubTasks","Finished=0 and ID_Tasks=" & [tbl_Tasks].[ID_Tasks])=0,-1,0) AS AllFinished
    Je ne comprend pas, tu veux que j'ajoute un champ calculé ? J'ai essayé dans ajouter un avec cette formule dans la table source de mon premier sous-formulaire, mais cette function n'est pas prise en compte donc ca ne doit pas etre ca ton idee ahah. J'ai du mal a comprendre. J'ai essayé de creer une checkbox uniquement dans le premier sous formulaire avec cette formule comme controle source mais pareil ca ne doit pas etre ca...

    Pourrait tu etre plus précis pour le pauvre debutant que je suis ? ahah

    Merci d'avance

  10. #10
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 621
    Points : 14 577
    Points
    14 577
    Par défaut
    bonjour,
    c'est dans le formulaire frm_Project_Tasks qu'il faut faire la modification. Tu dois modifier la requête source de ton sous-formulaire: si la source est une table, ce n'est pas grave il faut la convertir en requête comme montré dans la composition d'images ci-dessous:

    Nom : _0.JPG
Affichages : 395
Taille : 56,1 Ko

    tu copies et colles l'expression ci-dessous dans un nouveau champ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VraiFaux(CpteDom("Finished";"tbl_SubTasks";"Finished=0 and ID_Tasks= " & [tbl_Tasks].[ID_Tasks])=0;-1;0)
    et tu remplaces Expr1 par AllFinished
    et tu enregistre en cliquant sur l'icône "Fermer" en haut à droite:
    Nom : _2.JPG
Affichages : 386
Taille : 81,1 Ko

    J'ai essayé de creer une checkbox uniquement dans le premier sous formulaire avec cette formule comme controle source mais pareil ca ne doit pas etre ca...
    il suffit de mettre comme contrôle source le nouveau champ AllFinished (à mettre en invisible puisque c'est un contrôle technique ) et cela devrait fonctionner
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 125
    Points : 62
    Points
    62
    Par défaut
    AH MAIS OUI AJOUTER UN CHAMP EN CREANT UNE REQUETE...c'est du genie !

    Bah parfait, ca marche niquel, vu qu'on utilise locked en effet c'est invisible et on ne voit pas que tout s'applique a tout les enregistrement, merci encore c'est genial

  12. #12
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 621
    Points : 14 577
    Points
    14 577
    Par défaut
    bonjour,
    c'est du genie !
    ou plus simplement les nombreuses années de pratique ...

    si tout fonctionne n'oublie pas le bouton
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

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

Discussions similaires

  1. [Débutant] Pourquoi un "plot" modifie les proprietes de l'objet Axes
    Par Bktero dans le forum Interfaces Graphiques
    Réponses: 5
    Dernier message: 01/07/2009, 15h22
  2. Réponses: 1
    Dernier message: 30/10/2006, 15h29
  3. Réponses: 5
    Dernier message: 11/08/2006, 17h43
  4. Réponses: 4
    Dernier message: 05/01/2006, 10h01

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