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

Access Discussion :

Utilisation d'un module dans un formulaire [AC-2010]


Sujet :

Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    responsable hygiene
    Inscrit en
    Septembre 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : responsable hygiene
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2015
    Messages : 26
    Points : 13
    Points
    13
    Par défaut Utilisation d'un module dans un formulaire
    Bonjour à tous,

    Je cherche à compter le nombre de jours de congé pris par mon équipe entre 2 dates, pour ça, j'ai recopié les fonctions de MC2 pour compter le nombre de jours ouvrables en tenant compte des jours férié que j'ai collé dans un module que j'ai nommé "Jour_Absence", le hic est que je voudrai qu'après avoir rentré la date de fin, le nombre de jour se calcule en utilisant ce module, et renseigne mon champ Total-Absence.
    Naturellement, j'ai créé un évennement sur la mise à jour de EndDate
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub EndDate_AfterUpdate()
    Call Jour_Absence
    Total_Absence = Works_Days
    End Sub
    Et là, j'ai Erreur de compilation, Sub ou fonction non définie

    Quelqu'un sait-il comment je pourrai résoudre ce point SVP?

    D'avance merci de votre aide si précieuse

  2. #2
    Modérateur

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

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

    En fait tu veux utiliser une procédure d'un module dans un formulaire.

    Vérifie que Jour_Absence est bien défini comme "Public" sinon elle n'est visible que dans son module.

    A+

  3. #3
    Membre à l'essai
    Homme Profil pro
    responsable hygiene
    Inscrit en
    Septembre 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : responsable hygiene
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2015
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Bonsoir marot, Jour_Absence est défini comme publicNotCreatal, est-ce bien ça? Dans la propriété à Instancing, j'ai le choix entre
    1-Private
    2-publicNotCreatal

    J'avais choisi le 2 et juste au cas où, voici le code que j'ai implanté dans le module

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    Function Work_Days(BegDate As Variant, EndDate As Variant, _
                       Optional bAvecJFerie As Boolean = True) As Variant
        Dim dt As Date
     
    On Error GoTo Work_Days_Error
        If IsNull(BegDate) Or IsNull(EndDate) Then Err.Raise vbObjectError + 1
        If Not IsDate(BegDate) Or Not IsDate(EndDate) Then Err.Raise vbObjectError + 2
        If BegDate > EndDate Then Err.Raise vbObjectError + 3
     
        dt = BegDate
        Work_Days = 0
        While dt <= EndDate
            If DatePart("w", dt, vbMonday) < 6 And IIf(bAvecJFerie, Not EstFerie(dt), True) Then
                Work_Days = Work_Days + 1
            End If
            dt = DateAdd("d", 1, dt)
        Wend
        Exit Function
     
    Work_Days_Error:
        Select Case Err.Number
            Case vbObjectError + 1: Work_Days = "Les 2 dates sont obligatoires."
            Case vbObjectError + 2: Work_Days = "Format de date incorrect."
            Case vbObjectError + 3: Work_Days = "La date de fin doit être postérieure à la date de début."
            Case Else: Work_Days = Err.Description
        End Select
    End Function
     
     
    Function EstFerie(ByVal QuelleDate As Date) As Boolean
    Dim anneeDate As Integer
    Dim joursFeries(1 To 11) As Date
    Dim i As Integer
      anneeDate = Year(QuelleDate)
     
      joursFeries(1) = DateSerial(anneeDate, 1, 1)
      joursFeries(2) = DateSerial(anneeDate, 5, 1)
      joursFeries(3) = DateSerial(anneeDate, 5, 8)
      joursFeries(4) = DateSerial(anneeDate, 7, 14)
      joursFeries(5) = DateSerial(anneeDate, 8, 15)
      joursFeries(6) = DateSerial(anneeDate, 11, 1)
      joursFeries(7) = DateSerial(anneeDate, 11, 11)
      joursFeries(8) = DateSerial(anneeDate, 12, 25)
     
      joursFeries(9) = fLundiPaques(anneeDate)
      joursFeries(10) = joursFeries(9) + 38 ' Ascension = lundi de Pâques + 38
      joursFeries(11) = joursFeries(9) + 49 ' Lundi Pentecôte = lundi de Pâques + 49
     
      For i = 1 To 11
        If QuelleDate = joursFeries(i) Then
          EstFerie = True
          Exit For
        End If
      Next
    End Function
     
    Private Function fLundiPaques(ByVal Iyear As Integer) As Date
            ' Adapté de plusieurs scripts...
            Dim L(6) As Long, Lj As Long, Lm As Long
     
            L(1) = Iyear Mod 19: L(2) = Iyear Mod 4: L(3) = Iyear Mod 7
            L(4) = (19 * L(1) + 24) Mod 30
            L(5) = ((2 * L(2)) + (4 * L(3)) + (6 * L(4)) + 5) Mod 7
            L(6) = 22 + L(4) + L(5)
     
            If L(6) > 31 Then
                    Lj = L(6) - 31
                    Lm = 4
            Else
                    Lj = L(6)
                    Lm = 3
            End If
     
            ' Lundi de Pâques = Paques + 1 jour
            fLundiPaques = DateAdd("d", 1, (Lj & "/" & Lm & "/" & Iyear))
     
    End Function
    Peut_être qu'il y a une modif à faire pour adapter ce code à ma bd, mais j'ai pas mal de lacune dans ce domaine.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    OK j'avais mal compris ton problème.

    La solution est :

    soit simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Total_Absence = Works_Days(ici les 3 paramètre attendus par cette fontcion)
    Une fonction publique et visible de n'importe où dans l'application.

    soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Total_Absence = Jour_Absence.Works_Days(ici les 3 paramètre attendus par cette fonction)
    J'ai pris cette habitude qui permet visuellement de savoir où est codé la fonction mais le résultat est exactement le même.

    Tu n'as pas à changer les propriétés du module.

    Et en passant, on fait habituellement précéder le nom d'un module par une abréviation comme [CODEinline]mdl[/CODEnline] ou [CODEnline]m[/CODEnline] (ex : [CODEnline]mdlJourdAbscence[/CODEnline]) ce qui permet de le distinguer des fonctions, procédures ou varibale et de savoir à quoi on a affaire.
    Cela ne change rien pour la machine mais cela simplifie la tâche de l'humain qui lit et modifie ton code.
    L'usage d'abréviation est recommandé aussi pour les autres objets comme les tables (tbl), les requêtes (req, qry), les formulaires (frm), les états (eta, rpt).
    Comme ces objets ont des fonctionnalités différents et qu'on peut rarement les transformer en autre chose au cours de leur vie, cela permet au programmeur de savoir ce qu'il peut demander ou pas sans avoir à aller vérifier le type d'objet.

    Ce n'est pas une religion et l'important est de choisir une façon de faire et de s'y tenir au sein d'une même application.

    A+

  5. #5
    Membre à l'essai
    Homme Profil pro
    responsable hygiene
    Inscrit en
    Septembre 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : responsable hygiene
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2015
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Merci pour ton conseil, j'utilise déjà cette méthode pour les tables, requêtes, form, ... T_*****, R_*****,... mais je ne sais pas pourquoi je ne l'ai pas fait pour le module, j'y ferai attention la prochaine fois, c'est vrai que c'est beaucoup plus lisible avec cette méthode.

    J'ai appliqué ce que tu m'as donné comme code, ça évolue, mais je n'arrive toujours pas à avoir mon résultat , il me met une erreur d'execution "424", Objet Requis.
    Je suppose que ce doit être une option à cocher ou un truc comme ça, mais je ne sais pas non plus lequel (si c'est bien ça)

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Non objet requis cela veut dire que tu essayes d'utiliser quelque chose que Access prend pour un objet ou devrait être un objet vu ce que tu lui demandes.

    Sur quelle ligne as-tu l'erreur ?

    A+

  7. #7
    Membre à l'essai
    Homme Profil pro
    responsable hygiene
    Inscrit en
    Septembre 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : responsable hygiene
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2015
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    En fait il n'y a qu'un seule ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub EndDate_AfterUpdate()
    Total_Absence = Jour_Absence.Work_Days
    End Sub

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Bizarre, la fonction Work_days attend 2 (ou 3) paramètres : BegDate As Variant, EndDate As Variant, Optional bAvecJFerie As Boolean = True mais je me serai attendu à une autre erreur.

    Complète les paramètres manquant et voit si tu as toujours l'erreur.

    A+

  9. #9
    Membre à l'essai
    Homme Profil pro
    responsable hygiene
    Inscrit en
    Septembre 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : responsable hygiene
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2015
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Bonjour Marot,

    Ca y est, problème résolu
    Voilà la modif apportée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub EndDate_AfterUpdate()
    Total_Absence = M_Jour_Absence.Work_Days(BegDate, EndDate)
    End Sub
    Comme tu peux le constaté, j'ai tout repris à la base (j'ai recréé un module) et cette fois, j'ai fait attention à bien le nommer.

    Encore un grand merci pour ton aide et ta patience

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/02/2008, 22h58
  2. [MOSS 2007]Utilisation de script C# dans un formulaire
    Par jeff_! dans le forum SharePoint
    Réponses: 2
    Dernier message: 17/09/2007, 11h31
  3. Réponses: 2
    Dernier message: 07/08/2007, 09h35
  4. Réponses: 3
    Dernier message: 29/05/2007, 20h37
  5. Réponses: 21
    Dernier message: 29/11/2006, 22h51

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