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 29/03/2011, 18h29   #1
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Par défaut Etats "dynamiques", OpenArgs

Salut
Un collegue m'a demandé de l'aide sur Excel, mais vu l’ampleur de ce qu'il demande, je me suis tourné vers Access. Sauf que je ne maitrise pas du tout Access...
Le but et de faire une gestion de stock "toute bête", je pense avoir pas trop mal structuré mon fichier (Ah ben oui, un peu de prétention ne fait de mal à personne) .
Mais je me trouve face à un problème lors de la création des Etats "dynamiques", je dis dynamique mais en faite je modifie uniquement la clause Where lors de l'appelle de l'Etat via VBA.

Mon fichier gère donc des denrées alimentaires, regroupées par familles.
J'ai une table Client et une table Commande (entre autre).
Le but de mon Etat est d'afficher par famille de produit sur une année donnée (c'est cette partie date que je modifie via la clause Where). J'utilise ainsi le même Etat pour d'autre périodicité.



Comme vous pouvez le voir sur le screenshot joint, j'ai utilisé les Opérations de regroupement.
Hors pour mon champs Cmd_Date, je ne sais pas quoi choisir dans la liste d'Opération, car en regroupement, il me crée plusieurs lignes pour le même produit (dates de commande différentes). Je ne peux bien évidement pas supprimer ma colonne Cmd_Date, car je l'utilise pour la clause Where VBA.
J'avais déjà pas mal tourné en rond avec ce problème, que je pensais l'avoir résolu.... mais ça n'est pas le cas

En faisant quelques recherches, j'ai bien vu que certains conseillent (fortement) l'utilisation de OpenArgs, mais je ne vois pas comment l'utiliser dans mon cas.
Faut il que je passe, par exemple, les dates encadrant la periode voulu et que je récupére ensuite ces dates au chargement de mon Etat afin de les utiliser pour filter les données qu'il contient (Via un recordset créé via VBA)? Et d'appliquer ensuite le contenu de mon recordset à mon Etat? Cela me semble bien périlleux. Merci de m'éclairer sur le sujet, je ne saisi pas trop cette mecanique, j'utilise actuellement OpenArgs pour personnaliser le contenu d'un Label. Il me suffirait de faire une chaine avec des séparateurs pour récupérer chaque arguments via un split si tel est le besoin.

Merci pour votre aide et vos conseils.

Vu qu'il n'y a rien de confidentiel n'hesitez pas à demander le fichier si besoin.

++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/03/2011, 18h51   #2
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 410
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 410
Points : 4 439
Points : 4 439
Hello MagicQwaz,

déjà il me semble que le champ TblTicket.Ticket_FamilleId est redondant et peut être supprimé. Si on connait le produit dans la table TblTicket, on peut remonter à la famille du produit grâce au schéma:TblFamille-1--------∞-TblProduit.

Si tu veux filtrer la date, il faut choisir l'opération "Où" (clause WHERE) sur Cmd_Date
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/03/2011, 19h33   #3
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut
Alors pour l’étiquette, oui, je vois mon erreur, mais j'ai comme l'impression que ça va rester comme ça, a moins que cela puisse me poser un quelconque problème. Car sinon il faudrait que je reprenne... j'allais dire "toutes mes requêtes"... Ok la base et réduite, donc je regarderais quand même pour le faire .

Pour ce qui est de l'opérateur Où, j'avais testé, mais si on laisse le champs Expression vide, vu qu'il décoche automatiquement la visibilité de la colonne, il supprime le champs et vu que ce champs ne me sert que lors de l'utilisation de la clause Where VBA...
Je dois surement faire un truc pas catho.

Voila la partie VBA (extrait) où je crée ma chaîne Where, si ça peut aider
Code :
1
2
3
4
5
6
7
            SqlWhere = "(Year([Cmd_Date]) = " & CbBMoisAnnee & ")"
            If Not IsNull(CbBMois) Then
                SqlWhere = SqlWhere & " And (Month([Cmd_Date]) = " & CbBMois & ")"
                ParamArg = "Au mois de " & CbBMois.Column(0, CbBMois.ListIndex) & " " & CbBMoisAnnee
            Else
                ParamArg = "Pour l'année " & CbBMoisAnnee
            End If
Merci pour les éclaircissements

++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/03/2011, 21h40   #4
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 410
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 410
Points : 4 439
Points : 4 439
Re,

ok, ça ressemble un peu à ce qui se fait dans le tutoriel de Jeannot45: Un état pour plusieurs requêtes
( et plus précisément l'étude du 2nd cas)

Dans ce cas, le SQL de la requête est généré par VBA et les assistants "requête" (ta copie d'écran) devraient te permettre de récupérer le gros "SELECT... FROM..." à copier/coller dans le code VBA. Pourquoi déjà ne pas mettre un critère bidon sur la date juste pour tester si la requête retourne les bonnes infos ?

Citation:
Envoyé par Qwazerty
Le but de mon Etat est d'afficher par famille de produit...
Pourtant le regroupement est effectué par produit et par client (en supposant que tu aies supprimé en plus le regroupement sur la date). Je ne vois pas bien ce que doit retourner la requête mais j'ai le sentiment qu'il faut d'abord la mettre au point avant de passer au reste

Citation:
Envoyé par Qwazerty
j'utilise actuellement OpenArgs pour personnaliser le contenu d'un Label. Il me suffirait de faire une chaine avec des séparateurs pour récupérer chaque arguments via un split si tel est le besoin.
ou bien passer par des variables publiques que tu peux appeler de n'importe où, non ?
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/03/2011, 20h40   #5
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut
Merci pour le lien, c'est pile poile ce dont j'avais besoin

Citation:
Envoyé par f-leb
...devraient te permettre de récupérer le gros "SELECT... FROM..." à copier/coller dans le code VBA
Tout a fait exact, il a fallu adapter un peu mais rien de bien sorcier

Citation:
Envoyé par f-leb
Pourquoi déjà ne pas mettre un critère bidon sur la date juste pour tester si la requête retourne les bonnes infos ?
De se coté la pas de soucis, je n'avais pas (trop) de doute sur la structure de ma requête, j’étais certain de faire une erreur au niveau de l'appelle a mon Etat.

Citation:
Envoyé par f-leb
Pourtant le regroupement est effectué par produit et par client (en supposant que tu aies supprimé en plus le regroupement sur la date). Je ne vois pas bien ce que doit retourner la requête mais j'ai le sentiment qu'il faut d'abord la mettre au point avant de passer au reste
Je voulais effectivement 2 Etat, l'un me retournant le listing des produits vendu sur une période donnée. Et un second me donnant la même chose mais en plus par client. J'avais les 2 Etats, mais les appelles n’étaient pas bon, ce qui est chose résolu grâce à ton aide.

Citation:
Envoyé par f-leb
ou bien passer par des variables publiques que tu peux appeler de n'importe où, non ?
Oui, mais non. Autant que possible, je n'utilise pas cette artifice tant que je n'y suis pas contraint et forcé. Ici OpenArgs nous donne la possibilité de faire ce que l'on veut, autant faire avec. Je mets mon code à la suite et je pense que l'utilisation de Split et très pratique, enfin chacun voit midi à sa porte!

Voila ce que donne le résultat

Dans un Module, la déclaration des Constantes en Public
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
Public Const CstSQL_Client_Produit_Date As String = "SELECT " & _
    "[Client_Nom]+"" ""+[Client_Prenom] AS NomPrenom, Tbl_Famille.Famille_Nom, " & _
    "Tbl_Produits.Produits_Nom, " & _
    "Avg(Tbl_Ticket.Ticket_PrixDom) AS MoyenneDeTicket_PrixDom, " & _
    "Sum(Tbl_Ticket.Ticket_Quantite) AS SommeDeTicket_Quantite, " & _
    "Tbl_Produits.Produits_Volume " & _
    "FROM " & _
    "(Tbl_Famille INNER JOIN Tbl_Produits ON Tbl_Famille.Famille_Id = Tbl_Produits.Produits_FamilleId) " & _
    "INNER JOIN " & _
    "((Tbl_Client INNER JOIN Tbl_Commande ON Tbl_Client.Client_Id = Tbl_Commande.Cmd_ClientId) " & _
    "INNER JOIN " & _
    "Tbl_Ticket ON Tbl_Commande.Cmd_Id = Tbl_Ticket.Ticket_CmdId) " & _
    "ON " & _
    "(Tbl_Produits.Produits_Id = Tbl_Ticket.Ticket_ProduitId) " & _
    "AND " & _
    "(Tbl_Famille.Famille_Id = Tbl_Ticket.Ticket_FamilleId)"
 
Public Const CstSQL_Client_Produit_Date_Groupe As String = " GROUP BY " & _
    "[Client_Nom]+"" ""+[Client_Prenom], Tbl_Famille.Famille_Nom , " & _
    "Tbl_Produits.Produits_Nom , Tbl_Produits.Produits_Volume " & _
    "ORDER BY [Client_Nom]+"" ""+[Client_Prenom]"
 
 
 
Public Const CstSQL_Produit_Date As String = "SELECT " & _
    "Tbl_Famille.Famille_Nom, Tbl_Produits.Produits_Nom, " & _
    "Sum(Tbl_Ticket.Ticket_Quantite) AS SommeDeTicket_Quantite, " & _
    "Tbl_Produits.Produits_Volume, " & _
    "Avg(Tbl_Ticket.Ticket_PrixDom) AS MoyenneDeTicket_PrixDom " & _
    "FROM (Tbl_Famille INNER JOIN Tbl_Produits ON Tbl_Famille.Famille_Id = Tbl_Produits.Produits_FamilleId) " & _
    "INNER JOIN (Tbl_Commande INNER JOIN Tbl_Ticket ON Tbl_Commande.Cmd_Id = Tbl_Ticket.Ticket_CmdId) " & _
    "ON (Tbl_Produits.Produits_Id = Tbl_Ticket.Ticket_ProduitId) " & _
    "AND (Tbl_Famille.Famille_Id = Tbl_Ticket.Ticket_FamilleId)"
 
Public Const CstSQL_Produit_Date_Groupe As String = "GROUP BY Tbl_Famille.Famille_Nom, Tbl_Produits.Produits_Nom, Tbl_Produits.Produits_Volume;"
Le code du bouton qui lance l'affichage en fonction des option Boutons.
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
    Select Case GrpOpTri.Value
        Case 2 'Par Année et/ou Mois  et Client ou Produit
            If CbBMoisAnnee = "" Then
                MsgBox "Vous devez spécifier à minima une année", vbInformation, "Période invalide"
                Exit Sub
            End If
 
            SqlWhere = " Where (Year([Cmd_Date]) = " & CbBMoisAnnee & ")"
            If Not IsNull(CbBMois) Then
                SqlWhere = SqlWhere & " And (Month([Cmd_Date]) = " & CbBMois & ")"
                ParamArg = "Au mois de " & CbBMois.Column(0, CbBMois.ListIndex) & " " & CbBMoisAnnee
            Else
                ParamArg = "Pour l'année " & CbBMoisAnnee
            End If
 
            'On prend en compte la sous option de tri (Par Clients/Produit ou par Produit)
            If GrpOpSousTri = 1 Then 'Client/Produit
                'On lance l'etat trié
                ParamArg = ParamArg & "¤" & CstSQL_Client_Produit_Date & SqlWhere & CstSQL_Client_Produit_Date_Groupe
                DoCmd.OpenReport "Eta_Client_Poly", acViewPreview, OpenArgs:=ParamArg
            Else 'Produit
                'On lance l'etat trié
                ParamArg = ParamArg & "¤" & CstSQL_Produit_Date & SqlWhere & CstSQL_Produit_Date_Groupe
                DoCmd.OpenReport "Eta_Produit_Poly", acViewPreview, OpenArgs:=ParamArg
            End If
 
        Case 3 'Par Periode
            If IsDate(TxtPeriodeDebut) And IsDate(TxtPeriodeDebut) Then
                SqlWhere = " WHERE Tbl_Commande.Cmd_Date Between CDate(""" & TxtPeriodeDebut & """) And CDate(""" & CDate(TxtPeriodeFin) & """)"
                ParamArg = "Du " & TxtPeriodeDebut & " Au " & TxtPeriodeFin
                'On lance l'etat trié
                ParamArg = ParamArg & "¤" & CstSQL_Produit_Date & SqlWhere & CstSQL_Produit_Date_Groupe
                Debug.Print ParamArg
                DoCmd.OpenReport "Eta_Produit_Poly", acViewPreview, OpenArgs:=ParamArg
            Else
                MsgBox "Les dates spécifiées de la période ne sont pas valides", vbExclamation, "Dates invalides"
                Exit Sub
            End If
[...]
Et le code qui interprète OpenArgs à l'ouverture des Etats
Code :
1
2
3
4
5
6
7
8
9
Private Sub Report_Open(Cancel As Integer)
Dim Tab_Params As Variant
 
    If Len(Me.OpenArgs) > 0 Then
        tab_param = Split(Me.OpenArgs, "¤")
        Me.EtkParam.Caption = tab_param(0)
        Me.RecordSource = tab_param(1)
    End If
End Sub
Voilou, je sais pas si ça peut servir à quelqu'un d'autre, mais au cas ou...

Encore merci f-leb.
Passe une bonne soirée

++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web