[VBA] GROS PROBLEME !! help plz

Résolu
Onishi Messages postés 314 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Voilà mon problème, je possède un formulaire contenant 4 listes déroulantes. Chacune est renseigné selon une requête. C'est listes sont aussi liées entre elles. C'est en fait un formulaire de recherche poussé. L'utilisateur choisi ses critères et lorsqu'il clique sur le bouton Édition, selon les critère choisi un certains nombres de couches géographiques doivent s'affichaient dans un état.
Problème : Comment récupérer les critères choisi par l'utilisateur et comment envoyer les informations filtrées à l'état ??? Existe t il un moyen de changer la source d'un état depuis un bouton d'un formulaire ???? SVP aidez moi c'est très important !!!!!!

23 réponses

Onishi Messages postés 314 Date d'inscription   Statut Membre Dernière intervention   21
 
C'est bon pour le sql filtre sauf que après il me redis un pb d'incompatibilité.
Pour mon état je suis entrain de refaire là requête source (j'ai un peu de mal) mais peu importe quand je veux l'ouvrir il me dis que ID_THEME peut appartenir a différentes tables listées et blablabla...

Je te met deux liens pour te montrer à quoi ressemble mon état à la base (tu pourras y voir ce que chaque text box doit contenir :

http://www.easy-upload.net/fichier.php?fichier=200862512210

et

http://www.easy-upload.net/fichier.php?fichier=200862512327

Dis moi ce que tu en penses ?

EDIT : je dois aller manger à toute
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
Une facon de voir rapidement les incompatibilités, c'est de decouper le "sqlfiltre =" en plusieurs lignes, en ajoutant progressivement des petits bouts à sqlfiltre. Ce sera aussi plus clair.

Exemple :
sqlfiltre = sqlfiltre + " and [T_GEOBASE].[ID_GEOBASE] = '" + V_ID_GEOBASE_EMPL + "' "
sqlfiltre = sqlfiltre + " and [T_COUCHE_GEO].[ID_THEME] = '" + V_ID_THEME + "' "
sqlfiltre = sqlfiltre + etc...

En ce qui concerne la création de ton état, je recommande :
- de créer une requete, avec un nom, dont la syntaxe est environ ceci :
SELECT T_COUCHE_GEO.*, T_GEOBASE.*, [T_THEMATIQUE].[ID_THEME]
FROM T_COUCHE_GEO, T_GEOBASE, T_THEMATIQUE
WHERE [T_COUCHE_GEO].[ID_GEOBASE]=[T_GEOBASE].[ID_GEOBASE]
AND [T_COUCHE_GEO].[ID_THEME]=[T_THEMATIQUE].[ID_THEME];
- verfifier que cette requete est bien presente dans la liste des requetes, et que, quand tu l'ouvres, elle te montre bien toutes tes données
- utiliser le nom cette requete comme source de l'état
0
Onishi Messages postés 314 Date d'inscription   Statut Membre Dernière intervention   21 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Voilà donc j'ai refait la requête comme tu as dit. A la main l'état affiche tout et avec ce code :

Option Explicit
Option Compare Database

Private Sub BT_AFFICHER_Click()

'Déclaration des variables
Dim V_ID_GEOBASE_EMPL As Variant
Dim V_ID_THEME As Variant
Dim V_ID_S_THEME As Variant
Dim V_ID_SS_THEME As Variant
Dim V_ID_GEOBASE_INS As Variant
Dim V_SERVICE_NOM As Variant
Dim V_ID_AGENT As Variant
Dim V_LOCAL_ATTRIB As Boolean
Dim sqlfiltre As Variant

'Récupération des valeurs dans les variables
V_ID_GEOBASE_EMPL = F_GEOBASE_EMPL
V_ID_THEME = F_ID_THEME
V_ID_S_THEME = F_ID_S_THEME
V_ID_SS_THEME = F_ID_SS_THEME
V_ID_GEOBASE_INS = F_ID_GEOBASE_INS
V_SERVICE_NOM = LISTE_SERVICE
V_ID_AGENT = F_ID_AGENT
V_LOCAL_ATTRIB = cb_attribut


sqlfiltre = " 0 = 0 "

'Permet de gérer le null de la liste LISTE_SS_THEME
If Not IsNull(V_ID_SS_THEME) Then

sqlfiltre = sqlfiltre + " and ID_SS_THEME = '" + V_ID_SS_THEME + "' "

End If

'Permet que suivant si la checkbox est selectionée ou pas, le filtre selectionera les valeurs où ATTRIB_LOCAL est vrai ou faux
If V_LOCAL_ATTRIB Then

sqlfiltre = sqlfiltre + " and ATTRIB_LOCAL "

Else

sqlfiltre = sqlfiltre + " and (not ATTRIB_LOCAL) "

End If


sqlfiltre = sqlfiltre + " and [T_GEOBASE].[ID_GEOBASE] = '" + V_ID_GEOBASE_EMPL + "' "
sqlfiltre = sqlfiltre + " and [T_COUCHE_GEO].[ID_THEME] = '" + V_ID_THEME + "' "
sqlfiltre = sqlfiltre + " and [T_COUCHE_GEO].[ID_S_THEME] = '" + V_ID_S_THEME + "' "
sqlfiltre = sqlfiltre + " and [T_COUCHE_GEO].[ID_SS_THEME] = '" + V_ID_SS_THEME + "' "
sqlfiltre = sqlfiltre + " and [T_GEOBASE].[ID_GEOBASE] = '" + V_ID_GEOBASE_INS + "' "
sqlfiltre = sqlfiltre + " and [T_AGENT].[SERVICE_AGENT] = '" + V_SERVICE_NOM + "' "
sqlfiltre = sqlfiltre + " and [T_AGENT].[ID_AGENT] = '" + V_ID_AGENT + "' "
sqlfiltre = sqlfiltre + " and [T_ATTRIBUT].[ATTRIB_LOCAL] = '" + V_LOCAL_ATTRIB + "' "

'Filtre récupérant le contenu de chaque variable
'sqlfiltre = sqlfiltre + " and [T_GEOBASE].[ID_GEOBASE] = '" + V_ID_GEOBASE_EMPL + "' and [T_COUCHE_GEO].[ID_THEME] = '" + V_ID_THEME + "' and ID_S_THEME = '" + V_ID_S_THEME + "' and ID_SS_THEME = '" + V_ID_SS_THEME + "'and [T_GEOBASE].[ID_GEOBASE] = '" + V_ID_GEOBASE_INS + "' and SERVICE_AGENT = '" + V_SERVICE_NOM + "' and ID_AGENT ='" + V_ID_AGENT + "' and ATTRIB_LOCAL ='" + V_LOCAL_ATTRIB + "' "


'Syntaxe permettant d'ouvrir l'état E_SPECIFIQUE et d'y afficher les couches géographiques concernées par les critères
DoCmd.OpenReport "E_SPECIFIQUE", acViewPreview, , sqlfiltre

'MsgBox V_ID_GEOBASE_EMPL & Chr(13) & V_ID_THEME & Chr(13) & V_ID_S_THEME & Chr(13) & V_ID_SS_THEME & Chr(13) & V_ID_GEOBASE_INS & Chr(13) & V_SERVICE_NOM & Chr(13) & V_ID_AGENT
'sqlfiltre = " T_GEOBASE.ID_GEOBASE = '" + V_ID_GEOBASE_EMPL + "' and T_COUCHE_GEO.ID_THEME = '" + V_ID_THEME + "' and ID_S_THEME = '" + V_ID_S_THEME + "' and ID_S_THEME = '" + V_ID_SS_THEME + "' and T_GEOBASE.ID_GEOBASE = '" + V_ID_GEROBASE_INS + "' and SERVICE_AGENT = '" + V_SERVICE_NOM + "' and ID_AGENT ='" + V_ID_AGENT + "'"
'If Not (IsNull(V_ID_SS_THEME) Or IsEmpty(V_ID_SS_THEME)) Then

End Sub



Et bien cela m'a affiché l'état à un moment avec toutes les couches (alors que je n'en voulais que certaines) et après j'ai mis un point de repère et j'ai exécuté le code pas à pas (avec F8) et l'erreur d'incompatibilité vient de la ligne en gras au dessus. Tu serais me dire pourquoi ?

EDIT : Bon déjà j'avais oublié de réinitialiser la checkbox avec le bouton réinitialiser mais l'erreur d'incompatibilité n'apparait que lorsque je réexécute le code après avoir cliqué sur le bouton réinitialisé. L'erreur d'incompatibilité revient à chaque fois si jutilise ce bouton.

RE EDIT : en fait maintenant des que je clique sur le bouton il me dis qu'il n'arrive pas à gérer le null de la liste_ss_theme pourtant j'ai bien utilisé la syntaxe que tu m'as donné tout à l'heure et ça marché et je n'ai rien modifié...je suis perdu lol ☺
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Onishi Messages postés 314 Date d'inscription   Statut Membre Dernière intervention  
 
Comme tu fais un traitement specifique pour V_ID_SS_THEME et pour V_LOCAL_ATTRIB (tu les ajoutes dans sqlfiltre dans les instructions avec IF), tu ne dois surtout pas laisser les lignes dans la suite du code.

Ainsi, les deux lignes suivantes doivent être supprimées :
sqlfiltre = sqlfiltre + " and [T_COUCHE_GEO].[ID_SS_THEME] = '" + V_ID_SS_THEME + "' "
sqlfiltre = sqlfiltre + " and [T_ATTRIBUT].[ATTRIB_LOCAL] = '" + V_LOCAL_ATTRIB + "' "

Dans les exemples que je t'ai envoyé, j'avais fait cela, mais sans insister, et cela était sans doute trop discret.

En passant, je te rappelle ma suggestion de régulièrement tester les trois éléments suivants :
- l'ouverture à la main de l'état
- l'ouverture de l'état avec le code, mais sans filtre
- l'ouverture de l'état avec le code et le filtre

Chacun de ces tests devrait fonctionner, et les trois tests t'aideront à détecter plus facilement ce qui ne fonctionne pas.
0
Onishi Messages postés 314 Date d'inscription   Statut Membre Dernière intervention   21 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Bonjour,

j'ai enlevé les deux lignes et j'ai ouvert l'état à la main tout fonctionne, puis j'ai ouvert grâce au code sans le , , sqlfiltre
et il ma fait comme si j'ouvrai l'état à la main.
Pour la dernière solution il me demande des information à rentrer avant d'afficher le formulaire comme ATTRIB_LOCAL, T_AGENT.SERVICE_AGENT et T_AGENT.ID_AGENT puis il me met une erreur 3071 assez longue qui m'explique que ma syntaxe est soit trop complexe soit incorrecte, qu'une expression numérique peut contenir des éléments trop compliqués et qu'il faut que j'essaye de la simplifié en affectant des parties à des variables.
(ça c'est dans le cas ou je n'ai rien rentré comme informations => j'ai directement cliqué sur ok les 3 fois) et finalement même en complétant il me met la même erreur.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
Je pense que les trois champs (ATTRIB_LOCAL, T_AGENT.SERVICE_AGENT et T_AGENT.ID_AGENT) sont inconnus dans le contexte de l'état.
Tu peux faire deux vérifications :
1) Un des trois champs est-il affiché dans l'état ? Si oui, comment s'appelle-t-il exactement dans l'état ?
2) Ouvre "à la main" la requete qui sert de base à l'état. Ces trois champs y sont-ils présents ? Quel sont les titres de leurs colonnes ?
0
Onishi Messages postés 314 Date d'inscription   Statut Membre Dernière intervention   21
 
En effet ATTRIB_LOCAL est présent dans le sous état SE_ATTRIBUT sous forme de Checkbox et sa source est ATTRIB_LOCAL.
Idem pour T_AGENT.SERVICE_AGENT, il était dans le sous formulaire SE_AGENT et je l'ai renommé T_AGENT.SERVICE_AGENT car il été nommé SERVICE_AGENT.
En tout cas pour T_AGENT.ID_AGENT, il était présent dans les deux sous état cité au-dessus mais il était pourtant bien préfixé de la table T_AGENT.

Je vais voir ce que cela donne déjà.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Onishi Messages postés 314 Date d'inscription   Statut Membre Dernière intervention  
 
Tu ne peux mettre dans le filtre que des champs qui peuvent être présent dans l'état. Pour le moment, tu testes dans le filtre des champs qui ne sont pas dans l'état, et il est donc possible qu'ils ne soient pas utilisable au niveau de l'état.
Peux-tu vérifier si il est possible de les ajouter temporairement dans l'état (pas dans un sous état, dans l'état lui-meme) ? Si cela n'est pas possible, il est normal que tu ne puisses pas t'en servir dans le filtre...
Ces champs apparaissent-ils quand tu ouvres à la main la requete de base de l'état ?
0
Onishi Messages postés 314 Date d'inscription   Statut Membre Dernière intervention   21
 
Désolé de répondre que maintenant mais ma maître de stage à voulut m'aider (enfin ?) et elle s'énerve dessus et j'ai pas eu le temps de faire un copie et elle a déjà modifié pas mal de trucs :s. Je vais te tenir au courant mais bon maintenant elle me demande de trouver des solutions alors que je peux pas continuer sur ma lancé... A+

EDIT : je suis entrain de récupérer le code un peu plus je pense qu'on pourra reprendre ^^
0
Onishi Messages postés 314 Date d'inscription   Statut Membre Dernière intervention   21
 
Temporairement je vais essayer mais bon à la base ils doivent rester dans les sous états. Et j'ai exécuté la requête source de l'état et ces champs n'apparaissent pas :s. Existe t il une syntaxe pour les envoyer sur les sous états directement du genre :

DoCmd.OpenReport "[E_SPECIFIQUE]![lenomdemonsousetat]", acViewPreview, , sqlfiltre

?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Onishi Messages postés 314 Date d'inscription   Statut Membre Dernière intervention  
 
Tu ne peux pas mettre dans le filtre de l'état un champ qui n'est pas dans la requete de base de l'état. Tu ne peux pas non plus mettre dans l'état un champ qui n'est pas dans cette requete.
Je te suggère :
- temporairement, supprime ces trois champs de ton filtre, pour voir si le reste fonctionne
- essayer de rajouter ces trois champs dans la requete de base de l'état, si cela a un sens
- reflechir à ce que ces champs ont de particulier, qui ferait qu'ils n'ont pas leur place dans la requete de base de l'état
0
Onishi Messages postés 314 Date d'inscription   Statut Membre Dernière intervention   21 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
J'ai essayer de les mettre directement dans l'état après avoir modifié la requête source. Mais il ma mis une erreur lors de l'exécution (toujours la 3071) mais il me demandé en plus de renseigné T_ATTRIBUT et T_AGENT pourtant ils sont dans la requête source !

Si il n'ont pas leur place dans la requête base de l'état c'est que cette requête ne doit afficher que les informations concernant les couches géographiques et leur thématique. Voilà pourquoi ils sont dans des sous état.

En gros cet état et l'adaptation d'un formulaire que j'ai réalisé avec des sous formulaire. Je doit le créer juste dans le but de pouvoir imprimer mes résultats.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Onishi Messages postés 314 Date d'inscription   Statut Membre Dernière intervention  
 
Après avoir modifié la requete source, que donnes l'execution à la main de la requete source ? Pas d'erreur ? Y vois-tu les nouveaux champs ?

Je te suggère, temporairement, de supprimer ces trois champs de ton filtre, pour voir si le reste fonctionne.

Même si tu veux visualiser certains champs dans des sous-états, pourquoi ne pas les inclure dans la requete source de l'état. J'ai jété un coup d'oeil sur les requetes sources de tes sous états : en fait, les sous états sont indépendants de l'état.

Ai-je bien compris, il n'y a vraiment pas de lien entre l'état et les sous états ?

Si c'est le cas, comment imagine tu que cela va s'imprimer harmonieusement ?


0