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

VBA Access Discussion :

Paramètre "Filtername" de la fonction DoCmd.OpenReport


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut Paramètre "Filtername" de la fonction DoCmd.OpenReport
    Bonjour,

    Je vous expose mon problème, j'ai un Etat qui a une requête comme source de données et je voudrais pouvoir lui appliquer dans certains cas, une autre requête lors de l'impression de cet Etat via la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.OpenReport "MonEtat", acViewNormal, "MaRequete", "MonFiltre"
    Le problème est que le paramètre Filtername où je met le nom de ma requête "MaRequete" ne s'applique pas et l'Etat s'imprime mais sans aucune donnée de ma requête. Pour info si je laisse ce paramètre vide, l'état s'imprime correctement avec les données de la requête source.

    D'après ce lien https://msdn.microsoft.com/fr-fr/vba...form-or-report, ce paramètre a l'air de bien servir à faire ce que je veux faire apparement. Ou alors il y a quelque chose que je ne comprends pas, ce qui est bien possible.

    J'ai trouvé 2 autres méthodes pour arriver à ce que je veux faire :
    - En modifiant la source de l'Etat via ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DoCmd.OpenReport "MonEtat", acViewDesign, acReadOnly
    Reports("MonEtat").RecordSource = "MaRequete"
    DoCmd.Close acReport, "MonEtat", acSaveYes
    - En modifiant le SQL de la requète Source de l'Etat via ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentDb.QueryDefs("MaRequete").SQL = strSQL
    Ca fonctionne mais je trouve ça plus lourd que d'utiliser la fonction DoCmd.OpenReport avec le paramètre "Filtername", s'il sert bien à faire ça bien sûr.

    Si quelqu'un pouvait m’éclairer sur l'utilisation de ce paramètre ce serait gentil.

    Merci d'avance

  2. #2
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Bonsoir

    J'ai déjà eu ce Pb.
    Je l'ai résolu (contourné) comme ceci :
    - l'état est basé sur une table (toujours la même)
    - cette table peut être créée par différentes requêtes (autant que de cas de figures)
    - la requête à exécuter est choisie en fonction de la valeur d'un champ sur un formulaire

    Titi95
    Un problème bien posé est à moitié résolu

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    Points : 89
    Points
    89
    Par défaut
    Essaye ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Report_Open(Cancel As Integer)
    .../...
    Me.Filter = ...
    Me.FilterOn = True
    .../...
    End Sub

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par adlinformatik Voir le message
    Essaye ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Report_Open(Cancel As Integer)
    .../...
    Me.Filter = ...
    Me.FilterOn = True
    .../...
    End Sub
    Merci pour ta réponse. Je ne comprends pas trop ce que je dois mettre après Me.Filter= ..., puisque mon filtre est défini lors dans la fonction DoCmd.OpenReport.

  5. #5
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par nyv2233 Voir le message
    Merci pour ta réponse. Je ne comprends pas trop ce que je dois mettre après Me.Filter= ..., puisque mon filtre est défini lors dans la fonction DoCmd.OpenReport.
    Tu peux enlever le filtre du DoCmd.OpenReport, cad tu ouvre ton état sans filtre
    Et tu crée un événement sur ouverture de l'état en question.

    Tu mets ton filtre la place des trois points de suspension :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Report_Open(Cancel As Integer)
    Me.Filter = ...
    Me.FilterOn = True
    End Sub
    Et si tu nous montre ta ligne de code et surtout le filtre que tu veux mettre ça serait mieux

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par adlinformatik Voir le message
    Et si tu nous montre ta ligne de code et surtout le filtre que tu veux mettre ça serait mieux
    Et si tu lisais mon post, ça serait mieux! Mais je vais réexpliquer.

    J'ai cette ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.OpenReport "MonEtat", acViewNormal, "MaRequete", "MonFiltre"
    Elle est censé imprimer un Etat, en filtrant les données cet Etat avec la requête "MaRequete", Mais ça ne marche pas, sauf si je définis cette requête en tant que source de données de l'Etat, mais dans ce cas le filtre "MaRequete", dans la le code ne sert plus rien. Tout l'intérêt de ce code serait qu'il remplace la requête source de données originale de l'Etat.

  7. #7
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par nyv2233 Voir le message
    Et si tu lisais mon post, ça serait mieux! Mais je vais réexpliquer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.OpenReport "MonEtat", acViewNormal, "MaRequete", "MonFiltre"
    "MonFiltre" t'appel ça montrer le filtre ?!!!

    "MonFiltre" ou "TonFiltre" ça ne veux rien dire, je veux plus de détails, le vrais filtre c'est quoi
    Il faut nous montrer ta requête et le filtre, sauf si c'est secret défense !

  8. #8
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 636
    Points : 14 610
    Points
    14 610
    Par défaut
    Bonjour,
    si tu suis ce lien :https://msdn.microsoft.com/fr-fr/vba...-method-access
    tu remarqueras que le nom du filtre est le troisième paramètre.
    Donc tu dois mettre "MonFiltre" à la place de "MaRequete" (ce dernier n'ayant pas lieu d'être dans les paramètres)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.OpenReport "MonEtat", acViewNormal, "MonFiltre"
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    Bonjour,
    si tu suis ce lien :https://msdn.microsoft.com/fr-fr/vba...-method-access
    tu remarqueras que le nom du filtre est le troisième paramètre.
    Donc tu dois mettre "MonFiltre" à la place de "MaRequete" (ce dernier n'ayant pas lieu d'être dans les paramètres)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.OpenReport "MonEtat", acViewNormal, "MonFiltre"
    Bonjour,

    Merci pour ta réponse, j'avais vu ce lien et justement pour le paramètre Nom de filtre : Expression chaîne qui est le nom valide d'une requête dans la base de données active.

    Tu as raison, je me suis mal exprimé, le paramètre que j'appelle "MonFiltre" devrait être "MaConditionWhere", mais tel que s'est écrit, on doit pouvoir filtrer l'Etat avec une requète gràce à cette fonction. Or que je mette une condition WHERE ou non, j'ai beau mettre le nom d'une requête valide, mon Etat ne récupère aucune donnée, sauf dans le cas où la requête présente dans la fonction est la même que la requête qui est la source de donnée de l'Etat, mais du coup le paramètre de la fonction n'a plus aucun intérêt car l'Etat est déjà filtré avec cette requête.

    Dans le lien suivant, l'explication nous dit bien qu'on peut mettre une requête à la place du paramètre filtername, mais je pense qu'il y a quelque chose que je dois pas bien comprendre.
    https://msdn.microsoft.com/fr-fr/vba...form-or-report

  10. #10
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 636
    Points : 14 610
    Points
    14 610
    Par défaut
    Bonjour,

    personnellement, je conseillerai l'utilisation du paramètre "where condition" plus facile d'utilisation.
    De mémoire, quand on utilise une requête filtre, il faut que les champs correspondent exactement (ordre et nombre) aux champs de la requête (ou table ?) d'origine.
    Est-ce le cas pour ta requête ?
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    Bonjour,

    personnellement, je conseillerai l'utilisation du paramètre "where condition" plus facile d'utilisation.
    Je ne peux pas juste utiliser le paramètre "Where condition" car la requête est différente de la requête source de l'Etat, ce n'est pas juste la condition Where qui change dans les 2 requête

    Citation Envoyé par tee_grandbois Voir le message
    De mémoire, quand on utilise une requête filtre, il faut que les champs correspondent exactement (ordre et nombre) aux champs de la requête (ou table ?) d'origine.
    Est-ce le cas pour ta requête ?
    Oui c'est le cas. D'ailleurs lorsque je défini cette requête comme source de données de l'Etat, ça fonctionne correctement

  12. #12
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 636
    Points : 14 610
    Points
    14 610
    Par défaut
    comment se nomme ta requête ? (mieux vaut eviter les caractères spéciaux ou accentués et les espaces pour nommer les objets).
    Si ce n'est pas ça et que cela ne fonctionne toujours pas, tu peux utiliser le paramètre OpenArgs (le dernier du Docmd) pour changer le RecordSource à l'ouverture de l'état :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Report_Open(Cancel As Integer)
    If Not IsNull(Me.OpenArgs) Then Me.RecordSource = Me.OpenArgs
    End Sub
    et pour appeler l'état :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.OpenReport "MonEtat", acViewPreview, , , , "MaRequeteFiltre"
    Cela dit, j'ai testé avec une requête filtre, je n'ai pas eu de soucis.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Salut à tous,

    Tout d'abord merci à tous ceux qui ont pris le temps d'essayer de m'aider et désolé ne pas vous avoir donné de news plus tôt.

    Je pense finalement que adlinformatik a raison, je n'ai pas donné assez d'information.

    Voici mes 2 requêtes filtres (je les ai volontairement énormément simplifiée, sinon il y a avait au moins 15 lignes chacune et au final ça revient au même puisque ça ne marche pas)

    La première qui s'appelle FiltreFactures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCTROW FACTURES.NumFact, FACTURES.NumCommande, FACTURES.Date, FACTURES.DateLiv, FACTURES.NumClient FROM FACTURES
    et la seconde qui s'appelle FiltreCommandes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCTROW COMMANDES.NumFact, COMMANDES.NumCommande, COMMANDES.Date, COMMANDES.DateLiv, COMMANDES.NumClient FROM COMMANDES
    La première est le record source mon état "Facture".

    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
     
    Dim DBS As Database, CDE As Recordset,  NFact As Long
    Set DBS = DBEngine.Workspaces(0).OpenDatabase(VENTE_DATA)
    Set CDE = DBS.OpenRecordset("COMMANDES")
    CDE.Index = "PrimaryKey"
     
    NFact = InputBox("N° Fature")
     
    CDE.Seek "=", NFact
    If CDE.NoMatch Then
        Set CDE = DBS.OpenRecordset("FACTURES")
        CDE.Index = "PrimaryKey"
        CDE.Seek "=", NFact
        If CDE.NoMatch Then
            MsgBox "Aucune commande ou facture ne correspond à ce n°"
            Exit Function
        Else
            MonFiltre= "FiltreFactures"
     
        End If
    Else
        MonFiltre= "FiltreCommandes"
     
    End If
     
    CDE.Close
    DBS.Close
     
    DoCmd.OpenReport "Facture", acViewPreview, MonFiltre, "[NumFact] = " & NFact
    Pour résumé, l'utilisateur entre un Numéro de facture, Si ce numéro existe dans la table COMMANDES, on défini MonFiltre= "FiltreFactures" sinon si ce numéro existe dans la table FACTURES, on défini MonFiltre= "FiltreCommandes"

    Ensuite on ouvre l'état avec la requête filtre qui a été définie auparavant avec comme et [NumFact] = " & NFact comme condition WHERE.

    tee_grandbois, j'ai essayé ta solution avec le paramètre OpenArgs, mais chez moi ça ne fonctionne pas non plus, je ne comprends vraiment pas ce que je fait mal. Car si les 2 solutions marchent chez toi et pas chez moi, c'est bien que je fais mal quelque chose .

    Merci encore pour votre aide

  14. #14
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 636
    Points : 14 610
    Points
    14 610
    Par défaut
    Bonsoir nyv2233,
    j'ai fait le test avec un requête filtre et un WhereCondition et cela fonctionne bien. c'est donc étrange que cela ne fonctionne pas chez toi.

    A propos, le code posté n'est pas complet, je ne vois pas à quoi est raccroché le Else de la ligne 29: elle semble être en dehors du If de la ligne 10 et ce qui exclurait le Docmd.OpenReport. Est-ce une erreur ?

    Autre chose, tu n'as pas précisé ta version d'Access, j'utilise 2013 et toi ?
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Bonjour tee_grandbois,

    A propos, le code posté n'est pas complet, je ne vois pas à quoi est raccroché le Else de la ligne 29: elle semble être en dehors du If de la ligne 10 et ce qui exclurait le Docmd.OpenReport. Est-ce une erreur ?
    Oui effectivement c'est une erreur lorsque j'ai copié le code, ce "Else" ne figure pas dans mon code. J'ai corrigé, désolé.

    Autre chose, tu n'as pas précisé ta version d'Access, j'utilise 2013 et toi ?
    Oui effectivement, j'ai oublié de le préciser, j'utilise Access 2016.

    j'ai fait le test avec un requête filtre et un WhereCondition et cela fonctionne bien. c'est donc étrange que cela ne fonctionne pas chez toi.
    Oui, là franchement je ne comprends pas non plus, c'est bizarre que ça ne fonctionne pas non plus avec le paramètre OpenArgs, j'ai beau cherché ce que je fais mal mais je ne trouve pas. Peut être en rapport avec Access 2016, mais j'y crois pas trop. Je sens que je vais devoir me résigner mais je n'aime pas ça.

    Merci à toi tee_grandbois, au moins je sais que c'est possible...

  16. #16
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Bonjour à vous deux

    Dans mon premier post j'indiquais que j'avais été confronté à ce même problème il y a quelques années (version 97).
    Du coup je viens de refaire un essai simple sur 2010, et je retrouve la même difficulté.

    La "requête filtre" que l'on renseigne dans le OpenReport comme Filtre, doit requêter sur la source de l'état.
    Elle ne remplace pas cette dernière. (L'état reste vide si on supprime sa source)
    @nyv2233 : qu'as-tu en source de l'état ?

    Alors comment faire, comme le souhaite nyv2233, pour que l'état repose sur une table ou sur une autre ?
    Je ne dis pas qu'il n'existe pas de solution, mais je n'en ai pas trouvé.
    @tee_grandbois : as-tu pris en compte ce point dans ton essai ?

    C'est pourquoi à l'époque j'avais pris cette solution :
    - baser l'état ("passe-partout") sur une table (toujours la même)
    - cette table étant alimentée par des requêtes création de table, différentes suivant les critères souhaités

    Une remarque par ailleurs : l'utilisation du mot réservé Date comme nom de champ est peut-être à revoir
    Un problème bien posé est à moitié résolu

  17. #17
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 636
    Points : 14 610
    Points
    14 610
    Par défaut
    Bonsoir titti95 et nyv2233,
    Alors comment faire, comme le souhaite nyv2233, pour que l'état repose sur une table ou sur une autre ?
    Je ne dis pas qu'il n'existe pas de solution, mais je n'en ai pas trouvé.
    @tee_grandbois : as-tu pris en compte ce point dans ton essai ?
    Non effectivement, je n'ai testé que sur une seule table, je rencontre le même souci que vous avec une autre table.

    Mais pour moi, la solution d'utiliser la requête filtre en tant que RecordSource de l'état en passant par le paramètre OpenArgs fonctionne très bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    '...
            MonFiltre = "FiltreFactures"
     
        End If
    Else
        MonFiltre = "FiltreCommandes"
     
    End If
     
    CDE.Close
    DBS.Close
     
    DoCmd.OpenReport "Facture", acViewPreview, , "[NumFact] =" & NFact, , MonFiltre
    '...
    et dans l'état:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Report_Open(Cancel As Integer)
    If Not IsNull(Me.OpenArgs) Then Me.RecordSource = Me.OpenArgs
    End Sub
    seulement, nyv2233 dit qu'elle ne fonctionne pas:
    Citation Envoyé par nyv2233
    tee_grandbois, j'ai essayé ta solution avec le paramètre OpenArgs, mais chez moi ça ne fonctionne pas non plus, je ne comprends vraiment pas ce que je fait mal. Car si les 2 solutions marchent chez toi et pas chez moi, c'est bien que je fais mal quelque chose.
    Il faudrait réessayer, en modifiant le code comme indiqué.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  18. #18
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Désolé tee_grandbois, mais j'étais resté sur le code fourni par nyv2233 (requête filtre) et j'ai oublié ta solution avec OpenArgs. Donc pas essayé.

    Maintenant c'est fait, et ça fonctionne sans aucun pb.
    Et chez toi nyv2233 ?
    Un problème bien posé est à moitié résolu

  19. #19
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Bonsoir à vous 2,

    J'ai beau essayé le code tel que tu m'as donné, mais ça ne marche pas tee_grandbois. Je ne comprends pas.

    Après je ne sais pas si ça change quelquechose, mais le recordsource de mon Etat n'est pas une table mais la requête "FiltreFactures".
    Pour être sûr qu'on essaye bien de faire la même chose, je vous réexplique:

    Je voudrais que selon le nombre présent dans la variable NFact, s'il correspond à un numéro de facture cela m'ouvre mon état avec le filtre "FiltreFactures" et que s'il correspond à un numéro de commande, cela m'ouvre mon état avec le filtre "FiltreCommandes". Donc ça marche avec un numéro de facture mais pas avec un numéro de commande.

    Par contre si je vais changer dans mon état le recordource et que je met "FiltreCommandes" à la place de "FiltreFactures", là c'est l'inverse, ça m'ouvre correctement l'état lorsqu'il s'agit d'un numéro de commande mais pas lorsqu'il s'agit d'un numéro de facture (enfin l'état s'ouvre mais ne comporte aucune donnée)

    Le filtre ne semble donc pas pris en compte quoi qu'il en soit, il garde la requête définie comme recordsource dans l'état. Dans le premier cas, lorsque la valeur de NFact correspond à un numéro de commande, il m'ouvre l'état sans aucune donnée car il cherche un numéro de commande dans la table Facture or il n'existe pas, et inversement dans le second cas il cherche un numéro de Facture dans la table Commande or il n'existe pas.

    Comme je l'avais dis dans mon premier post, j'ai trouvé un moyen de contourner le problème en modifiant le recordsource de mon état avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DoCmd.OpenReport "Facture", acViewDesign, acReadOnly
    Reports("MonEtat").RecordSource = "FiltreCommandes"
    DoCmd.Close acReport, "Facture", acSaveYes
    avant l'ouverure de mon état dans lequel je n'ai donc plus besoin de mettre ma requête filtre du coup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.OpenReport "Facture", acViewPreview, , "[NumFact] = " & NFact
    Le seul petit inconvénient est que ça modifie le recordsource de l'état de façon durable, or il faut que le recordsource de mon état reste "FiltreFactures" pour d'autres utilisation.
    Au final ce n'est pas si grave il me suffit via le code précédent de redéfinir le recordsource sur "FiltreFactures" à la fin de mon code.

    Désolé, quand je relis mon Post, c'est un peu lourdingue, mais j'ai un peu de mal à expliquer le problème et ne suis vraiment pas fort en rédaction, j'ai essayé de faire au mieux pour que ça ne soit pas trop indigeste.

    Une remarque par ailleurs : l'utilisation du mot réservé Date comme nom de champ est peut-être à revoir
    Oui tu as bien raison, il y a plein de chose à revoir, le code est pas beau, les conventions de nommages ne sont pas respectées et j'en passe.
    En fait c'est une base que je récupère et j'essaye de comprendre le fonctionnement déjà et ce qui a cherché à être fait. Sachant que la personne qui a fait ça n'est pas du tout dans le domaine de l'informatique, je ne lui jette pas la pierre, c'est déjà du beau boulot, parce que là c'est juste une tout petite partie.
    Mais c'est sûr que tu as raison certaines choses ne sont pas très propre, je vais essayer de corriger ça au fur et à mesure


    En tout cas encore merci vraiment à vous 2 pour votre aide

  20. #20
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 636
    Points : 14 610
    Points
    14 610
    Par défaut
    Je voudrais que selon le nombre présent dans la variable NFact, s'il correspond à un numéro de facture cela m'ouvre mon état avec le filtre "FiltreFactures" et que s'il correspond à un numéro de commande, cela m'ouvre mon état avec le filtre "FiltreCommandes".
    cela fonctionne, j'ai fait le test avec 2 requêtes basées sur 2 tables différentes par contre:
    ça m'ouvre correctement l'état lorsqu'il s'agit d'un numéro de commande mais pas lorsqu'il s'agit d'un numéro de facture (enfin l'état s'ouvre mais ne comporte aucune donnée)
    je crois que tu n'as pas précisé auparavant que le filtre des commandes se faisait sur le numéro de commande, car le filtre WhereCondition "[NumFact] =" & NFact ne fonctionnera pas dans l'OpenReport.
    Est-ce bien cela ? Si oui, il faut changer le code comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            MonFiltre = "select * from FiltreFactures where [NumFact]=" & NFact
     
        End If
    Else
        MonFiltre = "select * from FiltreCommandes where [NumCommande]=" & NFact
     
    End If
     
    CDE.Close
    DBS.Close
    DoCmd.OpenReport "Facture", acViewPreview, , , , MonFiltre
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

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