Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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!

#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

Fabius a écrit:

...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 tongue)

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 smile)

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 smile
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 big_smile

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

Fabius a écrit:

...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 sad

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 ..... big_smile

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 smile

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

 

Pied de page des forums

Powered by FluxBB