banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Tue 30 November 2010 14:50

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

[MB 9]Connection dynamique entre deux listes

Bonjour,

Je reviens aujourd'hui avec un problème que j'avais déjà posté il y'a quelque temps (enfin peut être deux ans déjà smile ). Lors d'un programme je devais a l'époque agir avec deux listes l'une contenant les valeurs dont je disposais et l'autre les valeurs que je sélectionne. J'avais réussi a réaliser ceci avec l'aide de forumistes inspirés. Mon problème aujourd'hui rejoint la problématique de l'époque. En effet, dans le code que je joins ci dessous la liste 2 se remplit et se vide en fonction des choix de l'utilisateur (donc ca fonctionne très bien), cependant les utilisateurs souhaiteraient que la liste 1 se vide en fonction des données présentes dans la liste 2. En gros je souhaite un système de vase communiquant entre mes deux listes. Si une donnée est sélectionnée celle ci ce trouve dans la liste 2 mais plus dans la liste 1 ce qui pour ce dernier point et le cas a l'heure actuelle. Il me semble que lorsque j'avais soulevé ce problème on m'avait dit que ce n'était pas possible mais avec l'évolution de MI et des ses utilisateurs big_smile une solution existe peut être smile

Je vous joins le code si une âme charitable a une piste smile

Code:

SUB AJOUT
dim ligne,i as smallint
dim trouve as logical
ligne =readcontrolvalue(50)
 while ligne <> 0
  trouve = false
   for i = 1 to UBound(liste2)  
     if liste1(ligne) = liste2(i) then trouve = true end if
   next
   if trouve = false then
         redim liste2(UBound(liste2)+1)
     liste2(i) = liste1(ligne)
   else
     note "Cet ID est déjà selectionné"
   end if
  ligne =readcontrolvalue(50)
 wend
call tri
alter control 51 title from variable liste2()
alter control 82 enable
alter control 83 enable
alter control 84 enable
END SUB



Sub Efface
dim ligne,i,j,k,y,z as smallint
dim trouve as logical
dim liste3(),liste4() as string
ligne =readcontrolvalue(51)    'On remplit liste3() avec la sélection de liste2()

i = UBound(liste3)
 while ligne <> 0
  redim liste3(i+1)
  liste3(i+1) = liste2(ligne)
  ligne =readcontrolvalue(51)
  i = i+1
 wend                                
 for j = 1 to UBound(liste2)        
  trouve = false
   for k = 1 to UBound(liste3)    
     if liste2(j) = liste3(k) then trouve = true end if
   next
   if trouve = false then            
    y=UBound(liste4)
    redim liste4(y+1)
    liste4(y+1) = liste2(j)
   end if
 next
redim liste2(0)                    
redim liste2(UBound(liste4))
 for z=1 to UBound(liste4)
  liste2(z) = liste4(z)
 next

redim liste3(0)                
redim liste4(0)
call tri
alter control 51 title from variable liste2
alter control 81 enable
alter control 83 enable

END SUB


SUB ERASALL

redim liste2(0)
alter control 51 title from variable liste2()
alter control 82 disable
alter control 81 enable
alter control 84 disable
alter control 83 enable

END SUB


SUB PUTALL

FOR i=1 to ubound(liste1)
ReDim liste2(UBound(liste1))
liste2(i) = liste1(i)
next
alter control 51 title from variable liste2()
alter control 81 disable
alter control 82 enable
alter control 83 disable
alter control 84 enable

END SUB

Merci d'avance


Fab

Hors ligne

 

#2 Tue 30 November 2010 17:27

jean94
Participant assidu
Date d'inscription: 13 Aug 2009
Messages: 436

Re: [MB 9]Connection dynamique entre deux listes

Bonjour Fab,

Que se passerait-t-il si tu ajoutais  2 fonctions intermédiaires qui vérifie si les éléments de la liste1 se trouve dans la liste2 et si oui elle les enlèves et une qui fait l'inverse (vérifie liste2 par rapport à la list1. Les 2 fonctions sont indépendantes et devrait être appeler lorsqu'une des deux listesdoit être affiché.  Voici à quoi pourrais ressemble UNE d'entre elle...Elle vérifie s'il y a des éléments de la liste1 dans la liste2 et les enlève de la liste2

Code:

j=1
i=1
k = 1
Do while j < x ' x étant le nombre de d'éléments de liste1
Do while i < y ' y étant le nombre de d'éléments de liste2
if liste2(i) = liste1(j) then
listtemp(k) = liste2(i) 'listtemp(k) donne tout les éléments en double et listtemp2(k) l'index
listtemp2(k) = i
k = k + 1
end if
Loop
j = j + 1
Loop

i = 1
j= 1
dim listtemp3(i-k) 'Nombre d'éléments moins les doublons
Do while i < y
if listtemp(i) = liste2(listtemp2(i)) then goto jump end if
listetemp3(j) = liste2(i)
j = j + 1
jump:
i = i +1
Loop

i = 1
redim liste2(y-k)
do while i < y-k  ' remplace listetemp3 par liste2
liste2(i) = listetemp3(i)
i=i+1
Loop

Il faut l'adapter à ton code

[EDIT] Pour clarifier...
La première double loop cherche les doublons
La deuxième boucle crée un liste sans doublons
La troisième boucle Redonne les valeurs à ta liste2() sans doublons

JF

Dernière modification par jean94 (Tue 30 November 2010 17:32)

Hors ligne

 

#3 Wed 01 December 2010 16:54

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MB 9]Connection dynamique entre deux listes

Merci pour la réponde.

La logique du code me parait clair mais par contre il faudrait que je l'adapte a mon code précédent. pour info celui ci regroupe 4 procédures, en fait une par bouton, lorsque l'on ajoute une ou plusieurs variables, lorsque l'on les retire et les deux autres lorsque l'on ajoute ou retire tout.
Dans quelle cas dois je inserer cette fonction ? Je ne suis pas a l'aise avec les fonctions n'en ayant jamais codé moi meme big_smile

Merci pour le temps que vous m'accordez


Fab

Hors ligne

 

#4 Wed 01 December 2010 17:55

jean94
Participant assidu
Date d'inscription: 13 Aug 2009
Messages: 436

Re: [MB 9]Connection dynamique entre deux listes

Une fonction est sensiblement comme une procédure à l'exeption quelle envoie une valeur...

Tu peux passe le code ci-dessus dans une précédure si tes variables sont déclarer avant ta sub main.

Ce que je crois comprendre, car je ne suis pas sur de bien saisir ce que tu veux faire exactement, il faut que le code s'actionne lorsque tu veux savoir si une valeur d'une liste se trouve dans l'autre. Donc AVANT chaque fois qu'une liste est affichée et tu veux en faire afficherune 2ieme.

Cela étant dit, je crois qu'une ou deux variables logiques peuvent règler le problème. Bref, quand une liste doit s'affiché, vérifie si une liste est afficher (if LogVar = True) et si oui fait une procédure (Then call SubList) et continue. Pour afficher la liste sans les doublons

J'espère ne pas te mener dans une fausse route.

JF

Hors ligne

 

#5 Thu 02 December 2010 12:02

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MB 9]Connection dynamique entre deux listes

En fait pour résumer l'utilisateur a a l'écran une première liste qui contient toutes les valeurs distinctes d'une colonne de la table. Avec l'aide des boutons il décide de tout sélectionner ou seulement une ou plusieurs valeurs qui l'intéresse. A l'actionnement du bouton la deuxième liste visible à l'écran se remplit avec les valeurs sélectionnées. L'idée est juste , pour plus de clarté d'ôter les valeurs sélectionnés de la première.

Je te joins un screen pour plus de visibilité(dans l'exemple joins il n'y a qu'une valeur mais le mode de fonctionnement est le même si il y'en a 3000.



Fabien


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#6 Thu 02 December 2010 15:02

jean94
Participant assidu
Date d'inscription: 13 Aug 2009
Messages: 436

Re: [MB 9]Connection dynamique entre deux listes

Les valeurs sont-elles toutes unique ou tu peux avoir 2 fois et plus 1_GUIPRY (dans ta liste de 3000).

J'ai déjà fait quelque chose semblables à ce que tu veux dont je crois que ces possible.

JF

Hors ligne

 

#7 Thu 02 December 2010 19:51

jean94
Participant assidu
Date d'inscription: 13 Aug 2009
Messages: 436

Re: [MB 9]Connection dynamique entre deux listes

Salut Fabius,

Bonne nouvelle, j'ai trouvé mon vieux code. Je te le joint et donne le code source avec...Il y a même une table pour le tester. Dans la boite de dialogue tu n'a qu'à faire ouvrir et choisir la table. Il s’agit de listbox et non de multilistbox mais on peu adapter. Le tout compiler en 10.5 mais tu as le MB s'il y a des modifs a faire

JF


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#8 Fri 03 December 2010 11:13

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MB 9]Connection dynamique entre deux listes

Merci de ton retour et de ton implication. je teste ca des que possible.

Pour infos et pour répondre a ta question  les valeurs présentes dans les multilistbox sont uniques. En fait c'est la concatenation d'un identifiant unique et d'un nom de commune .

Fabien

Hors ligne

 

#9 Fri 03 December 2010 15:01

jean94
Participant assidu
Date d'inscription: 13 Aug 2009
Messages: 436

Re: [MB 9]Connection dynamique entre deux listes

Bonjour,

Dans mon exemple il s'agit de listbox ordinaire...mais on à la preuve que ces possible.
Il s'agit de changer les contrôles et adapter au Mlistbox

JF

Hors ligne

 

#10 Mon 06 December 2010 09:03

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MB 9]Connection dynamique entre deux listes

Merci en tout c'est clairement ce que je veux faire mais sur des multilistbox, je teste ca aujourd'hui et reviens pour le suivi si j'y arrive ou si je rencontre un probleme smile

Bonne journée,

Fabien

Hors ligne

 

#11 Mon 06 December 2010 12:07

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MB 9]Connection dynamique entre deux listes

Je viens de tester plusieurs types d'adaptations ce matin mais malheureusement celui qui m'intéresse a savoir la multilistbox n'est pas encore au point ! En fait lors d'une première sélection cela fonctionne très bien, la première valeur sélectionnée disparait de la liste1 et apparait dans la liste2. C'est lorsque j'essaye de transposer la valeur suivante que le bas blesse. En effet , celle ci disparait de la liste1 mais c'est le cas également de la valeur suivante. cette valeur étant remplacer par une ligne blanche dans la liste 1...

Ci joint le code adapté (en fait après plusieurs tentatives c'est finalement voir complètement proche du code de ton programme wink )

Code:

SUB AJOUT

dim ligne,i as smallint
dim trouve as logical
ligne =readcontrolvalue(50)
dim listTemp() as string
 
while ligne <> 0
  'trouve = false
   for i = 1 to UBound(liste2)  
     if liste1(ligne) = liste2(i) then trouve = true end if
   next
   if trouve = false then
         redim liste2(UBound(liste2)+1)
            liste2(i) = liste1(ligne)
            Redim listTemp(list1size - 1) 
  
            Do while i < ligne            'On remplit listtemp avec les valeurs inferieurs a celle qu'on vient de rajouter
            listTemp(i) = liste1(i)
            i = i + 1
            Loop

            Do while i < list1size            'puis avec celles superieures
            listTemp(i) = liste1(i + 1)
            i = i + 1
            Loop

            i = 1
            list1size = list1size - 1          'Boucle qui met à jour la var liste1
            Redim liste1(list1size)
            Do while i <= list1size
            liste1(i) = listTemp(i)
            i = i + 1 
            Loop

            Redim listTemp(0)
        alter control 51 title from variable liste2()
        alter control 50 title from variable liste1()
        call tri
          ligne =readcontrolvalue(50)
        end if
 wend

alter control 82 enable
alter control 83 enable
alter control 84 enable
END SUB

Hors ligne

 

#12 Mon 06 December 2010 17:37

jean94
Participant assidu
Date d'inscription: 13 Aug 2009
Messages: 436

Re: [MB 9]Connection dynamique entre deux listes

Bonjour Fabius,

Je ne peux travailler à partir de ton code, car il y a des sub (tri) que je n'ai pas, mais j'ai adapté mon ancien code avec 2 multilistebox que voici..je crois que tout est ok.

Bref, Il suffisait d'ajouter une boucle qui va chercher toute les valeurs du multilistbox...et les ajoutes par la suite. (à chaque ajout l'index de la liste racourcie de un donc j'ai ajouter un conteur "index moins nombre de tours" pour récupérer les bonnes valeurs).

À toi de l'adapter\débuger

JF

Dernière modification par jean94 (Mon 06 December 2010 17:38)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#13 Tue 07 December 2010 09:40

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MB 9]Connection dynamique entre deux listes

Bonjour Jean et encore merci pour ton retour.

J'ai adapté le code a ma problématique (sensiblement proche de celle présente dans ton fichier) et cela fonctionne super bien pour les boutons ajouter / enlever un ou plusieurs éléments !! Par contre les boutons tout effacer et tout remplir me ressorte un beug, c'est a dire que des lignes sont présentes dans les multilistbox et je peux interagir dessus mais aucune valeur n'apparait. Je vais chercher ce matin d'ou peut venir ce probleme.

En tout cas ce mode de fonctionnement est vraiment beaucoup plus sympa avec les données qui se transvasent comme cela smile. Pour info la routine tri sert en fait a trier les observation par ordre alphabétique (enfin alphanumérique puisque les premiers caractères du champs sont des chiffres). Lorsque je j'ajoute puis j'enlève une observation celles ci se trouve trier dans la liste dans laquelle elle se trouve.


Fab

[EDIT] En fait les listes ne sont pas vides, il ne retourne que la dernière observation et après test de la valeur item c'est bien uniquement la dernière valeur qui est présente. Petite précision dans mon programme la valeur présente dans la liste1 et le résultat d'une sélection SQL concaténant deux champs unique (identifiant et nom commun) groupé par ce même champs afin d'éliminer les valeurs en double.

Dernière modification par Fabius (Tue 07 December 2010 15:48)

Hors ligne

 

#14 Tue 07 December 2010 16:02

jean94
Participant assidu
Date d'inscription: 13 Aug 2009
Messages: 436

Re: [MB 9]Connection dynamique entre deux listes

Je en suis pas sur de bien comprendre la ligne suivant

mais aucune valeur n'apparait


Si j’interprète ce que je comprends...Le tout est affiché correctement mais tu es incapable de sélectionner dans une table?
Si c'est le cas il faudrait une procédure supplémentaire qui fait une sélection sql à partir des valeurs des lignes et ta table.

[EDIT] Une façon pour le faire, j'utiliserais un code qui créer une table et qui ajoute les valeur de la LISTE2 dans cette table et je ferais une requête SQL entre cette nouvelle table et celle que tu désires, à la fin il faudrait détruire cette table.

Précision, la façon que mon programme est monté, il peut accepter une valeur même si elle n'est pas unique, car je fais toujours référence à l'index et non à la valeur affichée.

JF

Dernière modification par jean94 (Tue 07 December 2010 16:09)

Hors ligne

 

#15 Tue 07 December 2010 16:24

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MB 9]Connection dynamique entre deux listes

En fait tu peux pointer sur une ligne dans la listbox mais celle ci est vide sauf pour la derniere observation de la liste qui elle est bien renseigné. Je viens de réussir a faire fonctionné le code en indiquant a la multilistbox 1 un "title from variable liste1()" et un "title "" value 1" a la seconde.

Je peux t'envoyer le prog si tu veux mais en message privé puisque celui contient certaines données d'entreprises diront nous big_smile

Je dois prendre un peu de temps pour tester si les valeurs sélectionnés sont les bonnes mais a priori ca fonctionne! Un grand merci en tout cas. Je pense que ce bout de code ainsi que d'autre sur les différentes boites de dialogues pourrait être regroupés pour aider les néophytes ainsi que tout ceux cherchant a parfaire leurs connaissances smile

PS: dans le code que tu avais joins il manque juste une parenthèse au moment de tester dans une boucle si une valeur est inférieur a une autre valeur calculé pour ceux qui voudraient récupérer ce code

Hors ligne

 

Pied de page des forums

Powered by FluxBB