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 :

Passage de variable ou non dans condition If


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Mars 2024
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Mars 2024
    Messages : 28
    Par défaut Passage de variable ou non dans condition If
    Bonjour

    En m'inspirant du planning trouvé je personnalise tout ca .
    https://denishulo.developpez.com/tut...ss/planningv3/

    j ai un formulaire (le formulaire de saisie du planning) sur lequel j ai des cases a cocher ( 5 pour les 5 jours ouvrables du nom de CBLundi, etc ...) qui définissent des jours de planning .

    si les cases sont décochées j'exclu les enregistrement de ces jours du planning . (L M M J V )


    Dans la conception du planning, les jours sont identifiés par des fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Function EstWeekEnd(ByVal dt As Date) As Boolean
        ' teste si la date passée en argument est sur un week-end ou non
        EstWeekEnd = (Weekday(dt) = 1) Or (Weekday(dt) = 7)
     
    End Function
     
    Public Function EstLundi(ByVal dt As Date) As Boolean
        ' teste si la date passée en argument est sur un week-end ou non
        EstLundi = (Weekday(dt) = 2)
     
    End Function
    On contrôle ensuite l'enregistrement ou non des jours du planning et on enregistre


    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
    dd = dd + 1
     
                    Do While (dd <= df) ' parcours des jours de la période
     
     
                        If (Not EstWeekEnd(dd)) And Not (EstFerie(dd)) And Not (EstLundi(dd)) Then
     
     
                            DoCmd.SetWarnings False
                            DoCmd.RunSQL "delete * from T_Planning where ([IdStagiaire]=" & Nz(Me.IdStagiaire.Value, 0) & ") and ([DateJour] = " & FormatDateUs(dd) & ")"
                            DoCmd.SetWarnings True
     
     
                            rs.AddNew
                            rs!IdStagiaire = Me.IdStagiaire
                            rs!IdMotifAbsence = Nz(Me.IdMotifAbsence, Null)
                            rs!NbHeures = Nz(Me.NbHeures, Null)
                            rs!DateJour = dd
                            rs!PeriodeJour = Me.PeriodeJour
                            rs.Update
     
     
                         End If
     
                       dd = dd + 1
     
                    Loop

    Mon soucis c est que je ne sais pas comment contrôler la case a cocher "me.CBLundi = false" pour qu'elle ajoute le parametre ESTLundi(dd) en exclusion de l'enregistrement .

    (je sais meme pas si je suis trés clair !)


    If (Not EstWeekEnd(dd)) And Not (EstFerie(dd)) And Not (EstLundi(dd)) Then

    et bien sur que ca fasse le même fonctionnement pour les autres case a cocher biensur


    Merci d avance si vous me comprenez

  2. #2
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 581
    Par défaut
    Bonjour,
    Je ne comprends pas ton histoire de case à cocher !
    Je n'en vois aucune dans ce que tu nous présente.

  3. #3
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Mars 2024
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Mars 2024
    Messages : 28
    Par défaut
    hahaha ! avec le nom et l avatar j adore
    ca me met dans l ambiance direct !

    effectivement on ne voit pas les cases a cocher .

    en fait ils sont dans un le formulaire F_Saisie_planning et les valeurs sont récupérées par me.Caseaccocher

    au final j ai opté pour un IF par case a cocher.
    je pense que ca peut s optimiser mais bon ...
    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
     
      If Me.CBLundi = True And Num_Jour = 2 Then
     
                            DoCmd.SetWarnings False
                            DoCmd.RunSQL "delete * from T_Planning where ([IdStagiaire]=" & Nz(Me.IdStagiaire.Value, 0) & ") and ([DateJour] = " & FormatDateUs(dd) & ")"
                            DoCmd.SetWarnings True
     
                            rs.AddNew
                            rs!IdStagiaire = Me.IdStagiaire
                            rs!IdMotifAbsence = Nz(Me.IdMotifAbsence, Null)
                            rs!NbHeures = Nz(Me.NbHeures, Null)
                            rs!DateJour = dd
                            rs!PeriodeJour = Me.PeriodeJour
                            rs.Update
                        End If
     
                        If Me.CBMardi = True And Num_Jour = 3 Then
     
                            DoCmd.SetWarnings False
                            DoCmd.RunSQL "delete * from T_Planning where ([IdStagiaire]=" & Nz(Me.IdStagiaire.Value, 0) & ") and ([DateJour] = " & FormatDateUs(dd) & ")"
                            DoCmd.SetWarnings True
     
                            rs.AddNew
                            rs!IdStagiaire = Me.IdStagiaire
                            rs!IdMotifAbsence = Nz(Me.IdMotifAbsence, Null)
                            rs!NbHeures = Nz(Me.NbHeures, Null)
                            rs!DateJour = dd
                            rs!PeriodeJour = Me.PeriodeJour
                            rs.Update
                        End If
     
                        If Me.CBMercredi = True And Num_Jour = 4 Then
     
                            DoCmd.SetWarnings False
                            DoCmd.RunSQL "delete * from T_Planning where ([IdStagiaire]=" & Nz(Me.IdStagiaire.Value, 0) & ") and ([DateJour] = " & FormatDateUs(dd) & ")"
                            DoCmd.SetWarnings True
     
                            rs.AddNew
                            rs!IdStagiaire = Me.IdStagiaire
                            rs!IdMotifAbsence = Nz(Me.IdMotifAbsence, Null)
                            rs!NbHeures = Nz(Me.NbHeures, Null)
                            rs!DateJour = dd
                            rs!PeriodeJour = Me.PeriodeJour
                            rs.Update
                        End If
    Ca fonctionne en tout cas .

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 527
    Par défaut
    Salut,

    On peut factoriser:
    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
     If (Me.CBLundi = True And Num_Jour = 2) Or _
        (Me.CBMardi = True And Num_Jour = 3) Or _
        (Me.CBMercredi = True And Num_Jour = 4) Then
         DoCmd.SetWarnings False
        DoCmd.RunSQL "delete * from T_Planning where ([IdStagiaire]=" & Nz(Me.IdStagiaire.Value, 0) & ") and ([DateJour] = " & FormatDateUs(dd) & ")"
        DoCmd.SetWarnings True
     
        rs.AddNew
        rs!IdStagiaire = Me.IdStagiaire
        rs!IdMotifAbsence = Nz(Me.IdMotifAbsence, Null)
        rs!NbHeures = Nz(Me.NbHeures, Null)
        rs!DateJour = dd
        rs!PeriodeJour = Me.PeriodeJour
        rs.Update
    End If
    Note:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.RunSQL "delete * from T_Planning where ([IdStagiaire]=" & Nz(Me.IdStagiaire.Value, 0) & ") and ([DateJour] = " & FormatDateUs(dd) & ")"
    Sauf erreur de ma part, si la requête échoue, l'instruction DoCmd.RunSQL ne génère aucun avertissement ou exception.
    Je préfère passer par la méthode Execute de l'objet Database, qui grâce à son second paramètre lèvera une exception en cas de problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentDb.Execut "delete * from T_Planning where ([IdStagiaire]=" & Nz(Me.IdStagiaire.Value, 0) & ") and ([DateJour] = " & FormatDateUs(dd) & ")", DbFailOnError
    De plus, dans le cadre de mise à jour successives, on préferera encadrer les opérations par une transaction, ce qui permettra de revenir en arrière en cas de problème, et ne pas laisser les données dans un état incohérent:
    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
    Public Sub MiseaJour()
    On Error Goto Error
        Dim Db As DAO.Database
        Set Db = CurrentDb
     
        Dim Wks As DAO.Workspace
        Set Wks = DbEngine.Workspaces("#Default Workspace#")
     
        Wks.BeginTrans    '// Debut de la transaction
     
        Db.Execute("DELETE .................", DbFailOnError)
        Db.Execute("UPDATE ................", DbFailOnError)
        Db.Execute("INSERT ......................", DbFailOnError)
     
        Wks.CommitTrans    '// Tout c'est bien passé, on valide la transaction
    Exit Sub
    Error:
        Wks.RollBack    '// Il y a eut un problème, on annule les changements
        Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
    End SUb

  5. #5
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Mars 2024
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Mars 2024
    Messages : 28
    Par défaut
    ha oui merci je vois le principe .

    je vais tenter la modif,

    concernant la 3eme partie je comprends pas vraiment le terme encadrer les operations par une transaction ...

    le cde fourni permet en cas d'erreur de retablir l etat d origine c est ca ?

    je le positionne dans la meme feuille VBA que mes instructions ?

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 527
    Par défaut
    Citation Envoyé par biomat24 Voir le message
    concernant la 3eme partie je comprends pas vraiment le terme encadrer les operations par une transaction
    Entourer, encapsuler, prend le terme qui te convient.
    Le but est de:
    1) Débuter une transaction (BeginTrans): Dire au moteur de base de données: "Attention, je débute une série d'opérations liées entre-elles".
    2) Confirmer la transaction (CommitTrans): Dire au moteur de base de données: "Tous c'est bien passé, tu peux appliquer les changements".
    Ou
    2) Annuler la transaction (Rollback): Dire au moteur de base de données: "Il y a eut un problème, n'applique pas les changements".

    Citation Envoyé par biomat24 Voir le message
    le cde fourni permet en cas d'erreur de retablir l etat d origine c est ca ?
    Oui, précisément.

    Citation Envoyé par biomat24 Voir le message
    je le positionne dans la meme feuille VBA que mes instructions ?
    Où tu veux, ce ne sont que des exemples pour illustrer mes propos.
    A toi d'adapter en fonction de ton besoin.

    N'hésite pas à écrire des fonctions de test pour faire des expérimentations.

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

Discussions similaires

  1. [Toutes versions] DAO et ADO : Copier dans une variable et non dans une feuille
    Par 4k1r4 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/12/2015, 09h50
  2. Webservices et passage de variable en GET dans l'URL
    Par SuperCed dans le forum Dynamique
    Réponses: 2
    Dernier message: 12/01/2007, 17h24
  3. Passage de variable dans une requête
    Par zestrellita dans le forum Langage SQL
    Réponses: 5
    Dernier message: 02/09/2004, 13h27
  4. Passage de variable dans un lien asp
    Par VirginieGE dans le forum ASP
    Réponses: 4
    Dernier message: 27/07/2004, 10h06
  5. [XSLT] Variable par défaut ou non dans un 'IF'
    Par Johnbob dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 25/01/2004, 17h00

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