Parametre pour SQL dans VBA

Résolu
Bonjour,
Cela fait deux jours que je me casse la tête sur un problème.

Afin de remplir une table, j'effectue deux requêtes différentes.
La première me fournis l'ensemble des infos nécessaires et surtout un couple (produit, date) qui doit me servir de paramètre de recherche dans la seconde (requête).
Lorsque je fait la recherche en manuel, j'obtiens mon résultat = OK.

Afin de l'automatisé, j'ai inclue ma seconde requête dans mon code VBA. Là, plus de réponse, c'est systématique. Je pense que cela viens de la traduction SQL directe en SQL VBA, avec l'insertion des & et " qui me bugg. Seulement, a force d'avoir le nez dans le guidon...on ne voie plus la route!

Je pense qu'un œil neuf verra de suite là où ca fait mal ;)

D'avance, merci de votre aide.

Ci après, les deux requêtes:
SQL =>
SELECT Shippement.Qte FROM shippement WHERE ((Shippement.Unites =Product) And (Shippement.Date = MoisEnCours));
VBA=>
SQL = "SELECT Shippement.Qte FROM shippement WHERE ((Shippement.Unites = " & R_GAR.Product & ") And (Shippement.Date = #" & MoisEnCours & "#));"

Configuration: Windows XP MC
Firefox
Kaspersky 7

10 réponses

  1. Modérateur
    Salut,

    comment passes-tu ta commande SQL en VBA ?

    As-tu un message d'erreur ?

    Parce qu'une requête de type 'selection' ne passe pas en docmd.runsql... Seules les requêtes de type 'action' passent (UPDATE, DELETE, INSERT...)
    0
    1. Je fais un currentdb().openrecordset(SQL) avec SQL qui est ma variable de type string et qui intègre directement les valeur des paramètres.
      Je l'ai déjà utiliser dans d'autres bases et cela fonctionne. Je n'ai pas de message d'erreur.
      Je te donne la suite du code:

      Set R_SHI = CurrentDb().OpenRecordset(SQL)

      If R_SHI.RecordCount <> 0 Then
      R_SHI.MoveFirst
      T_SQL.Exp = R_SHI.Qte
      R_SHI.Close
      End If

      Et mon chargement de T_SQL.Exp est toujours vide car le if est toujours faux.
      Je sais que certain cas je n'ai pas de réponse (c'est normal, nous ne nous chargeons pas de tout les produits sur le site de Montpellier). Donc dans certain cas, après des test manuel, j'obtiens une réponse qui n'apparait plus depuis que je le fais en VBA.
      0
      1. Modérateur
        Le recordcount n'est renseigné qu'après un movelast...

        fais un R_SHI.movelast avant et ensuite tu pourras tester le nombre d'enreg...
        0
        1. Désolé, mais là, j'ai une erreur 3021 = pas d'enregistrements!
          0
          1. oulala !!!

            alorss je serais toi je ferais une requete count pour :R_SHI.RecordCount

            select count(...... as comptede_R_SHI) from .....

            ensuite:

            dim db as database
            dim rs as recordset
            set db = currentdb

            set rs= db.openrecordset" requete count"
            with rs
            if not .EOF then
            ta_variable = !comptede_R_SHI
            end if
            end with
            puis:
            If ta_variable <> 0 Then
            R_SHI.MoveFirst
            T_SQL.Exp = R_SHI.Qte
            R_SHI.Close
            End If

            voila si besooin hesite pas
            0
            1. En relisant tout cela, je viens de me rendre compte que je n'étais pas super clair hier, après-midi.

              L'erreur 3021 apparait sur la ligne contenant le movelast. Ce qui ce comprend puisque nous devions être dans un cas où il n'y a pas de réponse.

              Concernant la réponse de MOICED59 je comprend la manip. Mais cela me fait exécuter une requête, sur une requête. Je trouve cela un peu lourd, d'autant plus que mes infos d'origine vont grossir de plus en plus. Alors l'exécution de cette fonction va prendre de plus en plus de temps, pour les utilisateurs, c'est moyen.

              Vous êtes sur que mon SQL pour le VBA est juste! Je ne sais pas pourquoi mais je reste persuadé que mon erreur est dans cette ligne, mais je ne la vois pas.

              En tout cas merci pour vos interventions à tous. Je continue mes recherches.
              Si quelqu'un trouve la faille, faite le moi savoir.

              Bonnes fêtes à tous
              0
              1. re

                ta rquete sql en vba n'est pas bonne non !!!!
                c impossible a realiser une requete select en vba !!!!
                0
                1. Modérateur
                  si, mais on ne la l'exécute pas avec un runsql, mais via un recordset...
                  0
              2. dc ce nest pas une rrequete sql !!!!
                mais un recordset!!!
                0
                1. Modérateur
                  un recordset peut avoir comme source une requête...
                  0
              3. oui je suis d'accord pas de souci la dessus!!!!
                0
                1. Salut à tous et Bonne année...

                  Après une petite interruption du travail, je suis revenu sur mon problème.

                  Voici la solution que j'ai trouvé: Les résultat du recordset sont toujours vide car le trie sur la date n'est pas au même format!
                  Un date est traitée jj/mm/aaaa et l'autre au format US. Grâce au changement d'année, j'ai eu un résultat car Janvier (mois 01) = le premier (01 aussi !).

                  Ainsi, pour ceux qui sont confronté au même problème, dans l'instruction SQL, j'ai utilisé ceci:

                  ... (Shippement.Date = #" & Format(MoisEnCours, "mm/dd/yyyy") & "#) ...

                  Parce que ma date de la table Shippement a ce format là.

                  Merci à tous ceux qui ont participé,
                  C'est toujours rassurant de ce savoir écouter quand on a un problème.
                  0