Remplir un listview avec un objet recordset ADODB

Signaler
Messages postés
15
Date d'inscription
samedi 7 août 2010
Statut
Membre
Dernière intervention
19 décembre 2021
-
Messages postés
16717
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
19 janvier 2022
-
bonjour,

j'ai un problème concernant le remplissage d'un objet listview avec un objet recordset.

j'utilise while not recordset.eof pour faire ma boucle mais à la seconde occurrence, j'ai une erreur qui me dis que je ne peux pas implémenter deux fois la même item avec le même nom.

Normalement la listview doit afficher :

Nom Utilsateur Rang Actif
Admin 1 Admin Oui
Employer 1 Employer Oui
MNS 1 MNS OUI
PAUL MNS NON
exemple "employer 1" avec employer 1". je met le code a suivre.

sub info()
        Dim StrNomUtil As String
        Dim StrRangUtil As String
        Dim StrActif As String
        ' procédure de demande d'info à la base de donnée
        ProcBDD_DemandeInfoTousUtil()
        'QueryBDD_DemandeInfoTousUtil est un objet recordset ADODB avec acess
        If Not QueryBDD_DemandeInfoTousUtil.EOF Then
            While Not QueryBDD_DemandeInfoTousUtil.EOF
                Dim Listview_Util As New ListViewItem
                StrNomUtil = QueryBDD_DemandeInfoTousUtil(ChampBDD_CompteUtilisateur_NomUtilisateur).Value
                StrRangUtil = QueryBDD_DemandeInfoTousUtil(ChampBDD_RangUtilisateur_NomRang).Value
                StrActif = QueryBDD_DemandeInfoTousUtil(ChampBDD_CompteUtilisateur_Actif).Value
                Listview_Util.Text = StrNomUtil
                Listview_Util.SubItems.Add(StrRangUtil)
                Listview_Util.SubItems.Add(StrActif)
                ListView_Utilisateur.Items.Add(Listview_Util)
                QueryBDD_DemandeInfoTousUtil.MoveNext()
                Listview_Util.Remove()
            End While


j'ai essayé en modifiant les termes de places etc...

mais rien ça plante à la seconde occurrence.

merci pour votre aide

PS: Je sais qu'utiliser les variables string ne change rien, c'est juste histoire d'y voir plus clair.

4 réponses

Messages postés
2526
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
17 janvier 2022
143
Bonjour
Inutile de m'envoyer un message privé ( voir mes commentaires dans ce message : https://codes-sources.commentcamarche.net/forum/affich-10106533-insertion-donnees-d-une-listbox-depuis )
La messagerie privée n'est pas faite dans ce but .Elle est utilisée principalement pour des échanges privés entre contributeurs, modérateurs et personnel de CCM Codes-Sources . Vous pouvez l'utiliser pour prendre contact avec un modérateur pour un souci sur Codes-Sources ( bug du site, problème sur votre compte, etc. )
Pour tout problème de code il faut passer par le forum .
Vous avez donc poster votre souci dans le forum : c'est bien . Je m'en suis aperçu après .
Mais vous n'avez pas présenté le code comme suggéré dans ce tuto : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
De plus votre code est incomplet
1) Le
If Not QueryBDD_DemandeInfoTousUtil.EOF Then
demande un
End If
de fin

2)
Listview_Util.Remove()
ne sert à rien

Ca plante à le seconde occurrence . Soit mais c'est quoi le seconde occurrence pour vous ? A quelle ligne cela plante et quel est le message d'erreur ?
En présentant le code comme dit ci-dessus des numéros de ligne sont indiqués dans le code .

Merci

Messages postés
16717
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
19 janvier 2022
583
Bonjour

Comme le signale vb95 (que je salue au passage) tu as posté ton code sans la coloration syntaxique ce qui le rend particulièrement peu agréable à lire et peu compréhensible.

C’est pourquoi je me teompe peut-être, mais il me semble que jamais ton code ne demande au recordset de changer d’occurence. Si j’ai raison, il n’y a pas de 2eme occurrence, mais 2 fois la première
Messages postés
15
Date d'inscription
samedi 7 août 2010
Statut
Membre
Dernière intervention
19 décembre 2021
1
bonjour,

Merci a vous deux pour vos commentaires, je vais donc réécrire mon post de manière lisible ainsi qu'avec les explications demander par vb95. Voici le code lisible.

private sub DemandeInfo()
                Dim Listview_Util As New ListViewItem
'procédure d'accès a la base de donnée ADODB Accèss
        ProcBDD_DemandeInfoTousUtil()
'Objet recordset est QueryBDD_DemandeInfoTousUtil
        If Not QueryBDD_DemandeInfoTousUtil.EOF Then
            While Not QueryBDD_DemandeInfoTousUtil.EOF
                StrNomUtil=QueryBDD_DemandeInfoTousUtil(ChampBDD_CompteUtilisateur_NomUtilisateur).Value
                StrRangUtil = QueryBDD_DemandeInfoTousUtil(ChampBDD_RangUtilisateur_NomRang).Value
                StrActif = QueryBDD_DemandeInfoTousUtil(ChampBDD_CompteUtilisateur_Actif).Value
                Listview_Util.Text = StrNomUtil
                Listview_Util.SubItems.Add(StrRangUtil)
                Listview_Util.SubItems.Add(StrActif)
                ListView_Utilisateur.Items.Add(Listview_Util)
                QueryBDD_DemandeInfoTousUtil.MoveNext()
            End While
        End If
end sub


le résultat attendu dans la listview est le suivant :


Chaque occurrence correspond a une ligne du précédent tableau.

L'erreur se produit ligne 14 a l'instruction :
ListView_Utilisateur.Items.Add(Listview_Util)

Lors deux second passage de l'objet recordset ( QueryBDD_DemandeINfoTousUtil)

voici l'erreur :



Si j'ajoute un
 exit while
après la ligne 15, j'obtiens la première ligne de mon tableau



Maintenant en changeant le code avec celui-ci

private sub DemandeInfo()
        ProcBDD_DemandeInfoTousUtil()
        If Not QueryBDD_DemandeInfoTousUtil.EOF Then
            While Not QueryBDD_DemandeInfoTousUtil.EOF
                Dim Listview_Util As New ListViewItem
                StrNomUtil = QueryBDD_DemandeInfoTousUtil(ChampBDD_CompteUtilisateur_NomUtilisateur).Value
                StrRangUtil = QueryBDD_DemandeInfoTousUtil(ChampBDD_RangUtilisateur_NomRang).Value
                StrActif = QueryBDD_DemandeInfoTousUtil(ChampBDD_CompteUtilisateur_Actif).Value
                Listview_Util.Text = StrNomUtil
                Listview_Util.SubItems.Add(StrRangUtil)
                Listview_Util.SubItems.Add(StrActif)
                ListView_Utilisateur.Items.Add(Listview_Util)
                QueryBDD_DemandeInfoTousUtil.MoveNext()
                Listview_Util.Remove()
            End While
        End If
    End Sub


Il ne se passe rien, ni erreur mais aussi pas de remplissage de la listview.

Et si je modifie le code afin de remplir un listbox

private sub DemandeInfo()
        ProcBDD_DemandeInfoTousUtil()
        If Not QueryBDD_DemandeInfoTousUtil.EOF Then
            While Not QueryBDD_DemandeInfoTousUtil.EOF
                Dim Listview_Util As New ListViewItem
                StrNomUtil = QueryBDD_DemandeInfoTousUtil(ChampBDD_CompteUtilisateur_NomUtilisateur).Value
                StrRangUtil = QueryBDD_DemandeInfoTousUtil(ChampBDD_RangUtilisateur_NomRang).Value
                StrActif = QueryBDD_DemandeInfoTousUtil(ChampBDD_CompteUtilisateur_Actif).Value
                ListBox1.Items.Add(StrNomUtil + vbtab + StrRangUtil + vbtab + StrActif)
                QueryBDD_DemandeInfoTousUtil.MoveNext()
                Listview_Util.Remove()
            End While
        End If
    End Sub


la liste box se rempli correctement.


vb95 Pourquoi dis-tu code incomplet?
De plus votre code est incomplet
 If Not QueryBDD_DemandeInfoTousUtil.EOF Then 
'demande un
End If


C'est un code que j'utilise depuis longtemps, je m'en sert car je sais que je vais forcement avoir des données en récupération, sinon j'utilise une autre solution.
Try

        Catch ex As Exception

        End Try




Whismeril : le code pour passer les occurrence est :
 QueryBDD_DemadeInfoTousUtil.MoveNext()
qui s'effecue à la fin de la boucle
 While Not QueryBDD_DemandeInfoTousUtil.EOF
'...
'...
QueryBDD_DemadeInfoTousUtil.MoveNext()
end while


j'espère avoir correctement répondu à vos demande.

Auriez-vous une solution?

Merci d'avance
Messages postés
16717
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
19 janvier 2022
583
Vb95 a dit qu’il manquait un end if parce que dans ton post initial, il n’y est pas.
C’est flagrant maintenant que @karamel a corrigé ce message.

Ce qui se voit mieux aussi, c’est le movenext qui m’avait échappé.

Je confirme qu’à chaque fois que cette ligne
 Listview_Util.Remove() 
est présente elle ne sert à rien.
La méthode Remove sert à supprimer une instance de la listview, or tu veux remplir la listview donc dès le départ c’est incohérent. Mais pour qu’elle supprime quelque chose, il faut lui mettre en paramètre et là y’a pas de paramètres…

Le message d’erreur dit clairement que Employer1 est déjà présent.
Est ce qu’il apparaît 2 fois (ou plus) dans la listbox?
J'ai utilisé un listbox pour des tests, et je n'ai pas eu d'erreur. C'est uniquement lorsque j'utilise la listview que ça me produit cette erreur.
Messages postés
16717
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
19 janvier 2022
583 > Keitarokun
Que la listbox n’ait pas généré d’erreur est normal. Parce qu’une listbox s’en moque s’il y a 2 items avec le même nom,
Et d’ailleurs ce n’est pas ce que je t’ai demandé.