#31 Tue 13 May 2008 15:19
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: [MapBasic 7.0]Selection fenetre double
...l faut que je créer une table puis grace a un fetch first /fetch next je remplisse chaque ligne par une valeur de liste2(i) ?...
Exact ...et vice-versa une fois le tri sur la table effectué !!
A moins qu'on puisse effectuer un tri sur une variable liste par un autre moyen que j'ignore ...
Hors ligne
#32 Tue 13 May 2008 17:00
- Fabius
- Participant actif
- Date d'inscription: 19 Mar 2008
- Messages: 130
Re: [MapBasic 7.0]Selection fenetre double
J'ai essayé de me documenter à ce sujet via l'aide de map basic malheureusement je n'ai rien trouvé la dessus, d'ailleur trop peu d'informations sur les listes à mon gout.
Je vais essayer via une table par contre quelle syntaxe utiliser afin de copier une valeur d'une liste vers une "case" ? et vice versa?
Cordialement
Hors ligne
#33 Tue 13 May 2008 21:52
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: [MapBasic 7.0]Selection fenetre double
Un très bel algorithme de tri d'une variable liste en caractères, obtenu sur le web (intégré désormais au code joint à mon post #29):
Sub tri_variable_liste
Dim i,j,h As Integer
Dim v As String
Dim n As Integer
n = UBound (variable_liste)
h = 1
Do
h = 3 * h + 1
Loop Until h > n
Do
h = h / 3
For i = h + 1 To n
v = variable_liste(i)
j = i
Do While variable_liste(j-h) > v
variable_liste(j) = variable_liste(j-h)
j = j - h
If j <= h Then
Exit Do
End If
Loop
variable_liste(j) = v
Next
Loop Until h = 1
End Sub
Hors ligne
#34 Wed 14 May 2008 12:40
- Fabius
- Participant actif
- Date d'inscription: 19 Mar 2008
- Messages: 130
Re: [MapBasic 7.0]Selection fenetre double
Merci beaucoup, c'est génial !!! quand je vois le code je ne pensais pas du tout que je l'aurais fait seul ou même aidé !! J'apporterais cependant une remarque puisque ce code trie de telle sorte que une id 2 se retrouve apres une id 19. C'est assez emebetant. Comment pourrais je contourner ce (dernier) petit probleme ?
Merci d'avance
Hors ligne
#35 Wed 14 May 2008 12:56
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: [MapBasic 7.0]Selection fenetre double
Pour ça, pas d'autre solution que de prévoir des ID01 à ID99 si on en a moins de 100, ou ID001 à ID999, etc...
ps: le problème est le même dans tout logiciel (Excel, ...) puisque, en caractère, 2 est après 19
nb: si le tri se fait sur la partie numérique (les x caractères après l'espace, transformés en nombre) ça devrait lever le problème, mais l'algorithme est fait pour du caractère et devrait être adapté pour des nombres (mais il faudra déjà que je comprenne moi même comment il fonctionne )
Hors ligne
#36 Wed 14 May 2008 15:31
- Fabius
- Participant actif
- Date d'inscription: 19 Mar 2008
- Messages: 130
Re: [MapBasic 7.0]Selection fenetre double
C'est vrai que la logique qu'il y'a derriere cet algorithme est assez farfelu.
Ne pourrait t'on pas modifier la table temporaire qui contient les id en rajoutant un certain nombre de zeros en fonction de la taille du champ de facon a ce que ceux ci est tous la meme longueur?
Hors ligne
#37 Wed 14 May 2008 17:18
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: [MapBasic 7.0]Selection fenetre double
Cet algorithme (non pas farfelu mais génial !) ne passe pas par une table temporaire...
Il faudrait modifier la table d'origine !! (ce qui ne serait pas une mauvaise idée d'ailleurs )
Hors ligne
#38 Wed 14 May 2008 23:55
- Fabius
- Participant actif
- Date d'inscription: 19 Mar 2008
- Messages: 130
Re: [MapBasic 7.0]Selection fenetre double
J'entendais par fafelu qu'il était complexe dans sa conception, c'est sur que pour le résultat il est top.
Je sais qu'il ne passe pas par une table temporaire mais pour remplir la premiere liste j'utilise dans mon programme une selection triée et groupée sur mon champ id ce qui me donne une table bidule. Ne serait il pas possible en modifiant ce champ de lui fixer une largeur que toutes les observations devront atteindre ? 3 par exemple ce qui permettrait en fait de faire passer 2 en 002 pour l'algorithme.
En faisant ca ne risque t'on pas de ne pas pouvoir utiliser les "vrais" id selectionnés par la suite? Dans le sens ou si on demande au programme d'utiliser la valeur 002 que l'utilisateur a séléctionné celui si la différencieras de la valeur de la table d'origine (en l'occurence 2 dans mon exemple) ?
Je sais pas si c'est clair mais c'est en tout la grosse question que je me pose en ce moment !!
Hors ligne
#39 Thu 15 May 2008 09:02
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: [MapBasic 7.0]Selection fenetre double
Creér une table temporaire "fausse" pour pouvoir y faire de vrais mise en ordre puis repasser à la table d'origine...
gymnastique complexe et risquée !! On a toutes les chances de se casser la figure
On ne peut pas toucher à la table d'origine, pour la rendre d'abord vraiment triable elle aussi ??
Hors ligne
#40 Thu 15 May 2008 12:16
- Fabius
- Participant actif
- Date d'inscription: 19 Mar 2008
- Messages: 130
Re: [MapBasic 7.0]Selection fenetre double
Non malheureusement je ne dois et je ne peux pas toucher à la table d'origine, à moins bien sur de la modifier pendant l'utilisation et de la remettre d'origine par la suite mais a mon avis ce serait vraiment trop fastidieux. Du coup je reste bloqué la dessus, c'est assez frustrant surtout lorsque l'on voit que la liste se trie presque comme l'on souhaite
Hors ligne
#41 Thu 15 May 2008 13:03
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: [MapBasic 7.0]Selection fenetre double
Il suffit d'ajouter (puis enlever à la fin) une colonne "utilisable"
Si à l'origine on a id 2, id 14, id 199, etc... on crée facilement cette colonne provisoire id002, id014, id199, etc... et on la détruit tout aussi facilement
Hors ligne
#42 Thu 15 May 2008 13:53
- Fabius
- Participant actif
- Date d'inscription: 19 Mar 2008
- Messages: 130
Re: [MapBasic 7.0]Selection fenetre double
Si j'ai bien compris, on créé une colonne que l'on remplit par des id "pleins" (avec des zeros devant si necessaire) ensuite on procède dans le programme avec les deux colonnes que l'on aura récupérer comme précédemment avec un selection (dans la table bidule), on affiche une de ces deux colonnes dans la liste1 et on interragie apres dessus en en selectionnant en fonction du besoin. Il faut "attacher" ces deux champs, dans le sens ou si on selectionne id002 le programme doit comprendre que l'on prend l'id 2 dans la colonne fixe de la table ?
Ensuite une fois la selection effectuée on supprime le champs rajouté.
Dis comme ca , cela semble facile mais mis a part l'ajout et la suppresion de colonne je ne sais pas du tout comment faire.
Une autre petite question, dans le cas ou je voudrais (afin d'éviter toute confusion) que les valeurs de liste1 basculées dans liste2 n'apparaissent plus. Quelque chose du type : redim liste1(liste1-liste2) et vise versas est il possible?
Merci
Hors ligne
#43 Fri 16 May 2008 00:08
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: [MapBasic 7.0]Selection fenetre double
...je voudrais que les valeurs de liste1 basculées dans liste2 n'apparaissent plus. Quelque chose du type : redim liste1(liste1-liste2) et vise versas est il possible?...
Non...et ce souhait complique les choses (mais c'est un transvasement de plus, donc possible s'il est logique avec les boutons d'ajout/suppression total/partiel déjà prévus)
NB: il est entendu que la colonne des ID est en caractères, avec des valeurs discontinues de 1 à n ??? (ou sinon reprécisez les valeurs qu'elle prend). Il est entendu aussi qu'on ne peut pas y toucher ni la passer en entier ??
ATTENTION: les variables liste1 et liste2 qu'on met dans les MultiListBox DOIVENT être en caractères... !!
Finalement les problèmes de tri ne vont peut être pas être résolus par l'algorithme miracle
Hors ligne
#44 Fri 16 May 2008 11:45
- Fabius
- Participant actif
- Date d'inscription: 19 Mar 2008
- Messages: 130
Re: [MapBasic 7.0]Selection fenetre double
La colonne ID dans la table d'origine est un entier mais dans les listes se sont des caracteres. Ces id prennent des valeurs parfois discontinue mais pas tout le temps, il y'a souvent un ou plusieurs trous. On ne peut malheureusement pas les modifier dans les tables qui vont etre utilisées dans le programme.
J'ai malheureusement peur que vous ayez raison pour l'algotihme celui ci ne va peut etre pas résoudre mon problème.
Pour le transvasement de plus , comment dois je m'y prendre ? créer un nouvelle liste remplit par les valeurs comprises dans liste1 mais pas dans liste2 ?
J'aime mapbasic , la théorie est tellement simple .....
Hors ligne
#45 Fri 16 May 2008 15:58
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: [MapBasic 7.0]Selection fenetre double
Pour les classements, on doit s'en sortir en créant (avec une fonction) la liste1 composées de 4 caractères (par exemple) constituée du nombre de zéro qui va bien et du nombre entier d'origine. On fera la manip inverse pour fabriquer une liste finale exploitable en utilisant val(liste2(i))
Pour les transvasements, c'est bien ça: lors de "ajout" ou "efface" on utilise une variable_liste provisoire puis on remplace liste1 par cette variable liste: tout liste1 moins ce qui est dans liste2 (après l'ajout ou l'effacement partiel)
Hors ligne
#46 Fri 16 May 2008 16:24
- Fabius
- Participant actif
- Date d'inscription: 19 Mar 2008
- Messages: 130
Re: [MapBasic 7.0]Selection fenetre double
D'accord pour les deux manip, mais avec quelle focntion pourrais je obtenir ma liste composé de 0 pour completer cela ?
Pour l'autre je vais m'y mettre dès lundi en esperant y arriver au plus vite.
Merci de votre réponse
Fabius
Hors ligne
#47 Fri 16 May 2008 16:52
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: [MapBasic 7.0]Selection fenetre double
Un truc simple du genre
If liste1(i) < 10 Then listeprov(i)="000"+liste1(i)
ElseIf liste1(i) between 10 and 99 Then listeprov(i)="00"+liste1(i)
ElseIf liste1(i) between 100 and 999 Then listeprov(i)="0"+liste1(i)
Else listeprov(i)=liste1(i)
End If
pour des valeurs jusqu'à 9999
Hors ligne
#48 Sun 18 May 2008 18:11
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: [MapBasic 7.0]Selection fenetre double
Finalement, je trouve inutile que les valeurs de liste1 basculées dans liste2 n'apparaissent plus: la façon de travailler des procédures "ajout" ou "putall" rendent les doublons impossibles. Si votre utilisateur s'acharne à ajouter 3 fois de suite un même groupe de valeurs, tant pis pour lui, mais elles ne seront ajoutées qu'une fois !
J'ai modifié notre "cher" programme (joint au post #29) pour que les entiers soient transformés en caractères et pour autant se classent bien avec l'algorithme miracle (mais j'ai mis des espaces, pas des zéros)
Le produit final que livre le programme (imprimé dans la fenêtre message) est une chaîne de caractères
listOK="(valeur_1,valeur_2,...valeur_n)" destinée à faire une sélection dans la table de base:
cmd="select * from "+table_base+" where id in "+listOK ... run command cmd
Hors ligne
#49 Mon 19 May 2008 11:48
- Fabius
- Participant actif
- Date d'inscription: 19 Mar 2008
- Messages: 130
Re: [MapBasic 7.0]Selection fenetre double
Merci , c'est vrai que cette manip n'est pas obligatoire, elle aurait pu permettre d'eviter de s'arracher les cheveux lorsque l'on a une liste d'id importante mais pour l'instant je pense laissé ca comme ca.
Pour le tri , je remarque que cela fonctionne tres bien dans votre programme mais il y'a une bonne partie de code que je ne comprend pas et je ne sais pas comment l'adapter a mon code d'origine. Pourriez vous m'eclairer ?
Merci d'avance
Hors ligne
#50 Mon 19 May 2008 12:56
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: [MapBasic 7.0]Selection fenetre double
D'accord, mais pour faire de ce post le 50° et dernier (le sujet devient laborieux à suivre) ...je vous propose d'échanger désormais par mail privé: passez moi votre code sur mon mail, dites moi où ça coince ...et je vous "éclairerai"
Hors ligne