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

IHM Discussion :

Zone de texte avec calcul récapitulatif


Sujet :

IHM

  1. #1
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut Zone de texte avec calcul récapitulatif
    Bonjour à tous et à toutes,

    J'ai un formulaire F Adhérents gérant des adhérents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [T Adhérents].*
    FROM [T Adhérents]
    WHERE ((([T Adhérents].Adherent)=True))
    ORDER BY [T Adhérents].Nom;
    J'y ai inséré un sous-formulaire F_Cotisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT T_Cotisation.NUM_COTISATION_PK, T_Cotisation.T_Adherent_FK, T_Cotisation.Cotisation_An, T_Cotisation.AG, T_Cotisation.Cotisation, T_Cotisation.Cotisation_Du
    FROM T_Cotisation;
    Ils sont liés par les champs T Adhérents.N°Adherent <===>T_Cotisation.T_Adherent_FK

    Je voudrais faire apparaitre dans mon formulaire principal le total des cotisations dues par chaque adhérent (Cotisation_Du) pour l'année actuelle et les 4 précédentes.
    [Cotisation_An] correspond aux années.


    J'ai cela dans un requête analyse croisée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TRANSFORM Sum(T_Cotisation.Cotisation_Du) AS SommeDeCotisation_Du
    SELECT [T Adhérents].N°Adherent, [T Adhérents].Nom, [T Adhérents].Prenom, Sum(T_Cotisation.Cotisation_Du) AS Total
    FROM [T Adhérents] INNER JOIN T_Cotisation ON [T Adhérents].N°Adherent = T_Cotisation.T_Adherent_FK
    WHERE (((T_Cotisation.Cotisation_An) Between (Year(Now())-4) And (Year(Now()))) AND (([T Adhérents].Adherent)=True))
    GROUP BY [T Adhérents].N°Adherent, [T Adhérents].Nom, [T Adhérents].Prenom
    ORDER BY [T Adhérents].N°Adherent, [T Adhérents].Nom, [T Adhérents].Prenom
    PIVOT T_Cotisation.Cotisation_An;
    mais je ne peux pas associer cette requête à la T Adhérents comme source de mon formulaire principal car je ne peux alors ni modifier un enregistrement ni en rajouter.

    J'ai un contrôle [Montant_Du] où j'ai essayé de mettre la formule suivante :
    =SomDom("[T_Cotisation]![Cotisation_Du]";"[T_Cotisation]";"[T_Cotisation]![Cotisation_An]>=Année(Date()-4)" Et "[T_Cotisation]![Cotisation_An]>=Année(Date()-4)" Et "[T Adhérents]![N°Adherent]=[T_Cotisation]![T_Adherent_FK]")

    Le résultat affiché me donne le total de [Cotisation_Du], les critères ne sont donc pas pris en compte.

    Il y a donc une erreur de syntaxe dans ma formule...ce qui ne me surprend pas.
    Peut-être y-a-t-il une autre solution que de passer par une fonction de domaine, toujours trop lente.
    Peut-être est-il mieux aussi de mettre ce contrôle dans le sous-formulaire, je ne sais pas trop.

    Merci de votre aide.

    A+

    C15

    Merci de votre aide.

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Dans les fonctions de domaine il faut utiliser les noms en anglais pour les oppérateurs et les fonctions.
    De plus le critère n'est qu'une seule chaîne.
    Aussi, tu ne peux te référer qu'aux champ de ta source pas ceux d'une table ou d'une requête autre.

    En supposant que tout est correct par ailleur ta formule devrait probablement être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SomDom("[Cotisation_Du]";"[T_Cotisation]";"[Cotisation_An]>=year(Date()-4) and [Cotisation_An]>=year(Date()-4) and [T_Adherent_FK]=" & [N°Adherent])
    Et je remarque que tu as doublé [T_Cotisation]![Cotisation_An]>=year(Date()-4) ce qui est probablement une erreur.

    Note que tu pourais aussi mettre un champ total dans le pied de ton sous-formulaire et faire la somme à cet endrois là puis afficher ce champ dans ton formulaire principal. La formule est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Somme([Cotisation_Du])
    je crois. Si tu as besoin de mettre des conditions supplémentaire tu peux faire =somme(iif(UneCondition); ValeurVraie; ValeurFausse)).

    Attention, cette soluttion est parfois un peu lente et quand il n'y a pas de données dans le sous-formulaire on a des soucis.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Bonjour,

    Merci de ta réponse.
    J'ai corrigé pour avoir la fourchette 2014 - 2018
    =SomDom("[T_Cotisation]![Cotisation_Du]";"[T_Cotisation]";"[T_Cotisation]![Cotisation_An]>=year(Date())-4 and [T_Cotisation]![Cotisation_An]<=year(Date()) AND [T_Adherent_FK]=" & [N°Adherent])

    Je me suis pris la tête un moment en voulant reconstruire la formule avec le générateur d'expression...sympa, mais il faux causer anglais et non français pour avoir une réponse valide !
    J'en étais arrivé à faire 2 contrôles non visibles contenant Année(Date()) et Année(Date())-4 ; pas très élégant mais efficace.

    Par ailleurs, je me suis aperçu que Année(Date())-4 est différent de Année(Date()-4) comme je l'avais écrit par erreur (calendrier en jours à compter du 01/01/1900 ?)
    Entre cela, l’anglais et les guillemets, ma formule initiale était presque juste

    Pour rester sérieux, un dernier point.
    J'ai un bouton "Valider" pour valider les modifs éventuelles et rebloquer les contrôles afin d'éviter des modifs intempestives.
    Quelle commande y ajouter afin que l’enregistrement actuel se rafraichisse immédiatement sans avoir à changer d'enregistrement et revenir sur dessus ?

    Merci encore de ton aide.
    A+

    c15

  4. #4
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Bonjour marot_r,

    Je reviens vers toi car en faisant des tests, je me suis aperçu que cela coinçait quand je saisis un nouvel enregistrement.

    Le blocage se fait sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Me.Adherent = True And Me.Montantdu.Value >= 25 Then
    concernant une zone de texte signalant que l'adhérent est mauvais payeur.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Private Sub Form_Current()
     
    Dim Ctl As Control
        For Each Ctl In Me.Détail.Controls
     
        If (Ctl.ControlType = acTextBox) Or (Ctl.ControlType = acComboBox) Or (Ctl.ControlType = acCheckBox) Then
        Ctl.Locked = True
        End If
        Next Ctl
     
        Me.QuelAdherent.Locked = False
        NomDeChemin_AfterUpdate
     
     
    If Me!Adherent = False Then
        Me!NonAdherent.Visible = True
        Me!NonAdherent.Caption = "N'est plus Adhérent"
        Me!NonAdherent.ForeColor = 65535
        Me!NonAdherent.BackColor = 39423
    Else
        Me!NonAdherent.Visible = False
    End If
     
    If Me!DateRadiation <> "" Then
    Adherent = False
    TypeAdherent = ""
    ElseIf Me!MotifRadiation <> "" Then
    Adherent = False
    TypeAdherent = ""
    ElseIf Me!DateDeces <> "" Then
    Adherent = False
    TypeAdherent = ""
    End If
     
    If Me.Adherent = True And Me.Montantdu.Value >= 25 Then
        Me!ZoneCotisations.Visible = True
        Me!ZoneCotisations.Caption = "En retard de cotisations"
        Me!ZoneCotisations.ForeColor = 10040115
    Else
        Me!ZoneCotisations.Visible = False
    End If
     
    End Sub
    En effet il faut que mon nouvel adhérent soit créé dans ma table T_Cotisation, que la date du jour apparaisse automatiquement, alors la formule objet de ce post donnera un résultat.
    Il y a peut-être une solution, c’est d'analyser l'erreur de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Montantdu.Value >= 25
    pour que cela ne coince pas quand on obtient#Erreur

    Pour info, j'ai un bouton nouvel enregistrement avec le code suivant :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    Private Sub Nouveau_Click()
    On Error GoTo Err_Nouveau_Click
     
    If Me.NewRecord Then
         N°Adherent = DLast("[N°Adherent]", "[T Adhérents]") + 1
         Me.DateJour.Value = Date
     
         DoCmd.RunCommand acCmdSaveRecord
     
     
         MsgBox "S'il s'agit d'un nouvel adhérent, changer d'enregistrement par roulette souris ou le navigateur en bas à gauche" & Chr(13) & "et revenez sur la fiche du nouveau avant d'ouvrir le formulaire de ses cotisations", vbOKOnly
     
        'Ajout du nouvel enregistrement dans la table T_Cotisation
         Dim T_Cotisation As DAO.Recordset
               Set T_Cotisation = CurrentDb.OpenRecordset("T_Cotisation", dbOpenDynaset)
     
               T_Cotisation.AddNew
               T_Cotisation("T_Adherent_FK") = Me.N°Adherent
               T_Cotisation.Update
     
    End If
     
        Forms![F_Adherent avec cotisations et AG].AllowEdits = True
        DoCmd.GoToRecord , , acNewRec
        DoCmd.GoToControl "Titre"
     
        Me!Titre.Locked = False
        Me!Nom_Adherent.Locked = False
        Me!Prenom_Adherent.Locked = False
        Me!DateNaissance.Locked = False
        Me!Adherent.Locked = False
        Me!DateAdhesion.Locked = False
        Me!Type_Adherent.Locked = False
        Me!Fonction.Locked = False
        Me!Spécialité.Locked = False
        Me!NomOrigine.Locked = False
        Me!DateOrigine.Locked = False
        Me!DateRadiation.Locked = False
        Me!MotifRadiation.Locked = False
        Me!DateDeces.Locked = False
        Me!Adresse.Locked = False
        Me!NomVille.Locked = False
        Me!CP.Locked = False
        Me!Region.Locked = False
        Me!Téléphone.Locked = False
        Me!Mobile.Locked = False
        Me!EMail.Locked = False
        Me!Profession.Locked = False
        Me!Retraite.Locked = False
        Me!DateMiseAJour.Locked = False
     
     
     
     
     
    Exit_Nouveau_Click:
        Exit Sub
     
    Err_Nouveau_Click:
        MsgBox Err.Description
        Resume Exit_Nouveau_Click
    End Sub
    Par ailleurs
    Le N°Adherent s'incrémente automatiquement par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_BeforeInsert(Cancel As Integer)
    Me.N°Adherent = DLast("[N°Adherent]", "[T Adhérents]") + 1
    End Sub
    Toutes ces procédures concernent le formulaire principal ; j'ai rencontré des conflits liés à des doublons de N°Adherent.
    Depuis que j'ai restructuré ma base avec les T Adhérents et T_Cotisation je butte sur la gestion du N°Adherent dans les 2 tables.

    Merci de ton aide.
    A+
    C15

    PS : peut-être ce nouveau post mérite-t-il d'âtre déplacé et/ou renommé. Je te laisse juge

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Tu as sans doute un problème parce que ta valeur est nulle.

    Essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Me.Adherent = True And nZ(Me.Montantdu, 0) >= 25 Then
    Le .value est optionnel car c'est la propriété par défaut.

    Nz remplace la valeur nule par 0.
    Attention avec Nz car il m'a déjà fait sauter les décimales d'un réel.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Quelle commande y ajouter afin que l’enregistrement actuel se rafraichisse immédiatement sans avoir à changer d'enregistrement et revenir sur dessus ?
    À mon avis, il te faut faire me.requery ou me.TonChamp.requery après la mise à jour.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    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 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonsoir,
    je signale également que ce code est faux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.N°Adherent = DLast("[N°Adherent]", "[T Adhérents]") + 1
    car il renvoie la valeur de N°Adherent du dernier enregistrement.
    Pour avoir la plus grande valeur de N°Adherent, faut utiliser DMax, car Access ne stocke pas les enregistrements dans un ordre particulier.
    Ceci explique certainement les problèmes de doublons de clés évoqués plus haut.
    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 ?

  8. #8
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Bonjour marot_r,

    Merci de ces réponses que j'ai appliquées.
    Par contre j'ai toujours un problème quand je veux saisir un nouvel enregistrement avec un message d'erreur (erreur de syntaxe(opérateur absent dans l'expression)) qui apparait immédiatement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SomDom("[T_Cotisation]![Cotisation_Du]";"[T_Cotisation]";"[T_Cotisation]![Cotisation_An]>=year(Date())-4 and [T_Cotisation]![Cotisation_An]<=year(Date()) AND [T_Adherent_FK]=" & [N°Adherent])
    le contrôle MontantDu concerné affichant #Erreur
    C'est logique car l’enregistrement n’existe pas encore dans la T_Cotisation

    Cela veut dire que lorsque je clique sur le bouton [nouvel enregistrement], c'est d'abord la procédure Private Sub Form_Current() qui s'exécute avant la procédure Private Sub Nouveau_Click()

    Dans cette dernière procédure j'avais prévu de créer le nouvel enregistrement dans cette table T_Cotisation
    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
    ....
    If Me.NewRecord Then
         N°Adherent = DLast("[N°Adherent]", "[T Adhérents]") + 1
         Me.DateJour.Value = Date
     
         DoCmd.RunCommand acCmdSaveRecord
     
     
         MsgBox "S'il s'agit d'un nouvel adhérent, changer d'enregistrement par roulette souris ou le navigateur en bas à gauche" & Chr(13) & "et revenez sur la fiche du nouveau avant d'ouvrir le formulaire de ses cotisations", vbOKOnly
     
        'Ajout du nouvel enregistrement dans la table T_Cotisation
         Dim T_Cotisation As DAO.Recordset
               Set T_Cotisation = CurrentDb.OpenRecordset("T_Cotisation", dbOpenDynaset)
     
               T_Cotisation.AddNew
               T_Cotisation("T_Adherent_FK") = Me.N°Adherent
               T_Cotisation.Update
     
    End If
    ...
    mais c'est "trop tard"

    Pour résumer :

    La procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    If Me.Adherent = True And Nz(Me.Montantdu, 0) >= 25 Then
        Me!ZoneCotisations.Visible = True
        Me!ZoneCotisations.Caption = "En retard de cotisations"
        Me!ZoneCotisations.ForeColor = 10040115
    Else
        Me!ZoneCotisations.Visible = False
    End If
    doit s’exécuter quand je passe d'un enregistrement à l'autre dans le formulaire principal (je l'ai mise dans Private Sub Form_Current() ), mais pour un nouvel enregistrement elle ne doit s'exécuter que lorsque ce nouvel enregistrement existe à la fois dans la table T_Adherents (N°Adherent) et dans la T_Cotisation (T_Adherent_FK).

    Peut-être peut-elle être déplacée dans un autre événement du formulaire, mais lequel ?

    En espérant avoir été assez clair.

    Merci de ton aide.

    A+
    c15

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SomDom("[Cotisation_Du]";"[T_Cotisation]";"[Cotisation_An]>=year(Date())-4 and [Cotisation_An]<=year(Date()) AND [T_Adherent_FK]=" & [N°Adherent])
    Avec les fonctions de domaine, tous les champs proviennent obligatoirement de la source (le second paramètre). Il ne faut pas les préfixer.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  10. #10
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Bonjour,

    J'ai corrigé mon code en conséquence, merci

    Pou contourner le problème de mon message d'erreur, j'ai mis un
    dans la procédure Private Sub Form_Current() du formulaire principal.
    Le message d'erreur n'apparait plus, ma zone de texte affiche toujours #Erreur jusqu'à ce que je commence la saisie du nouvel enregistrement (donc que N°Adherent soit attribué)

    Par contre, j'ai un petit problème avec Requery

    Quand je suis sur un enregistrement et que je veuille modifier une donnée du sous-formulaire j'ai un bouton [Modifier]
    avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Modifier_Click()
     
    Dim Ctl As Control
        For Each Ctl In Me.Détail.Controls
            If (Ctl.ControlType = acTextBox) Or (Ctl.ControlType = acComboBox) Or (Ctl.ControlType = acCheckBox) Then
        Ctl.Locked = False
            End If
        Next Ctl
     
    End Sub
    Les modifs faites, j'utilise le bouton [Valider] avec 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
    21
    22
    23
    Private Sub Valider_Click()
    On Error GoTo Err_Enregistrer_Click
     
        Me.Requery
        Forms![F_Adherent avec cotisations et AG].Requery
        DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
        'Forms![sfCotisations].Refresh
       ' Forms![sfCotisations].AllowEdits = True
     
    Dim Ctl As Control
        For Each Ctl In Me.Détail.Controls
            If (Ctl.ControlType = acTextBox) Or (Ctl.ControlType = acComboBox) Or (Ctl.ControlType = acCheckBox) Then
        Ctl.Locked = True
            End If
        Next Ctl
     
    Exit_Enregistrer_Click:
        Exit Sub
     
    Err_Enregistrer_Click:
        MsgBox Err.Description
        Resume Exit_Enregistrer_Click
    End Sub
    Or cela me fait revenir sur le 1er enregistrement de mon formulaire principal.
    Ce que je voudrais, c'est valider les modifs faites et rafraichir l'enregistrement actuel en restant dessus.
    Ainsi, si je saisis la dernière cotisation dans mon sous-formulaire, le [montant_ du]=Somdom(... passe à 0 et le texte d'avertissement "en retard de cotisations" disparait.

    Il y a certainement à corriger, voire élaguer le code ci-dessus.

    Merci de ton aide.

    A+

    C15

  11. #11
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    c'est probablement à cause du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Forms![F_Adherent avec cotisations et AG].Requery
    où est ton bouton "Valider" ?

    Dans le formulaire ou le sous-formulaire ?

    Et tu peux demander la mise à jour d'un champ en particulier en faisant quelque chose donne :

    Habituellement cela ne change pas la position du curseur.

    Le on error resume next doit être utilisé avec BEAUCOUP de précaution car il "glisse sous le tapis" TOUTES les erreurs et peut donc masquer une erreur importante.

    Si tu sais qu'une erreur peut survenir, l'idéal est d'avoir du code qui fait un test et qui évite qu'elle se produise (ex en rendant un calcul conditionnel).

    L'autre solution est de tester l'erreur et de ne l'ignorer que si c'est celle attendue.

    Le code ressemble à cela :

    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
    'En début de routine
    on error goto NomTaSub_Err
     
    'ici du code qui ne génère pas d'erreur
     
    'ici ton code qui génère l'erreur
     
    'ici du code après l'erreur
     
    exit_NomTaSub:
       exit sub
     
    err_NomTaSub:
      select case err.number
         case Ici le numéro de l'erreur attendu
            resume next 'Reprend après l'erreur.
     
         case else
             call err.raise(err.number,,err.description) 'Relance l'erreur
     
      end select
    Comme cela, si tu as une erreur mais qui n'est pas celle que tu attendais tu le sais.

    J'ai pris un exemple avec une sub mais c'est sembable avec une fonction.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  12. #12
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Bonsoir,

    Le bouton "Valider" est dans le sous-formulaire
    J'y avais rajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Forms![F_Adherent avec cotisations et AG].Requery
    en espérant rafraichir mon formulaire principal et vérifier que ma zone de texte [Montant_du] était actualisée.
    Il faudrait peut-être tenter, à partir de ce bouton un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Forms![F_Adherent avec cotisations et AG].[Monant_du].Requery
    C'est jouable ?

    Par ailleurs merci pour les précisions concernant le Je quitte ce fil momentanément pour raison de week-end sportif et le reprendrai lundi après quelques tests.

    Bon week-end
    A+
    C15

  13. #13
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Bonsoir tee_grandbois,

    Désolé, j'avais zappé que c'était toi qui m'avait corrigé pour le DMax.

    Merci et bon week-end
    A+
    C15

  14. #14
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Forms![F_Adherent avec cotisations et AG].[Monant_du].Requery
    Devrait fonctionner et n'actualiser que ta zone Montnat_du.

    Tu peux écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call me.parent.[Monant_du].Requery
    ce qui rend ton code moins sensible aux modifications d'architecture.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  15. #15
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Bonjour
    Je reviens sur la fréquence.

    Effectivement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Forms![F_Adherent avec cotisations et AG].[Montantdu].Requery
    appliqué sur le bouton "Valider" du sous-formulaire actualise le seul contrôle [Montantdu] de mon formulaire principal.
    Donc tout baigne !

    Il me reste un tout petit problème (secondaire à régler)
    Dans mon sous-formulaire j'ai un bouton "Modifier" avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Modifier_Click()
     
    Dim Ctl As Control
        For Each Ctl In Me.Détail.Controls
            If (Ctl.ControlType = acTextBox) Or (Ctl.ControlType = acComboBox) Or (Ctl.ControlType = acCheckBox) Then
        Ctl.Locked = False
            End If
        Next Ctl
     
    End Sub
    Or si je veux modifier une valeur (par exemple cocher [Cotisation] pour faire passer [Cotisation_Du] à 0, il me faut cliquer 2 fois sur ce bouton "Modifier".
    Comme si le 1er clic me faisant "entrer" dans le sous-formulaire et le 2 ième clic modifier ce que je veux.
    Mais peut-être est-ce normal.

    Merci de ta réponse.
    A+

    C15

Discussions similaires

  1. [AC-2007] zone de texte avec champ calculé ne fonctionne pas
    Par ericdin dans le forum IHM
    Réponses: 6
    Dernier message: 30/10/2012, 20h55
  2. : remplir des zones de texte avec une boucle For
    Par Haro_GSD dans le forum Access
    Réponses: 3
    Dernier message: 20/09/2005, 21h23
  3. Réponses: 3
    Dernier message: 21/06/2005, 11h37
  4. [MFC] zone de texte avec "wrap" automatique
    Par bigquick dans le forum MFC
    Réponses: 3
    Dernier message: 21/04/2005, 16h26
  5. Zone de texte avec SDL
    Par bobtux dans le forum OpenGL
    Réponses: 2
    Dernier message: 08/03/2005, 18h47

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