Recordset et creation formulaire dynamique sous access

fredieuric Messages postés 24 Date d'inscription mercredi 10 juillet 2002 Statut Membre Dernière intervention 2 octobre 2008 - 14 mai 2007 à 14:53
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 - 14 mai 2007 à 23:03
Bonjour à tous,

Sous Access 2003 SP2,

J'ai récupéré un code source que j'essaye d'adapter à mes besoins (à savoir créer dynamiquement un formulaire en fonction du résultat d'une requête):

Pour être clair:
en bleu le code de la fionction "create_form" définie dans un module
en rose les problèmes que je rencontre
en vert les commentaires
en gris l'évènement faisant appel à la fonction create_form

Je sais, c'est un peu long, mais j'esaie d'être clair.

Public Function create_form(sql As String) As Boolean



Dim frm As Form
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim ctl As Control
Dim i, j As Integer



Set db = CurrentDb



' --Ouvrir le formulaire en mode modification et caché




DoCmd.OpenForm "F_AFFICHAGE", acDesign, , , , acHidden



Set rst = db.OpenRecordset(sql)


Premier problème, le rst semble ne pas contenir d'éléments : MsgBox (rst.RecordCount) me renvoie "1"



'--Création des contrôles

Dim controle(1 To 100) As Control




If rst.RecordCount <> 0 Then
    i = 1
    j = 1000
    While i < rst.RecordCount


        ' -- Créer le contrôle i
    Set controle(i) = CreateControl("F_AFFICHAGE", acTextBox)
    ' --lui affecter un nom
    controle(i).Name = "TXT_" & rst(i)

Deuxième problème: rst(i): item not found in this collection

    ' --le positionner sur le formulaire
    controle(i).Left = 100 + j
    ' --Définir sa largeur
    controle(i).Width = 1150
        ' --source de données de ce contrôle
    controle(i).ControlSource = rst.Fields(i).Name
    i = i + 1
    j = j + 1150
    Wend
End If

Voila pour la fonction... Maintenant pour le code appelant cette fonction:

Private Sub Product_variant_name_AfterUpdate()
Dim MySql As String
MySql = "SELECT [Component type].[Component type name]"
MySql = MySql & " FROM [Component type];"
create_form (MySql)
DoCmd.OpenForm "F_AFFICHAGE", acNormal
End sub

Quelqu'un peut-il m'expliquer ce qui ne va pas (si possible avant que je ne pète un cable!)???

Merci d'avance et bonne programmation.

4 réponses

cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
14 mai 2007 à 15:47
Salut, quelques petites remarques



Premier problème, le rst semble ne pas contenir d'éléments : MsgBox (rst.RecordCount) me renvoie "1"


Bah, la preuve que si puisqu'il te renvoie 1





Deuxième problème: rst(i): item not found in this collection


Je pense que c'est du au fait que i doit etre de type string il me semble (pas sur mais pour un champ c'est sur par contre
 rst.fields("Nom_du_champ")

Ca donnerait donc    rst(format(i,"0")) a la place de rst(i)

J'espere que ca te conviendra
0
fredieuric Messages postés 24 Date d'inscription mercredi 10 juillet 2002 Statut Membre Dernière intervention 2 octobre 2008 1
14 mai 2007 à 16:18
Tout d'abord, merci pour ta réponse!

J'ai résolu une partie de mon pb en créant une requète en dehors du code:

Public Function create_form(arg As String) As Boolean
Dim frm As Form
Dim rst As DAO.Recordset
Dim ctl As Control
Dim i, j As Integer
Dim rqMaQuery As QueryDef





' --Ouvrir le formulaire en mode modification et caché

DoCmd.OpenForm "F_AFFICHAGE", acDesign, , , , acHidden



'--Exécuter requête pour definir component type associés


Set rqMaQuery = CurrentDb.QueryDefs("Rq_Component_Type")
rqMaQuery.Parameters(0) = arg
Set rst = rqMaQuery.OpenRecordset



'Maintenant, en rajoutant le petit bout de code suivant, je fais défiler les résultats de ma requete...

While Not rst.EOF
    MsgBox rst(0)
    rst.MoveNext
Wend


Mais là où je reste bloqué, c'est après, lorsque j'essaie de créér les contrôles:

Dim controle(1 To 100) As Control
If rst.RecordCount <> 0 Then



    i = 1
    j = 1000
    While i < rst.RecordCount
  
    
    Set controle(i) = CreateControl("F_AFFICHAGE", acComboBox)
    ' --lui affecter un nom
    controle(i).Name = "TXT_" & rst(i)


PB: Erreur d'execution 3021: No current record????


Please help!
0
cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
14 mai 2007 à 16:29
Bon la je dois partir mais si tu veux savoir la position de ton recordset,

msgbox rst.AbsolutePosition

 et aussi, tu n'as pas oublié le i = i + 1.

essaies aussi rst(i).name.

Désolé si ca correspond pas mais comme le dis FAF, j'ai pas le temps car mon esprit glisse ailleurs.

A demain.
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
14 mai 2007 à 23:03
Combien penses-tu créer de contrôles à partir de cette boucle ?
    While i < rst.RecordCount
    Set controle(i) = CreateControl("F_AFFICHAGE", acComboBox)

Si ta table contient 10 colonnes, disons
ton recordset devrait contenir 10 valeurs

S'il n'y a qu'un enregistrement trouvé, ta boucle ne pourra te créer aucun contrôlei 1> While i < rst.RecordCount (recordcount = 1)

Il faudrait que tu boucles sur les champs du Recordset
For i = 0 to rst.Fields.Count - 1
Set Controle(I) = ??? 
là je ne sais pas comment tu vas définir le genre de contrôle par rapport au champ visé...

Pour ce qui est de l'erreur, je ne sais pas trop...(?)

MPi
0
Rejoignez-nous