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 :

Requête SQL - fonction iff & calcul d'un champ selon d'autres champs


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2013
    Messages : 34
    Points : 11
    Points
    11
    Par défaut Requête SQL - fonction iff & calcul d'un champ selon d'autres champs
    Bonjour, je suis confrontée à un problème qui me turlupine pas mal...
    J'ai pour but de calculer un score (nouveau champ) en faisant la somme des points obtenus selon la réponse apportée à chaque question, le tout divisé par le nombre de questions (soit 5)

    Par question,
    si l'individu répond 1 alors il a 0 point
    si l'individu répond 2 alors il a 50 points
    enfin, si l'individu répond 3 alors il a 100 points

    Ainsi, si le répondant a répondu respectivement 1, 1, 2, 1, 3 aux questions 1, 2, 3, 4, 5, il obtient le score suivant : (0 + 0 + 50 + 0 + 100)/5 = 30

    Voici ma requête (mise à jour):

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE [Suivi Aidant] SET [Suivi Aidant].SFscore = (IIf([Suivi Aidant].SFQ1=2,50,IIf([Suivi Aidant].SF36Q1=3,100,0))+
    (IIf([Suivi Aidant].SFQ2=2,50,IIf([Suivi Aidant].SFQ2=3,100,0))+
    (IIf([Suivi Aidant].SFQ3=2,50,IIf([Suivi Aidant].SFQ3=3,100,0))+
    (IIf([Suivi Aidant].SFQ4=2,50,IIf([Suivi Aidant].SFQ4=3,100,0))+
    (IIf([Suivi Aidant].SFQ5=2,50,IIf([Suivi Aidant].SFQ5=3,100,0)))/5
    seulement voilà, le soucis étant que j'ai parfois des valeurs manquantes, et j'aurais aimé émettre la condition suivante :
    s'il y a une valeur manquante parmi les 5 réponses alors le score n'est pas calculé et prend la valeur 999
    mais je n'arrive pas à l'écrire avec le SQL d'ACCESS (refus du else)

    alors j'ai pensé écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (IIf([Suivi Aidant].SFQ1=1,0,IIf([Suivi Aidant].SFQ1=2,50,IIf([Suivi Aidant].SFQ1=3,100,999))+[etc.])/10
    et noter dans le champ valeur valide si <999 mais j'avoue que c'est plus du "bidouillage" qu'autre chose :/

  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
    Les iif() imbriqués peuvent devenir un enfer à maintenir. Voici ce que je te propose :

    Créer un nouveau module.
    Ajouter les fonctions suivantes :

    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
    Public function CalculerScore(prmSFQ1 as variant, prmSFQ2 as variant, prmSFQ3 as variant, prmSFQ4 as variant, prmSFQ5 as variant) as double
       dim result as double
       const CALCUL_IMPOSSIBLE as double=999
     
       if isnull(prmSFQ1) or isnull(prmSFQ2) or isnull(prmSFQ3) or isnull(prmSFQ4) or isnull(prmSFQ5) then
             result=CALCUL_IMPOSSIBLE
          else
             result=0
             result=result+CalculerScoreQuestion(prmSFQ1)
             result=result+CalculerScoreQuestion(prmSFQ2)
             result=result+CalculerScoreQuestion(prmSFQ3)
             result=result+CalculerScoreQuestion(prmSFQ4)
             result=result+CalculerScoreQuestion(prmSFQ5)
             result=result/5
       end if
     
       CalculerScore=result
    end function
    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
     
    private function CalculerScoreQuestion(prmSFQ as long) as double
       dim result as double
     
       select case prmSFQ
           case 1:result=0
           case 2:result=50
           case 3:result=100
           case else
               'Cas impossible
               error 5
       end select
     
       CalculerScoreQuestion=result
    end function
    Dans ta requête tu mets maintenant :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE [Suivi Aidant] SET [Suivi Aidant].SFscore = CalculerScore([Suivi Aidant].SFQ1, [Suivi Aidant].SFQ2, [Suivi Aidant].SFQ3, [Suivi Aidant].SFQ4, [Suivi Aidant].SFQ5)

    Note que tu pourrais déduire le score en fonction de la réponse : Aussi ta structure n'est pas idéale si tu as à ajouter ou à enlever des questions.

    La méthode habituelle pour modéliser ce genre de chose est de faire :

    Table Question :
    ClefQuestion
    Autres infos

    Table Personne :
    ClefPersonne
    Autres infos

    Table Reponse :
    ClefPersonne
    ClefQuestion

    ValeurReponse

    Cette structure permet de gérer un nombre variable de questions sans avoir à modifier tes tables.

    A+

  3. #3
    Membre à l'essai
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2013
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    Merci infiniment pour votre aide, j'exécute les codes et je vous tiens au courant.
    Oui je sais que la structure de mes tables et les relations peuvent poser soucis, le problème étant que pour chaque individu j'ai 3 suivis avec le questionnaire identique, j'ai donc regroupé dans une même table, le soucis étant que j'ai des doublons, donc l'ID de l'individu ne peut être en clé primaire ...

    exemple
    ID Patient Suivi QuestionA QuestionB____etc.
    1_________1______1_________2
    1_________2______4_________5
    1_________3______4_________2
    2_________1______3_________5
    2_________2______1_________5
    2_________3______3_________2_______etc.

    autre question au sujet du code, pourquoi redéfinir de nouvelles variantes, prmSFQ1 [...] prmSFQ5 et ne pas reprendre SFQ1 [...] SFQ2, concernant le premier code ? (curiosité )
    Merci vraiment en tout cas pour votre aide

  4. #4
    Membre à l'essai
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2013
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    J'ai adapté le code à mes variables et je ne sais pas pourquoi l'erreur qui me vient est : type d'arguments by ref incompatibles. J'ai vu sur internet qu'il fallait tenter avec des by val, mais rien n'y fait ... ou alors je ne les écris pas au bon endroit



    EDIT : j'ai tenté quelques modifications :

    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
    Public Function CalculScore(db As Database, prmSFQ31 As Variant, prmSFQ32 As Variant, prmSFQ33 As Variant, prmSFQ34 As Variant, prmSFQ35 As Variant, prmSFQ36 As Variant, prmSFQ37 As Variant, prmSFQ38 As Variant, prmSFQ39 As Variant, prmSFQ310 As Variant) As Double
       Dim result As Double
       Const CALCUL_IMPOSSIBLE As Double = 99999
     
       If IsNull(prmSFQ31) Or IsNull(prmSFQ32) Or IsNull(prmSFQ33) Or IsNull(prmSFQ34) Or IsNull(prmSFQ35) Or IsNull(prmSFQ36) Or IsNull(prmSFQ37) Or IsNull(prmSFQ38) Or IsNull(prmSFQ39) Or IsNull(prmSFQ310) Then
             result = CALCUL_IMPOSSIBLE
          Else
             result = 0
             result = result + CalculScoreQuestion(prmSFQ31)
             result = result + CalculScoreQuestion(prmSFQ32)
             result = result + CalculScoreQuestion(prmSFQ33)
             result = result + CalculScoreQuestion(prmSFQ34)
             result = result + CalculScoreQuestion(prmSFQ35)
             result = result + CalculScoreQuestion(prmSFQ36)
             result = result + CalculScoreQuestion(prmSFQ37)
             result = result + CalculScoreQuestion(prmSFQ38)
             result = result + CalculScoreQuestion(prmSFQ39)
             result = result + CalculScoreQuestion(prmSFQ310)
             result = result / 10
       End If
    CalculScore = result
    End Function
     
    Private Function CalculScoreQuestion(prmSFPF As Long) As Double
       Dim result As Double
     
       Select Case prmSFPF
           Case 1: result = 0
           Case 2: result = 50
           Case 3: result = 100
           Case Else
               'Cas impossible
               Error 5
       End Select
     
       CalculScoreQuestion = result
    End Function
    le soucis étant maintenant qu'apparemment les enregistrements ne s'opèrent pas car il y a un échec de conversion de type

  5. #5
    Membre à l'essai
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2013
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    J'ai tenté maintes modifcations, le problème revient toujours à ce soucis de conversion.
    Voici les derniers codes que j'ai rentré :


    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
    Public Function CalculScore(prmSFQ31 As Long, prmSFQ32 As Long, prmSFQ33 As Long, prmSFQ34 As Long, prmSFQ35 As Long, prmSFQ36 As Long, prmSFQ37 As Long, prmSFQ38 As Long, prmSFQ39 As Long, prmSFQ310 As Long) As Long
       Dim result As Long
       Const CALCUL_IMPOSSIBLE As Long = 99999
     
       If IsNull(prmSFQ31) Or IsNull(prmSFQ32) Or IsNull(prmSFQ33) Or IsNull(prmSFQ34) Or IsNull(prmSFQ35) Or IsNull(prmSFQ36) Or IsNull(prmSFQ37) Or IsNull(prmSFQ38) Or IsNull(prmSFQ39) Or IsNull(prmSFQ310) Or prmSFQ31 = 9 Or prmSFQ32 = 9 Or prmSFQ33 = 9 Or prmSFQ34 = 9 Or prmSFQ35 = 9 Or prmSFQ36 = 9 Or prmSFQ37 = 9 Or prmSFQ38 = 9 Or prmSFQ39 = 9 Or prmSFQ310 = 9 Then
     
             result = CALCUL_IMPOSSIBLE
          Else
             result = result + CalculScoreQuestion(prmSFQ31)
             result = result + CalculScoreQuestion(prmSFQ32)
             result = result + CalculScoreQuestion(prmSFQ33)
             result = result + CalculScoreQuestion(prmSFQ34)
             result = result + CalculScoreQuestion(prmSFQ35)
             result = result + CalculScoreQuestion(prmSFQ36)
             result = result + CalculScoreQuestion(prmSFQ37)
             result = result + CalculScoreQuestion(prmSFQ38)
             result = result + CalculScoreQuestion(prmSFQ39)
             result = result + CalculScoreQuestion(prmSFQ310)
             result = result / 10
       End If
    CalculScore = result
    End Function
     
     
    Private Function CalculScoreQuestion(prmSFPF As Long) As Long
     
       Select Case prmSFPF
           Case 1: result = 0
           Case 2: result = 50
           Case 3: result = 100
           Case Else
               'Cas impossible
               ' Error 5
       End Select
     
       CalculScoreQuestion = CalculScoreQuestion + result
    End Function
    et la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE [Suivi Aidant] SET [Suivi Aidant].SFPF = CalculScore([Suivi Aidant].SFQ31,[Suivi Aidant].SFQ32,[Suivi Aidant].SFQ33,[Suivi Aidant].SFQ34,[Suivi Aidant].SFQ35,[Suivi Aidant].SFQ36,[Suivi Aidant].SFQ37,[Suivi Aidant].SFQ38,[Suivi Aidant].SFQ39,[Suivi Aidant].SFQ310);
    en sachant que mes variables SFQ31 SFQ32 ... jusqu'à SFQ310 ET SFPF je les ai toutes mises en entier long pour voir. Mais rien à faire, il y a un problème de conversion

  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
    Si tu veux pouvoir passer des Nulls à ta fonction il faut définir les paramètres comme des Variant et non des long.

    Tu as aussi intérêt à définir le résultat comme un double car il est probable que le résultat de la disivion de soit pas un entier.

    Aussi j'écrirai mon test comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If IsNull(prmSFQ31) Or IsNull(prmSFQ32) Or IsNull(prmSFQ33) Or IsNull(prmSFQ34) Or IsNull(prmSFQ35) Or IsNull(prmSFQ36) Or IsNull(prmSFQ37) then
            result = CALCUL_IMPOSSIBLE
    elseif  prmSFQ31 = 9 Or prmSFQ32 = 9 Or prmSFQ33 = 9 Or prmSFQ34 = 9 Or prmSFQ35 = 9 Or prmSFQ36 = 9 Or prmSFQ37 = 9 Or prmSFQ38 = 9 Or prmSFQ39 = 9 Or prmSFQ310 = 9 Then
     
             result = CALCUL_IMPOSSIBLE
          Else
    Utiliser un null dans un test est toujours un peu incertain. En théorie, n'importe quoi et Null donne Null en pratique Access se montre parfois 'gentil' et traite le null comme une chaîne vide, un 0 ou tout autre valeur appropriée. Le problème c'est que tu ne sais jamais trop quand il va être gentil ou pas.

    Pour le prmXXX c'est une de mes habitudes non standardisées : prm veut dire Paramètre et cela me permet de savoir que la variable vient de l'extérieur de ma fonction.

    A+

  7. #7
    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
    Pour tester ta fonction fais-toi une petite procédure du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private sub Test()
        debug.print CalculScore(1,1,1,1,1,1,1,1,1,1)
        debug.print CalculScore(Null,Null,Null,Null,Null,Null,Null,Null,Null,Null)
        debug.print CalculScore(9,9,9,9, 9, 9, 9, 9, 9,9)
    end sub
    à mettre dans le module de la fonction CalculScore par exemple.

    En utilisant le mode pas à pas ([f8]) tu vas pouvoir suivre l'exécution de ton code et interroger tes variables en cours d'exécution. Et comme tu es dans un environnement controlab;e facilement tu vas pouvoir plus facilement décider quelles valeurs sont passées à la fonction.

    Désolé de ne pouvoir être plus précis mais je ne vois pas d'erreur dans ton code à part les typages et le problème de typage ne produirai pas ce message là.

    Il se peut que cela vienne des données contenues dans la table.

    A+

  8. #8
    Membre à l'essai
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2013
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    Bonjour Mr Ramo, merci pour vos réponses.

    Si j'ajoute db as database étrangement le soucis des byref est soulevé quand j'exécute la macro. En revanche quand j'exécute depuis la requête on me dit : fonction utilisée avec un nombre d'arguments incorrects dans la fonction calculscore(...) ... j'imagine à cause de db as database ? Alors que faire ?

    Malheureusement j'ai déjà exécuté avec as variant et as double, mais je retrouve toujours le même soucis que as long : erreur de conversion de type.
    Et je ne comprends pas où est le problème car les variables SFQ31 jusqu'à SFQ310 sont définies comme numérique et entier long (avec liste déroulante,ayant pour contenu : 1;"Oui, très limité";2;"Oui, plutôt limité";3;"Pas limité du tout";9;"M.". Le soucis viendrait-il d'ici ?), et pour le score SFPF j'ai défini le champ en numérique et réel double

    Dernier code exécuté :

    Public Function CalculScore(db As Database, prmSFQ31 As Variant, prmSFQ32 As Variant, prmSFQ33 As Variant, prmSFQ34 As Variant, prmSFQ35 As Variant, prmSFQ36 As Variant, prmSFQ37 As Variant, prmSFQ38 As Variant, prmSFQ39 As Variant, prmSFQ310 As Variant) As Double
    Dim result As Double
    Const CALCUL_IMPOSSIBLE As Long = 99999

    If IsNull(prmSFQ31) Or IsNull(prmSFQ32) Or IsNull(prmSFQ33) Or IsNull(prmSFQ34) Or IsNull(prmSFQ35) Or IsNull(prmSFQ36) Or IsNull(prmSFQ37) Or IsNull(prmSFQ38) Or IsNull(prmSFQ39) Or IsNull(prmSFQ310) Then
    result = CALCUL_IMPOSSIBLE
    ElseIf prmSFQ31 = 9 Or prmSFQ32 = 9 Or prmSFQ33 = 9 Or prmSFQ34 = 9 Or prmSFQ35 = 9 Or prmSFQ36 = 9 Or prmSFQ37 = 9 Or prmSFQ38 = 9 Or prmSFQ39 = 9 Or prmSFQ310 = 9 Then
    result = CALCUL_IMPOSSIBLE
    Else
    result = result + CalculScoreQuestion(prmSFQ31)
    result = result + CalculScoreQuestion(prmSFQ32)
    result = result + CalculScoreQuestion(prmSFQ33)
    result = result + CalculScoreQuestion(prmSFQ34)
    result = result + CalculScoreQuestion(prmSFQ35)
    result = result + CalculScoreQuestion(prmSFQ36)
    result = result + CalculScoreQuestion(prmSFQ37)
    result = result + CalculScoreQuestion(prmSFQ38)
    result = result + CalculScoreQuestion(prmSFQ39)
    result = result + CalculScoreQuestion(prmSFQ310)
    result = result / 10
    End If
    CalculScore = result
    End Function


    Private Function CalculScoreQuestion(prmSFQ As Long) As Double

    Select Case prmSFQ
    Case 1: result = 0
    Case 2: result = 50
    Case 3: result = 100
    Case Else
    'Cas impossible
    ' Error 5
    End Select
    CalculScoreQuestion = CalculScoreQuestion + result

    End Sub

    & la requête :
    UPDATE [Suivi Aidant] SET [Suivi Aidant].SFPF = CalculScore([Suivi Aidant].SFQ31,[Suivi Aidant].SFQ32,[Suivi Aidant].SFQ33,[Suivi Aidant].SFQ34,[Suivi Aidant].SFQ35,[Suivi Aidant].SFQ36,[Suivi Aidant].SFQ37,[Suivi Aidant].SFQ38,[Suivi Aidant].SFQ39,[Suivi Aidant].SFQ310);


    Le score se calcule bien, puisque j'avais pas à pas exécuté le code VBA, le problème réside soit dans la conversion de type ou les byref

  9. #9
    Membre à l'essai
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2013
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    Je suis en train de revoir votre premier code proposé, et je m'interroge sur prmSFQ que vous avez nommé. Ça n'est pas en rapport avec le score total ?
    Dois je définir SFQ dans mes champs de la table Suivi Aidant ?

  10. #10
    Membre à l'essai
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2013
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    "étrangement" il semble que tous mes soucis soient solutionnés j'avais ommis un byval dans la seconde fonction quand j'ai tenté les byval

    Code :

    Public Function CalculScore(ByVal prmSFQ31 As Variant, ByVal prmSFQ32 As Variant, ByVal prmSFQ33 As Variant, ByVal prmSFQ34 As Variant, ByVal prmSFQ35 As Variant, ByVal prmSFQ36 As Variant, ByVal prmSFQ37 As Variant, ByVal prmSFQ38 As Variant, ByVal prmSFQ39 As Variant, ByVal prmSFQ310 As Variant) As Double
    Dim result As Double
    Const CALCUL_IMPOSSIBLE As Long = 99999

    If IsNull(prmSFQ31) Or IsNull(prmSFQ32) Or IsNull(prmSFQ33) Or IsNull(prmSFQ34) Or IsNull(prmSFQ35) Or IsNull(prmSFQ36) Or IsNull(prmSFQ37) Or IsNull(prmSFQ38) Or IsNull(prmSFQ39) Or IsNull(prmSFQ310) Then
    result = CALCUL_IMPOSSIBLE
    ElseIf prmSFQ31 = 9 Or prmSFQ32 = 9 Or prmSFQ33 = 9 Or prmSFQ34 = 9 Or prmSFQ35 = 9 Or prmSFQ36 = 9 Or prmSFQ37 = 9 Or prmSFQ38 = 9 Or prmSFQ39 = 9 Or prmSFQ310 = 9 Then
    result = CALCUL_IMPOSSIBLE
    Else
    result = result + CalculScoreQuestion(prmSFQ31)
    result = result + CalculScoreQuestion(prmSFQ32)
    result = result + CalculScoreQuestion(prmSFQ33)
    result = result + CalculScoreQuestion(prmSFQ34)
    result = result + CalculScoreQuestion(prmSFQ35)
    result = result + CalculScoreQuestion(prmSFQ36)
    result = result + CalculScoreQuestion(prmSFQ37)
    result = result + CalculScoreQuestion(prmSFQ38)
    result = result + CalculScoreQuestion(prmSFQ39)
    result = result + CalculScoreQuestion(prmSFQ310)
    result = result / 10
    End If
    CalculScore = result
    End Function


    Private Function CalculScoreQuestion(ByVal prmSFQ As Long) As Double
    Dim result As Double

    Select Case prmSFQ
    Case 1: result = 0
    Case 2: result = 50
    Case 3: result = 100
    Case Else
    'Cas impossible
    Error 10
    End Select

    CalculerScoreQuestion = result
    End Function


    en revanche pour les résultats obtenus ils ne sont pas correctes :
    j'obtiens pour trois individus calculés 99999, 0 et 0
    Je vais revoir le code

  11. #11
    Membre à l'essai
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2013
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    Je suis enfin parvenue à débloquer la situation
    simplement un soucis demeure (eh oui...)
    j'ai appliqué ce code sur une table où mes variables SFQ31 etc. sont numériques avec liste déroulante ET une autre table où ces mêmes variables ne comportent pas de liste déroulante.

    Ainsi ma macro fonctionne pour la table où ne figure pas de liste déroulante, à contrario l'autre qui en présente affiche soit 0 soit 99999 pour les scores...
    Alors je me tourne vers vous une dernière fois, pensez vous que je peux solutionner le problème, car je DOIS laisser les listes déroulantes

    Code :

    Public Function CalculScore(ByVal prmSFQ31 As Variant, ByVal prmSFQ32 As Variant, ByVal prmSFQ33 As Variant, ByVal prmSFQ34 As Variant, ByVal prmSFQ35 As Variant, ByVal prmSFQ36 As Variant, ByVal prmSFQ37 As Variant, ByVal prmSFQ38 As Variant, ByVal prmSFQ39 As Variant, ByVal prmSFQ310 As Variant) As Double
    Const CALCUL_IMPOSSIBLE As Long = 99999
    Dim result As Double
    If IsNull(prmSFQ31) Or IsNull(prmSFQ32) Or IsNull(prmSFQ33) Or IsNull(prmSFQ34) Or IsNull(prmSFQ35) Or IsNull(prmSFQ36) Or IsNull(prmSFQ37) Or IsNull(prmSFQ38) Or IsNull(prmSFQ39) Or IsNull(prmSFQ310) Then
    result = CALCUL_IMPOSSIBLE
    ElseIf prmSFQ31 = 9 Or prmSFQ32 = 9 Or prmSFQ33 = 9 Or prmSFQ34 = 9 Or prmSFQ35 = 9 Or prmSFQ36 = 9 Or prmSFQ37 = 9 Or prmSFQ38 = 9 Or prmSFQ39 = 9 Or prmSFQ310 = 9 Then
    result = CALCUL_IMPOSSIBLE
    Else
    result = result + CalculScoreQuestion(prmSFQ31)
    result = result + CalculScoreQuestion(prmSFQ32)
    result = result + CalculScoreQuestion(prmSFQ33)
    result = result + CalculScoreQuestion(prmSFQ34)
    result = result + CalculScoreQuestion(prmSFQ35)
    result = result + CalculScoreQuestion(prmSFQ36)
    result = result + CalculScoreQuestion(prmSFQ37)
    result = result + CalculScoreQuestion(prmSFQ38)
    result = result + CalculScoreQuestion(prmSFQ39)
    result = result + CalculScoreQuestion(prmSFQ310)
    result = result / 10
    End If
    CalculScore = result
    End Function


    Private Function CalculScoreQuestion(ByVal prmSFPF As Long) As Double
    Select Case prmSFPF
    Case 1: result = 0
    Case 2: result = 50
    Case 3: result = 100
    Case Else
    'Cas impossible
    Error 10
    End Select

    CalculerScoreQuestion = CalculerScoreQuestion + result
    End Function

  12. #12
    Membre à l'essai
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2013
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    Je suis enfin parvenue à débloquer la situation
    simplement un soucis demeure (eh oui...)
    j'ai appliqué ce code sur une table où mes variables SFQ31 etc. sont numériques avec liste déroulante ET une autre table où ces mêmes variables ne comportent pas de liste déroulante.

    Ainsi ma macro fonctionne pour la table où ne figure pas de liste déroulante, à contrario l'autre qui en présente affiche soit 0 soit 99999 pour les scores...
    Alors je me tourne vers vous une dernière fois, pensez vous que je peux solutionner le problème, car je DOIS laisser les listes déroulantes

    Code :

    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
    Public Function CalculScore(ByVal prmSFQ31 As Variant, ByVal prmSFQ32 As Variant, ByVal prmSFQ33 As Variant, ByVal prmSFQ34 As Variant, ByVal prmSFQ35 As Variant, ByVal prmSFQ36 As Variant, ByVal prmSFQ37 As Variant, ByVal prmSFQ38 As Variant, ByVal prmSFQ39 As Variant, ByVal prmSFQ310 As Variant) As Double
       Const CALCUL_IMPOSSIBLE As Long = 99999
       Dim result As Double
       If IsNull(prmSFQ31) Or IsNull(prmSFQ32) Or IsNull(prmSFQ33) Or IsNull(prmSFQ34) Or IsNull(prmSFQ35) Or IsNull(prmSFQ36) Or IsNull(prmSFQ37) Or IsNull(prmSFQ38) Or IsNull(prmSFQ39) Or IsNull(prmSFQ310) Then
            result = CALCUL_IMPOSSIBLE
       ElseIf prmSFQ31 = 9 Or prmSFQ32 = 9 Or prmSFQ33 = 9 Or prmSFQ34 = 9 Or prmSFQ35 = 9 Or prmSFQ36 = 9 Or prmSFQ37 = 9 Or prmSFQ38 = 9 Or prmSFQ39 = 9 Or prmSFQ310 = 9 Then
            result = CALCUL_IMPOSSIBLE
          Else
             result = result + CalculScoreQuestion(prmSFQ31)
             result = result + CalculScoreQuestion(prmSFQ32)
             result = result + CalculScoreQuestion(prmSFQ33)
             result = result + CalculScoreQuestion(prmSFQ34)
             result = result + CalculScoreQuestion(prmSFQ35)
             result = result + CalculScoreQuestion(prmSFQ36)
             result = result + CalculScoreQuestion(prmSFQ37)
             result = result + CalculScoreQuestion(prmSFQ38)
             result = result + CalculScoreQuestion(prmSFQ39)
             result = result + CalculScoreQuestion(prmSFQ310)
             result = result / 10
       End If
    CalculScore = result
    End Function
     
     
    Private Function CalculScoreQuestion(ByVal prmSFPF As Long) As Double
       Select Case prmSFPF
           Case 1: result = 0
           Case 2: result = 50
           Case 3: result = 100
           Case Else
               'Cas impossible
               Error 10
       End Select
     
       CalculerScoreQuestion = CalculerScoreQuestion + result
    End Function

  13. #13
    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
    À vrai dire les listes déroulantes n'ont pas d'usage dans une table. Elles sont des éléments d'inteface et ne devraient être utilisées que dans des formulaires mais à priori elles ne pertubent pas du tout le traitement des données. Elles peuvent par contre cacher les données qui sont réellement dans le champ.

    En résumé tu pourrais ne pas avoir de liste déroulante dans tes tables et en avoir dans tes formulaires et cela sans problème. Et tu es supposée utiliser un formulaire pour faire la saisie de tes données pas d'aller directement dans la table. Les formulaires te donnent beaucoup plus de contrôle sur le processus de saisie (ex : contrôle avant enregistrement, champs verrouillés, champs invisibles ...).

    Est-ce que tu utilises des champs multi-valués pour stocker tes résulats ?

    Peux-tu mettre une copie d'écran des propriétés d'un des champs avec liste déroulante ? Je soupsconne qu'en réalité ton champ n'est pas numérique du tout.

    A+

  14. #14
    Membre à l'essai
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2013
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    Bonjour,
    Non, de ce côté j'en suis sûre j'ai défini mes variables comme numériques :
    exemple :
    SFQ11
    type de données : numérique
    taille du champ entier long
    format nombre général
    décimales auto
    null interdit non
    indexé non

    afficher le contrôle : zone de liste déroulante
    origine source : liste valeurs
    contenu 1;"Faux";2;"Vrai";3"M."
    colonne liée 1
    nbr colonnes 2
    en tête colonnes non
    limiter à liste non

  15. #15
    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 au temp pour mon intuition masculine :-).

    La solution qui me semble la plus simple est une éxécution pas à pas de ta fonction.

    Pour ce faire, va dans le code de la fonction et clique en marge de la 1ère ligne. Cela va mettre un gros point marrond à gauche. Lors de l'exécution Access va s'arréter et tu vas pouvoir suivre l'exécution de chaque instruction. Pour passer à l'instruction suivante appuyer sur la touche [F8].

    En cours de débuggage tu peux pointer sur le nom d'une variable avec ta souris et Access va afficher la valeur. Cela devrait te donner une piste de solution.

    A+

Discussions similaires

  1. Requête sql count(*) et divers calcul
    Par Smoki28 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 07/07/2014, 13h40
  2. [AC-2010] Requête SQL - Fonction RANK
    Par la mouche dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 26/04/2012, 17h48
  3. Requête SQL Fonction Max(LaDate)
    Par ElVatoLoco69 dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/02/2012, 11h55
  4. Réponses: 4
    Dernier message: 20/04/2008, 22h38
  5. [Requête/SQL]Remplacer champ par valeur autre champ
    Par BORDEAUX4 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 17/04/2007, 11h05

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