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

Requêtes et SQL. Discussion :

Calculer le nombre de jours ouvrables entre 2 dates [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 116
    Points : 63
    Points
    63
    Par défaut Calculer le nombre de jours ouvrables entre 2 dates
    Bonjour à tous,

    (Je suis en 2007 donc j'espère que ca ne posera pas de problème)

    J'ai collé le code de
    http://access.developpez.com/faq/?pa...nip#NbJourOuvr
    dans un nouveau module.

    Je reprende ensuite dans la requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT table_unique.Ref_W, table_unique.TypeDocument, table_unique.DateEnregistrementMSX, (Work_Days([DateEnregistrementMSX],Now()))-[type_document]![délai] AS depassement
    FROM table_unique INNER JOIN type_document ON table_unique.TypeDocument = type_document.type_document
    WHERE (((table_unique.Ref_W)>3000) AND ((table_unique.DateEnregistrementMSX)>Now()-30) AND (((Work_Days([DateEnregistrementMSX],Now()))-[type_document]![délai])>0) AND ((table_unique.[FO-BO])="FO") AND ((table_unique.DateTraitement) Is Null))
    ORDER BY (Work_Days([DateEnregistrementMSX],Now()))-[type_document]![délai] DESC;
    (je souhaite faire resortir les dossiers dont le délai depuis l'ouverture a dépassé le délai théorique, par type de document.

    Mais j'ai la réponse
    "type de données incompatible dans l'expression du critère"

    sachant que le champ "DateEnregistrementMSX" est formaté en date abrégé jj/mm/aaaa.

    Mes connaissances en VB flirte avec le zéro, donc un coup de main ne serait pas de refus.

    Merci d'avance.

    Viggen

  2. #2
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 116
    Points : 63
    Points
    63
    Par défaut
    Bonjour à tous,

    N'ayant pas réussi à faire aboutir la manip' précédente, j'ai tenté autre chose suite à une recherche sur le site Microsoft:

    http://support.microsoft.com/kb/469628/fr

    Hélas la référence:
    Microsoft Office Web Components Function Library

    est absente de la liste des référence, je ne peux donc la cocher.

    Quelqu'un aurait une idée ?

    Merci d'avance

    Viggen

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Installe ce composant :

    Pour les versions 2003 et 2007 : http://www.microsoft.com/downloads/d...5-E0FD290D4B76
    Pour la version 2002 : http://www.microsoft.com/downloads/d...displaylang=en

    Tu devrais ensuite trouver la référence.

    Philippe

  4. #4
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 116
    Points : 63
    Points
    63
    Par défaut
    Bonjour,

    Merci pour ton aide,

    J'ai bien téléchargé le fichier pour 2007, l'ai installé.
    Au cours de l'installation, je suis informé que la version installée est plus ancienne, bonne nouvelle.

    Une fois l'installation terminée, je ne trouve hélas pas l'objet dans MS VBA:
    Microsoft Office Web Components Function Library

    et je ne trouve pas le fichier "msowcf.dll" en faisant une recherche sur mon C.

    Est-ce normal ?
    J'espère que ca t'oriente,

    Viggen

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour

    En fait j'en ai déduit cela en raison du nom du composant (Microsoft Office Web Components), car je l'utilise, et je l'ai réinstallé il n'y a pas longtemps.

    Donc c'est une déduction à partir du nom.

    Cependant (cela vient de me tilter), si tu tapes msowcf.dll dans Google tu trouveras de nombreux liens de téléchargement.

    Philippe

  6. #6
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 116
    Points : 63
    Points
    63
    Par défaut
    Bonjour,

    Oui j'ai vu qu'il était pas compliqué à trouver.
    Pour le réinstaller je n'ai donc qu'à la coller dans un ou deux répertoires ?

    Le coller dans C:\Program Files\Microsoft Office\Office12 suffirait ou un emplacement supplémentaire est nécessaire ?

    Merci de ta réponse

    Viggen

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 116
    Points : 63
    Points
    63
    Par défaut
    Bonjour à tous,

    j'ai continué mes recherches et trouvé ce qui suit:
    (c'était en ligne donc j'espère libre de Droits).

    J'ai collé les fonctions ci-dessous dans 3 nouveaux modules:

    NbOpenDay:

    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
    Public Function NbOpenDay(dtDeb As Date, dtFin As Date) As Integer
    ' Calculer le nombre de jours ouvrables entre deux dates
    ' Utilise la fonction JourFérié(dtDate As Date)
     
    Dim dblDateDeb As Double
    Dim dblDateFin As Double
    Dim DateCourante As Date
    Dim resultat As Integer
     
    If IsNull(dtDeb) Or IsNull(dtFin) _
        Or IsEmpty(dtDeb) Or IsEmpty(dtFin) Then
            NbOpenDay = 0
            Exit Function
    ElseIf Not IsDate(dtDeb) Or Not IsDate(dtFin) Then
            NbOpenDay = 0
            Exit Function
    ElseIf dtDeb > dtFin Then
            Dim dhTemp As Date
            dhTemp = dtDeb
            dtDeb = dtFin
            dtFin = dhTemp
    End If
     
    dblDateDeb = CDbl(dtDeb)
    dblDateFin = CDbl(dtFin)
     
    Do Until dblDateDeb > dblDateFin
        DateCourante = CDate(dblDateDeb)
        If Weekday(DateCourante) <> 1 And _
            Weekday(DateCourante) <> 7 And _
            JourFérié(DateCourante) = False Then
                resultat = resultat + 1
        End If
        dblDateDeb = dblDateDeb + 1
    Loop
     
    NbOpenDay = resultat
     
    End Function

    puis fPaques:


    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
    Public Function fPaques(wAn%) As Date
    'Pâques est le dimanche qui suit le quatorzième jour de la
    'Lune qui tombe le 21 mars ou immédiatement après
     
    Dim wA%, wB%, wC%, wD%, wE%, wF%, wG%, wH%
    Dim wI%, wJ%, wK%, wL%, wM%, wN%, wP%
     
    wA = wAn Mod 19 'Calcul du rang de l'année dans le cycle lunaire qui a 19 ans
    wB = wAn / 100 'Calcul du siècle
    wC = wAn Mod 100 'Calcul du rang de l'année dans le siècle
    wD = wB / 4
    wE = wB Mod 4
    wF = (wB + 8) / 25
    wG = (wB - wF + 1) / 3
    wH = (19 * wA + wB - wD - wG + 15) Mod 30
    wI = wC / 4
    wK = wC Mod 4
    wL = (32 + 2 * wE + 2 * wI - wH - wK) Mod 7
    wM = (wA + 11 * wH + 22 * wL) / 451
    wN = (wH + wL - 7 * wM + 114) / 31 'détermine le mois
    wP = (wH + wL - 7 * wM + 114) Mod 31 'détermine le jour
    fPaques = DateSerial(wAn, wN, wP + 1)
     
    '** A titre d'info :************'
    '** dtVenSaint = fPaques - 2****'
    '** dtLunPaq = fPaques + 1******'
    '** dtAscension = fPaques + 39**'
    '** dtDimPent = fPaques + 49****'
    '** dtLunPent = fPaques + 50****'
     
    End Function
    et enfin JourFérié

    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
    Public Function JourFérié(dtDate As Date) As Boolean
     
    Dim dtPaques As Date
     
    dtPaques = fPaques(Year(dtDate))
    Select Case dtDate
        Case CDate("01/01/" & Year(dtDate)) 'Jour de l'an
            JourFérié = True
        Case CDate("01/05/" & Year(dtDate)) 'Fête du travail
            JourFérié = True
        Case CDate("08/05/" & Year(dtDate)) 'Victoire de 1945
            JourFérié = True
        Case CDate("14/07/" & Year(dtDate)) 'Fête nationale
            JourFérié = True
        Case CDate("15/08/" & Year(dtDate)) 'Assomption
            JourFérié = True
        Case CDate("01/11/" & Year(dtDate)) 'Toussaint
            JourFérié = True
        Case CDate("11/11/" & Year(dtDate)) 'Armistie 1918
            JourFérié = True
        Case CDate("25/12/" & Year(dtDate)) 'Noël
            JourFérié = True
        Case dtPaques + 1 'Lundi de Pâques
            JourFérié = True
        Case dtPaques + 39 'Ascension
            JourFérié = True
        Case dtPaques + 50 'Lundi de pentcôte
            JourFérié = True
        Case Else
             JourFérié = False
    End Select
     
    End Function


    j'utilise ensuite le tout dans la requete suivante, faisant resortir les demandes/dossiers dont le délai de traitement a dépasser le délai théorique du type de dossier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT table_unique.Ref_W, table_unique.TypeDocument, table_unique.DateEnregistrementMSX, NbOpenDay([table_unique]![DateEnregistrementMSX],Now())-[type_document]![délai] AS depassement
    FROM table_unique INNER JOIN type_document ON table_unique.TypeDocument = type_document.type_document
    WHERE (((table_unique.Ref_W)>3000) AND ((table_unique.DateEnregistrementMSX)>Now()-30) AND ((NbOpenDay([table_unique]![DateEnregistrementMSX],Now())-[type_document]![délai])>0) AND ((table_unique.[FO-BO])="FO") AND ((table_unique.DateTraitement) Is Null) AND (([table_unique]![DDC-delai_1-debut])<>0) AND (([table_unique]![DDC-delai_1-fin])<>0) AND (([table_unique]![DDC-delai_2-debut])<>0) AND (([table_unique]![DDC-delai_2-fin])<>0) AND (([table_unique]![DDC-delai_3-debut])<>0) AND (([table_unique]![DDC-delai_3-fin])<>0)) OR (((table_unique.Ref_W)>3000) AND ((table_unique.DateEnregistrementMSX)>Now()-30) AND ((NbOpenDay([table_unique]![DateEnregistrementMSX],Now())-[type_document]![délai])>0) AND ((table_unique.[FO-BO])="FO") AND ((table_unique.DateTraitement) Is Null) AND (([table_unique]![DDC-delai_1-debut]) Is Null) AND (([table_unique]![DDC-delai_1-fin]) Is Null) AND (([table_unique]![DDC-delai_2-debut]) Is Null) AND (([table_unique]![DDC-delai_2-fin]) Is Null) AND (([table_unique]![DDC-delai_3-debut]) Is Null) AND (([table_unique]![DDC-delai_3-fin]) Is Null))
    ORDER BY NbOpenDay([table_unique]![DateEnregistrementMSX],Now())-[type_document]![délai] DESC;

    A l'execution de la requete j'ai une boite de dialogue: "Type de données incompatible à l'expression du critére".

    J'ai l'impression de toucher au but,
    mais ca ne veut pas ...

    Quelqu'un a une idée ?

    Merci

    Vigg

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 903
    Points
    55 903
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Vérifie le type du champ table_unique.Ref_W. Est-ce bien un numérique?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 116
    Points : 63
    Points
    63
    Par défaut
    C'est un NumeroAuto,

    ca influerai ?

  10. #10
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 903
    Points
    55 903
    Billets dans le blog
    131
    Par défaut
    Si c'est un numérique, non. C'est ce que je voulais vérifier...

    Ceci dit, avec une clause WHERE telle que celle que tu présentes, ce n'est pas gagné...

    Tu as intérêt à travailler avec une chaine SQL pour pouvoir débusquer les problèmes plus facilement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dim sql as string
    sql = "Select ..."
    debug.print sql
    ...
    Et tu mets un arrêt sur la ligne qui suit debug.print... pour visualiser la valeur de ta chaine sql dans la fenêtre d'exécution
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  11. #11
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    bonjour à tous,
    je crois que l'erreur vient de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (table_unique.DateEnregistrementMSX)>Now()-30)
    dans la WHERE tu fais une opération sur deux types de données différentes, j'imagine que tu souhaites retirer 30 jours à la date du jour.
    essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table_unique.DateEnregistrementMSX)>DateAdd("d",-30,Now())

  12. #12
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    En fait non c'est moi qui

  13. #13
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 903
    Points
    55 903
    Billets dans le blog
    131
    Par défaut
    Salut Ilank

    Pour moi, si DateEnregistrementMSX est un champ date, je ne vois pas de problème à utiliser la syntaxe >now()-30

    Par contre, Now n'est pas une fonction SQL ni une fonction intrinsèque d'Access. Il faut encadrer cette valeur qui est calculée par VBA

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sql = "select ... WHERE (((table_unique.Ref_W)>3000) AND ((table_unique.DateEnregistrementMSX)>" & Now()-30 & ") AND ((NbOpenDay([table_unique]![DateEnregistrementMSX],Now())-[type_document]![délai])>0) AND ((table_unique.[FO-BO])="FO") AND ((table_unique.DateTraitement) Is Null) AND (([table_unique]![DDC-delai_1-debut])<>0) AND (([table_unique]![DDC-delai_1-fin])<>0) AND (([table_unique]![DDC-delai_2-debut])<>0) AND (([table_unique]![DDC-delai_2-fin])<>0) AND (([table_unique]![DDC-delai_3-debut])<>0) AND (([table_unique]![DDC-delai_3-fin])<>0)) OR (((table_unique.Ref_W)>3000) AND ((table_unique.DateEnregistrementMSX)>Now()-30) AND ((NbOpenDay([table_unique]![DateEnregistrementMSX],Now())-[type_document]![délai])>0) AND ((table_unique.[FO-BO])="FO") AND ((table_unique.DateTraitement) Is Null) AND (([table_unique]![DDC-delai_1-debut]) Is Null) AND (([table_unique]![DDC-delai_1-fin]) Is Null) AND (([table_unique]![DDC-delai_2-debut]) Is Null) AND (([table_unique]![DDC-delai_2-fin]) Is Null) AND (([table_unique]![DDC-delai_3-debut]) Is Null) AND (([table_unique]![DDC-delai_3-fin]) Is Null))
    A mon sens, pour s'en sortir, il faut utiliser des variables au sein du code VBA et recréer la chaine sql, car je pense que l'utilisation des fonctions telles que nbopenday() en direct dans la chaine sql amène à des problèmes...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  14. #14
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 116
    Points : 63
    Points
    63
    Par défaut
    Merci pour vos réponses,

    Pierre,
    Malgré toute ma bonne volonté tu m'en demandes trop :-)),
    je ne suis pas assez calé pour écrire du sql ou du vba,
    les codes que j'ai communiqués ont été récupéré sur internet ou généré par access.
    Je ne suis donc pas capable de continuer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dim sql as string
    sql = "Select ..."
    debug.print sql
    ...
    En gros je n'ai pas de préférence pour nbopenday, mais c'est globalement ce que j'ai trouvé qui semble compréhensible, pour moi ...

    Je suis bien sur ouvert a toute autre proposition.

  15. #15
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour les gens,
    Citation Envoyé par Pierre Fauconnier
    Pour moi, si DateEnregistrementMSX est un champ date, je ne vois pas de problème à utiliser la syntaxe >now()-30
    Par contre, Now n'est pas une fonction SQL ni une fonction intrinsèque d'Access. Il faut encadrer cette valeur qui est calculée par VBA
    Je pense avoir rectifié ma grossière erreur, dans le post du dessous.
    Ca m'apprendra.
    je me suis permis de réécrire la clause WHERE pour y voir un peu mieux
    Code sql : 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
    WHERE
    (
      ( 
       (table_unique.Ref_W>3000) AND
       (table_unique.DateEnregistrementMSX>(Now()-30)) AND
       ((NbOpenDay([table_unique]![DateEnregistrementMSX],Now()) - [type_document]![délai])>0) AND
       (table_unique.[FO-BO]="FO") AND
       (table_unique.DateTraitement Is Null)
      ) AND 
       (
         (([table_unique]![DDC-delai_1-debut]<>0) Or ([table_unique]![DDC-delai_1-debut] Is Null)) AND 
         (([table_unique]![DDC-delai_1-fin]<>0) Or ([table_unique]![DDC-delai_1-fin] Is Null)) AND
         (([table_unique]![DDC-delai_2-debut]<>0) Or ([table_unique]![DDC-delai_2-debut] Is Null)) AND 
         (([table_unique]![DDC-delai_2-fin]<>0) Or ([table_unique]![DDC-delai_2-fin] Is Null)) AND 
         (([table_unique]![DDC-delai_3-debut]<>0) Or ([table_unique]![DDC-delai_3-debut] Is Null)) AND 
         (([table_unique]![DDC-delai_3-fin]<>0) Or ([table_unique]![DDC-delai_3-fin] Is Null))
       )
     )

  16. #16
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 116
    Points : 63
    Points
    63
    Par défaut
    Bonjour à tous,

    Merci ilank, même le sql-incult que je suis comprend presque quelque chose ...

    Durant mes recherches j'ai trouvé une fonction qui ajoute à une date un nombre à préciser de jours ouvrés.
    Hélas je n'ai pas réussi à l'utiliser directement pour compter le nombre de jours ouvrés entre deux dates ...

    Mais, je me disais que la technique pour discerner les jours ouvrés pouvait être exploité pour mon compteur. donc si vous vous sentez inspiré, n'hésitez pas !

    la fonction:

    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
    Function AjoutJoursTrav(DateDebut As Date, NbreJoursTrav As Integer) As Date
    Dim joursTrav As Integer
    Dim dt As Date
     
    dt = DateDebut
    joursTrav = 0
     
    While (joursTrav < NbreJoursTrav)
     
    dt = dt + 1
     
       If DatePart("w", dt, vbMonday) < 6 and Not (EstFerie(dt)) Then
          joursTrav = joursTrav + 1
       End If
     
    Wend
     
    AjoutJoursTrav = dt
     
    End Function
    et sa syntaxe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [EN COMPTA POUR LE]: AjoutJoursTrav([DISTRIBUEE(S) LE];+14)



    Cela mettrait quelqu'un sur la voie ?

    Merci d'avance

    Viggen.

  17. #17
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonsoir Viggen0020,
    j'ai pas tout compris ta fonction OpenDay n'est pas correcte ?

    essaie ceci : 'Correction du 12/02/2009
    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
    Public Function JourOuvres(ByVal date1 As Date, ByVal Date2 As Date) As Long
        Dim DateDeb As Date, DateFin As Date
        If IsNull(date1) Or IsNull(Date2) Then GoTo JourOuvres_Erreur
        If Not IsDate(date1) Or Not IsDate(Date2) Then GoTo JourOuvres_Erreur
        date1=dateserial(year(date1),month(date1),day(date1))
        date2=dateserial(year(date2),month(date2),day(date2))
        If date1 = Date2 Then GoTo JourOuvres_Erreur
        DateDeb = date1
        DateFin = date2
        If date1 > Date2 Then
            DateDeb = Date2
            DateFin = date1
        End If
        JourOuvres = CLng(DateFin) - CLng(DateDeb)-1 
        if JourOuvres=0 Then Exit Function
        DateDeb = DateDeb + 1
        Do
            If (Weekday(DateDeb, vbMonday) >= 6) Or (EstFerie(DateDeb) = True) Then JourOuvres = JourOuvres - 1
            DateDeb = DateDeb + 1
        Loop While DateDeb < DateFin
        Exit Function
    JourOuvres_Erreur:
     JourOuvres = 0
    End Function

  18. #18
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 116
    Points : 63
    Points
    63
    Par défaut
    Bonjour ilank,

    J'ai collé la fonction que tu me propose dans un nouveau module que j'ai enregistré.
    J'ai ensuite mis à jour ma requête ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT table_unique.Ref_W, table_unique.TypeDocument, table_unique.DateEnregistrementMSX, JourOuvres([table_unique]![DateEnregistrementMSX],Now())-[type_document]![délai] AS depassement
    FROM table_unique INNER JOIN type_document ON table_unique.TypeDocument = type_document.type_document
    WHERE (((table_unique.Ref_W)>3000) AND ((table_unique.DateEnregistrementMSX)>Now()-30) AND ((JourOuvres([table_unique]![DateEnregistrementMSX],Now())-[type_document]![délai])>0) AND ((table_unique.[FO-BO])="FO") AND ((table_unique.DateTraitement) Is Null) AND (([table_unique]![DDC-delai_1-debut])<>0) AND (([table_unique]![DDC-delai_1-fin])<>0) AND (([table_unique]![DDC-delai_2-debut])<>0) AND (([table_unique]![DDC-delai_2-fin])<>0) AND (([table_unique]![DDC-delai_3-debut])<>0) AND (([table_unique]![DDC-delai_3-fin])<>0)) OR (((table_unique.Ref_W)>3000) AND ((table_unique.DateEnregistrementMSX)>Now()-30) AND ((JourOuvres([table_unique]![DateEnregistrementMSX],Now())-[type_document]![délai])>0) AND ((table_unique.[FO-BO])="FO") AND ((table_unique.DateTraitement) Is Null) AND (([table_unique]![DDC-delai_1-debut]) Is Null) AND (([table_unique]![DDC-delai_1-fin]) Is Null) AND (([table_unique]![DDC-delai_2-debut]) Is Null) AND (([table_unique]![DDC-delai_2-fin]) Is Null) AND (([table_unique]![DDC-delai_3-debut]) Is Null) AND (([table_unique]![DDC-delai_3-fin]) Is Null))
    ORDER BY JourOuvres([table_unique]![DateEnregistrementMSX],Now())-[type_document]![délai] DESC;
    Le message d'erreur est que la fonction 'JourOuvres' est non définies.

    Ai-je la bonne méthode pour faire utiliser les codes sql (cad coller dans un module) ?

    Merci

    Viggen

  19. #19
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour Viggen0020,
    j'ai corrigé le code; car il pouvait te renvoyer des négatifs.
    A noter, j'exclus du calcul les 2 dates envoyées en paramètres.
    Ex: Entre le 1er janvier et aujourd'hui JourOuvres=29.
    Entre hier et aujourd'hui JourOuvres=0

    Pour obtenir 30 et 1 retire le -1 de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JourOuvres=Clng(datefin)-Clng(datedeb)-1
    Vérifie l'orthographe de la fonction dans le module, elle doit être déclarée en Public et doit pouvoir appeler EstFerie qui elle-même doit pouvoir appeler fLundiPaques. Le mieux étant de les placer toutes 3 dans le même module.
    (j'ai fait un copier/coller des fonctions EstFerie et fLundiPaques)

  20. #20
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 116
    Points : 63
    Points
    63
    Par défaut
    Bigre je finis par m'y perdre.

    Alors ok pour coller la fonction JourOuvres dans un module,
    mais pour coller les 2 fonctions nécessaires dans le même module, c'est plus délicat:
    dans ton post précédent, tu parles des fonctions:
    - fLundiPaques
    - EstFerie

    alors que j'ai de mon côté les fonctions:
    - fPaques
    - JourFérié

    Dois-je considérer que:
    fLundiPaques = fPaques ?
    EstFerie = JourFérié ?

    Si oui, je colle dans un module ce qui suit

    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    Public Function JourOuvres(ByVal date1 As Date, ByVal Date2 As Date) As Long
        Dim DateDeb As Date, DateFin As Date
        If IsNull(date1) Or IsNull(Date2) Then GoTo JourOuvres_Erreur
        If Not IsDate(date1) Or Not IsDate(Date2) Then GoTo JourOuvres_Erreur
        date1 = DateSerial(Year(date1), Month(date1), Day(date1))
        Date2 = DateSerial(Year(Date2), Month(Date2), Day(Date2))
        If date1 = Date2 Then GoTo JourOuvres_Erreur
        DateDeb = date1
        DateFin = Date2
        If date1 > Date2 Then
            DateDeb = Date2
            DateFin = date1
        End If
        JourOuvres = CLng(DateFin) - CLng(DateDeb)
        If JourOuvres = 0 Then Exit Function
        DateDeb = DateDeb + 1
        Do
            If (Weekday(DateDeb, vbMonday) >= 6) Or (JourFérié(DateDeb) = True) Then JourOuvres = JourOuvres - 1
            DateDeb = DateDeb + 1
        Loop While DateDeb < DateFin
        Exit Function
    JourOuvres_Erreur:
     JourOuvres = 0
    End Function
     
     
     
     
    Public Function fPaques(wAn%) As Date
    'Pâques est le dimanche qui suit le quatorzième jour de la
    'Lune qui tombe le 21 mars ou immédiatement après
     
    Dim wA%, wB%, wC%, wD%, wE%, wF%, wG%, wH%
    Dim wI%, wJ%, wK%, wL%, wM%, wN%, wP%
     
    wA = wAn Mod 19 'Calcul du rang de l'année dans le cycle lunaire qui a 19 ans
    wB = wAn / 100 'Calcul du siècle
    wC = wAn Mod 100 'Calcul du rang de l'année dans le siècle
    wD = wB / 4
    wE = wB Mod 4
    wF = (wB + 8) / 25
    wG = (wB - wF + 1) / 3
    wH = (19 * wA + wB - wD - wG + 15) Mod 30
    wI = wC / 4
    wK = wC Mod 4
    wL = (32 + 2 * wE + 2 * wI - wH - wK) Mod 7
    wM = (wA + 11 * wH + 22 * wL) / 451
    wN = (wH + wL - 7 * wM + 114) / 31 'détermine le mois
    wP = (wH + wL - 7 * wM + 114) Mod 31 'détermine le jour
    fPaques = DateSerial(wAn, wN, wP + 1)
     
    '** A titre d'info :************'
    '** dtVenSaint = fPaques - 2****'
    '** dtLunPaq = fPaques + 1******'
    '** dtAscension = fPaques + 39**'
    '** dtDimPent = fPaques + 49****'
    '** dtLunPent = fPaques + 50****'
     
    End Function
     
     
    Public Function JourFérié(dtDate As Date) As Boolean
     
    Dim dtPaques As Date
     
    dtPaques = fPaques(Year(dtDate))
    Select Case dtDate
        Case CDate("01/01/" & Year(dtDate)) 'Jour de l'an
            JourFérié = True
        Case CDate("01/05/" & Year(dtDate)) 'Fête du travail
            JourFérié = True
        Case CDate("08/05/" & Year(dtDate)) 'Victoire de 1945
            JourFérié = True
        Case CDate("14/07/" & Year(dtDate)) 'Fête nationale
            JourFérié = True
        Case CDate("15/08/" & Year(dtDate)) 'Assomption
            JourFérié = True
        Case CDate("01/11/" & Year(dtDate)) 'Toussaint
            JourFérié = True
        Case CDate("11/11/" & Year(dtDate)) 'Armistie 1918
            JourFérié = True
        Case CDate("25/12/" & Year(dtDate)) 'Noël
            JourFérié = True
        Case dtPaques + 1 'Lundi de Pâques
            JourFérié = True
        Case dtPaques + 39 'Ascension
            JourFérié = True
        Case dtPaques + 50 'Lundi de pentcôte
            JourFérié = True
        Case Else
             JourFérié = False
    End Select
     
    End Function


    et execute la requete:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT table_unique.Ref_W, table_unique.TypeDocument, table_unique.DateEnregistrementMSX, JourOuvres([table_unique]![DateEnregistrementMSX],Now())-[type_document]![délai] AS depassement
    FROM table_unique INNER JOIN type_document ON table_unique.TypeDocument = type_document.type_document
    WHERE (((table_unique.Ref_W)>3000) AND ((table_unique.DateEnregistrementMSX)>Now()-30) AND ((JourOuvres([table_unique]![DateEnregistrementMSX],Now())-[type_document]![délai])>0) AND ((table_unique.[FO-BO])="FO") AND ((table_unique.DateTraitement) Is Null) AND (([table_unique]![DDC-delai_1-debut])<>0) AND (([table_unique]![DDC-delai_1-fin])<>0) AND (([table_unique]![DDC-delai_2-debut])<>0) AND (([table_unique]![DDC-delai_2-fin])<>0) AND (([table_unique]![DDC-delai_3-debut])<>0) AND (([table_unique]![DDC-delai_3-fin])<>0)) OR (((table_unique.Ref_W)>3000) AND ((table_unique.DateEnregistrementMSX)>Now()-30) AND ((JourOuvres([table_unique]![DateEnregistrementMSX],Now())-[type_document]![délai])>0) AND ((table_unique.[FO-BO])="FO") AND ((table_unique.DateTraitement) Is Null) AND (([table_unique]![DDC-delai_1-debut]) Is Null) AND (([table_unique]![DDC-delai_1-fin]) Is Null) AND (([table_unique]![DDC-delai_2-debut]) Is Null) AND (([table_unique]![DDC-delai_2-fin]) Is Null) AND (([table_unique]![DDC-delai_3-debut]) Is Null) AND (([table_unique]![DDC-delai_3-fin]) Is Null))
    ORDER BY JourOuvres([table_unique]![DateEnregistrementMSX],Now())-[type_document]![délai] DESC;

    et j'ai le message d'erreur "Type de donnée incompatible".

    qu'est ce que j'ai loupé?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AC-2007] Calculer le nombre de jours ouvrables entre 2 dates
    Par sarah12 dans le forum VBA Access
    Réponses: 7
    Dernier message: 06/05/2015, 11h30
  2. Calcul de nombre de jours ouvrable entre deux date
    Par etienneborms dans le forum Débuter
    Réponses: 6
    Dernier message: 30/01/2012, 10h53
  3. Fonction Calcul automatique de nombre de jours ouvrable entre deux dates
    Par KiMbOoO dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/04/2011, 09h23
  4. Réponses: 1
    Dernier message: 11/09/2007, 12h10
  5. [Dates] calculer le nombre de jour ouvrable entre 2 dates
    Par pimpmyride dans le forum Langage
    Réponses: 1
    Dernier message: 20/11/2006, 17h10

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