jabulon
Messages postés9Date d'inscriptionmardi 2 juin 2009StatutMembreDernière intervention 6 août 2010
-
19 avril 2010 à 14:10
jabulon
Messages postés9Date d'inscriptionmardi 2 juin 2009StatutMembreDernière intervention 6 août 2010
-
25 avril 2010 à 17:21
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.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
jabulon
Messages postés9Date d'inscriptionmardi 2 juin 2009StatutMembreDerniè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.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
jabulon
Messages postés9Date d'inscriptionmardi 2 juin 2009StatutMembreDerniè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?
jabulon
Messages postés9Date d'inscriptionmardi 2 juin 2009StatutMembreDerniè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?