Alimentation d'un MSFlexgrid via requête et additem

Résolu
Signaler
Messages postés
175
Date d'inscription
mardi 19 octobre 2004
Statut
Membre
Dernière intervention
26 juin 2006
-
Messages postés
16
Date d'inscription
mercredi 30 octobre 2002
Statut
Membre
Dernière intervention
7 août 2007
-
Bonjour,

Je tente d'alimenter un MSFlexgrid via recordset et requête SQL mais je n'arrive pas à alimenter toutes les lignes du tableau.
Je débute alors je suppose que je m'y prends très mal...
Voici mon code actuel :

'Je détermine le nombre de ligne du tableau
Rs_Com.Open "select count(*) as [nblignes] from COMMANDE AS CO, Contenir AS C where CO.Nom_Conso = '" & LbNom & "' and CO.Pre_Conso = '" & LbPre & "' and CO.Paye_Com = 0 and CO.Num_Com = C.Num_Com", Cn, adOpenDynamic, adLockOptimistic
MSFCom.Rows = Rs_Com(" nblignes ")
Rs_Com.Close

'J'alimente mon flexgrid avec les champs trouvésRs_Com.Open "select * from COMMANDE AS CO, Contenir AS C where CO.Nom_Conso '" & LbNom & "' and CO.Pre_Conso '" & LbPre & "' and CO.Paye_Com = 0 and CO.Num_Com = C.Num_Com", Cn, adOpenDynamic, adLockOptimistic

While Rs_Com.EOF = False
For ligne = 1 To nblignes + 1 Step 1
MSFCom.Col = 1
MSFCom.Row = ligne
MSFCom.Text = Rs_Com("Dat_Com")
MSFCom.Col = 2
MSFCom.Row = ligne
MSFCom.Text = Rs_Com("Lib_Sup")
MSFCom.Col = 3
MSFCom.Row = ligne
MSFCom.Text = Rs_Com("Quantite")
MSFCom.Col = 4
MSFCom.Row = ligne
MSFCom.Text=Rs_Com("Montant")

Rs_Com.MoveNext
Next ligne
Wend

De cette manière, l'alimentation fonctionne mais uniquement pour la 1er ligne, il semble qu'ensuite, le RS soit en fin de liste alors que la requête est sensée retourner 10 lignes...

J'ai essayé d'utiliser la fonction AddItem mais je n'arrive pas à l'ecrire correctement pour alimenter l'ensemble des colonnes puisque l'alimentation ne s'effectue que dans une colonne
La syntaxe décrite dans MSDN : object.AddItem(string, index, number) ne semble pas fonctionné ou du moins je n'arrive pas à trouvé la bonne syntaxe.

Merci d'avance pour votre aide

9 réponses

Messages postés
16
Date d'inscription
mercredi 30 octobre 2002
Statut
Membre
Dernière intervention
7 août 2007

Selon moi, si Rs_Com .recordcount = -1 ça indique que ton recordset n'est pas bien ouvert.



Qu'est ce que tu utilises pour ouvrir ta connexion à ta base de donnée.

Moi je travaille avec ADODB.



'=====================================

'Déclaration générale

Dim gCnn As New ADODB.Connection

Dim gRS As New ADODB.Recordset



Private Sub UserForm_Activate()



Dim vSQL As String

Dim vCheminDB As String



'chemin de la base de donnée'

'change le texte en rouge pour mettre ton chemin

vCheminDB = app.Path & "\data\db\emp.mdb"



'connexion à la base de donnée

gCnn.Provider = "Microsoft.Jet.OLEDB.4.0"

gCnn.ConnectionString = vCheminDB

gCnn.Open



'requete que j'ai pris de ton code

vSQL = " SELECT"

vSQL = vSQL & " *"



vSQL = vSQL & " FROM"

vSQL = vSQL & " commande AS CO"

vSQL = vSQL & ", contenir AS C"



vSQL = vSQL & " WHERE"

vSQL vSQL & " CO.Nom_Conso '" & LbNom & "'"

vSQL = vSQL & " AND"

vSQL vSQL & " CO.Pre_Conso '" & LbPre & "'"

vSQL = vSQL & " AND"

vSQL vSQL & " CO.Paye_Com 0"

vSQL = vSQL & " AND"

vSQL vSQL & " CO.Num_Com C.Num_Com"



'si tu n'as pas mit cette propriété, le recordset retourne -1

gRS.CursorLocation = adUseClient



gRS.CursorType = adOpenDynamic

gRS.LockType = adLockOptimistic



'Ouverture du recordset

gRS.Open vSQL, gCnn



With MSFcom



'Détermine le nombre de ligne

.rows = Rs_Com.recordcount

.cols = 4



'Remplir la MSflexgrid

For i = 1 to rs_com.recordcount

.row = i

.col = 1

.text = Rs_Com("Dat_Com")



.row = i

.col = 2

.text = Rs_Com("Lib_Sup")



.row = i

.col = 3

.text = Rs_Com("Quantite")



.row = i

.col = 4

.text = Rs_Com("Montant")

next



end with



End sub
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 109 internautes nous ont dit merci ce mois-ci

Messages postés
16
Date d'inscription
mercredi 30 octobre 2002
Statut
Membre
Dernière intervention
7 août 2007

'pointe sur le premier enregistrement avant ta boucle

Rs_Com.movefirst
Messages postés
175
Date d'inscription
mardi 19 octobre 2004
Statut
Membre
Dernière intervention
26 juin 2006
3
Malheureusement, c'est kif kif... Il n'y a toujours qu'une ligne d'alimenter...
Je suis parvenu à obtenir un résultat pas trop mauvais en utilisant addItem (voir ci-dessous)mais ce mode d'alimentation ne m'arrange pas trop pour la suite du code car je dois alimenter la première collone séparement pour y mettre un checkbox... Et c'est pas tout simple...

MSFCom.AddItem " " & Chr(9) & Rs_Com("Dat_Com") & Chr(9) & Rs_Com("Lib_Sup") & Chr(9) & Rs_Com("Quantite") & Chr(9) & Rs_Com("Montant"), 1
Messages postés
16
Date d'inscription
mercredi 30 octobre 2002
Statut
Membre
Dernière intervention
7 août 2007

Personnellement, je ferais comme suit:



'requete que j'ai pris de ton code

Rs_Com.Open "select * from COMMANDE AS CO, Contenir AS C where
CO.Nom_Conso '" & LbNom & "' and CO.Pre_Conso '" &
LbPre & "' and CO.Paye_Com 0 and CO.Num_Com C.Num_Com", Cn,
adOpenDynamic, adLockOptimistic



with MSFcom



'Détermine le nombre de ligne

.rows = Rs_Com.recordcount

.cols = 4



'Remplir la MSflexgrid

For i = 1 to rs_com.recordcount

.row = i

.col = 1

.text = Rs_Com("Dat_Com")



.row = i

.col = 2

.text = Rs_Com("Lib_Sup")



.row = 3

.col = 1

.text = Rs_Com("Quantite")



.row = i

.col = 4

.text = Rs_Com("Montant")

next



end with



De cette manière tu verras combien d'enregistrements tu as dans ta requête.
Messages postés
16
Date d'inscription
mercredi 30 octobre 2002
Statut
Membre
Dernière intervention
7 août 2007

Il y avait une erreur dans le précédent...



Personnellement, je ferais comme suit:



'requete que j'ai pris de ton code

Rs_Com.Open "select * from COMMANDE AS CO, Contenir AS C where
CO.Nom_Conso '" & LbNom & "' and CO.Pre_Conso '" &
LbPre & "' and CO.Paye_Com 0 and CO.Num_Com C.Num_Com", Cn,
adOpenDynamic, adLockOptimistic



with MSFcom



'Détermine le nombre de ligne

.rows = Rs_Com.recordcount

.cols = 4



'Remplir la MSflexgrid

For i = 1 to rs_com.recordcount

.row = i

.col = 1

.text = Rs_Com("Dat_Com")



.row = i

.col = 2

.text = Rs_Com("Lib_Sup")



.row = i

.col = 3

.text = Rs_Com("Quantite")



.row = i

.col = 4

.text = Rs_Com("Montant")

next



end with



De cette manière tu verras combien d'enregistrements tu as dans ta requête.
Messages postés
175
Date d'inscription
mardi 19 octobre 2004
Statut
Membre
Dernière intervention
26 juin 2006
3
Merci beaucoup pour ton aide. Je ne peux pas te dire tout de suite si cela fonctionne bien car je dois finir en urgence une autre partie de l'application avant une présentation pour demain à la première heure, mais ton code étant très clair, je pense qu'il n'y aura pas de soucis...


Merci encore
Messages postés
175
Date d'inscription
mardi 19 octobre 2004
Statut
Membre
Dernière intervention
26 juin 2006
3
Ton code ne semple pas marcher. J'ai tout essayé mais il n'y a rien a faire...
Au mieux il y a des erreurs, au pire ca plante.
La ligne avec recordcount ne marche pas : Rs_Com.recordcount est tj égal à -1.
Même sans cela, en gardant ma méthode pour déterminer le nombre de ligne du flexgrid, ca plante...
J'ai essayé avec ton code tel quel et avec un parcours du Rs, mais le résultat est le même...
Messages postés
175
Date d'inscription
mardi 19 octobre 2004
Statut
Membre
Dernière intervention
26 juin 2006
3
Ca y est, ca marche. Merci
Il manquait juste un petit Rs_Com.Move next à la fin de la bouble for, pour le parcours. J'utilise ADODB également et je déclare la connexion et le recordset en global, ils n'étaient pas en cause mais il semble que ce soir bien la requête qui "merdoyait" et la propriété aduseclient qui manquait.
Comme je suis curieux, j'ai essayé de remettre la propriété manquante adUseClient
derrière ma requête en ligne mais cela n'a pas marché, pourquoi?

Merci encore
Messages postés
16
Date d'inscription
mercredi 30 octobre 2002
Statut
Membre
Dernière intervention
7 août 2007

Désolé, au départ, j'avais fait l'exemple avec un listview et en le remplacant par ton code, j'ai supprimer rs_com.movenext.



Pour ce qui est de asUseClient, je ne sais pas pourquoi ça ne
fonctionne pas sur la même ligne. Moi personnellement, j'opte
pour tout mettre séparément. Je trouve ça plus clair, je vois
plus rapidement à quoi est associé la propriété.