OVH Cloud OVH Cloud

Compter des champs non vide dans une table

24 réponses
Avatar
levallo
Bonjour =E0 tous,

Je suis devant un petit probl=E8me dont je n'arrive pas =E0 trouver la
solution.
J'explique le contexte.
J'ai une table qui doit servir =E0 g=E9rer les =E9quipes de travail
comprenant :
N=B0enr ; NomChefEquip ; N=B01_Empl ; N=B02_Empl ; ... ; N=B08_Empl ;
DateDeb ; DateFin

Dans le but de pouvoir calculer le temps pass=E9 par chantiers
effectu=E9s pendant la p=E9riode de composition de l'=E9quipe il me serait
n=E9cessaire de compter la composition de l'=E9quipe durant la p=E9riode.

D'autre part, je connais quel chantier a =E9t=E9 effectu=E9 par quel Chef
d'=E9quipe enregistr=E9 dans une autre table.

Mon soucis est comment puis-je compter les champs N=B01_Empl =E0
N=B08_Empl non vide ce qui me donnerait le nombre d'=E9quipiers pour la
p=E9riode donn=E9e.

La fonction compte() calcule sur la colonne d'un champ. Pour moi il
s'agit d'obtenir un champ calcul=E9 par enregistrement me donnant le
nbre d'=E9quipiers. L=E0, je s=E8che lamentablement ;+)

Je suis s=FBr que les pro que vous =EAtes, pourrez me trouver la
solution.

Merci encore pour tout ce que vous faites pour nous autres les bleus.

Cordialement

Jean

10 réponses

1 2 3
Avatar
jt
"jt" a écrit dans le message de news:


"jt" a écrit dans le message de news:


a écrit dans le message de news:



Bonjour,

Si je ne me trompe pas, tu ne peux pas invoquer de méthode Find
(FindFirst, FindNext,...) sur un jeu d'enregistrements de type Table, ce
qui est ton cas d'après ta déclaration d'ouverture du Recordset. Pour
contourner le problème, déclares comme suit:
set rst=currentdb.openrecordset("tbEquipes", dbOpenDynaset) ' jeu
dynamique
ou
set rst=currentdb.openrecordset("tbEquipes", dbOpenSnapshot) ' jeu
instantané



Merci Eric,
mais je plante toujours au même endroit.
J'ai essayé les Trois solutions. Voici la function telle qu'elle est
actuellement

Function nbEmp(chef)
Dim rst As Recordset
' Set rst = CurrentDb.OpenRecordset("tbEquipes")
' Set rst = CurrentDb.OpenRecordset("tbEquipes", dbOpenDynaset) ' jeu
dynamique
Set rst = CurrentDb.OpenRecordset("tbEquipes", dbOpenSnapshot) ' jeu
instantané
rst.FindFirst "ChefEquipesNom='" & chef & "'"
For N = 1 To 8
If Not IsNull(rst("n°" & N & "_empl")) Then
nb = nb + 1
End If
Next
nbEmp = nb
Set rst = Nothing
End Function

Pour répondre à Michel, j'ai vérifié que j'avais bien coché
Microsoft DAO 3.6 Library. Il était coché.
Ensuite j'ai décoché microsoft activeX data objet 2.8

Le message d'erreur était et reste Membre de méthode ou de données
introuvables.

Cela n'a rien changé.

La table comporte le champ ChefEquipesNom format texte

A+

Jean
Bonjour
Peux tu preciser le message d erreur
A+

Je n avais pas bien lu

Il me semble que le probleme vient plutot de la ligne
If Not IsNull(rst("n°" & N & "_empl")) Then
Il faut il me semble les enumerer un par un et non dans une boucle avec

une variable

Apres verif j ai dit une anerie Desole




Avatar
Eric
re,

Préfixes le recordset dans sa déclaration:
Dim rst As Recordset devient:
Dim rst As DAO.Recordset
car tu dois encore avoir une référence à ADO.

Je viens de tester avec les 2 référence DAO et ADO et en préfixant je
n'ai plus le message d'erreur.




Bonjour,

Si je ne me trompe pas, tu ne peux pas invoquer de méthode Find
(FindFirst, FindNext,...) sur un jeu d'enregistrements de type Table, ce
qui est ton cas d'après ta déclaration d'ouverture du Recordset. Pour
contourner le problème, déclares comme suit:
set rst=currentdb.openrecordset("tbEquipes", dbOpenDynaset) ' jeu dynamique
ou
set rst=currentdb.openrecordset("tbEquipes", dbOpenSnapshot) ' jeu instantané




Merci Eric,
mais je plante toujours au même endroit.
J'ai essayé les Trois solutions. Voici la function telle qu'elle est
actuellement

Function nbEmp(chef)
Dim rst As Recordset
' Set rst = CurrentDb.OpenRecordset("tbEquipes")
' Set rst = CurrentDb.OpenRecordset("tbEquipes", dbOpenDynaset) ' jeu
dynamique
Set rst = CurrentDb.OpenRecordset("tbEquipes", dbOpenSnapshot) ' jeu
instantané
rst.FindFirst "ChefEquipesNom='" & chef & "'"
For N = 1 To 8
If Not IsNull(rst("n°" & N & "_empl")) Then
nb = nb + 1
End If
Next
nbEmp = nb
Set rst = Nothing
End Function

Pour répondre à Michel, j'ai vérifié que j'avais bien coché
Microsoft DAO 3.6 Library. Il était coché.
Ensuite j'ai décoché microsoft activeX data objet 2.8

Le message d'erreur était et reste Membre de méthode ou de données
introuvables.

Cela n'a rien changé.

La table comporte le champ ChefEquipesNom format texte

A+

Jean



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr


Avatar
jt
a écrit dans le message de news:



Bonjour,

Si je ne me trompe pas, tu ne peux pas invoquer de méthode Find
(FindFirst, FindNext,...) sur un jeu d'enregistrements de type Table, ce
qui est ton cas d'après ta déclaration d'ouverture du Recordset. Pour
contourner le problème, déclares comme suit:
set rst=currentdb.openrecordset("tbEquipes", dbOpenDynaset) ' jeu
dynamique
ou
set rst=currentdb.openrecordset("tbEquipes", dbOpenSnapshot) ' jeu
instantané



Merci Eric,
mais je plante toujours au même endroit.
J'ai essayé les Trois solutions. Voici la function telle qu'elle est
actuellement

Function nbEmp(chef)
Dim rst As Recordset
' Set rst = CurrentDb.OpenRecordset("tbEquipes")
' Set rst = CurrentDb.OpenRecordset("tbEquipes", dbOpenDynaset) ' jeu
dynamique
Set rst = CurrentDb.OpenRecordset("tbEquipes", dbOpenSnapshot) ' jeu
instantané
rst.FindFirst "ChefEquipesNom='" & chef & "'"
For N = 1 To 8
If Not IsNull(rst("n°" & N & "_empl")) Then
nb = nb + 1
End If
Next
nbEmp = nb
Set rst = Nothing
End Function

Pour répondre à Michel, j'ai vérifié que j'avais bien coché
Microsoft DAO 3.6 Library. Il était coché.
Ensuite j'ai décoché microsoft activeX data objet 2.8

Le message d'erreur était et reste Membre de méthode ou de données
introuvables.

Cela n'a rien changé.

La table comporte le champ ChefEquipesNom format texte

A+

Jean

reBonjour
Tu peux remplacer
' Set rst = CurrentDb.OpenRecordset("tbEquipes")
' Set rst = CurrentDb.OpenRecordset("tbEquipes", dbOpenDynaset) ' jeu
dynamique
Set rst = CurrentDb.OpenRecordset("tbEquipes", dbOpenSnapshot) ' jeu
instantané
rst.FindFirst "ChefEquipesNom='" & chef & "'"
par
set rst=currentdb.openrecordset("select * from tbEquipes where
ChefEquipesNom='" & chef & "'")

Avatar
levallo

re,

Préfixes le recordset dans sa déclaration:
Dim rst As Recordset devient:
Dim rst As DAO.Recordset
car tu dois encore avoir une référence à ADO.

Je viens de tester avec les 2 référence DAO et ADO et en préfixant je
n'ai plus le message d'erreur.

Re Eric


En remplaçant
Dim rst As Recordset par:
Dim rst As DAO.Recordset
le message d'erreur change il devient : Errur d'exécution '3265' avec
:
"Eléments non trouvé dans cette collection "et je bloque sur :
If Not IsNull(rst("n°" & N & "_empl")) Then

Dans les références : Microsoft DAO 3.6 Object Library est bien
coché.

A+

Jean

Avatar
levallo
Hi,

Autant pour moi, cela venait des noms de champ auquel que j'avais
nommé
No_1er_Employé ; etc..

Correction faite il n'y a plus d'erreur, mais par contre le résultat
du champ nombre est toujours de 1 sur toutes les lignes de la
requète.

A+

Jean
Avatar
Eric
re,

Es-tu sur des noms de tes champs.
Ils s'appellent bien n°1_empl, n°2_empl , ... ?

car cette erreur t'indique que le champ n°x_empl n'existe pas où x
représente une valeur allant de 1 à 8.


En remplaçant
Dim rst As Recordset par:
Dim rst As DAO.Recordset
le message d'erreur change il devient : Errur d'exécution '3265' avec
:
"Eléments non trouvé dans cette collection "et je bloque sur :
If Not IsNull(rst("n°" & N & "_empl")) Then

Dans les références : Microsoft DAO 3.6 Object Library est bien
coché.

A+

Jean



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Eric
re,

Un exemple là : http://cjoint.com/?ixveZqDeOC
qui fait ce que tu veux et donne le résultat attendu.



Hi,

Autant pour moi, cela venait des noms de champ auquel que j'avais
nommé
No_1er_Employé ; etc..

Correction faite il n'y a plus d'erreur, mais par contre le résultat
du champ nombre est toujours de 1 sur toutes les lignes de la
requète.

A+

Jean



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
levallo
Salut Eric,
J'ai re-vérifié les les noms des champs et les ai corrigé.
Ils s'appellent maintenant pour éviter toute abiguité.
ChefEquipesNom ; No_1_Employé ; No_2_Employé ; etc ... ;
No_8_Employé
J'ai donc corrigé la ligne :
If Not IsNull(rst("No_" & N & "_Employé")) Then

En testant pas à pas la function celle-ci indique bien une progression
de N de 1 à 9
par contre nb s'arrête à 1

Si on reprend la function actuelle :

Function nbEmp(chef)
' Dim rst As Recordset
Dim rst As DAO.Recordset
' Dim nb As Integer
' Set rst = CurrentDb.OpenRecordset("tbEquipes")
' Set rst = CurrentDb.OpenRecordset("tbEquipes", dbOpenDynaset) ' jeu
dynamique
Set rst = CurrentDb.OpenRecordset("tbEquipes", dbOpenSnapshot) ' jeu
instantané
rst.FindFirst "ChefEquipesNom='" & chef & "'"
For N = 1 To 8
If Not IsNull(rst("No_" & N & "_Employé")) Then
nb = nb + 1
End If
Next
nbEmp = nb
Set rst = Nothing
End Function

Toutes les options en commentaires ont été essayées sans succès.

Pour cette ligne en regardant les variables pas à pas dans rst je vois
que chef ne donne que la valeur "chef"

rst.FindFirst "ChefEquipesNom='" & chef & "'"

Ce champ dans ma requète
nombre:nbemp("NomDuchef")
ne devrait-il pas être identifié ainsi :
nombre:nbEmp("chef")

Autre question il ne semble pas que la function progresse au delà de
la première ligne enregistrée.
Avatar
Eric
Bonjour,

Dans la requete, tu dois mettre:
nombre:nbemp([ChefEquipesNom]) où ChefEquipesNom est le nom du champ
contenant le nom du chef d'équipe.
Regardes l'exemple que je t'ai mis en lien sur l'autre post.


...
Pour cette ligne en regardant les variables pas à pas dans rst je vois
que chef ne donne que la valeur "chef"

rst.FindFirst "ChefEquipesNom='" & chef & "'"

Ce champ dans ma requète
nombre:nbemp("NomDuchef")
ne devrait-il pas être identifié ainsi :
nombre:nbEmp("chef")

Autre question il ne semble pas que la function progresse au delà de
la première ligne enregistrée.



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
levallo

re,

Un exemple là : http://cjoint.com/?ixveZqDeOC
qui fait ce que tu veux et donne le résultat attendu.



Effectivement, cela fonctionne très bien.

J'ai essayé de le transposer sur sur ma base mais mes résultats sont
erronés

Je ne comprend pas ce qu'il y a dans ma base qui ne joue des tours.

A+

Jean

1 2 3