IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IHM Discussion :

[Etat] Mise en forme d'un etat conditionnel


Sujet :

IHM

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2006
    Messages : 160
    Par défaut [Etat] Mise en forme d'un etat conditionnel
    Je possède une requête qui fait apparaitre une somme suivant la date d'enregistrement:

    Table: heures de travail
    Nom
    Date
    Valeur

    J'ai créé une requête pour faire la somme des valeurs par nom et en regroupant les dates par semaine.
    J'en ai fait une seconde pour les mois.

    Les deux grace à :Format$([heures de travail].[Date],'ww yyyy') AS Semaine
    puis un regroupement par nom et semaine.

    Maintenant je cherche par un formulaire à l'aide de cases à cocher choisir l'etat à afficher par mois ou semaine mais egalement pouvoir choisir ma semaine ou mois.

    Comment puis-je faire? Je suppose par du VBA?

  2. #2
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour,

    tu pourrai avoir deux Etats. Un regroupé par mois et un regroupé par semaines.
    En fonction des cases à cocher tu ouvres l'un ou l'autre.
    Pour t'assurer que les deux cases à cocher n'ont pas la même valeur tu mets ce code dans l'évènement Après MAJ
    des cases à cocher.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub cbSemaine_AfterUpdate()
      Me.cbMois = Not Me.cbSemaine
    End Sub
     
    Private Sub cbMois_AfterUpdate()
      Me.cbSemaine = Not Me.cbMois
    End Sub
    Tu définis une case cachée par défaut dans l'évènement Sur Ouverture du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_Load()
      Me.cbMois = True
    End Sub
    Sur le formulaire, en plus des cases à cocher, tu mets deux zones de textes (txtAnnee et txtMoisOuSem).
    Cela permet de créer une condition WHERE pour l'état à ouvrir.

    Exemple de code d'un bouton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Dim strDoc As String
    Dim strWHERE As String, strAnnee As String, strMoisOuSem As String
    
    ' Choix Etat à ouvrir
    If cbMois = True Then strDoc = "EtatMois"
    If cbSemaine = True Then strDoc = "EtatSemaine"
    
    strAnnee = Format(Nz([txtAnnee], 0), "0000")
    strMoisOuSem = Format(Nz([txtMoisOuSem], 0), "00")
    
    If strAnnee = "0000" Or strMoisOuSem = "00" Then
       ' Afficher un message d'erreur. Au moins une donnée est manquante
       Exit Sub
    Else
       ' Construction du critère pour un filtrage par Mois
       If cbMois = True Then
          strWHERE = "Format([Date], ""yyyymm"") = '" & strAnnee & strMoisOuSem & "'"
       End If
       ' Construction du critère pour un filtrage par Semaine
       If cbSemaine = True Then
          strWHERE = "Format(Year([Date])*100 + datepart(""ww"",[Date],0,3), _
                     ""000000"") = '" & strAnnee & strMoisOuSem & "'"
       End If
       ' Ouverture état filtré par condition WHERE
       DoCmd.OpenReport strDoc, acViewPreview, , strWHERE
    End If
    Voir plus en détail l'aide de DatePart pour les deux derniers paramètres.
    Ils influent sur le numéro de semaine retourné (premier jour de la semaine et définition de la semaine 1).

    Voir aussi les tutoriels Recherche mutli-critère.
    C'est le même principe : création d'une condition WHERE pour filtrer des données.

    A+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2006
    Messages : 160
    Par défaut
    Je suis débutant avec un strict minimum sur visual basic,
    Le code ne fonctionne pas donc je cherche à comprendre le code pour l'adapter à ma base de donnée.

    Grand merci d'avance aux personnes qui voudront bien m'aider!!!!!!!

    1- Dois-je avoir une requête avec le champs date normal et non déjà regroupé par semaine ou mois pour faire le formulaire indiqué?

    2- A quoi sert le strDoc?
    Citation Envoyé par LedZeppII
    Exemple de code d'un bouton
    [CODE]Dim strDoc As String
    Dim strWHERE As String, strAnnee As String, strMoisOuSem As String
    3- A quoi sert le Nz dans la definition du format?
    strAnnee = Format(Nz([txtAnnee], 0), "0000")
    strMoisOuSem = Format(Nz([txtMoisOuSem], 0), "00")
    4- Al la ligne suivante dois je ajouter le texte de mon choix avec " ... "?
    If strAnnee = "0000" Or strMoisOuSem = "00" Then
    ' Afficher un message d'erreur. Au moins une donnée est manquante
    Exit Sub
    5- Un msg d'erreur: "erreur de compilation Else and If" apparait au niveau du Else de quoi ça vient?

    6- A quoi sert la ligne de code suivante?
    If cbMois = True Then
    strWHERE = "Format([Date], ""yyyymm"") = '" & strAnnee & strMoisOuSem & "'"
    End If
    A définir mon année?

    7- La ligne de code suivante s'affiche en rouge donc il y a une erreur mais laquelle?
    If cbSemaine = True Then
    strWHERE = "Format(Year([Semaine])*100 + datepart(""ww"",[Semaine],0,3), _
    ""000000"") = '" & strAnnee & strMoisOuSem & "'"

  4. #4
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour,

    Je réponds à tes questions point par point.

    1. Dois-je avoir une requête avec le champs date normal et non déjà regroupé par semaine ou mois pour faire le formulaire indiqué?
    Tu dois avoir le champ date en plus de ton champ de regroupement pour que mon code fonctionne.
    Pour avoir la somme entrer dans une zone de texte : = Somme([NomDuChamp])
    Remarque : Somme([Valeur]) ne fonctionne pas chez moi. J'ai du renommer le champ en Valeur1 et écrire = Somme([Valeur1]).
    L' état fera le regroupement sur les champs de regroupement et la somme dans le pied de groupe (sur Nom par exemple).

    Donc dans ta requête tu aura les champs de ta table (Nom, Date, Valeur1) et ton champ de regroupement (Format$([heures de travail].[Date],'ww yyyy') AS Semaine ou Format$([heures de travail].[Date],'mm yyyy') AS Mois)

    2. strDoc est une variable texte destinée à recevoir le nom de l'état à ouvrir.

    3. Nz est une fonction Access qui permet de substituer une valeur à Null (champ vide)
    Dans mon exemple la valeur de remplacement est 0 (zéro).

    4. Tu affiche un message de ton choix avec la fonction MsgBox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    If strAnnee = "0000" Or strMoisOuSem = "00" Then
       ' Afficher un message d'erreur. Au moins une donnée est manquante
       MsgBox "Au moins une donnée est manquante"
       Exit Sub
    Else
       ...
    End If
    5. Je ne vois pas. Peut-être qu'il manque un End If

    6. Cette ligne crée un critère de sélection sur Année et Mois

    7. L'erreur vient de ce qu'il manque un espace entre , et _
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       If cbSemaine = True Then
          strWHERE = "Format(Year([Date])*100 + datepart(""ww"",[Date],0,3), _
                     ""000000"") = '" & strAnnee & strMoisOuSem & "'"
       End If
    _ sert à dire que la ligne qui suit est la suite de la ligne juste au dessus parce qu'on l'a coupé. _ doit être précédé d'un espace.


    Si je reprends mon exemple,

    On a un état regroupé par semaine (EtatSemaine) et un état regroupé par mois (EtatMois).
    En fonction de l'état des cases à cocher cbMois et cbSemaine la variable strDoc contient le nom de l'état EtatSemaine ou EtatMois.
    La fonction DoCmd.OpenReport à la fin du code ouvrira l'état dont le nom est dans la variable strDoc.

    txtAnnee est la zone de texte dans laquelle on saisi l'année (4 chiffres) et
    txtMoisOuSemaine est la zone de texte dans laquelle on saisi le mois ou la semaine.
    Si l'année et le mois (ou la semaine) sont renseignés, le code crée un critère pour filtrer les données.
    J'ai choisi une forme condensée combinant année et mois ou année et semaine dans une chaîne de caractères.

    On aurait aussi pu faire comme ça (à la reflexion c'est plus lisible):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Dim strDoc As String
    Dim strWHERE As String, strAnnee As String, strMoisOuSem As String
    
    ' Choix Etat à ouvrir
    If cbMois = True Then strDoc = "EtatMois"
    If cbSemaine = True Then strDoc = "EtatSemaine"
    
    strAnnee = CStr(Nz([txtAnnee], 0))
    strMoisOuSem = CStr(Nz([txtMoisOuSem], 0))
    
    If strAnnee = "0" Or strMoisOuSem = "0" Then
       ' Afficher un message d'erreur
       MsgBox "Au moins un valeur n'est pas renseignée"
       Exit Sub
    Else
       ' Critère sur Année et Mois
       If cbMois = True Then
          strWHERE = "Year([Date])= " & strAnnee & " AND Month([Date]) = " & strMoisOuSem
       End If
       ' Critère sur Année et Semaine
       If cbSemaine = True Then
          strWHERE = "Year([Date])= " & strAnnee & " AND DatePart(""ww"",[Date],0,3) = " & strMoisOuSem
       End If
       DoCmd.OpenReport strDoc, acViewPreview, , strWHERE
    End If
    Si tu veux conserver tes Etats basés sur des requêtes de regroupement (la requête fait la somme au lieu de l'état) :
    Le formulaire a une zone de texte txtSemaine dans laquelle on saisi la semaine et l'année (ww YYYY),
    une zone de texte txtMois dans laquelle on saisi le mois et l'année (mm YYYY),
    deux cases à cocher cbMois et cbSemaine, et un bouton dont voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Dim strDoc As String
    Dim strWHERE As String, strMois As String, strSemaine As String
    
     ' Choix Etat à ouvrir
    If cbMois = True Then strDoc = "EtatMois"
    If cbSemaine = True Then strDoc = "EtatSemaine"
    
    strMois = Nz([txtMois], "")
    strSemaine = Nz([txtSemaine], "")
    
    If cbMois And strMois = "" Then
       ' message d'erreur si txtMois est vide
       MsgBox "Entrer mois et année (MM AAAA)"
       Exit Sub
    End If
    
    If cbSemaine And strSemaine = "" Then
       ' message d'erreur si txtSemaine
       MsgBox "Entrer semaine et année (SS AAAA)"
       Exit Sub
    End If
    
    ' Critère sur champ Mois Format$([heures de travail].[Date],'mm yyyy')
    If cbMois = True Then
       strWHERE = "Mois ='" & strMois & "'"
    End If
    
    ' Critère sur champ Semaine Format$([heures de travail].[Date],'ww yyyy')
    If cbSemaine = True Then
       strWHERE = "Semaine ='" & strSemaine & "'"
    End If
    
    DoCmd.OpenReport strDoc, acViewPreview, , strWHERE
    A+

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2006
    Messages : 160
    Par défaut
    Grand merci pour ces explications !!!!!!

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2006
    Messages : 160
    Par défaut améliorations
    Voici la solution que j'ai opté (La dernière):
    Private Sub Form_Load()
    Me.cbMois = True
    Me.cbSemaine = False
    End Sub
    Private Sub cbSemaine_AfterUpdate()
    Me.cbMois = Not Me.cbSemaine
    End Sub

    Private Sub cbMois_AfterUpdate()
    Me.cbSemaine = Not Me.cbMois
    End Sub

    Private Sub Commande13_Click()
    Dim strDoc As String
    Dim strWHERE As String, strMois As String, strSemaine As String

    ' Choix Etat à ouvrir
    If cbMois = True Then strDoc = "Synthèse Mensuelle"
    If cbSemaine = True Then strDoc = "Synthèse hebdomadaire"

    strMois = Nz([txtMois], "")
    strSemaine = Nz([txtSemaine], "")

    If cbMois And strMois = "" Then
    ' message d'erreur si txtMois est vide
    MsgBox "Entrer mois et année (MM AAAA)"
    Exit Sub
    End If

    If cbSemaine And strSemaine = "" Then
    ' message d'erreur si txtSemaine
    MsgBox "Entrer semaine et année (SS AAAA)"
    Exit Sub
    End If

    ' Critère sur champ Mois Format$([heures de travail].[Jour],'mm yyyy')
    If cbMois = True Then
    strWHERE = "Mois ='" & strMois & "'"
    End If

    ' Critère sur champ Semaine Format$([heures de travail].[Jour],'ww yyyy')
    If cbSemaine = True Then
    strWHERE = "Semaine ='" & strSemaine & "'"
    End If

    DoCmd.OpenReport strDoc, acViewPreview, , strWHERE
    End Sub
    1 - Quand je reviens sur le formulaire la date choisi ne s'efface pas automatiquement.
    Je souhaite qu'à chaque retour sur formulaire la date s'efface. Comment dois-je procédé?

    2 - Actuellement, je peux filtrer avec une date précise grace à la zone texte.
    Je souhaite également voir toujours par semaine ou mois l'ensemble des enregistrements.
    Pour cela je pensais mettre une case à cocher pour tout voir (coché d'origine). La zone de texte serait alors grisée.
    Et si je veux filtrer la selection, je cliquerai sur la zone texte qui passerai active en blanc, à l'invers la case pour tout voir se désactiverai automatiquement.

    Je pense que c'est faisable mais comment?
    Ai-je été assez clair?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Etat mise en forme conditionnelle
    Par Ptitezone dans le forum IHM
    Réponses: 1
    Dernier message: 27/03/2011, 13h26
  2. [ETAT] Mise en forme conditionnelle
    Par Pistos dans le forum Access
    Réponses: 2
    Dernier message: 16/06/2007, 03h47
  3. Mise en forme d'un etat conditionnel
    Par syldudu dans le forum IHM
    Réponses: 8
    Dernier message: 17/10/2006, 11h35
  4. Etat, mise en forme différente par detail
    Par Kinian dans le forum IHM
    Réponses: 4
    Dernier message: 06/05/2006, 12h07
  5. Etat, mise en forme conditionnelle
    Par Kinian dans le forum Access
    Réponses: 1
    Dernier message: 26/04/2006, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo