Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/09/2011, 17h40   #1
Invité régulier
 
Inscription : septembre 2011
Messages : 10
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 10
Points : 6
Points : 6
Par défaut Reporting un peu complexe

Bonjour à tous,

J'ai déjà posé quelques questions sur ce forum et j'ai toujours reçu une réponse rapide et complète. Je tente donc ma chance pour une question un peu plus complexe :-)

J'ai donc une table qui traque le déplacement d'objets dans un stock.

La table se présente comme suit:

OBJET | DEBUT_MOUVEMENT | FIN_MOUVEMENT | LOCALISATION

-> par exemple, prenons l'objet "Colis 1". Disons que celui-ci est stocké entre le 01/01/2011 et le 04/01/2011 dans la zone 2, l'entrée se présentera comme suit:

COLIS1 | 01/01/2011 | 04/01/2011 | zone 2


Je suis en train de créer un outil de reporting qui a pour but de donner une vue sur l'occupation des "localisations".

J'aimerais créer un rapport qui, reprend, pour chaque jour de l'année, le nombre de colis stockés dans la localisation.

Cela donenrait un tableau de ce genre:

ZONE 2 - # colis
01/01/2011 - 1
02/01/2011 - 1
03/01/2011 - 1
04/01/2011 - 1
05/01/2011 - 0

Comment est-ce que je peux écrire un rapport qui ferait ça?

J'ai par contre déjà écrit la requête qui le calcule pour un jour donné. L'idée c'est de trouver le moyen (macro? autre?) pour construire le tableau et répliquer la requête 365 fois.

Merci d'avance pour votre aide!
Jeanwsl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 19h06   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 475
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 475
Points : 7 561
Points : 7 561
Personnellement voilà comment je procéderai :

requête de comptage des colis par jour

Code sql :
1
2
3
4
5
PARAMETERS prmDateCourante DateTime;
SELECT [prmdateCourante] AS DateCourante, TableMouvement.IdZone, Count(TableMouvement.IdColis) AS NbColis
FROM TableMouvement
WHERE ((([prmDateCourante] BETWEEN [DateDebut] AND [DateFin])=True))
GROUP BY [prmdateCourante], TableMouvement.IdZone;

code pour calculer chaque jour :

Code :
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
38
39
40
41
42
43
44
45
46
47
48
49
50
'Calcule chaque jour de l'année et le nombre de colis par zone
 
dim db as dao.database:set db=currentdb
dim rComptage as dao.recordset
dim qComptage as dao.querydef:set q=db.querydefs("rCompteColisParJour")
 
dim rResult as dao.recordset:set rResult=db.openrecordset("TableResult") 'Table qui donne pour chaque jour et zone le nombre de colis.
 
dim rZone as doa.recordset:set rZone=db.OpenRecordset("TableZone") 'Liste des zones
 
dim dateCourante as date:set dateCouranet=dateserial(2011,01,01)
 
do while dateCourante<=dateserial(2011,12,31)
    qComptage .parameter("prmDateCourante",dateCourante)
    set rComptage=qComptage.openrecordset
 
    do while not rComptage.eof
       rResult.addnew
       rResult![DateCourante]=rComptage![dateCourante]
       rResult![IdZone]=rComptage![IdZone]
       rResult![NbColis]=rComptage![NbColis]
       rResult.update
    loop
 
    if rComptage.Recordcount=0 then
       'traite le cas où il n'y a pas de colis ce jour là.
       rZone.MoveFirst
 
       do while not rZone.eof
 
          rResult.addnew
          rResult![DateCourante]=dateCourante
          rResult![IdZone]=rZone![IdZone]
          rResult![NbColis]=0
          rResult.update
 
          rZone.movenext
       loop
 
    end if
 
    rComptage.close
 
    dateCourante=dateadd("d",1,dateCourante) 'Passe au jour suivant
loop
 
set rComptage=nothing
rResult.close:set rResult=nothing
rZone.close:set rZone=nothing
set db=nothing
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 19h18   #3
Invité régulier
 
Inscription : septembre 2011
Messages : 10
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 10
Points : 6
Points : 6
Merci pour cette réponse!

Je suis familier avec VBA sous excel, mais pas sous Access. Comment dois-je m'y prendre pour faire fonctionner le code que tu me proposes? Je galère un peu :-) J'ai essayé de chercher dans la FAQ Access mais je ne trouve pas vraiment.

merci!

Jean
Jeanwsl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 19h54   #4
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 475
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 475
Points : 7 561
Points : 7 561
Oui VBA Excel et Access partagent de nombreuses similitudes mais aussi ont des différences assez frustrantres.

En relisant le code je m'apperçois que pour une journée donnée tu n'auras que les zones où il y a des colis pas toutes les zones. Si il n'y a pas données alors tu as toutes les zones à 0.

Requête rCompteColisParJour

Code sql :
1
2
3
4
5
6
PARAMETERS prmDateCourante DateTime, prmIdZone Long;
SELECT [prmdateCourante] AS DateCourante, TableMouvement.IdZone, Count(TableMouvement.IdColis) AS NbColis
FROM TableMouvement
WHERE ((([prmDateCourante] BETWEEN [DateDebut] AND [DateFin])=True))
GROUP BY [prmdateCourante], TableMouvement.IdZone
HAVING (((TableMouvement.IdZone)=[prmIdZone]));

Voici le code pour gérer cela
Crée un nouveau module
Ajoute :

option explicit s'il n'y ai pas déjà

Code :
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
private sub TestComptage
 
'Calcule chaque jour de l'année et le nombre de colis par zone
 
dim db as dao.database:set db=currentdb
dim rComptage as dao.recordset
dim qComptage as dao.querydef:set q=db.querydefs("rCompteColisParJour")
 
dim rResult as dao.recordset:set rResult=db.openrecordset("TableResult") 'Table qui donne pour chaque jour et zone le nombre de colis.
 
dim rZone as doa.recordset:set rZone=db.OpenRecordset("TableZone") 'Liste des zones
 
dim anneeCourante as long : anneeCourante = 2011 'Permet de facilement adapter le code à une autre année
 
dim dateCourante as date:set dateCourante=dateserial(AnneeCourante,01,01)
 
do while dateCourante<=dateserial(anneeCourante,12,31)
 
     rZone.MoveFirst
 
    do while not rZone.eof
 
        qComptage.parameter("prmDateCourante",dateCourante)
        qComptage.parameter("prmIdZone",dateCourante)
        set rComptage=qComptage.openrecordset
 
        if not rComptage.eof then
             rResult.addnew
             rResult![DateCourante]=rComptage![dateCourante]
             rResult![IdZone]=rComptage![IdZone]
             rResult![NbColis]=rComptage![NbColis]
             rResult.update
          else
             'Ajoute la zone s'il n'y a pas de colis
             rResult.addnew
             rResult![DateCourante]=dateCourante
             rResult![IdZone]=rZone![IdZone]
             rResult![NbColis]=0
             rResult.update
        end if
 
        rComptage.close
 
    loop
 
    dateCourante=dateadd("d",1,dateCourante) 'Passe au jour suivant
loop
 
set rComptage=nothing
rResult.close:set rResult=nothing
rZone.close:set rZone=nothing
set db=nothing
 
end sub
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2011, 22h20   #5
Invité régulier
 
Inscription : septembre 2011
Messages : 10
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 10
Points : 6
Points : 6
Merci pour ta réponse!

J'ai un petit souci avec le code à la ligne 23:

Code :
qComptage.parameter("prmDateCourante",dateCourante)
Il y avait apparemment une erreur de syntaxe. En cherchant sur google je suis tombé sur la forme suivante:

Code :
qComptage.parameter("prmDateCourante") = dateCourante
Mais cela ne fonctionne pas non plus ("Method or data member not found").

Peux-tu m'éclairer?

Merci!
Jeanwsl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2011, 22h54   #6
Invité régulier
 
Inscription : septembre 2011
Messages : 10
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 10
Points : 6
Points : 6
Un "S" à parameter règle le problème...

Cela dit, en l'exécutant, j'ai maintenant une erreur run-time 91

Citation:
Object variable or With block variable not set
Une idée?
Jeanwsl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2011, 23h18   #7
Invité régulier
 
Inscription : septembre 2011
Messages : 10
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 10
Points : 6
Points : 6
Cela fait un peu monologue, mais j'ai trouvé la réponse et vous l'indique au cas où cela pourrait dépanner quelqu'un qui aurait un problème semblable...

Il y avait une petite erreur dans la ligne
Code :
Set qComptage = db.QueryDefs("rComptePatientParJour")
J'essayais de mettre un paramètre sur une variable qui n'avait pas le bon nom...

Après quelques autres petites modifs, ça tourne parfaitement!

Un grand merci!!!!
Jeanwsl est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h35.


 
 
 
 
Partenaires

Hébergement Web