Comment éviter les doublons dans combobox indexés?

Solomein Messages postés 30 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 2 août 2010 - 5 mai 2010 à 09:08
Solomein Messages postés 30 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 2 août 2010 - 6 mai 2010 à 10:46
Salut à tous! Je vous expose mon problème:
- j'ai 6 combobox, trois ont pour nom ComboFab(1), ComboFab(2) et ComboFab(3) et les 3 autres ComboFin(1), ComboFin(2) et ComboFin(3).
- Verticalement, cela me donne d'un coté les ComboFab et de l'autre les ComboFin.
- Ces Combobox sont reliées via une base de donnée access (connexion ADO).
Jusqu'ici tout va bien, le truc qui pose problème c'est que malgré mon "distinct" placé dans ma requete sql j'ai quand même des doublons qui apparaissent. Donc j'ai mis un ComboFin(i).Clear avant de faire ma connexion ADO dans le code des ComboFab, mais il suffit que je touche à un ComboFab pour que tous les ComboFin se ferment... auriez-vous une idée de solution à appliquer?
Mon idée est qu'au final si je clique sur le 1er comboFab, le 1er ComboFin se Close afin qu'il n'y ai pas de doublons.
(j'ai essayé avec des combobox non indexé et ça marche très bien, à mon avis je n'ai pas la bonne syntaxe).

7 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 mai 2010 à 11:03
Salut
Ne connaissant ni la syntaxe des requètes appliquées au DataSource de tes ComboBox ni la syntaxe de ton code, impossible de savoir ce qui se passe dans ton programme.

L'indexation des objets n'a aucun lien avec leurs comportement.

"il suffit que je touche à un ComboFab pour que tous les ComboFin se ferment"
Fermer : définition ?
Quel code dans ComboFab_Change ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Solomein Messages postés 30 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 2 août 2010
5 mai 2010 à 11:51
Voilà le code pour ComboFab_Click

Private Sub ComboFab_Click(Index As Integer)

For i = 1 To 3

'ComboFin(i).Close
scn = "Provider=Microsoft.jet.oledb.4.0;data source= C:\Documents and Settings\u352229\Projet\finalisation\bd1.mdb;"
ssql = "SELECT distinct Finit FROM Table1 where Fab='" & ComboFab(i).Text & "';"

ct.Open scn
ors.Open ssql, ct, adOpenForwardOnly, adLockReadOnly, adCmdText

While Not ors.EOF
ComboFin(i).AddItem ors(0)
ors.MoveNext

Wend

ors.Close
ct.Close

Set ors = Nothing
Set ocn = Nothing
Next i


End Sub
Et j'entend par "fermer" le fait que mes ComboFin se réinistialisent toutes alors que je ne touche qu'à une seul d'entre elle, j'ai utilisé le terme fermer car le code que j'appliquais était ComboFin(i).Close (je l'ai mis en commentaire).
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 mai 2010 à 12:44
Puisque ta base de données est la même pour toutes tes requètes, pourquoi l'ouvrir et la fermer à l'intérieur de la boucle For-Next ?
--> Ouvre-la avant le For et referme-la après le Next

ors.Open ssql, ct, adOpenForwardOnly, adLockReadOnly, adCmdText
Drôle de syntaxe.
adOpenForwardOnly ? --> adOpenStatic
adCmdText correspond à quoi ?
Comment est dimensionné 'ors' ? de quel type de RecordSet s'agit-il ?
La requète fonctionne t-elle ? Obtiens-tu des résultats ?

ComboFin(i).AddItem ors(0)
Non, ors(0) voudrait dire que c'est le RecordSet qui est indexé.
--> ors.Fields(0).Value

Si ta ComboFin se réinitialise,n c'est qu'il doit y avoir un .Clear quelquepart ...

En VB6, il n'existe pas de fonction .Close aux ComboBox

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Solomein Messages postés 30 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 2 août 2010
5 mai 2010 à 13:13
... Chui une pine...
.Clear est la fonction que je voulais utiliser, d'ailleur c'est celle qui se trouve dans mes Combo, je ne sais pas pourquoi j'ai mis Close... La fatigue du matin sans doute.
Donc je reprend, le soucis n'est pas dans ma base de donnée, elle marche très bien, mon seul, et unique, problème se pose lorsque je clique sur une ComboFab (n'importe laquelle), et si bien sur j'ai mis avant d'appeller ma connexion ComboFin(i).Clear, cela me ferme toutes les ComboFin de la colonne suivant (logique) et si je ne met rien, les ComboFin de la colonne m'affichent une, deux, trois fois les mêmes items... C'est pour cette raison que je pense qu'il s'agit d'un problème de syntaxe. Ce que je voudrait et que je n'arrive pas à faire c'est que si je clique sur la première ComboFab, alors la première ComboFin admet la fonction .Clear et ainsi de suite, non pas que ce soit la première, la deuxième et la troisième.
Je ne sais pas si je susi assez clair :(

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 mai 2010 à 17:10
Pas clair tout ça (sans ponctuation cohérente et sans retour à la ligne, difficile (chiant) à lire)

"cela me ferme toutes les ComboFin de la colonne suivant" : décryptage ?
Ca te vide les 3 combobox nommées ComboFin ?

"si je clique sur la première ComboFab, alors la première ComboFin admet la fonction .Clear" : décryptage ?
Admettre ?
Dans ton programme, quand tu travailles avec ComboFab(1), le composant ComboFin associé est ComboFin(1) : donc, pas de souci, ton indexation est correcte : Fab(1) agira sur Fin(1), Fab(2) agira sur Fin(2) et Fab(3) agira sur Fin(3)

"non pas que ce soit la première, la deuxième et la troisième" : Décryptage ?

Vérifie que les ComboFin indexés sont bien les bons sur ta forme (y a t-il des ComboBox dont le nom pourrait ressembler ?) et que l'index va bien de 1 à 3
Au fait, pourquoi n'y a t-il pas d'index 0 ?

Vérifie si, ailleurs dans ton code, tu n'aurais pas un ComboFin(x).Clear qui traine

En mode debug (F9, F8, F5), lors de ta boucle, vérifie que 'i' s'incrémente correctement : survole avec la souris tes variables pour en connaitre la valeur au moment du figeage de débugue
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 mai 2010 à 17:14
C'est quoi 'ocn' que tu remets à Nothing à la fin ?

Je te conseille vivement la déclaration obligatoire des variables : cela évite toute erreur de saisie (voir options de VB6) + lancement avec Ctrl-F5 au lieu de F5.
Cette déclaration obligatoire ajoutera "Option Explicit" en tête de chaque nouvelle page de code. Pour les pages de codes existantes au moment de l'activation de l'option, il faudra ajouter manuellement cette ligne en tête de chaque page
C'est un peu chiant au début, mais ça fait gagner du temps dans la mise au point.
Solomein Messages postés 30 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 2 août 2010
6 mai 2010 à 10:46
Alors en gros, voilà mes déclarations de variables, je suis désolé de ne pas être très clair mais mon application est beaucoup plus importante que le petit bout de code que j'ai mis et du coup je me perd un peu.

Dim ct As New ADODB.Connection
Dim ors As New ADODB.Recordset
Dim ssql As String
Dim scn As String
Dim T(1 To 15) As Variant

Il n'y a pas d'index 0 car je l'ai fait commencé à 1, petit choix personnel pour ça (même si ça peut vous paraître stupide).

Pour le ocn = Nothing je l'ai viré, j'avais trouvé un bout de ce code en parcourant les forums et je ne m'étais pas posé de question vu que ça marchait...

Décryptage de "cela me ferme toutes les ComboFin de la colonne suivant" : Effectivement cela me vide les 3 combobox nommées ComboFin.

Après vérification mes Combobox ont bien le même nom et sont bien indexés (certe elles commencent à 1)

Après être passé en mode débug, je n'ai vu aucun ComboFin(i).Clear

"non pas que ce soit la première, la deuxième et la troisième" = "non pas que cela me vide les 3 combobox nommées ComboFin"

Et si comme tu dis : "Fab(1) agira sur Fin(1), Fab(2) agira sur Fin(2) et Fab(3) agira sur Fin(3)" alors effectivement sur le plan de ma connexion ADO Fab(1) agit sur Fin(1) etc...
Par contre pourquoi, si je met un ComboFin(i).Clear avant l'appel de ma requête SQL et après l'ouverture de ma boucle For, lorsque je clique sur n'importe lequel de mes 3 ComboFab, cela vide les 3 ComboFin d'un coup?
Normalement, si ComboFab(1) agit sur ComboFin(1), alors le clique que je ferais sur Fab(1) ne me viderait que le contenu de Fin(1), non?
En tout cas ce n'est pas le cas pour mon application et c'est le résultat que j'aimerais obtenir.

Et à dire vrai je n'ai mis que 3 Combobox par colonne mais en réalité j'en ai entre 10 et 15 en fonction du Form qui va s'ouvrir.
Et vu que je suis débutant je m'emmele vite les pinceaux car je n'ai pas encore appris à tout commenter et tout classer... Donc pour moi c'est très dure d'expliquer de façon technique ce qui vigure dans mon code, et surtout d'être le plus clair possible, c'est pourquoi je vous demande d'être indulgent et je vous remercie de l'aide que vous me proposez, malgré le fait que ce que je marque soit assez chiant à lire.
Rejoignez-nous