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 :

Formulaire basé sur Query variable


Sujet :

IHM

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 169
    Points : 100
    Points
    100
    Par défaut Formulaire basé sur Query variable
    Bonjour,

    J'ai un query qDummy que j'ai laissé vide
    J'ai une Form fMain avec un TextBox tSQL et un sous formulaire fSQLResult dont le recordsource=qDummy.

    Ce query qDummy est modifié d'après tSQL comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentDb.QueryDefs("QDummy").SQL = tSQL.value
    Je fais ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Forms!fMain!fSQLResult.Form.Refresh (ou repaint ou requery)
    mais dans fSQLResult, j'obtiens une liste vide de tout champ. Par contre on voit que le ScrollBar vertical bouge et indique le nombre d'enregistrements !

    Si je vais voir qDummy en mode SQL, elle est bien mise à jour mais en mode design, aucun champ n'est placé dans les colonnes.

    Je précise que je ne veux pas utiliser les ListBox.

    Il doit y avoir un truc bête mais je cale un peu...

    Merci de votre aide

  2. #2
    Expert éminent
    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
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Il y a peut-être quelque chose qui ne va pas dans le code SQL provenant de tSQL.value.

    Crée ta requête manuellement, passe en mode d'affichage "Mode SQL", et regarde ce qui diffère.

    Remarque :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM Table1
    n'affiche aucune colonne dans la requête lorsqu'on passe en affichage SQL.

    Alors que
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Table1.* FROM Table1
    affiche une colonne avec * lorsqu'on passe en affichage SQL.
    La différence c'est le nom de la table, suivie d'un point, avant le *

    A+

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 169
    Points : 100
    Points
    100
    Par défaut
    Je ne vois pas, hormis cette subtilité propre à l'éditeur de Query, de différence au final. Tous les champs sont affichés.
    Il faut savoir que tSQL est saisi par l'utilisateur qui va rentrer du SQL "générique" (sans mettre Table1. devant chaque champ)
    Cela étant, j'ai essayé avec ta modification mais ça ne change rien (voir image)

    L'image montre un exemple similaire d'une forme ayant comme source de données QDummy. Tu verra que la forme est cependant vide de tout champ, ce qui explique surement pourquoi elle n'affiche rien mais comporte n enregistrements. Mon problème c'est d'automatiquement insérer tous les champs de la query dans la forme afin qu'ils soient affichés. Sans passer par le mode design bien sûr.
    Merci
    Images attachées Images attachées  

  4. #4
    Expert éminent
    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
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    Je croyais que tu parlais de ce que tu voyais dans la requête en mode création.

    Mon problème c'est d'automatiquement insérer tous les champs de la query dans la forme afin qu'ils soient affichés. Sans passer par le mode design bien sûr
    Ça je ne sais pas faire.
    Si la source de données d'un formulaire change, il faut obligatoirement passer par le mode création,
    pour ajouter ou supprimer des contrôles et les lier aux champs de la source.

    Ce qui fonctionne en revanche c'est un contrôle sous-formulaire dont la source n'est pas un formulaire,
    mais directement la requête QDummy.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CurrentDb.QueryDefs("QDummy").SQL = tSQL.value
     
    ' Pour actualiser :
    Me.fSQLResult.SourceObject = ""
    Me.fSQLResult.SourceObject = "Query.QDummy"
     
    ' Ou bien avec la syntaxe Forms!... :
    Forms!fMain!fSQLResult.SourceObject = ""
    Forms!fMain!fSQLResult.SourceObject = "Query.QDummy"
    A+

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 169
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par LedZeppII Voir le message
    Ce qui fonctionne en revanche c'est un contrôle sous-formulaire dont la source n'est pas un formulaire,
    mais directement la requête QDummy.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CurrentDb.QueryDefs("QDummy").SQL = tSQL.value
     
    ' Pour actualiser :
    Me.fSQLResult.SourceObject = ""
    Me.fSQLResult.SourceObject = "Query.QDummy"
     
    ' Ou bien avec la syntaxe Forms!... :
    Forms!fMain!fSQLResult.SourceObject = ""
    Forms!fMain!fSQLResult.SourceObject = "Query.QDummy"
    A+
    Effectivement, je passais par une sous-forme, c'est pour ça que ça ne marchait pas .
    Merci ta solution marche nickel. Mais y-a-t-il une façon d'interdire de supprimer/ajouter des enregistrements? (Pour ne pas pouvoir modifier, on peut mettre Locked=Yes mais ça n'empêche pas de supprimer, quant à le mettre disable, ça empêche, le tri, le copy....)

  6. #6
    Expert éminent
    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
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    J'ai essayé un truc qui a l'air de fonctionner (testé sur 2007).

    Ajoute cette sub dans le code du formulaire principal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub SetfSQLResultPermissions()
    Me.fSQLResult.Form.AllowAdditions = False
    Me.fSQLResult.Form.AllowDeletions = False
    Me.fSQLResult.Form.AllowEdits = False
    End Sub
    Crée un appel de cette sub dans l'événement "sur chargement" du formulaire principal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_Load()
    SetfSQLResultPermissions
    End Sub
    Et aussi à la fin du code qui modifie le SQL de la requête QDummy:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CurrentDb.QueryDefs("QDummy").SQL = tSQL.value
     
    ' Pour actualiser :
    Me.fSQLResult.SourceObject = ""
    Me.fSQLResult.SourceObject = "Query.QDummy"
     
    ' Permissions sur les données du sous-formulaire
    SetfSQLResultPermissions
    A+

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 169
    Points : 100
    Points
    100
    Par défaut

    Ca marche impec. La solution est donc d'utiliser des propriétés de form alors que l'on utilise pas une form... j'aurai vraiment pas trouvé

    Merci de ton expertise

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 169
    Points : 100
    Points
    100
    Par défaut
    Par contre il y a un truc très bizarre:
    si sur la même form je mets un controle lié à une table T(un combo par exemple), que je change la ligne du combo, ça ne marche plus:
    si je fais la query sur cette même table T: il m'affiche un message d'erreur (l'expression se rapporte à un objet fermé ou non existant) et rien ne s'affiche dans le qDummy.

    Par contre si je fais la query sur une autre table que T, ça marche...

    Bizarre Bug de A2003 ?

  9. #9
    Expert éminent
    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
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Désolé, je ne vois pas où peut être le problème.
    Sur quelle ligne de code se produit l'erreur ?

    A+

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 169
    Points : 100
    Points
    100
    Par défaut
    C'est dès que je fais référence à la propriété form par ex:

    Me.fSQLResult.Form.AllowEdits = False

    Je peux faire en mode debug "? Me.fSQLResult.name par exemple mais pas Me.fSQLResult.Form....

    Merci

  11. #11
    Expert éminent
    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
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Tout ce que je peux dire c'est que le membre Form n'est exploitable que lorsque la requête est affichée dans le contrôle sous-formulaire.
    C'est parce qu'il n'y a pas de formulaire en tant qu'objet source du contrôle sous-formulaire.

    J'ai le problème par exemple, si au lieu de mettre une requête SELECT ..., je met une requête action (UPDATE ... par exemple) qui ne retourne pas un jeu d'enregistrements.
    Une requête action n'a pas de fenêtre feuille de données, donc pas de Form.

    Au moment de l'erreur, est-ce que ?Me.fSQLResult.SourceObject renvoie quelque chose ?

    Par contre je ne vois pas pourquoi ta combo génère ce problème.

    A+

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 169
    Points : 100
    Points
    100
    Par défaut
    Je viens de recréer un formulaire simplifié pour pouvoir te l'envoyer afin de te montrer l'erreur....impossible de la reproduire .
    Il doit y avoir autre chose dans le formulaire original qui fait bugger ça. Je regarde ça lundi au boulot mais ça doit être tricky car ton morceau de code est exactement le même. Peut-être dû à un des évenements liés au combo?. Je te tiens au courant. Merci de ton aide.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 169
    Points : 100
    Points
    100
    Par défaut
    Me revoilà...

    En fait, in semble que le problème se présente quand une sous forme liée à la table existe dans la forme.
    Je te joins 2 copies afin de comprendre. Et l'archive du test.

    Form1 est la forme principale qui contient:
    tSQL,fSQLResult et Form1_subform

    Le recordSource de Form1_subform est la table "PCF"

    Dans la copie1, On fait un query sur PCF (message d'erreur)
    Dans la copie2, on fait un query sur une autre table: pas d'erreur

    L'erreur se produit dès qu'une ligne de code fait référence à la propriété "form" de fSQLResult. Par ex:
    NRec% = Me.fSQLResult.Form.Recordset.RecordCount

    Bizarre
    Images attachées Images attachées   
    Fichiers attachés Fichiers attachés

  14. #14
    Expert éminent
    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
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    J'ai mis un peu de temps à trouver.
    J'ai constaté qu'on ne pouvait même pas ouvrir l'objet requête QDummy lui-même, sans avoir cette erreur :
    La table «T1» est déjà ouverte en mode exclusif par un autre utilisateur, ou elle est déjà ouverte par l'interface utilisateur et ne peut pas être manipulée par programmation.
    J'ai fini par trouver que la requête QDummy avait un mode de verrouillage à Général.
    En le mettant sur Aucun (valeur par défaut) ça fonctionne.

    On peut le forcer en VBA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ' Modifier le SQL de la requête QDummy
    CurrentDb.QueryDefs("QDummy").SQL = TextSQL.Value
    ' Forcer Verrouillage = Aucun
    CurrentDb.QueryDefs("QDummy").Properties("RecordLocks") = 0
     
    ' Pour actualiser :
    Me.fSQLResult.SourceObject = ""
    Me.fSQLResult.SourceObject = "Query.QDummy"
    Voila, c'était la petite particularité à laquelle je ne pensais pas.

    A+

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 169
    Points : 100
    Points
    100
    Par défaut
    Alors là... respect.
    Franchement, c'est vicieux. Un combo attaché à la table ne provoque pas ça.

    Merci infiniment. J'aurais jamais trouvé

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

Discussions similaires

  1. Dupliquer enregistrement formulaire basé sur une requête
    Par fredpeca dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 05/02/2007, 12h40
  2. Sous-Formulaire basé sur une requête nécessitant des paramètes
    Par nicou50 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 02/09/2006, 22h18
  3. Ouvrture Formulaire basé sur une requête paramétrée
    Par teffal dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 10/07/2006, 16h04
  4. Réponses: 2
    Dernier message: 05/07/2006, 16h52
  5. Formulaire basé sur requete Union
    Par capitaine dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 14/06/2006, 11h17

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