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

GEODATA DAYS 2024

#1 Tue 29 June 2010 14:39

V. Girault
Participant actif
Lieu: Clermont-Ferrand
Date d'inscription: 22 Sep 2005
Messages: 106

Visualiser sur une carte les items selectionnés dans une MultiListBox

Bonjour @ tous !

Je suis toujours sous MB 8.5, je n'ai pas eû de place dans le titre pour mettre la balise... big_smile


Grâce à votre aide, j'ai réussi tant bien que mal a mettre le résultat d'une requête dans une MultiListBox. Maintenant, je veux faire apparaître par un zoom entire layer tous les items que j'ai sélectionné dans ma MultiListBox. Pour l'instant, je ne parvients qu'à faire ceci sur le dernier item sélectionné....

Voici mon code actuel...

Code:

Sub ValidOperation
    Dim Schoix as Integer
    Dim ChampRec as Alias

    Operation = ReadControlValue(2)
    ChampRec = name & "." & ID

    While Operation <> 0

        Select * from name Where Operation = ChampRec Into Resultat Noselect
        call Visu
        Operation = ReadControlValue(2)
    Wend
End Sub

Sub Visu
    DIM mnumtables AS INTEGER

    mnumtables = NumTables()
    Select * from Resultat Into table_select
    Add Map layer table_select
    Set Map Zoom Entire Layer table_select
    Close Table table_select

    IF NumTables() > mnumtables Then
        Close Table TableInfo(NumTables(),TAB_INFO_NAME)
    END IF
End Sub

Pourriez-vous m'aider s'il vous plaît ?
Merci beaucoup d'avance...

Dernière modification par V. Girault (Tue 29 June 2010 14:41)

Hors ligne

 

#2 Tue 29 June 2010 19:05

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: Visualiser sur une carte les items selectionnés dans une MultiListBox

Bonjour
La méthode n'est pas bonne: comme il n'y a dans MI qu'une sélection à la fois, votre Sub ValidOperation aboutit à une table Resultat ou seule figure la dernière sélection
Le principe de la Sub ValidOperation devrait plutôt être de constituer une chaine de caractères la_liste - genre (IDa, IDb, ...IDn) - des ID sélectionnés dans la MultiListBox, puis, dans la Sub Visu de sélectionner les entités de name Where ID in la_liste
ps: on peut aussi tenter d'ajouter à la table Resultat des signes au fur et à mesure de la boucle, avec des select into bidule suivis d'un Insert genre Insert Into Resultat (Obj) Select Obj From bidule

Hors ligne

 

#3 Wed 30 June 2010 11:05

V. Girault
Participant actif
Lieu: Clermont-Ferrand
Date d'inscription: 22 Sep 2005
Messages: 106

Re: Visualiser sur une carte les items selectionnés dans une MultiListBox

Bonjour @ tous et merci à Maurice...

J'ai adapté mon code en fonction de la réponse ci-dessus, mais bien que la liste soit correctement constituée, il est signalé que rien n'est trouvé au niveau de la requête...

Ai-je fais une boulette au niveau de la création des arguments où j'ai retiré la dernière virgule à la fin de celle-ci ou est-ce au niveau de la comparaison du champ ID de ma table, sachant que c'est un entier, je le transforme en chaîne...

Voilà où j'en suis dans le code :

Code:

Sub ValidOperation

    ChampRec = name & "." & ID
    Operation = ReadControlValue(2)

    While Operation <> 0
        ChOpe=ChOpe+Str$(Operation)+","
        'call Visu
        Operation = ReadControlValue(2)
    Wend
    RqOpe = left$(ChOpe,len(ChOpe)-1)
    call Visu
End Sub

Sub Visu
    DIM mnumtables AS INTEGER

    mnumtables = NumTables()
    Select * from name Where Str$(ID) In (RqOpe) Into table_select
    Add Map layer table_select
    Set Map Zoom Entire Layer table_select
    Close Table table_select

    IF NumTables() > mnumtables Then
        Close Table TableInfo(NumTables(),TAB_INFO_NAME)
    END IF
End Sub

Ou alors faudrait-il passer ID en Alias ? Je vais continuer de chercher...

Merci beaucoup d'avance...

Hors ligne

 

#4 Wed 30 June 2010 13:01

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: Visualiser sur une carte les items selectionnés dans une MultiListBox

Bonjour
Insérer un print RqOpe avant le call Visu
Si c'est en caractère on doit avoir ("1","2",..."n")
Si c'est en nombre on doit avoir (1,2,...,n)
nb: ne pas oublier les parenthèses...et - à mon avis - éviter les caractères, ça complique ! smile

Hors ligne

 

#5 Thu 01 July 2010 09:55

V. Girault
Participant actif
Lieu: Clermont-Ferrand
Date d'inscription: 22 Sep 2005
Messages: 106

Re: Visualiser sur une carte les items selectionnés dans une MultiListBox

Bonjour à tous !

Pour faire suite à la réponse de Maurice hier, j'ai eû un petit contre-temps...
Je reprends donc le fil aujourd'hui....

J'ai bien fait mon print RqOpe et la chaîne contient bien des chiffres sous forme (1,2,...,n). Dans la boîte de message, j'obtiens 1,7

Le problème est qu'ensuite la requête ne trouve rien, le signalant par "objet non trouvé", alors que ceux-ci existent bien dans la table.... Est-ce dans la requête que je me suis fourvoyé ?

Voici le code en cours :

Code:

Sub ValidOperation
    '=======================================================================
    ' Lancement de la requête sur les opérations et mise à jour de la carte
    ' sur le résultat de la requête
    '=======================================================================

    ChampRec = name & "." & ID
    Operation = ReadControlValue(2)

    While Operation <> 0
        ChOpe=ChOpe+Str$(Operation)+","
        Operation = ReadControlValue(2)
    Wend
    RqOpe = Left$(ChOpe,len(ChOpe)-1)
    Print RqOpe
    Call Visu
End Sub

Sub Visu
    DIM mnumtables AS INTEGER

    'mnumtables = NumTables()
    Select * from name Where Str$(ID) In (RqOpe) Into table_select
    Select * from table_select
    Add Map layer table_select
    winid4=FrontWindow()
    If winid4 <> 0 then
        If WindowInfo(winid4, WIN_INFO_TYPE)=1 then
            note ("Map active")
            Set Map Window winid4 Zoom Entire Layer table_select
            Set Map redraw On
            Close Table table_select
        Else
            Note ("La bonne fenêtre n'est pas prête !")
            Note "Type fenêtre : "+WindowInfo(winid4, WIN_INFO_TYPE)
            If WindowInfo(winid4, WIN_INFO_TYPE)=2 then
                winid1=FrontWindow()
                Set Map Window winid1 Zoom Entire Layer table_select
                Set Map redraw On
                Close Table table_select
            End if
        End If
    End If

    'IF NumTables() > mnumtables Then
    '    Close Table TableInfo(NumTables(),TAB_INFO_NAME)
    'END IF
End Sub

Là, je ne comprends pas trop... Dans le passage d'argument de la requête, je suis obligé de passer ID en Str$(ID) sinon j'ai une erreur de type dans l'expression car ID dans la table est entier... Ca me paraît correct pourtant, ou alors, une subtilité me manque..... sad

Merci beaucoup d'avance pour le petit coup de main

Dernière modification par V. Girault (Thu 01 July 2010 09:55)

Hors ligne

 

#6 Thu 01 July 2010 14:45

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: Visualiser sur une carte les items selectionnés dans une MultiListBox

Bonjour
Pour être tranquille, passer par une commande interprétée

Code:

Dim cmd As String
cmd="Select * from name Where ID In "+RqOpe+" Into table_select"
print cmd 'pour vérifier, facultatif...
Run Command cmd

Hors ligne

 

#7 Thu 01 July 2010 16:23

V. Girault
Participant actif
Lieu: Clermont-Ferrand
Date d'inscription: 22 Sep 2005
Messages: 106

Re: Visualiser sur une carte les items selectionnés dans une MultiListBox

Bonjour Maurice !

Et merci pour la piste en réponse... big_smile

Que c'est ballot ! Palsembleu, j'ai honte ! yikes
J'avais pourtant bien fait mon test du passage de la chaine cmd en Print, c'était là sous mes yeux, et je n'avais pas vu que name n'était pas passée en variable.... Du coup, le prog me disait après table name pas ouverte, alors j'ai focalisé mon attention ailleurs bien plus haut dans le code.... Et j'ai rien vu !

Honte à moi !

Voici le bon code :

Code:

Sub Visu
    DIM mnumtables AS INTEGER, cmd as String

    'mnumtables = NumTables()
    
    winid6=FrontWindow()
    If WindowInfo(winid6, WIN_INFO_TYPE) = 1 then
        note "Fenêtre actuelle : "+WindowInfo(winid6, WIN_INFO_TYPE)
        cmd="Select * from "+name+" Where ID in ("+RqOpe+") into Pipo"
        Print cmd
        Run Command cmd
        Browse * from Pipo

        if TableInfo("Pipo",TAB_INFO_NROWS) = 0 then
            note "Aucun résultat..."
        else
            note "J'ai trouvé !"
            Select * from Pipo
            Browse * from Pipo
            Commit Table Pipo As "C:\Documents and Settings\GiraultV\Mes documents\MI\WOR\Pipo.TAB" 
            CoordSys Earth Projection 3, 33, "m", 3, 46.5, 44, 49.00000000001, 700000, 6600000
            Bounds (-792421, 5278231) (3520778, 9741029)
         end if
    End If

    Add Map layer Pipo
    winid4=FrontWindow()

    If winid4 <> 0 then
        If WindowInfo(winid4, WIN_INFO_TYPE)=1 then
            Note ("Map active")
            Set Map Window winid4 Zoom Entire Layer Pipo
            Set Map redraw On
            'Close Table Pipo
        Else
            Note ("La bonne fenêtre n'est pas prête !")
            Note ("Type fenêtre : "+WindowInfo(winid4, WIN_INFO_TYPE))
            If WindowInfo(winid4, WIN_INFO_TYPE)=2 then
                winid1=FrontWindow()
                Set Map Window winid1 Zoom Entire Layer RQ
                Set Map redraw On
                'Close Table RQ
            End if
        End If
    End If

    'IF NumTables() > mnumtables Then
    '    Close Table TableInfo(NumTables(),TAB_INFO_NAME)
    'END IF
Note "J'ai fini"
End Sub

Louanges et remerciements à Maurice ! smile

Dernière modification par V. Girault (Fri 02 July 2010 07:44)

Hors ligne

 

Pied de page des forums

Powered by FluxBB