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 15/11/2011, 14h53   #1
Membre à l'essai
 
Inscription : octobre 2004
Messages : 84
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : octobre 2004
Messages : 84
Points : 21
Points : 21
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 :
CurrentDb.QueryDefs("QDummy").SQL = tSQL.value
Je fais ensuite
Code :
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
zitoune92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 19h02   #2
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
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 : 3 939
Points : 6 278
Points : 6 278
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 :
SELECT * FROM Table1
n'affiche aucune colonne dans la requête lorsqu'on passe en affichage SQL.

Alors que
Code sql :
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+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 11h06   #3
Membre à l'essai
 
Inscription : octobre 2004
Messages : 84
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : octobre 2004
Messages : 84
Points : 21
Points : 21
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
Type de fichier : jpg 2011-11-16_110047.jpg (92,5 Ko, 3 affichages)
zitoune92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 18h57   #4
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
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 : 3 939
Points : 6 278
Points : 6 278
Bonsoir,

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

Citation:
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 :
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+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 09h02   #5
Membre à l'essai
 
Inscription : octobre 2004
Messages : 84
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : octobre 2004
Messages : 84
Points : 21
Points : 21
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 :
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....)
zitoune92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 18h36   #6
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
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 : 3 939
Points : 6 278
Points : 6 278
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 :
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 :
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 :
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+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 09h43   #7
Membre à l'essai
 
Inscription : octobre 2004
Messages : 84
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : octobre 2004
Messages : 84
Points : 21
Points : 21

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
zitoune92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 15h25   #8
Membre à l'essai
 
Inscription : octobre 2004
Messages : 84
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : octobre 2004
Messages : 84
Points : 21
Points : 21
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 ?
zitoune92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2011, 14h57   #9
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
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 : 3 939
Points : 6 278
Points : 6 278
Bonjour,

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

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2011, 21h07   #10
Membre à l'essai
 
Inscription : octobre 2004
Messages : 84
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : octobre 2004
Messages : 84
Points : 21
Points : 21
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
zitoune92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2011, 13h19   #11
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
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 : 3 939
Points : 6 278
Points : 6 278
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+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2011, 14h44   #12
Membre à l'essai
 
Inscription : octobre 2004
Messages : 84
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : octobre 2004
Messages : 84
Points : 21
Points : 21
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.
zitoune92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 16h35   #13
Membre à l'essai
 
Inscription : octobre 2004
Messages : 84
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : octobre 2004
Messages : 84
Points : 21
Points : 21
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
Type de fichier : jpg 1.jpg (62,8 Ko, 2 affichages)
Type de fichier : jpg 2.jpg (72,7 Ko, 1 affichages)
Fichiers attachés
Type de fichier : 7z Test.7z (56,9 Ko, 4 affichages)
zitoune92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 19h29   #14
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
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 : 3 939
Points : 6 278
Points : 6 278
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 :
Citation:
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 :
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+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 19h46   #15
Membre à l'essai
 
Inscription : octobre 2004
Messages : 84
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : octobre 2004
Messages : 84
Points : 21
Points : 21
Alors là... respect.
Franchement, c'est vicieux. Un combo attaché à la table ne provoque pas ça.

Merci infiniment. J'aurais jamais trouvé
zitoune92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h22.


 
 
 
 
Partenaires

Hébergement Web