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 :

Fonction Mediane Access


Sujet :

Access

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Février 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Fonction Mediane Access
    Bonjour tout le monde,

    Après avoir fait de nombreux forums, je viens vers vous en désespoir de cause. En espérant que vous pourriez m'aider à programmer cela.

    Je suis assez nouveau dans la programmation access et suis en train de développer un logiciel d’exploitation de données. Access ne permet malheureusement pas de faire la médiane d'une série de valeurs avec des conditions donc le coding s'impose.

    Et c'est là que ça se corse.

    Voilà ce que j'ai fait jusqu'à présent:

    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
    Public Function Median(strfield As String, strdomain As String, Optional strcriteria As String) As Single
     
    'Define the dimension of the different elements
     
     Dim rs As DAO.Recordset
     Dim varmedian As Variant
     Dim strSQL As String
     
      Set db = CurrentDb()
     
    If Len(strcriteria) > 0 Then
     
    strSQL = "select" & strfield & " FROM " & strdomain & " WHERE " & strcriteria & " ORDER BY " & strfield & ""
     
    Else: strSQL = "select" & strfield & " FROM " & strdomain & " ORDER BY " & strfield & ""
     
    End If
     
    Set rs = db.OpenRecordset(strSQL)
     
    rs.MoveLast
        n = rs.RecordCount
        rs.Move -Int(n / 2)
     
        If n Mod 2 = 1 Then 'odd number of elements
           Median = rs(pfield)
        Else                'even number of elements
           sglHold = rs(strfield)
           rs.MoveNext
           sglHold = sglHold + rs(strfield)
           Median = sglHold / 2
        End If
        rs.Close
    End Function

    J'ai essayé plusieurs modèles (comme celui ci dessous) mais rien à faire rien ne marche.

    Pouvez vous me sortir de ce gouffre?

    Merci d'avance !

    Exemple de fonction utilisée et qui n'a pas marché:

    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
    95
    96
    97
    98
    99
    100
    101
    Public Function DMedian( _
     ByVal strfield As String, ByVal strdomain As String, _
     Optional ByVal strcriteria As String) As Variant
     
        ' Purpose:
        '     To calculate the median value
        '     for a field in a table or query.
        ' In:
        '     strField: the field.
        '     strDomain: the table or query.
        '     strCriteria: an optional WHERE clause to
        '                  apply to the table or query.
        ' Out:
        '     Return value: the median, if successful;
        '                   Otherwise, an Error value.
     
        Dim db As DAO.Database
        Dim rstDomain As DAO.Recordset
        Dim strSQL As String
        Dim varmedian As Variant
        Dim intFieldType As Integer
        Dim intRecords As Integer
     
        Const errAppTypeError = 3169
     
        On Error GoTo HandleErr
     
        Set db = CurrentDb()
     
        ' Initialize return value.
        varmedian = Null
     
        ' Build SQL string for recordset.
        strSQL = "SELECT " & strfield & " FROM " & strdomain
     
        ' Only use a WHERE clause if one is passed in.
        If Len(strcriteria) > 0 Then
            strSQL = strSQL & " WHERE " & strcriteria
        End If
     
        strSQL = strSQL & " ORDER BY " & strfield
     
        Set rstDomain = db.OpenRecordset(strSQL, dbOpenSnapshot)
     
        ' Check the data type of the median field.
        intFieldType = rstDomain.Fields(strfield).Type
        Select Case intFieldType
        Case dbByte, dbInteger, dbLong, _
          dbCurrency, dbSingle, dbDouble, dbDate
            ' Numeric field.
            If Not rstDomain.EOF Then
                rstDomain.MoveLast
                intRecords = rstDomain.RecordCount
                ' Start from the first record.
                rstDomain.MoveFirst
     
                If (intRecords Mod 2) = 0 Then
                    ' Even number of records.
                    ' No middle record, so move to the
                    ' record right before the middle.
                    rstDomain.Move ((intRecords \ 2) - 1)
                    varmedian = rstDomain.Fields(strfield)
                    ' Now move to the next record, the
                    ' one right after the middle.
                    rstDomain.MoveNext
                    ' And average the two values.
                    varmedian = _
                      (varmedian + rstDomain.Fields(strfield)) / 2
                    ' Make sure you return a date, even when
                    ' averaging two dates.
                    If intFieldType = dbDate And Not IsNull(varmedian) Then
                        varmedian = CDate(varmedian)
                    End If
                Else
                    ' Odd number or records.
                    ' Move to the middle record and return its value.
                    rstDomain.Move ((intRecords \ 2))
                    varmedian = rstDomain.Fields(strfield)
                End If
            Else
                ' No records; return Null.
                varmedian = Null
            End If
        Case Else
            ' Non-numeric field; so raise an app error.
            Err.Raise errAppTypeError
        End Select
     
        DMedian = varmedian
     
    ExitHere:
        On Error Resume Next
        rstDomain.Close
        Set rstDomain = Nothing
        Exit Function
     
    HandleErr:
        ' Return an error value.
        DMedian = CVErr(Err.Number)
        Resume ExitHere
    End Function

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Bonsoir,

    Je ne comprends pas très bien ce que tu veux faire sans tes données, modèles ou autres objets.

    Une discussion sur le calcul des Médianes a été résolue ICI. J'espère que c'est un début d'idée pour toi avec les bases exemples à disposition.

    Cordialement,

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Février 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup pour votre réponse . La discussion apporte certains éléments, je vais essayer de compiler quelques chose et vous tiens au courant.

    Pour ce qui est de ce que j'essaie de faire, j'ai une série de données: Un élément, un responsable et une durée avec diverses autres critères spécifiques

    ce que je cherche à faire, c'est la médiane des durées pour chaque responsable en tenant compte des critères:

    Exemple:

    Element 1 - responsable 1 - durée 1 - option 1.1 - option 1.2
    Element 2 - responsable 2 - durée 2 - option 2.1 - option 2.2
    Element 3 - responsable 3 - durée 3 - option 3.1 - option 3.2
    Element 4 - responsable 4 - durée 4 - option 4.1 - option 4.2
    ETC.

    J'aimerais obtenir un truc de ce style

    Responsable 1 - mediane durée - mediane durée (option .1) - médiane durée (option .2)
    Etc.

    Voilà Avez-vous une idée?

    bien à vous

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Février 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Une idée?
    Hello les gens !

    Vous avez une idée de la manière de procéder?

    Merci beaucoup !

Discussions similaires

  1. Meilleur moyen de réutiliser des fonctions dans Access ?
    Par generalgreg dans le forum VBA Access
    Réponses: 3
    Dernier message: 14/10/2007, 21h42
  2. fonction IIF access
    Par raider14 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 25/05/2007, 11h59
  3. fonction MonthName() access équivalent en plsql
    Par megapacman dans le forum PL/SQL
    Réponses: 3
    Dernier message: 08/11/2006, 09h31
  4. VBA requete avec fonction sous access
    Par vanima dans le forum VBA Access
    Réponses: 4
    Dernier message: 21/06/2006, 15h18
  5. fonctions logiciel access
    Par tom_167 dans le forum Access
    Réponses: 1
    Dernier message: 16/06/2006, 10h07

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