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
michel
Bonjour
essaie
Sub nbEmp
dim rst as recordset
set rst=currentdb.openrecordset("nomDeTaTable")
chef=inputbox("nom du chef d'equipe")
rst.findfirst "nomChefEquip='" & chef & "'"
for n=1 to 8
if not isnull(rst("n°" & n &"_empl")) then
nb=nb+1
endif
next
msgbox nb & " equipier(s)"
set rst=nothing
end sub
Michel
a écrit dans le message de news:

Bonjour à tous,

Je suis devant un petit problème dont je n'arrive pas à trouver la
solution.
J'explique le contexte.
J'ai une table qui doit servir à gérer les équipes de travail
comprenant :
N°enr ; NomChefEquip ; N°1_Empl ; N°2_Empl ; ... ; N°8_Empl ;
DateDeb ; DateFin

Dans le but de pouvoir calculer le temps passé par chantiers
effectués pendant la période de composition de l'équipe il me serait
nécessaire de compter la composition de l'équipe durant la période.

D'autre part, je connais quel chantier a été effectué par quel Chef
d'équipe enregistré dans une autre table.

Mon soucis est comment puis-je compter les champs N°1_Empl à
N°8_Empl non vide ce qui me donnerait le nombre d'équipiers pour la
période donnée.

La fonction compte() calcule sur la colonne d'un champ. Pour moi il
s'agit d'obtenir un champ calculé par enregistrement me donnant le
nbre d'équipiers. Là, je sèche lamentablement ;+)

Je suis sûr que les pro que vous êtes, pourrez me trouver la
solution.

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

Cordialement

Jean
Avatar
JL
michel wrote:
Bonjour
essaie
Sub nbEmp
dim rst as recordset
set rst=currentdb.openrecordset("nomDeTaTable")
chef=inputbox("nom du chef d'equipe")
rst.findfirst "nomChefEquip='" & chef & "'"
for n=1 to 8
if not isnull(rst("n°" & n &"_empl")) then
nb=nb+1
endif
next
msgbox nb & " equipier(s)"
set rst=nothing
end sub
Michel


Merci pour la réponse. Je suis de nouveau présent.

Une petite précision qui me semble nécessaire pour le novice que je suis.
Ce Sub nbEmp doit être modifié comment pour être integré et faire
apparaitre dans la requète un champ NbreEquipiers ?

Cordialement

Jean


Avatar
michel
Pour etre utilisable dans une requete il faut une procedure function et non
Sub
function nbEmp(chef)
dim rst as recordset
set rst=currentdb.openrecordset("nomDeTaTable")
rst.findfirst "nomChefEquip='" & chef & "'"
for n=1 to 8
if not isnull(rst("n°" & n &"_empl")) then
nb=nb+1
endif
next
nbEmp=nb
set rst=nothing
end function

ensuite dans ta requete tu ajoute un champ
nombre:nbemp("NomDuchef")
Voila
Michel
"JL" a écrit dans le message de news:
44ec54fa$0$25984$
michel wrote:
Bonjour
essaie
Sub nbEmp
dim rst as recordset
set rst=currentdb.openrecordset("nomDeTaTable")
chef=inputbox("nom du chef d'equipe")
rst.findfirst "nomChefEquip='" & chef & "'"
for n=1 to 8
if not isnull(rst("n°" & n &"_empl")) then
nb=nb+1
endif
next
msgbox nb & " equipier(s)"
set rst=nothing
end sub
Michel


Merci pour la réponse. Je suis de nouveau présent.

Une petite précision qui me semble nécessaire pour le novice que je suis.
Ce Sub nbEmp doit être modifié comment pour être integré et faire
apparaitre dans la requète un champ NbreEquipiers ?

Cordialement

Jean






Avatar
levallo
Merci Michel pour ta réponse. Malheureusement ma function plante sur
rst.findfirst "nomChefEquip='" & chef & "'"
J'ai corrigé

set rst=currentdb.openrecordset("nomDeTaTable")
Par :

set rst=currentdb.openrecordset("tbEquipes") ' qui est le nom de ma
table
Et
rst.findfirst "nomChefEquip='" & chef & "'"
par :

rst.FindFirst "ChefEquipesNom='" & chef & "'" ' qui le vrai nom du
champ

Quel est la raison du plantage de ma requète ?

A+

Jean

Avatar
michel
ChefEquipesNom est il bien un champ texte, si oui je pense a un probleme de
reference tu ne m'indique pas le message d'erreur
Serait ce "propriete ou methode non geree etc"
Essaie
Dans ton module ou tu as mis la fonction
Alt F11 pour modifier
Ensuite dans le menu References
Cherche et coche Microsoft DAO 3.6 Library
Ensuite decoche microsoft active x data objet 2.1
Tiens moi au courant
Mais je ne pourrais pas acceder au forum avant demain
Michel

a écrit dans le message de news:

Merci Michel pour ta réponse. Malheureusement ma function plante sur
rst.findfirst "nomChefEquip='" & chef & "'"
J'ai corrigé

set rst=currentdb.openrecordset("nomDeTaTable")
Par :

set rst=currentdb.openrecordset("tbEquipes") ' qui est le nom de ma
table
Et
rst.findfirst "nomChefEquip='" & chef & "'"
par :

rst.FindFirst "ChefEquipesNom='" & chef & "'" ' qui le vrai nom du
champ

Quel est la raison du plantage de ma requète ?

A+

Jean

Avatar
Eric
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) ' je instantané

Merci Michel pour ta réponse. Malheureusement ma function plante sur

rst.findfirst "nomChefEquip='" & chef & "'"


J'ai corrigé

set rst=currentdb.openrecordset("nomDeTaTable")


Par :
set rst=currentdb.openrecordset("tbEquipes") ' qui est le nom de ma
table
Et

rst.findfirst "nomChefEquip='" & chef & "'"


par :
rst.FindFirst "ChefEquipesNom='" & chef & "'" ' qui le vrai nom du
champ

Quel est la raison du plantage de ma requète ?

A+

Jean



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


Avatar
levallo

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 dynam ique
ou
set rst=currentdb.openrecordset("tbEquipes", dbOpenSnapshot) ' jeu inst antané



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

Avatar
levallo

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 dynam ique
ou
set rst=currentdb.openrecordset("tbEquipes", dbOpenSnapshot) ' jeu inst antané



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

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
Bonjour
Peux tu preciser le message d erreur
A+

Avatar
jt
"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


1 2 3