ACCES, Recordset et requête SQL

Résolu
ashtheking Messages postés 229 Statut Membre -  
ashtheking Messages postés 229 Statut Membre -
Bonjour,
Me voilà confronté à un problème que je trouve étrange.
Dans un formulaire ACCESS 2000, j'ai créé un bouton de commande qui, sur un clic, doit déclencher la création d'un RecordSet qui me servira plus tard à inscrire des données sur EXCEL (c'est une commande très précise que l'on m'a demandé et je ne peux pas m'en écarter en faisant une exportation de table ou autre chose).

Tout se passe relativement bien jusqu'à l'ouverture du Recorset où le logiciel me dit que des valeurs nécessaire ne sont pas renseignée. J'essaye d'ouvrir l'aide (elle bugge), j'exécute pas à pas le script, je remarque que la source du recordset dans mon espion et tronqué de presque la moitié de la requête sql, j'essaye une autre requête plus simple, cela marche parfaitement.

Je me pose donc une question, y a-t-il une longueur à respecter pour la source du recorset (alors qu'une variable string peut faire 2 milliards et des poussières de caractères) et comment gruger ACCESS pour qu'il accepte ma requête ?

Je précise que pour une raison qui m'échappe, je ne peux pas écrire rs.source = <nom d'une requête enregistré> et que je suis obligé de faire rs.source = <Select _ FROM _ etc...> ou <Variable string contenant la requête>

J'envoie le code dans le message suivant.
Merci d'avance.
--
J'aime bien aider autrui, suis-je un pigeon pour autant ?

8 réponses

  1. ashtheking Messages postés 229 Statut Membre 97
     
    Private Sub EXL_Click()
    Dim rs As New Recordset
    Dim sql As String

    sql = "SELECT [plante].[nom_plante_latin], [sous_lot].[age], [sous_lot].[qté], [plante_disponible].[année_dispo]"
    sql = sql & " FROM sous_lot INNER JOIN (plante INNER JOIN plante_disponible ON [plante].[num_plante]=[plante_disponible]"
    sql = sql & ".[num_plante]) ON [sous_lot].[num_ss_lot]=[plante_disponible].[num_ss_lot]"
    sql = sql & " WHERE [plante_disponible].[année_dispo] = [Forms]![FRM_EXCEL]![annee].Caption"
    sql = sql & " ORDER BY [plante].[nom_plante_latin];"

    rs.ActiveConnection = CurrentProject.Connection
    rs.CursorType = adOpenKeyset
    rs.LockType = adLockOptimistic
    rs.Source = sql
    rs.Open EN GENERAL C'EST ICI QUE CA BLOQUE

    Dim i As Long
    i = 0
    While Not rs.EOF SINON CA CONSIDERE QUE C'EST UN RS VIDE ET CA VA VERS LE WEND
    MsgBox rs![nom_plante_latin]
    i = i + 1
    rs.MoveNext
    Wend
    End Sub
    0
  2. othanga
     
    Hello!
    est-il possible de voir la requête prise en compte par rs.source ? est-elle entière ou déjà tronquée ?
    est-il possible de mettre en place des
    if err.number <> 0 then msgbox err.description
    après les instructions essentielles du traitement de ta requête ?
    0
  3. ashtheking Messages postés 229 Statut Membre 97
     
    Salut, merci de ta réponse rapide,
    la msgbox d'erreur affiche "Aucune valeur donnée pour un ou plusieurs des paramètres requis" à rs.open

    Si dans le WHERE de la requête, je sors [Forms]![FRM_EXCEL]![annee].caption des guillemets pour faire une concaténation ( =" & [Forms]![FRM_EXCEL]![annee].caption), le script s'execute jusqu'au WHILE NOT.EOF passe à la msgbox d'erreur et n'affiche rien

    La source tronquée est :
    "SELECT [plante].[nom_plante_latin], [sous_lot].[age], [sous_lot].[qté], [plante_disponible].[année_dispo] FROM sous_lot INNER JOIN (plante INNER JOIN plante_disponible ON [plante].[num_plante]=[plante_disponible].[num_plante]) ON [sous_lot].[num_ss_lot]=

    J'ai beau essayé de passer en contournant, j'ai toujours un problème quelque part.
    C'est frustrant !
    0
  4. othanga
     
    Ca va t'énerver...
    j'ai collé ta requête tronquée dans un éditeur de texte... le texte fait 256 car !!! soit la taille maxi d'une chaine des époques reculées ;-)
    => la propriété source de ton recordset est limité à 256 car (ça fait un peu foutage de g....)
    donc tu as très certainement une autre méthode utilisable pour transmettre ta requête au moteur... mais je suis bien incapable de t'aider car je ne connais rien à Access.

    1. Est-ce que par hasard, les chaines dans ton pgm seraient pas limitées à 256 car... genre je travaille en octets alors que tout le monde préfère l'unicode depuis 10ans.
    2. Est-ce que la requete tronquée que tu affiches vient de la propriété source du recordset ou est-ce la chaine calculée ?
    2bis si juste avant rs.source = sql tu glisses un msgbox len(sql), aurais-tu un affichage "256"
    => oui, la nature des chaines que tu utilises qui te bride
    => non, c'est access qui limite les chaines et il va te falloir trouver l'option ou l'instruction pour utiliser des chaines vastes (les 4Gb dont tu parlais initialement).

    Sur ce, je te laisse car je vais me coucher. bon courage !
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. blux Messages postés 5031 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Salut,

    un recordset se définit avec une instruction set, généralement.

    Je te suggère donc la syntaxe suivante :
    Set Rs = CurrentDb.OpenRecordset(sql, dbOpenTable, dbReadOnly)
    while not rs.EOF...
    --

    A+ Blux           
     "Les cons, ça ose tout.
    C'est même à ça qu'on les reconnait"
    0
    1. ashtheking Messages postés 229 Statut Membre 97
       
      Merci Blux mais...

      "Argument non valide" au niveau du SET

      Mais d'un point de vue général, je ne me rappelle pas avoir réussi à définir un NEW RECORDSET avec un SET
      0
      1. blux Messages postés 5031 Date d'inscription   Statut Modérateur Dernière intervention   3 455 > ashtheking Messages postés 229 Statut Membre
         
        voui, t'as raison, j'avais pas fait attention au new recordset :-)

        Je viens de tester chez moi (en access 2002, avec une autre requête), ça marche parfaitement...

        J'ai du mal à saisir...
        0
      2. blux Messages postés 5031 Date d'inscription   Statut Modérateur Dernière intervention   3 455 > blux Messages postés 5031 Date d'inscription   Statut Modérateur Dernière intervention  
         
        tu peux essayer de créer retaper ta requête en tant que requête 'normale' pour voir si elle est exécutée ?
        0
      3. ashtheking Messages postés 229 Statut Membre 97 > blux Messages postés 5031 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Salut,
        J'ai RE essayé en requête "normale" en passant par l'assistant création et tout le tintouin (cette fois-ci je l'ai enregistré comme ça je peux toujours la vérifier) et elle marche correctement, s'execute et me renvoie les dix enregistrements prévus.

        C'EST CA, LE PLUS FRUSTRANT !!!!!!!!

        Donc je me résume, ma déclaration de variable est bonne, ma déclaration de recorset est bonne, ma requête est bonne, conclusion :
        J'oublie tout le barda et je réinvente la casserole à pression... Non ! J'ai obligation de réussite donc je cherche encore.

        Merci de tes efforts.
        0
  7. ashtheking Messages postés 229 Statut Membre 97
     
    Tcho,

    1. Les chaines ne sont pas limité à 256 c. (d'après l'aide sur la variables string, mais je commence à doute de l'aide)
    2. La requête tronquée vient de la propriétés source mais si je met un espion sur la variable sql, la requête est tronquée exactement au même endroit, j'en déuis donc que c'est l'affichage de l'espion qui est limité à 256 c. d'autant plus que :
    2bis. msgbox len(sql) = 402 =>Access limite ....

    Merci de ton aide, bonne nuit
    0
  8. ashtheking Messages postés 229 Statut Membre 97
     
    Salut,
    RéSOLUTION DU PROBLèME ::::::::::::::::::::::::::

    sql = "SELECT [plante].[nom_plante_latin], [sous_lot].[age], [sous_lot].[qté], [plante_disponible].[année_dispo]"
    sql = sql & " FROM sous_lot INNER JOIN (plante INNER JOIN plante_disponible ON [plante].[num_plante]=[plante_disponible]"
    sql = sql & ".[num_plante]) ON [sous_lot].[num_ss_lot]=[plante_disponible].[num_ss_lot]"
    sql = sql & " WHERE [plante_disponible].[année_dispo] =" & [Forms]![FRM_EXCEL]![annee].Caption
    sql = sql & " ORDER BY [plante].[nom_plante_latin];"

    Ce code SQL, bien que parfaitement correct dans l'assistant requête de ACCESS, est aussi parfaitement incorect en dynamique par VBA à cause du format STRING du champs [plante_disponible]![année_dispo].
    Il faut donc faire apparaitre des guillements à l'intérieur de la variable sql.

    Ce qui donne (la modification est en gras) :

    sql = "SELECT [plante].[nom_plante_latin], [sous_lot].[age], [sous_lot].[qté], [plante_disponible].[année_dispo]"
    sql = sql & " FROM sous_lot INNER JOIN (plante INNER JOIN plante_disponible ON [plante].[num_plante]=[plante_disponible]"
    sql = sql & ".[num_plante]) ON [sous_lot].[num_ss_lot]=[plante_disponible].[num_ss_lot]"
    sql = sql & " WHERE [plante_disponible].[année_dispo] =""" &[Forms]![FRM_EXCEL]![annee].Caption
    sql = sql & """
    ORDER BY [plante].[nom_plante_latin];"

    C'est un problème qui n'aurait pas eu lieu d'être si j'avais pu faire rs.source = <nom de la requête>.
    0
  9. Jeffjefferson
     
    Mdr je cherche sur internet des infos et j'tombe sur ton pseudo ash... xD
    0
    1. ashtheking Messages postés 229 Statut Membre 97
       
      Yo Jeff,
      0