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 :

Etat alimenté par une requête paramétrée (paramètre issu d'un formulaire) [AC-2010]


Sujet :

VBA Access

  1. #1
    Membre du Club
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Novembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 52
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2014
    Messages : 44
    Points : 53
    Points
    53
    Par défaut Etat alimenté par une requête paramétrée (paramètre issu d'un formulaire)
    Bonjour,

    Je voudrais ouvrir (et remplir) un état dépendant d'une requête paramétrée, en mode apercu avant impression.

    La requête paramétrée fonctionne très bien dans l'éditeur de requête d'access.

    Je récupère la valeur du paramètre dans un formulaire contenant une listbox.

    J'ai essayé de modifier le paramètre de la requête lors de l'ouverture de l'état comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DoCmd.OpenReport "Copie de E_Formulaire_VP", acViewPreview, , , , "TypeVP=" & Long_IDtypeVP
    - La requête "R_Opérations_Formulaire_VP" est affectée à l'état dans la propriété "source" en manuel à la création.
    - Le paramètre "TypeVP" est déclaré au début de la requête
    - La variable "Long_IDtypeVP" est publique et est mise à jour par la listbox du formulaire (ça fonctionne)

    Problème : à l'ouverture de l'état, access me demande d'entrer la valeur du paramètre "TypeVP".

    J'ai essayé de modifier le paramètre en amont de l'ouverture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim oDb As DAO.Database
    Dim oQdf As QueryDef
    Set oDb = CurrentDb
     
    Set oQdf = oDb.QueryDefs("R_Opérations_Formulaire_VP")
    oQdf.Parameters("TypeVP").Value = Long_IDtypeVP
    DoCmd.OpenReport "Copie de E_Formulaire_VP", acViewPreview
    Et j'obtiens le même résultat.

    Pourtant, j'ai utilisé cette dernière méthode dans l'état pour remplir des textbox avec une autre requête (programmée de la même manière que la première) et ça fonctionne parfaitement.

    Qu'est ce que j'ai oublié ?

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 015
    Points : 24 548
    Points
    24 548
    Par défaut
    Bonjour,
    Il n'y a aucun lien entre tes 2 objets :

    • oQdf
    • "Copie de E_Formulaire_VP"


    oQdf n'est visible que dans VBA, Copie de E_Formulaire_VP ne le vois pas.

    Ta clause Where est mal positionnée dans l'instruction OpenReport.
    cf l'aide (F1)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    docmd.OpenReport(ReportName, View, FilterName, WhereCondition, WindowMode, OpenArgs)
    Dans ton instruction tu es dans le openargs.

    Cordialement,

  3. #3
    Membre du Club
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Novembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 52
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2014
    Messages : 44
    Points : 53
    Points
    53
    Par défaut
    Merci Loufab,

    Je croyais que l'état étant basé sur une requête, on pouvait modifier cette requête (ou ses paramètres) à n'importe quel moment, je suis déçue.

    Effectivement, j'ai mis sciemment l'affectation du paramètre de requête ("TypeVP=" & Long_IDtypeVP) dans le paramètre "openarg" du "docmd.OpenReport", car en fait il n'apparait pas dans la clause "Where" de la requête SQL (mais dans des requêtes utilisées par cette dernière), j'illustre :

    - Voici la requête source de l'état : [R_Opérations_Formulaire_VP]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PARAMETERS TypeVP Long;
    SELECT T_A_Opération_VP_initiale.No_MOP, T_A_Opération_VP_initiale.Opération, T_A_Opération_VP_initiale.No_Bloc_VP, T_A_Opération_VP_initiale.No_Zone, T_A_Opération_VP_initiale.No_Ordre_Zone, T_A_Opération_VP_initiale.No_Ordre_Opération, T_Situation_rame.ID_Situation, T_Situation_rame.Nom_Situation, IIf([T_Blocs].[ID_Bloc]=2,[SOUS-ENSEMBLE].[NOMSous-Ensemble],IIf(([T_Blocs].[ID_Bloc]=5 Or [T_Blocs].[ID_Bloc]=9),IIf(([T_Blocs].[ID_Bloc]=5 And [T_Lieu_Opération_1].[Nom_Lieu]="Intercaisses"),[T_Lieu_Opération_1].[Nom_Lieu],[T_Situation_Rame].[ID_Situation]),[T_A_Opération_VP_initiale].[No_Ordre_Zone])) AS Groupe_2, IIf(([T_Blocs].[ID_Bloc]=2),[SOUS-ENSEMBLE].[NOMSous-Ensemble],IIf(([T_Blocs].[ID_Bloc]=9),[T_Lieu_Opération].[Nom_Lieu] & "  " & [T_Lieu_Opération_1].[Nom_Lieu] & " pour " & [T_Situation_rame].[Nom_Situation] & "  " & [Sous-Ensemble].[NomSous-Ensemble],IIf(([T_Blocs].[ID_Bloc]=5),IIf(([T_Lieu_Opération_1].[Nom_Lieu]="Intercaisses"),[T_Lieu_Opération].[Nom_Lieu] & "  " & [T_Lieu_Opération_1].[Nom_Lieu],[T_Lieu_Opération].[Nom_Lieu] & "  " & [T_Lieu_Opération_1].[Nom_Lieu] & " pour " & [T_Situation_rame].[Nom_Situation]),[T_Lieu_Opération].[Nom_Lieu] & "  " & [T_Lieu_Opération_1].[Nom_Lieu]))) AS Titre_Groupe_2
    FROM ((T_Lieu_Opération INNER JOIN T_Zones_Rame ON T_Lieu_Opération.Nom_Lieu = T_Zones_Rame.Lieu_1) LEFT JOIN T_Lieu_Opération AS T_Lieu_Opération_1 ON T_Zones_Rame.Lieu_2 = T_Lieu_Opération_1.Nom_Lieu) INNER JOIN (T_Situation_rame INNER JOIN (([SOUS-ENSEMBLE] INNER JOIN T_MOP ON ([SOUS-ENSEMBLE].[IDSOUS-ENSEMBLE] = T_MOP.[NoSous-ensemble]) AND ([SOUS-ENSEMBLE].[IDSOUS-ENSEMBLE] = T_MOP.[NoSous-ensemble])) INNER JOIN ((T_Blocs INNER JOIN ([R_MOPs_Total_VP] INNER JOIN T_A_Opération_VP_initiale ON [R_MOPs_Total_VP].[R_MOPs+Asso_VP].NoMOP = T_A_Opération_VP_initiale.No_MOP) ON T_Blocs.ID_Bloc = T_A_Opération_VP_initiale.No_Bloc_VP) INNER JOIN T_Type_VP ON ([R_MOPs_Total_VP].[R_MOPs+Asso_VP].IDTYPEVP = T_Type_VP.IDTYPEVP) AND (T_A_Opération_VP_initiale.ID_Type_VP = T_Type_VP.[Types_VP_ Initiales].Value)) ON T_MOP.NoMOP = T_A_Opération_VP_initiale.No_MOP) ON T_Situation_rame.ID_Situation = T_A_Opération_VP_initiale.Situation.Value) ON T_Zones_Rame.ID_Zone = T_A_Opération_VP_initiale.No_Zone
    ORDER BY T_A_Opération_VP_initiale.No_Bloc_VP;
    - Voici la requête utilisée par [R_Opérations_Formulaire_VP] : [R_MOPs_Total_VP]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PARAMETERS TypeVP Long;
    SELECT [R_MOPs+Asso_VP].NoMOP, [R_MOPs+Asso_VP].IDTYPEVP
    FROM [R_MOPs+Asso_VP] LEFT JOIN [R_MOPs_Annulés_VP] ON [R_MOPs+Asso_VP].NoMOP = [R_MOPs_Annulés_VP].T_MOP.NoMOPsAnnulés.Value
    WHERE (([R_MOPs_Annulés_VP].T_MOP.NoMOPsAnnulés.Value) Is Null);
    - Voici la 1ère requête utilisée par [R_MOPs_Total_VP] : [R_MOPs+Asso_VP]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    PARAMETERS TypeVP Long;
    SELECT T_MOP.NoMOP,  T_Type_VP.IDTYPEVP
    FROM T_MOP INNER JOIN ([T_Type_VP] INNER JOIN [T_A_MOP_VP_Initiale] ON [T_Type_VP].[Types_VP_ Initiales].Value = [T_A_MOP_VP_Initiale].[IDType-VP]) ON T_MOP.NoMOP = [T_A_MOP_VP_Initiale].NoMOP
    WHERE (T_Type_VP.IDTYPEVP=TypeVP)
    UNION SELECT T_MOP_1.NoMOP, T_Type_VP.IDTYPEVP
    FROM (T_MOP INNER JOIN T_MOP AS T_MOP_1 ON T_MOP.[NoMOPsAssociés].Value = T_MOP_1.NoMOP) INNER JOIN ([T_A_MOP_VP_Initiale] INNER JOIN [T_Type_VP] ON [T_A_MOP_VP_Initiale].[IDType-VP] = [T_Type_VP].[Types_VP_ Initiales].Value) ON T_MOP.NoMOP = [T_A_MOP_VP_Initiale].NoMOP
    HAVING (T_Type_VP.IDTYPEVP=TypeVP);
    - Voici la 2ème requête utilisée par [R_MOPs_Total_VP] : [R_MOPs_Annulés_VP]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PARAMETERS TypeVP Long;
    SELECT T_MOP.NoMOPsAnnulés.Value, T_Type_VP.IDTYPEVP
    FROM T_MOP INNER JOIN (T_Type_VP INNER JOIN T_A_MOP_VP_Initiale ON T_Type_VP.IDTYPEVP = T_A_MOP_VP_Initiale.[IDType-VP]) ON T_MOP.NoMOP = T_A_MOP_VP_Initiale.NoMOP
    WHERE (T_Type_VP.IDTYPEVP=TypeVP);
    Je sais ... C'est une usine à gaz .....

    J'avais fait une première version où je récupérais le paramètre directement dans la listbox du formulaire de choix, mais je le ferme après l'ouverture et j'utilise encore ces 3 dernières requêtes pour remplir d'autres champs indépendants par la suite dans mon état, alors j'ai opté pour l'option variable publique ....

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 015
    Points : 24 548
    Points
    24 548
    Par défaut
    Tu peux effectivement modifier une requête utilisée dans un état/formulaire avant son ouverture à 2 conditions :

    • Il faut que se soit une requête enregistrée (un objet requête présent dans la liste).
    • Elle ne doit pas comporter de PARAMETERS.


    Concernant le paramètre, s'il est dans une des requêtes enfants tu n'as pas besoin de le spécifier dans toutes les requêtes au dessus.

    Maintenant concernant le problème de l'état. On ne peut pas fournir la valeur du paramètre dans la clause Where, il faut faire donc chercher une autre solution.
    Admettons 2 requêtes ; RequêteA utilise comme source requêteB.
    requêteA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT article, prix, qte * valeurVariable as nouvellequantite FROM requêteB;
    requêteB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT article, prix, qte, [param1] as valeurVariable FROM article;
    RequêteB contient un paramètre à fournir que nous appellons param1.
    L'état à comme source RequêteA.

    Voici comment procéder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    dim rq as dao.querydefs
    set rq = currentdb.querydefs("requêteB")
    rq.sql = replace(sql,"[param1]",10)
    rq.close
    currentdb.querydefs.refresh
     
    docmd.openreport "test"....
    on remplace dans la requête [Param1] par la valeur numérique 10 directement dans le texte. Pour du texte ne pas oublier de joindre les séparateurs.
    Attention ! il faut prévoir un sauvegarde de la requête pour la remettre à son état d'origine à la fin du traitement.
    Cordialement,

  5. #5
    Membre du Club
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Novembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 52
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2014
    Messages : 44
    Points : 53
    Points
    53
    Par défaut
    Merci, ça fonctionne, il me reste à trouver où remettre à l'état d'origine les requêtes.

    Par contre, il y a une petite omission dans ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rq.sql = replace(rq.sql,"[param1]",10)
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rq.sql = replace(sql,"[param1]",10)
    J'ai mis le nom de ma variable publique à la place de 10 et ça fonctionne aussi.
    Et du coup, j'ai supprimé tous les paramètres dans les requêtes .

    Un grand merci Loufab

  6. #6
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 015
    Points : 24 548
    Points
    24 548
    Par défaut
    Bravo !
    et bravo également pour la correction c'est ça de rédiger le code sur un coin de nappe.

    Pour la sauve tu peux imaginer une 2ème requête de stockage, sinon stocker dans une variable, mettre une attente de fermeture sur l'état, et replacer l'original depuis la variable.

    Cordialement,

  7. #7
    Membre du Club
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Novembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 52
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2014
    Messages : 44
    Points : 53
    Points
    53
    Par défaut
    Et bin pour la nappe, c'est Madame qui va être contente

    En effet pour la sauvegarde, j'ai copié les 2 codes SQL dans 2 variables "string" et restitué à la fermeture de l'état (Faut pas que j'oublie de fermer l'état maintenant)

    Merci, à bientôt surement

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/06/2013, 14h05
  2. Réponses: 9
    Dernier message: 06/12/2012, 18h38
  3. [WD17] Planning Alimenté par une Requête
    Par b_reda31 dans le forum WinDev
    Réponses: 7
    Dernier message: 29/10/2012, 10h22
  4. [AC-2007] Ajout élément Liste déroulante alimenter par une requête
    Par morinxav dans le forum VBA Access
    Réponses: 1
    Dernier message: 18/04/2012, 11h35
  5. Connaitre par une requête les paramètres d'une fonction
    Par katoyi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/05/2008, 20h00

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