[VBA]Requete & fonction

Résolu
nicolas -  
 Utilisateur anonyme -
Bonjour,
Je réalise un petit projet vba dans lequel j'ai une page contenant une dizaine de combox dont les valeurs de chaque combo proviennent d'une requete: En voici un exemple:

'// Initialisation de la liste des pests ///////////////

req = "select Pests from VisitDetail group by Pests"
exec_req (req)
For i = 0 To max
If rst!Pests <> " " Then
ls_pests.AddItem (rst!Pests)
End If
rst.MoveNext
Next i

'// Procedure permettant d'executer les différentes requetes de chargement des listes ///////

Sub exec_req(req)
Set rst = dbLocal.OpenRecordset(req) ', dbOpenForwardOnly, dbReadOnly)
rst.MoveLast
max = rst.RecordCount - 1
rst.MoveFirst
End Sub

Je souhaiterais pouvoir créer une fonction me permettant (ameliorant cette derniere) de pouvoir chargé les listes en passant comme parametre (si cela est possible):
- le nom de la colonne dans la requete
-ainsi que le nom du controle
Les problemes que je rencontre actuellement sont liés aux types de données a passer en parametre.
En effet je ne c est pas sous qu'elle type de donnée récupérer le nom de la colonne.
Merci d'avance

5 réponses

  1. Lupin
     
    Bonjour,

    J'ai trouvé dans un bouquin pour acces 97 une procédure
    qui fait le travail à merveille pour modifier des requètes
    par programmation.

    Je l'ai suggérré plus d'une fois mais a prime abord elle peut
    paraitre compliqué. En voici un apercu.

    La fonction qui sert à modifier la requête :

    Public Function ChangeRequeteDef(ChaineRequete As String, _
                               ChaineSQL As String) As Boolean
        
        Dim Definition As QueryDef
        
        If ((ChaineRequete = "") Or (ChaineSQL = "")) Then
            ChangeRequeteDef = False
        Else
            Set Definition = CurrentDb.QueryDefs(ChaineRequete)
            Definition.SQL = ChaineSQL
            Definition.Close
            RefreshDatabaseWindow
            ChangeRequeteDef = True
        End If
        
    End Function
    


    Cette requete dans être placé dans la section Module de Access.
    Au préalable, il te faut créer une requete standard.

    Deux parametres sont passer à la fonction, soit le nom de la
    requete et la requête elle même.

    Pour faire appel a cette requete, voici comment proceder :

    Private Sub Liste_Cassette_AfterUpdate()
        
        ' Ici l'exemple porte sur ma BD de ma vidéothèque.
        ' Une liste déroulante me permet de sélectionner
        ' un paramètres quelconque de ma requete, ici
        ' c'est le numéro de cassette
    
        Dim Chaine As String
        Dim Critere As String
        Dim CassetteVidéo As String
        Dim Ensemble As Recordset
        
    On Error GoTo Liste_Cassette_Err
    
        ' Capture du paramètre
        CassetteVidéo = Forms![Formulaire Table Vidéo].[Liste Cassette]
    
        ' Création de la chaine SQL, ici la création se fait en 2 lignes
        ' par concaténation dans le but de simplifié la compréhension
        Chaine = "Select * from [Table Vidéo] where [Cassette] = "
        Critere = Chaine & """" & CassetteVidéo & """"
        
        ' La variable critere contient ici la chaine SQL
        If (ChangeRequeteDef("Requête Liste Spécifique Cassette", Critere)) Then
            
            ' Ouverture de la requete modifié
            Set Ensemble = CurrentDb.OpenRecordset("Requête Liste Spécifique Cassette")
            Ensemble.MoveLast
            Ensemble.MoveFirst
    
            ' Le but ici étant de déterminer le nombre d'enregistrement
            'de la requete.
            NbrRecherche.Value = Ensemble.RecordCount
            Ensemble.Close
            ' Ouverture du formulaire accroché sur cette requete.
            DoCmd.OpenForm "Formulaire Liste Spécifique Cassette", acNormal, "", "[Cassette]", , acNormal
        End If
    
    Liste_Cassette_Exit:
        Exit Sub
    
    Liste_Cassette_Err:
        MsgBox Error$
        Resume Liste_Cassette_Exit
    
    End Sub
    


    Lupin
    1
  2. mali
     
    elle te sert a quoi cette requete precisement g pas compris
    0
    1. Lupin
       
      une autre façon,

      problème posé :

      je cite :

      Je souhaiterais pouvoir créer une fonction me permettant (ameliorant cette derniere) de pouvoir chargé les listes en passant comme parametre (si cela est possible):
      - le nom de la colonne dans la requete
      -ainsi que le nom du controle

      Fin citation


      la requete ici dans mon exemple est :

      Chaine = "Select * from [Table Vidéo] where [Cassette] = "
      Critere = Chaine & """" & CassetteVidéo & """"

      qui se traduit aussi par :

      Critere = "Select * from [Table Vidéo] where [Cassette] = " & """" & CassetteVidéo & """"

      en fait j'ai commencé par créer une simple requête global
      de ma table, je n'accède que très rarement à une table
      directement.

      la variable "Critère" est la syntaxe de la requête de Type "String"

      cette variable est modifiable facilement comme ceci :

      Critere = "Sel" & "ect" & " " & "*" & " from " & monNomdeTable.macolonne & " ..."

      si j'ai compris l'exercice soumis, il est plus efficace de modifier
      la requete elle-même que de passer ces paramêtres à la requête.

      la modification de la requete se fait à l'appel de :

      If (ChangeRequeteDef("Requête Liste Spécifique Cassette", Critere)) Then

      Le nom de la requête à modifier et la "syntaxe" de la requête.

      de plus en procédant ainsi, si chaque liste est basé sur une requête, cela multiplit les possibilités de combiné des requëtes
      sur les objets d'un formulaire.

      c'est très efficace et ça me vient du boucquin sur VBA Access,
      si je mets la main dessus je pourrai te fournir la référence
      exact mais pour le moment il brille de son abscence :-(

      la fonction ChangeRequeteDef est simple !

      Public Function ChangeRequeteDef(ChaineRequete As String, ChaineSQL As String) As Boolean
          
          Dim Definition As QueryDef
          
          If ((ChaineRequete = "") Or (ChaineSQL = "")) Then
              ChangeRequeteDef = False
          Else
              Set Definition = CurrentDb.QueryDefs(ChaineRequete)
              Definition.SQL = ChaineSQL
              Definition.Close
              RefreshDatabaseWindow
              ChangeRequeteDef = True
          End If
          
      End Function
      
      


      Lupin
      0
      1. Lupin > Lupin
         
                ...
                RefreshDatabaseWindow
                ChangeRequeteDef = True
                Set Definition = Nothing
            End If
        ...
        
        0
  3. Nicolas
     
    Merci de vos réponses,
    Apres quelque heures de recherche j'ai finit par trouver ma reponse la ou je ne l'attendait pas :)
    Encore un grand merci pour l'attention que vous m'avez accordé e;)
    0
  4. aloux18
     
    bjr,
    je voudrais savoir a quoi sert le public function!
    je viens de commencer!
    la reponse fonction publique ne m'interesse pas bien sur lol!
    une explication serait mieux!
    merci d'avance

    alex
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    à quoi sert une requet dans l'access
    à quoi sert formulaire dans l'access
    à quoi sert les etats dans l'access
    0