[VBA] GROS PROBLEME !! help plz

Résolu
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 !!!!!!
--
0nïzuk@ + K@k@shï ===== 0nïshï
Configuration: Windows XP
Firefox 2.0.0.14

23 réponses

Résumé de la discussion

La problématique porte sur la récupération des critères choisis par l'utilisateur dans quatre listes déroulantes et la transmission de ces filtres à un rapport généré à partir d'un formulaire Access. L'approche consiste à utiliser DoCmd.OpenReport avec une clause WHERE pour passer les critères filtrés et adapter dynamiquement la requête source de l'état depuis le formulaire. En cas d'erreurs liées à des champs multiples ou à des collisions de tables, il peut être nécessaire de construire la condition WHERE dans la requête ou d'éviter l'usage de sqlfiltre lors de l'ouverture. Pour éviter l'ambiguïté liée à ID_GEOBASE, privilégier une approche ciblée sur un seul champ et tester les filtres directement dans les contrôles du formulaire.

Bobot (l’IA à votre service)
  1. Contributeur
    Dans le code associé à un bouton, tu peux ouvrir un état, et ajuster comment cet état est créé, avec :
    DoCmd.OpenReport
    1. Oui je sais voici une ébauche de ce que j'ai fait :

      DoCmd.OpenReport "E_SPECIFIQUE", acViewPreview, "est ce là que je dois mettre ma requête ????"

    2. Contributeur
      @OnishiDoCmd.OpenReport "E_SPECIFIQUE", acViewPreview, ,"ici ce qui va venir dans la partie WHERE de la requete, sans le mot WHERE"
    3. @yg_beOk je vais tester merci bien ^^ Je te tiens au courant
    4. @OnishiBon j'ai marqué ça sur le clique du bouton :

      DoCmd.OpenReport "E_SPECIFIQUE", acViewPreview, , (ID_GEOBASE = " & P & ")

      Ma requête est celle ci :

      SELECT T_COUCHE_GEO.*
      FROM T_COUCHE_GEO
      WHERE ID_GEOBASE="P";

      Quand je clique sur le bouton il m'affiche mon état mais tous les champs sont rempli par #Nom ?

      Je ne sais pas quoi mettre dans la source de mon état :s Une requête ?
    5. Contributeur
      @Onishic'est quoi ce "P" ? Si P est une variable de type string qui contient l'ID que tu veux visualiser, j'essayerais :

      DoCmd.OpenReport "E_SPECIFIQUE", acViewPreview, , " ID_GEOBASE = " & P

      et si tu fais la requete à la main, qu'obtiens-tu ?
  2. Contributeur
    essaie plutot, au lieu de ta ligne en gras :

    sqlfiltre = " ID_THEME ='" + V_ID_THEME +"') "
    sqlfiltre = sqlfiltre + " and " ID_S_THEME ='" + V_ID_S_THEME +"') " 'ainsi de suite
    DoCmd.OpenReport "E_SPECIFIQUE", acViewPreview, ,
    1. Là j'ai fais ça :

      sqlfiltre = 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
      DoCmd.OpenReport "E_SPECIFIQUE", acViewPreview, , sqlfiltre


      mais quand je clique sur le bouton il me dis que mon ID_GEOBASE peut désigner plusieurs tables listées dans la clause FROM de mon instruction SQL, pourtant elle est comme ça :

      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]));


      Il y a bien une table devant chaque ID_GEOBASE nan ?
  3. Contributeur
    Quel contiens sqlfiltre exactement au moment du openreport ?

    Il faut aussi mettre les noms des tables dans sqlfiltre...
    1. je suis bête j'avais laisser les char(13) pour le retour de ligne et non pas une concaténation je vais donc utiliser ce que tu m'a donner là : " ID_THEME ='" + V_ID_THEME + "') et je continue pour les autres, si j'ai bien compris ?
    2. @yg_beSnif je suis naze, j'ai jamais concaténer des variables est ce que c'est bien comme ça ?

      sqlfiltre = '" ID_GEOBASE ='" + V_ID_GEOBASE_EMPL + "' & '" ID_THEME ='" + V_ID_THEME + "' & '" ID_S_THEME ='" + V_ID_S_THEME + "' & '" ID_S_THEME ='" + V_ID_SS_THEME + "' & '" ID_GEOBASE ='" + V_ID_GEROBASE_INS + "' & '" SERVICE_AGENT ='" + V_SERVICE_NOM + "' & '" ID_AGENT ='" + V_ID_AGENT + "'
  4. Contributeur
    essaie ainsi :
    sqlfiltre = " ID_GEOBASE = '" + V_ID_GEOBASE_EMPL + "' and ID_THEME = '" + V_ID_THEME + "' and ID_S_THEME = '" + V_ID_S_THEME + "' and ID_S_THEME = '" + V_ID_SS_THEME + "' and ID_GEOBASE = '" + V_ID_GEROBASE_INS + "' and SERVICE_AGENT = '" + V_SERVICE_NOM + "' and ID_AGENT ='" + V_ID_AGENT + "'"
    1. Ok merci donc apparemment cela ne bloque plus à partir du sql filtre mais il me dis que mon ID_GEOBASE peut être de différentes tables dans mon instruction SQL

      et il me surligne cette ligne (en gras) :

      sqlfiltre = " ID_GEOBASE = '" + V_ID_GEOBASE_EMPL + "' and ID_THEME = '" + V_ID_THEME + "' and ID_S_THEME = '" + V_ID_S_THEME + "' and ID_S_THEME = '" + V_ID_SS_THEME + "' and ID_GEOBASE = '" + V_ID_GEROBASE_INS + "' and SERVICE_AGENT = '" + V_SERVICE_NOM + "' and ID_AGENT ='" + V_ID_AGENT + "'"
      DoCmd.OpenReport "E_SPECIFIQUE", acViewPreview, , sqlfiltre

      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;

      pourtant que je sache cette requête ci-dessus explique clairement d'où vient chaque ID_GEOBASE
  5. Contributeur
    Il faut aussi mettre les noms des tables dans sqlfiltre...

    Si tu veux éviter cela, il faut dans ton query qui sert de base à ton état, éviter de sélectioner des champs synonymes.
    1. J'ai tester avec un MsgBox sqlfiltre et il me dit que sqlfiltre est null...

      le code est comme ca 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 + "'"

      DoCmd.OpenReport "E_SPECIFIQUE", acViewPreview, , sqlfiltre

      Désolé en plus je dois partir je reprendrais ça lundi. Je sais pas si tu seras toujours là mais j'essaierais de trouver tout seul sinon. Encore merci pour ton aide ça m'a été précieux ^^
    2. Contributeur
      @OnishiIl faudrait que TOUTES les variables V_ soient de type string.
      La logique suppose aussi que TOUTES les variables interviennent dans le filtre.

      Il y a moyen de faire mieux, du genre :

      sqlfiltre= " 0 = 0 "
      if V_ID_GEOBASE_EMPL <> "" then
      sqlfiltre = sqlfiltre + " and [T_GEOBASE].[ID_GEOBASE] = '" + V_ID_GEOBASE_EMPL + "' "
      end if

    3. @yg_beBonjour yg_be, bon, mon problème est que j'ai des listes qui ce sont rajoutées et deux d'entre elles posent problème.

      La première, la liste LISTE_SS_THEME qui me pose un problème lors du clique du bouton afficher. En effet cette liste n'est pas forcément renseignée et donc lors de la compilation la liste retourne null.

      La deuxième est une liste nommée LISTE_GEOBASE_INS, en fait elle a le même but que la liste LISTE_GEOBASE sauf que celle ci permet d'afficher des informations dans un sous état situé dans l'état....(je sais c'est vraiment compliqué comme méthode ...)

      Et donc pour l'instan quand je récupère sa valeur cela m'affiche null aussi. Est ce que cela pourrait être du à la LISTE_GEOBASE qui bloqueré la LISTE_GEOBASE_INS ?

      Cordialement, Onishi ^^

      PS : Voici l'état de mon code pour le moment :

      Option Compare Database

      Private Sub BT_AFFICHER_Click()

      'Déclaration des variables
      Dim V_ID_GEOBASE_EMPL As String
      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 String
      Dim V_SERVICE_NOM As String
      Dim V_ID_AGENT As String

      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


      'DoCmd.OpenReport "E_SPECIFIQUE", acViewPreview, , 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 + "'"

      DoCmd.OpenReport "E_SPECIFIQUE", acViewPreview, , sqlfiltre
      End Sub


      Private Sub BT_REINITIALISER_Click()

      LISTE_GEOBASE_EMPL = ""
      liste_theme = ""
      liste_sous_theme = ""
      liste_sous_sous_theme = ""

      LISTE_GEOBASE_INS = ""
      LISTE_SERVICE = ""
      LISTE_NOM_AGENT = ""

      End Sub

      Private Sub LISTE_GEOBASE_1_AfterUpdate()

      Forms![F_RECHERCHE_PAR_CRITERES]!liste_theme.Requery

      End Sub

      Private Sub LISTE_SOUS_THEME_AfterUpdate()

      Forms![F_RECHERCHE_PAR_CRITERES]!liste_sous_sous_theme.Requery

      End Sub

      Private Sub LISTE_THEME_AfterUpdate()

      Forms![F_RECHERCHE_PAR_CRITERES]!liste_sous_theme.Requery
      Forms![F_RECHERCHE_PAR_CRITERES]!liste_sous_sous_theme.Requery

      End Sub
      Private Sub bt_retour_Click()
      On Error GoTo Err_bt_retour_Click

      DoCmd.Close

      Exit_bt_retour_Click:
      Exit Sub

      Err_bt_retour_Click:
      MsgBox Err.Description
      Resume Exit_bt_retour_Click

      End Sub
    4. Contributeur
      @OnishiSuggestion :

      sqlfiltre= " 0 = 0 "

      if not isnull(V_ID_GEOBASE_EMPL) then
      sqlfiltre = sqlfiltre + " and [T_GEOBASE].[ID_GEOBASE] = '" + V_ID_GEOBASE_EMPL + "' "
      end if

      ... et ainsi de suite pour chaque critère
    5. @yg_beLa syntaxe à l'air correcte mais il me dis tjs le même problème sur ID_GEOBASE mais à mon avis cela ne vient pas de là car sur V_ID_SS_THEME en passant avec la souris lors de la compilation il y a écrit "Null" et sur V_ID_GEROBASE_INS il y a écrit "Vide". :s
  6. Voici la requête source de l'état :

    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];


    et voici mon sql filtre :


    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_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 + "'"
    1. J'ai maintenant une erreur d'incompatibilité de type "erreur 13".

      Pourrais tu m'aider à trouver le type de variable que je dois déclarer svp ? Comme pour la checkbox par exp, est ce que c'est bien du booléan qu'il faut déclarer ?

      Merci d'avance.
    2. Contributeur
      @OnishiBonne idée de mettre boolean pour une variable qui va recuperer le contenu d'une checkbox.
      Si tu utilise ce boolean dans le filtre, veux-tu le comparer à un champ de la table ? SI oui, quel est le type de ce champ ?
    3. @yg_beCe boolean permet d'afficher ou pas (selon si la case est cochée) si les attributs des couches géographiques sont en locale ou non. Dans la table T_ATTRIBUT ce champ ce nomme ATTRIB_LOCAL et est de type Oui/Non.
  7. Contributeur
    Si c'est au moment de l'ouverture de l'état que tu as le message d'erreur "ID_GEOBASE peut appartenir à différentes tables", essaie un peu en n'utilisant pas sqlfiltre dans le openreport.
    1. Pour l'instant cette erreur je ne l'ai plus ☺ mais en tout cas l'erreur d'incompatibilité commence à m'énerver, je ne trouve pas la variable dont le type bloque :s.

      Voici le code :

      Option Compare Database

      Private Sub BT_AFFICHER_Click()

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

      '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

      '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_GEROBASE_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

      'DoCmd.OpenReport "E_SPECIFIQUE", acViewPreview, , 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 + "'"
      'sqlfiltre = " 0 = 0 "
      'If Not IsNull(V_ID_GEOBASE_EMPL) Then
      'If Not (IsNull(V_ID_SS_THEME) Or IsEmpty(V_ID_SS_THEME)) Then

      End Sub
  8. Contributeur
    Le plus propre, c'est de faire ainsi :

    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_GEROBASE_INS + "' and SERVICE_AGENT = '" + V_SERVICE_NOM + "' and ID_AGENT ='" + V_ID_AGENT + "' "

    if V_LOCAL_ATTRIB then
    sqlfiltre = sqlfiltre + " and ATTRIB_LOCAL "
    else
    sqlfiltre = sqlfiltre " and (not ATTRIB_LOCAL) "
    end if

    Avec cette logique, suivant que le checkbox est selectione ou pas, le filtre selectionera les valeurs où ATTRIB_LOCAL est vrai ou faux. Est-ce cela que tu veux obtenir ?
    1. Oui c'est exactement cela ^^ Je vais maintenant voir pourquoi j'ai toujours ce problème d'incompatibilité. Merci pour toute ton aide ! ☺ Mais je sens que je n'ai pas fini encore ^^
    2. Contributeur
      @OnishiJe pense que l'incompatibilité devrait disparaitre avec ma derniere suggestion.
  9. J'ai mis toutes les variables sauf la checkbox en variant pour vérifier l'incompatibilité? Lors de l'exécution un message me dit :

    Erreur d'exécution 3075 : Erreur de syntaxe (opérateur absent) dans l'expression '(and T_GEOBASE.ID_GEOBASE ='P' and T_COUCHE_GEO.ID_THEME ='6' and ID_S_THEME ='30' and ID_SS_THEME ="and T_GEOBASE.ID_GEOBASE =" and SERVICE_AGENT ='SEEF' and ID_AGENT ='65' and (not ATTRIB_LOCAL))'.

    Je ne comprend pas tellement d'où cela peut venir :s

    PS : Access me surligne cette ligne en jaune et le sql filtre à l'ai de contenir le contenu de message d'erreur :

    DoCmd.OpenReport "E_SPECIFIQUE", acViewPreview, , sqlfiltre
    1. Contributeur
      N'aurais-tu pas supprimé la ligne
      sqlfiltre = " 0 = 0 "
      avant sqlfiltre = sqlfiltre + ...

      Je pense que tu tournes en rond, n'as tu pas négligé ma suggestion du lundi 23 juin 2008 à 10:28:47 ? Je pense qu'il vaut mieux éviter les variant et travailler sur les incompatibilités.

      Une facon de voir rapidement les incompatibilités, c'est de decouper le "sqlfiltre =" en plusieurs lignes, en ajoutant progressivement des petits bouts à sqlfiltre.

      Avec les variant, tu caches les incompatibilités, mais tu te crees d'autres problemes que tu n'as pas besoin de resoudre.
      1. C'est pas faux excuse moi. Je l'ai mis comme ça :

        '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

        '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 "

        '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_GEROBASE_INS + "' and SERVICE_AGENT = '" + V_SERVICE_NOM + "' and ID_AGENT ='" + V_ID_AGENT + "' "

        '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

        '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

        Mais hélas l'erreur du ID_GEOBASE qui appartient a plusieurs tables est revenue.
        1. Contributeur
          Je pense que si tu as l'erreur du ID_GEOBASE qui appartient a plusieurs tables, c'est signe que tu progresses, ce n'est pas le moment de faire marche arrière !

          Si c'est au moment de l'ouverture de l'état que tu as le message d'erreur "ID_GEOBASE peut appartenir à différentes tables", essaie un peu en n'utilisant pas sqlfiltre dans le openreport.
          1. Oui je sens aussi que je progresse (grâce à toi ^^).
            Comme tu m'as dis j'ai enlevé sql filtre de la ligne qui permet d'ouvrir l'état mais à la place je met quoi ? ça :

            " 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_GEROBASE_INS + "' and SERVICE_AGENT = '" + V_SERVICE_NOM + "' and ID_AGENT ='" + V_ID_AGENT + "' "

            Parce qu'avec ça l'erreur 3075 revient mais pas avec ID_GEOBASE, avec tout le détail comme tout à l'heure :

            erreur de syntaxe dans l'expression '(and....etc (comme au dessus)).
        2. Contributeur
          Tu fais simplement :
          DoCmd.OpenReport "E_SPECIFIQUE", acViewPreview

          C'est pour voir si l'erreur vient du filtre ou pas.
          1. Mmmmm ben non il y a toujours l'erreur de ID_GEOBASE...

            Cela viendrait donc d'autre part que le filtre ?
        3. Contributeur
          Et su tu ouvres l'état à la main ?
          1. Le champ spécifié ID_GEOBASE peut désigner plusieurs tables.... blabla ... toujours la même chose.
            Avant cela ne me le faisait pas.. Cela vient donc de la requête source si je comprend bien ?
        4. Contributeur
          Cela vient de l'état, soit de la requete source, soit d'autre chose.
          J'ai toujours une vague inquetude à propos de quelque chose que tu avais mentioné à propos d'un sous état... Cela te dit quelque chose, c'était dans ton mesage du lundi 23 juin 2008 à 09:30:22 ?
          Tu peux y jeter un coup d'oeil ?
          1. Va falloir que j'aille manger :s. Je re cette aprem. Pour ce qui des sous états il y en a 3. Un qui affiche les attributs, un qui affiche les mise à jour de la couches et les personnes qui les effectuent et le dernier qui affiche les responsable. A toute je serais la dans une petite heure.
            1. Re bonjour, voilà les requêtes sources de mes différents sous états, pourrais tu me dire si je dois les supprimer ?

              Sous état ATTRIBUT :

              SELECT T_ATTRIBUT.*
              FROM T_ATTRIBUT;

              Sous état MAJ Historique

              SELECT T_MAJ_HISTO.*, T_MAJ_RESP.ID_MAJ_RESP, T_MAJ_RESP.ID_AGENT, T_AGENT.AGENT_NOM
              FROM T_MAJ_HISTO LEFT JOIN (T_AGENT RIGHT JOIN T_MAJ_RESP ON T_AGENT.ID_AGENT = T_MAJ_RESP.ID_AGENT) ON T_MAJ_HISTO.ID_MAJ_HISTO = T_MAJ_RESP.ID_MAJ_HISTO;

              Sous état RESPONSABLE :

              SELECT T_RESP.*, T_AGENT.*
              FROM T_AGENT INNER JOIN T_RESP ON T_AGENT.ID_AGENT = T_RESP.ID_AGENT;
              1. Contributeur
                Ces requetes source ont l'air ok.
                Je pense que, quelque part dans l'état, il y a le champ "ID_GEOBASE", peut-être dans les propriétés d'un textbox ?
                1. Oui c'est ça je l'ai 4 fois au total ! Une fois dans l'état et une fois dans chaque sous état !! je vais essayer de préfixer chaque textbox.

                  EDIT : Bon je l'ai est toutes préfixées de la tables les concernant et il me dis toujours que id_geobase peut être listé dans plusieurs tables, pourquoi ? Faut il que je modifie la source de mes état ou du moins que j'y précise la table à laquelle appartient l'id geo ?
                2. Contributeur
                  @Onishiid_geobase est dans plusieurs tables, non ? Tu dois donc, à chaque fois, préciser à quel table appartient id_geo.

                  N'est ce pas ce que tu as deja fait ?
                3. @yg_beSi je viens de le faire mais maintenant il ne me trouve plus d'erreur mais me demande d'entrer ce que j'ai dis juste en dessous.
                  Avant j'avais fait par exemple : SELECT T_COUCHE_GEO.ID_GEOBASE, T_COUCHE_GEO.*, etc... Là j'ai tout les champs de détaillés (préfixés par une table) grâce à l'assistant.
              2. Bon j'ai recrée la requête source de mon état et idem pour mes 3 sous états en préfixant chaque champs de chaque table (vive l'assistant ^^)

                Le problème de id_geobase n'apparait plus mais lord du click sur le bouton un petite case apparait et me demande de saisir : ID_GEOBASE, ID_THEME, T_AGENT.ID_AGENT, et encore T_AGENT.ID_AGENT !!

                Là je comprend pas tellement. Et quand j'ai rentré ces informations l'état s'affiche avec ce que je viens de marquer.
                Pourquoi ce que j'ai écrit dans le code a l'air de ne pas fonctionner ??
                1. Contributeur
                  Si tu ouvres ton état à la main, que vois-tu ? En principe, tu dois voir les infos de tous tes enregistrements, puisqu'il n'y a pas de filtre.

                  Je veux être certain que l'état est de nouveau ok avant de travailler sur le code. De plus, comme tu as changé ou recréé l'état, il faut peut-être adapter les sous-états ou le code.
                2. @yg_beJ'ai tout remis comme avant donc quand je lance l'état à la main tous les enregistrements s'affichent et quand j'exécute mon code depuis le bouton il me dis le pb de id_geobase.

                  Voici mon code :

                  '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

                  '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 "

                  '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_GEROBASE_INS + "' and SERVICE_AGENT = '" + V_SERVICE_NOM + "' and ID_AGENT ='" + V_ID_AGENT + "' "

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

                  sqlfiltre = sqlfiltre + " and (not ID_SS_THEME) "

                  Else

                  sqlfiltre = sqlfiltre + " and 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

                  '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

                  Ce que je ne comprend pas c'est que tout à l'heure en préfixant j'ai réussi à ouvrir mon état mais mon code n'était pas pris en compte. Il me demander de rentrer des infos et il m'afficher pas très bien la couches géographique.
                3. Contributeur
                  @OnishiSi dans le code tu fais simplement la ligne suivante, sans utiliser le filtre, que se passe-t-il ?
                  DoCmd.OpenReport "E_SPECIFIQUE", acViewPreview

                  A propos de ce que tu ne comprends pas (tout à l'heure en préfixant j'ai réussi à ouvrir mon état mais mon code n'était pas pris en compte. Il me demander de rentrer des infos et il m'afficher pas très bien la couches géographique.), à ce moment-là, s tu ouvrais l'état à la main, que se passait-il ? Comme tu as choisi de tout remettre comem avant, le saurons-nous jamais ?

                  Attention, ta gestion du null de la liste LISTE_SS_THEME est foireuse , il vaut mieux faire :

                  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 [T_GEOBASE].[ID_GEOBASE] = '" + V_ID_GEROBASE_INS + "' and SERVICE_AGENT = '" + V_SERVICE_NOM + "' and ID_AGENT ='" + V_ID_AGENT + "' "

                  '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
                4. @yg_beBonjour,

                  Pour répondre à tes questions voilà :

                  Pour l'exécution du code avec cette ligne DoCmd.OpenReport "E_SPECIFIQUE", acViewPreview
                  Tu veux dire que je ne dois rien mettre d'autre ? SI c'est le cas j'ai fait le test et il me met le pb de ID_GEOBASE donc à mon avis j'ai une text box qui ne doit pas être préfixée dans mon état ou dans un des sous état.

                  Pour ce que je ne comprenez pas : En fait quand j'ai exécuté le code à partir du bouton Access me demandé de rentrer un ID_GEOBASE, un ID_THEME et deux foix un T_AGENT.ID_AGENT. Et pour l'ouverture du code à la main il me demandé de renseigner T_AGENT.ID_AGENT (mais j'avais beau le renseigner cela me répété toujours d'écrire T_AGENT.ID_AGENT)
                  Vraiment bizarre :s

                  Pour gérer le null de la liste LISTE_SS_THEME je vais corriger avec ce que tu as mis.

                  Je te donne les détails bientôt.

                  EDIT : Bon j'ai fais le test et il me dis Erreur d'exécution 13 : Incompatibilité de type. Je pense que cela vient de ce qui est en gras car il me le met à vide dans le sql filtre mais avant dans la récupération des valeurs de liste il m'affiche bien l'id.

                  Voici mon Code :

                  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

                  '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(là il récupère bien l'id exple P pour production)
                  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

                  '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 [T_GEOBASE].[ID_GEOBASE] = '" + V_ID_GEROBASE_INS +(là il me le met vide !) "' 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
                5. Contributeur
                  @OnishiIl n'y a pas un R en trop dans V_ID_GEROBASE_INS ?
                  Suggestion : ajouter "option explicit" tout au debut du code, tu auras alors une erreur de syntaxe pour ce genre d'anomalie.

                  Si l'ouverture "à la main" de l'état fonctionne sans erreur, mais que l'ouverture par le code, sans filtre, donne une erreur, je suis surpris... Est-ce bien le même état ?
              3. Effectivement il y avait un R en trop et maintenant cela récupère bien l'ID.
                J'ai ajouté "option explicit" au tout début du code et lorsque je compile voici l'erreur qui apparait :
                Erreur de compilation : Variable non définie et il me surligne ceci : "sqlfiltre =" de la ligne sqlfiltre = " 0 = 0 "

                En plus j'ai du trop bidouiller mais mon état ne s'ouvre plus correctement à la main :s.
                1. Contributeur
                  ajoute dim sqlfiltre as string

                  Que dit-il quand tu ouvres l'état à la main ?
              • 1
              • 2