Comptage d'enregistrement suivant un filtre

Résolu
jabulon Messages postés 9 Date d'inscription mardi 2 juin 2009 Statut Membre Dernière intervention 6 août 2010 - 19 avril 2010 à 14:10
jabulon Messages postés 9 Date d'inscription mardi 2 juin 2009 Statut Membre Dernière intervention 6 août 2010 - 25 avril 2010 à 17:21
Cher Tous, Bonjour.[del]/del

j'ai developpé une application sur Access 2003 pour la gestion de prise en charge d'enfant malade. il y a un formulaire qui represente une fiche d'enfant malade, que l'on rempli et dont les données sont stockees dans une table. l'application est concu pour recupere les données dans la table "fiche" et afficher le comptage dans une grille, pour chaque item de la grille. cette grille est organiser en mois et Zone de santé. j'utilise pour acceder aux données un recordset lier dynamiqument à la table.
le probleme est que je voudrais forcer le comptage des resultats suivant le filtre qui est la Zone de sante et le mois. mais le resultat donne un chiffre tres bas par rapport aux données concenées.
Pourquoi le code n'arrive pas à considérer tout le cas?

Public Sub Janv_AfterUpdate()
Dim Mabase As Database
Dim Monsql As Object
Dim Dynalist As Object
Dim CompteOui As Long
Dim CompteNon As Long
Set Mabase = CodeDb
CompteOui = 0
CompteNom = 0
'voici le code pour la connexion 
nomRelais.RowSource = "SELECT ZoneSanté.[Zone]FROM ZoneSanté WHERE ((([Zone])=Forms!DepouillementZ![Zone]));"
Set Dynalist = Mabase.OpenRecordset("FicheIndiv", dbOpenTable)
Nom = nomRelais
Dynalist.MoveFirst

Do Until Dynalist.EOF()
'le code qui suit est le decoupage de la date afin de l'afficher sous le format "mm/aaaa
 moi = Janv & "/" & mois
'voici le code pour le comptage de cas de fievre concordant. je voudrai que les cas non
' concordant, suivant le filtre de classement des concordant, decoule directement
If (Dynalist("RepFievre") "1" Or Dynalist("Fièvre") "1") And (Dynalist("REF1") = "1" And (Dynalist("FC2JT") = "1" Or Dynalist("FEC") = "1")) And Dynalist("Zone de Santé") = Nom And Right((Dynalist("Date")), 7) = moi Then
     If ((Dynalist("SiPABP") "0" Or Dynalist("SiPABP") "99" Or IsNull(Dynalist("SiPABP"))) And (Dynalist("PALU") = "99" Or IsNull(Dynalist("PALU")))) And SigneOk = True And Dynalist("Zone de Santé") = Nom And Right((Dynalist("Date")), 7) = moi Then
        CompteOui16 = CompteOui16 + 1
     End If

End If
elseIf (Dynalist("RepFievre") "1" Or Dynalist("Fièvre") "1") And ((Dynalist("N1-2") = "1" Or Dynalist("SNER") = "1" Or Dynalist("EIBT") = "1" Or Dynalist("EVT") = "1" Or Dynalist("EC") = "1" Or Dynalist("EI") = "1" Or Dynalist("APP") = "1" Or Dynalist("RDTS") = "1" Or Dynalist("TM15J") = "1" Or Dynalist("ESM") = "1" Or Dynalist("EDPMMS") = "1" Or Dynalist("ETA") = "1") And Dynalist("CASREF") = "1") And Dynalist("Zone de Santé") = Nom And Right((Dynalist("Date")), 7) = moi Then
    If (Dynalist("PALU") "99" Or IsNull(Dynalist("PALU"))) And (Dynalist("REF1") "0" Or Dynalist("REF1") = "99" Or IsNull(Dynalist("REF1"))) And Dynalist("Zone de Santé") = Nom And Right((Dynalist("Date")), 7) = moi Then
        CompteOui16 = CompteOui16 + 1
    End If

End If
ElseIf ((Dynalist("RepFievre") "1" Or Dynalist("Fièvre") "1") And (Dynalist("SiPABP") = "1" And Dynalist("PALU") = "1")) And Dynalist("Zone de Santé") = Nom And Right((Dynalist("Date")), 7) = moi Then
       If ((Dynalist("FC2JT") "0" Or Dynalist("FC2JT") "99" Or IsNull(Dynalist("FC2JT"))) And (Dynalist("FEC") = "0" Or Dynalist("FEC") = "99" Or IsNull(Dynalist("FEC")))) And (Dynalist("REF1") = "0" Or Dynalist("REF1") = "99" Or IsNull(Dynalist("REF1"))) And SigneOk = True And Dynalist("Zone de Santé") = Nom And Right((Dynalist("Date")), 7) = moi Then
        CompteOui16 = CompteOui16 + 1
       End If
Else: CompteNon16 = CompteNon16 + 1
endif


s'il vous plait, aider moi pour pouvoir remettre ce travail à temps. mon job en depend.

merci

jolo pour lui...

11 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
23 avril 2010 à 14:28
A partir du moment où une erreur te parle de collection, il faut penser aux indexations.
Ici, le seul objet indexé est le .Fields
Il est possible que l'énumération des Fields commencent à l'index 0 et pas 1
Peut-être qu'en consultant l'aide tu aurais pu le découvrir tout seul ...

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
19 avril 2010 à 15:58
Salut
On ne sait pas comment est déclaré Dynalist.
As Object est un peu vague, même si ça a tendance à marcher.
Voir ADODB par exemple.

Côté syntaxe, je ne pense pas que cela soit autorisé :
Dynalist("RepFievre") = "1"
Mieux vaudrait utiliser la vraie syntaxe d'un RecordSet :
Dynalist.Field("RepFievre").Value = "1"

Plus je lis et plus je me dis que c'est du vite fait, tout ça.
Il m'a fallu 10 minutes pour constater que le seul lien entre
- la table entière FicheIndiv chargée dans un truc nommé Dynalist
- et le nomRelais (on ne sait pas trop ce que c'est non plus)
c'est
- d'un côté un champ nommé Zone de la table ZoneSanté
- de l'autre, un champ nommé 'Zone de Santé' dans FicheIndiv

Dans le même rayon, tu déclares des variables comme CompteOui et dans le programme, tu utilises CompteOui16.
Tu utilises une variable nommée 'moi' qui n'est pas déclarée (bonjour les surprises).

Bref, que veux-tu faire avec ce bazard ?
Si tu dois afficher des champs issus de la table FicheIndiv, pourquoi charger la table 'Zone de Santé' ?
Pour compter les fiches correspondant à ton filtre, suffit de faire une vraie requète SQL plutôt que de charger toute la table :
Exemple de requète :
sSQL = "Select Count(*) " & _
" From FicheIndiv " & _
" Where ( RepFievre = '1' & _
" Or Fièvre = '1') " & _
" And SiPABP = '1' " & _
" And PALU = '1' " & _
" And [Zone de Santé] = Forms!DepouillementZ![Zone] " & _
" And Right([Date], 7) = '" & Janv & "/" & mois & "' "

Te restera à approfondir cette requète :
- Le Right devra peut-être être remplacé par un SubString
- Revoir la syntaxe des '1' selon le type de champ délcaré dans la base (faut il des ' ou pas ?)
- Très mauvaise idée de nommé un champ comme le nom d'une variable de langage : grande méfiance (d'où l'utilisation des crochets [ et ].
- Vérifier que l'ensemble Janv & "/" & mois fait toujours 7 caractères
- et surtout, mettre à plat les conditions pour un questionnement (mélange de Or et de And)

Une fois que tu auras mis au point cette requète, le RecordSet ne te fournira qu'une seule donnée : la totalisation demandée.
Il ne te restera qu'à recopier cette requète pour faire le test suivant.
D'ailleurs, tu fais les 2 premiers tests (If) mais tu incrémentes la même variable inconnue CompteOui16 : Normal ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
jabulon Messages postés 9 Date d'inscription mardi 2 juin 2009 Statut Membre Dernière intervention 6 août 2010
19 avril 2010 à 19:53
merci pour la reponse instruictive.

je le teste et vous fait le feedback incessament

merci
jolo pour lui...
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
20 avril 2010 à 10:02
Correctif syntaxe
" And [Zone de Santé] = '" & Forms!DepouillementZ![Zone] & "'" & _
toujours avec ces histoires de type de champ qui définiront s'il faut ou pas des ' pour encadrer les valeurs des champs
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jabulon Messages postés 9 Date d'inscription mardi 2 juin 2009 Statut Membre Dernière intervention 6 août 2010
20 avril 2010 à 15:08
Salut!
je viens de tester et il donne une erreur lorsque j'ecris de cette facon Dynalist.Field("RepFievre").Value = "1" . le message dit qu'il n'est pas pris en charge.
Pour ce qui est de "ComptOui et ComptOui16", j'avais oublié de dire que dans la procedure, j'utilise plusieurs compteurs pour compter les différents cas. Il y a plusieurs cas qu'il faut compter pour afficher sur la grille. et celui que j'ai mis n'est qu'un cas.
Pour la requete Sql, faut - il faire une requete pour chaque cas de concordance (plus de 30 cas)?Et comment?
je pense que j'utilise DAO pour l'acces et la manipulation des données.
Lorsque je declare Dim Dynalist as DAO.Recordset, en executant, il m'envoit la reponse procedure trop long...mais lorsque je le garde sous sa forme Dynalist as Object, la procedure s'execute normalement. je voudrai rendrai modulaire le code de cette procedure en la decoupant en fonction et procedure, mais je ne sais pas comment faire une procedure qui renvoie une valeur dans le code et pour qu'il soit utilisé dans une fonction qui renverai le comptage.

Merci

jolo pour lui...
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
21 avril 2010 à 10:15
Oui, c'est .Fields, pas .Field, pardon.
Oui, il faudra faire autant de requète que de comptage, mais elle se ressembleront beaucoup, ce ne sera que du copier-coller + adaptation, un peu de concentration et ce ne sera pas la mer à boire.
DAO est obsolète. Mieux vaut utiliser ADODB.
DAO pose quelques problèmes, des fonctions qui ne fonctionnent pas correctement (.FindFirst par exemple)
Oui, créer des fonctions indépendantes pour alléger le programme.

Exemple :
Private Function NbCompteOui16(ByRef Zone As String, _
                               ByRef MoisAnnée As String) As Long
    Dim sSQL    As String
    Dim oRS     As ADODB.Recordset
    ' Requête à affiner pour chaque cas
    sSQL = "Select Count(*) " & _
           "  From FicheIndiv " & _
           " Where (   RepFievre = '1' " & _
           "        Or Fièvre = '1') " & _
           "   And SiPABP = '1' " & _
           "   And PALU = '1' " & _
           "   And [Zone de Santé] = '" & Zone & "'" & _
           "   And Right([Date], 7) = '" & MoisAnnée & "' "
    Set oRS = New ADODB.Recordset
    oRS.CursorLocation = adUseClient
    oRS.Open SQL, , adOpenStatic, adLockReadOnly
    With oRS
        If .RecordCount > 0 Then
            .MoveFirst
            Do While Not .EOF
                NbCompteOui16 = .Fields(1).Value
                .MoveNext   ' sans intérêt ici puisque la requète
                            ' ne devrait renvoyer qu'une seule ligne
            Loop
        End If
    End With
    Set oRS = Nothing
End Function

et pour récupérer la valeur concernée :
CompteOui16 = NbCompteOui16("ma zone", "mon mois année")

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
21 avril 2010 à 10:17
PS : Ajouter la référence à ADODB = "Microsoft ActiveX Data Objects 2.8 Library" qui est le fichier msado15.dll sous "C:\Windows\System\ado"
0
jabulon Messages postés 9 Date d'inscription mardi 2 juin 2009 Statut Membre Dernière intervention 6 août 2010
21 avril 2010 à 10:43
Merci, je le teste et vous fait le feed back

jolo pour lui...
0
jabulon Messages postés 9 Date d'inscription mardi 2 juin 2009 Statut Membre Dernière intervention 6 août 2010
21 avril 2010 à 11:49
Est-il possible dans la norme Sql utilisée sous Access d'inclure des instructions du genre" If....then...else...endif", comme sous oracle?

jolo pour lui...
0
jabulon Messages postés 9 Date d'inscription mardi 2 juin 2009 Statut Membre Dernière intervention 6 août 2010
21 avril 2010 à 13:21
je viens de le tester et il m'envois une serie d'erreur.

la première: erreur "type Byref incompatible" pour la ligne
CompteOui16 = NbCompteOui16("ma zone", "mon mois année"). j'ai essayé de mettre Byval, il provoque une autre erreur : "erreur 3709 : impossible d'utiliser cette connexion pour effectuer cette opération. Elle est fermée ou non valide dans ce contexte"
elle pointe vers "oRS.Open sSql, , adOpenStatic, adLockReadOnly"

j'ai pour cela essayer de créer un objet connexion :
 Dim cnx As New ADODB.Connection
   
    
    'Définition du pilote de connexion
cnx.Provider = "Microsoft.Jet.Oledb.4.0"
'Définition de la chaîne de connexion
cnx.ConnectionString = "E:\Fichiers et document produits\correction application CCM\Test non-concordance fievre et diarrhée 16 avril\test 21 aprl 2010.mdb"
'Ouverture de la base de données
cnx.Open

et j'ai ajouté
oRS.ActiveConnection = cnx


Il me renvoie " erreur 3265: Impossible de trouver l'objet dans la collection correspondant au nom ou à la référence ordinale démandée". et le code concerné est:
NbCompteOui16 = .Fields(1).Value
.(c'est là que bloque le code)
Cette erreur veut dire quoi?

jolo pour lui...
0
jabulon Messages postés 9 Date d'inscription mardi 2 juin 2009 Statut Membre Dernière intervention 6 août 2010
25 avril 2010 à 17:21
Ouf! j'ai reussi à faire marcher les choses et ca fonctionne à 100%. Evidement, j'ai suivi vos conseil et j'ai apporté des petites revision dans mon algorithme. Et ca marche.

j'ai gardé DAO pour l'acces et la manipulation des données. ADO je ne le maitrise pas encore assez. mais je lis un doc telecharger sur www.developpez.com

Néanmoins, j'ai des questions avant de continuer.

1. Jusqu'à combien des fonctions dans un module, Access peut supporter? car j'ai regroupé une fonction pour plusieurs resultats et je compte en créer au moins 7 pour d'autre type de resultats.
2.En quoi ADO est mieux que DAO?

Merci


jolo pour lui...
0
Rejoignez-nous