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!

#1 Tue 11 November 2008 22:11

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

Ouvrir toutes les tables présentes dans un répertoire.

Bonjour,


Dans le cadre d'un programme  qui utilise de nombreuses tables situé dans un même dossier. Je donne le choix  à l'utilisateur de sélectionner le répertoire de travail. Cependant j'aurais aimé soit récupérer le nom des tables présente dans le répertoire (dont le nom et le nombre varie fréquemment) soit toutes les ouvrir dans la session courante.
Ma question est donc comment es ce possible de réaliser l'une ou l'autre de ces manipulations? Sachant que j'ai déjà récupérer le chemin du répertoire sur lequel je vais travailler

Merci d'avance

Hors ligne

 

#2 Tue 11 November 2008 23:07

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

Re: Ouvrir toutes les tables présentes dans un répertoire.

Bonsoir
Piste: faire une liste (dans une variable array) de tous les *.tab (éventuellement de ceux seulement qui sont accompagnés d'un *.map: tables graphiques, sauf images) et présenter cette liste dans une MultiListBox ou un PopUpMenu
Mais là il est tard...

Hors ligne

 

#3 Wed 12 November 2008 11:25

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

Re: Ouvrir toutes les tables présentes dans un répertoire.

Merc de votre réponse , cependant ceci me paraissait normal de fonctionner comme cela mais le probleme est : par quel fonction puis je récuperer la liste des tables présentes dans le répertoire sachant que leurnom et leur nombre n'est pas fixé.

Hors ligne

 

#4 Wed 12 November 2008 13:45

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

Re: Ouvrir toutes les tables présentes dans un répertoire.

Pour la liste, ce n'est pas totalement trivial ....
Une solution simple est de passer par DOS (eh oui...) en créant en début de programme la liste des TABs du répertoire sous forme d'un fichier texte, que l'on détruira en fin de programme. Entre temps on lira dans ce fichier de quoi établir une variable liste des TAB.
Soit la variable "repertoire", texte, connue (par exemple repertoire="C:\temp\") et une variable s_chaine texte
Soit aussi une variable variable liste TABnames(0) et une variable i entier

s_chaine= "Run Program "+chr$(34)+"cmd.exe /c Dir "+repertoire+"*.tab"+" /O-D /B >"+repertoire+"liste_tab.txt"+chr$(34)
Run Command s_chaine
'.... ensuite on lit les noms dans le fichier et on les mets dans la variable liste
s_chaine = "Open File "+chr$(34)+repertoire+"liste_tab.txt"+chr$(34)+" for input As #1"
Run Command s_chaine
i=1
Do While Not EOF(1)
  Line Input #1, str
   If Not EOF(1) Then
    Redim TABnames(Ubound(TABnames)+1
    TABnames(i)=str
    i=i+1
   End If
Loop
Close File #1
' enfin, si on veut tout traiter:
For i=1 To Ubound(TABnames)
  ' faire ici le traitement prévu pour chacun des TABs présents dans repertoire,
  ' par un call sub_procedure par exemple
Next


Note CHR$(34) permet d'insérer " (guillemet) dans le texte

Hors ligne

 

#5 Sun 16 November 2008 19:27

snaileater
Participant actif
Date d'inscription: 5 Nov 2008
Messages: 121

Re: Ouvrir toutes les tables présentes dans un répertoire.

Bonjour,
j'ai voulu tester ces exemples et je bloque à la ligne suivante :

Code:

Open File "d:\liste_tab.txt" for Input as #1

Testée dans le code ou dans la FMB j'ai le même comportement :
"commande indisponible : open" ...
Où peut-être l'astuce ?
Merci !

Hors ligne

 

#6 Sun 16 November 2008 19:49

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

Re: Ouvrir toutes les tables présentes dans un répertoire.

Bonjour
Dans la FMB ...pas étonnant, cette commande n'y est pas autorisée !! sad
Dans le code...ça doit passer si le chemin est "en dur" comme dans votre exemple, par contre s'il y a une variable il faut passer par une commande interprétée comme dans l'exemple de mon post #4

Hors ligne

 

#7 Sun 16 November 2008 21:04

snaileater
Participant actif
Date d'inscription: 5 Nov 2008
Messages: 121

Re: Ouvrir toutes les tables présentes dans un répertoire.

Bonsoir,
j'essaie juste de faire fonctionner les quelques lignes indiquées auparavant :

Code:

s_chaine = "Open File "+chr$(34)+repertoire+"liste_tab.txt"+chr$(34)+" for input As #1"
Run Command s_chaine

avec repertoire="d:\"

et je n'y arrive jamais ... encore un pb de guillemets et chr$(34) mais je tourne en rond ...

Hors ligne

 

#8 Sun 16 November 2008 21:11

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

Re: Ouvrir toutes les tables présentes dans un répertoire.

Tout est bon dans les guillemets
Si s_chaine et repertoire sont bien définis en string...ça doit marcher dans un mbx
Par contre c'est inutilisable dans la FMB (cf. plus haut)

Hors ligne

 

#9 Mon 17 November 2008 10:05

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

Re: Ouvrir toutes les tables présentes dans un répertoire.

Bonjour et merci pour votre réponse mais je vais encore vous embeter un petit peu....
Désolé mais en fait l'instruction d'ouverture du fichier txt avec la liste ne fonctionne pas, mapinfo me retourne que la commande open est indisponible, ca a fonctionné une premiere fois (vendredi juste pour tester brievement votre code sur mon poste avant le weekend)mais depuis impossible d'acceder à la sutie.
J'ai placé un note juste apres l'instruction et cela me rapporte quelque chose de similaire à la syntaxe disponible dans l'aide de Mapbasic (au guillemet près sad)

Hors ligne

 

#10 Mon 17 November 2008 10:38

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

Re: Ouvrir toutes les tables présentes dans un répertoire.

Fabius a écrit:

...J'ai placé un note juste apres l'instruction et cela me rapporte quelque chose de similaire à la syntaxe disponible dans l'aide de Mapbasic (au guillemet près sad)


Bon...on va se résoudre à considérer que l'aide en ligne a tort sad
Deux solutions
- tester

s_chaine = "Open File "+repertoire+"liste_tab.txt"+" for input As #1"
print s_chaine
Run Command s_chaine


- ou tester

dim bidule as string
bidule=repertoire+"liste_tab.txt"
print bidule
Open File bidule for input As #1


nb: je préfère print à note car on peut copier-coller du contenu de la fenêtre message....

Hors ligne

 

#11 Mon 17 November 2008 11:23

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

Re: Ouvrir toutes les tables présentes dans un répertoire.

Meme probleme avec ses codes ,l'erreur retorunée est la meme que  celle de snaileater (message 12 du sujet)

Ps: c'est vrai que le print est mieux et garde en mémoire les derniers "essais"

Hors ligne

 

#12 Mon 17 November 2008 12:02

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

Re: Ouvrir toutes les tables présentes dans un répertoire.

Idée !!
DOS va trop vite !! Le fichier liste_tab.txt se crée instantanément et il faut un système un moment pour "prendre conscience" de son existence smile
Après sa création (avant de faire Open File...) utilisez une sous procédure d'attente genre

declare sub attente(byval duree as smallint) 'à introduire au début
.........
s_chaine= "Run Program "+...
Run Command s_chaine
call attente(2) 'la duree de l'arrêt est donnee en secondes
s_chaine = "Open File "+...
...
--------------------------
sub attente(byval duree as smallint)
dim start as integer
start=timer()
while timer()-start < duree Wend
end sub

Hors ligne

 

#13 Mon 17 November 2008 12:16

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

Re: Ouvrir toutes les tables présentes dans un répertoire.

Bonne idée ..... mais ça ne fonctionne pas. en effet meme en ne faisant tourner que ce morceau de code avec un ficheir créer et remplit correctement avec les tables présentes dans le repertoire, le message d'erreur retourné est  toujours le même

Hors ligne

 

#14 Mon 17 November 2008 13:06

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

Re: Ouvrir toutes les tables présentes dans un répertoire.

Je fatigue...mais voilà un code qui marche, avec la réserve qu'on ne peut pas se dispenser de la commande note "bla, bal..." car MI perd le focus pendant l'exécution de la commande DOS et que c'est tout ce que j'ai trouvé pour qu'il le récupère et affiche le dialogue sad

declare sub main
declare sub onliste
declare sub attente(byval duree as smallint)

dim repertoire,bidule,liste,s_chaine,str,TABnames() as string
dim i,j as integer

sub main
repertoire="D:\"
s_chaine= "Run Program "+chr$(34)+"cmd.exe /c Dir "+repertoire+"*.tab"+" /O-D /B > "+repertoire+"liste_tab.txt"+chr$(34)
Run Command s_chaine
call attente(2) 'on attend deux secondes
'.... ensuite on lit les noms dans le fichier et on les mets dans la variable liste
bidule=repertoire+"liste_tab.txt"
  If  FileExists(bidule) Then
    note "fichier trouvé... !!"
    Open File bidule for input As #1
  End If
i=1
  Do While Not EOF(1)
    Line Input #1, str
      If Not EOF(1) Then
         Redim TABnames(Ubound(TABnames)+1)
         TABnames(i)=str
         i=i+1
      End If
  Loop
Close File #1
Call onliste
end sub

sub onliste
Dialog title "test"
  control popupmenu
    id 2
    title from variable TABnames
    Control OKButton
    Control CancelButton
end sub

sub attente(byval duree as smallint)
dim start as integer
start=timer()
while timer()-start<duree Wend
end sub

Hors ligne

 

#15 Mon 17 November 2008 21:40

snaileater
Participant actif
Date d'inscription: 5 Nov 2008
Messages: 121

Re: Ouvrir toutes les tables présentes dans un répertoire.

bon ... j'ai refait quelques petits tests ... :

Code:

's_chaine = "Open File "+repertoire+"liste_tab.txt for input As #1"
s_chaine="Open File d:\liste_tab.txt for input as #1"
print s_chaine
Run Command s_chaine

le run command fonctionne avec la deuxième ligne mais pas avec la première (celle mise en commentaire) alors que les deux chaines de caractères sont bien censées produire le même résultat ... non ?
De plus cette deuxième ligne fonctionne alors que le nom du fichier dans l'Open File n'est mm pas mis entre guillemets (contrairement à la syntaxe indiquée dans la doc ...)
Le souci que j'ai comme Fabius ce n'est pas de lancer la commande DOS mais la constitution de la bonne chaine pour l'Open File ...
Sinon comme le dit Maurice ... il n'y a pas de raison à utiliser un Run Command dans ce cas là ... puisqu'un simple :

Code:

Open File repertoire+"liste_tab.txt" for input as #1

fonctionne ...
Par contre je veux bien prendre les paris que dès qu'un espace sera présent dans le nom d'un répertoire cette écriture va à nouveau stresser Mapinfo ...

Hors ligne

 

#16 Mon 17 November 2008 22:26

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

Re: Ouvrir toutes les tables présentes dans un répertoire.

Trois conclusions:
- l'aide en ligne se goure et la syntaxe est (ou peut être) Open File bidule.txt... sans guillemets
- Open File ne peut pas être intégré dans une chaine cmd="Open File"+variable+"..." suivie d'un Run Command cmd
- passer par DOS empêche l'utilisation de répertoires avec espaces ou accents etc... Ce n'est pas MapInfo qui cale mais DOS sad
Une solution: se passer de DOS. Il est tard mais je vous propose bientôt deux méthodes alternatives...

Hors ligne

 

#17 Tue 18 November 2008 08:49

magali di salvo
Participant actif
Lieu: Lyon
Date d'inscription: 21 Sep 2005
Messages: 70

Re: Ouvrir toutes les tables présentes dans un répertoire.

bonjour,
j'arrive comme un cheveux sur la soupe, ou alors j'ai mal compris le sujet mais j'avais eu le même problème voir
ce fil de discussion :  http://georezo.net/forum/viewtopic.php?id=52270
et en utilisant l'extrait de code fournit à l'époque par Maurice ça marchait très bien.

je remet à tout hasard, dans le fil ci-dessus, la dernière version du MB que j'avais déduit du code de Maurice (celui que j'avais joint initialement ne fonctionnait pas)...
c'est à adapter en fonction du contexte bien sûr  (désolée si je suis "hors sujet")

cordialement
magali di salvo Diren rhône-alpes

[EDIT Maurice] comme il est un peu compliqué, car adapté à ta problématique, je joins, dans le post suivant, un code plus centré sur le présent sujet (qui contient les mêmes "fondamentaux" ...mais eux seuls)

Hors ligne

 

#18 Tue 18 November 2008 09:07

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

Re: Ouvrir toutes les tables présentes dans un répertoire.

Aargh ...grillé !!
Pas hors sujet du tout Magali, mais j'avais moi même oublié(!) ma contribution à tes efforts sad
Et je joins un bout de code plus simple mais plus adapté au présent sujet qui montre
- deux façons de désigner un répertoire (API, plus puissant et FileOpenDialog, plus simple et "rustique" maist qui laisse le problème des répertoires vides ou qui ne contiennent pas de TAB)
- un exemple de listing des TABs contenus dans le répertoire désigné, à l'aide d'un PopUpMenu (d'autres sont possibles, comme le passage de la variable liste à une liste caractère du genre (tab1;tab2;...tabx), utile dans certains cas)
Bien sûr il faut le compiler pour tester son comportement smile


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

Hors ligne

 

#19 Wed 19 November 2008 09:46

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

Re: Ouvrir toutes les tables présentes dans un répertoire.

Bonjour,

Pour le suvi: le code fournit par maurice fonctionne donc merci à tous pour votre aide et désolé de ne pas avoir ressorti le sujet traitant de ce probleme, j'avais pourtant recherché un probleme similaire avant de me décider a créer un post wink

Hors ligne

 

#20 Wed 19 November 2008 10:33

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

Re: Ouvrir toutes les tables présentes dans un répertoire.

Pas de problème, c'est moi qui aurait dû me souvenir... (faut que je pense à aller consulter !  big_smile)
Je ferai un peu de ménage dans le sujet si vous êtes d'accord, pour épargner aux futurs lecteurs nos hésitations...

Hors ligne

 

#21 Wed 19 November 2008 19:47

snaileater
Participant actif
Date d'inscription: 5 Nov 2008
Messages: 121

Re: Ouvrir toutes les tables présentes dans un répertoire.

Je trouve personnellement qu'il est toujours un peu dommage de modifier un topic sachant que dans une question se trouve souvent des considérations qui certes peuvent donner l'impression de partir dans tous les sens mais qui globalement restent utiles ... je pense ...

en l'occurrence dans ce topic il y a deux points "annexes" que je trouve parfois assez "galère" :

1] La passation d'une chaine de caractère pour interprétation dans Run Command

2] Les problèmes potentiellement liés avec les processus asynchrones lancés par "Run Program"

Mais ces considérations ne sont pas valables que pour Mapinfo d'ailleurs ...

Hors ligne

 

#22 Wed 19 November 2008 22:19

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

Re: Ouvrir toutes les tables présentes dans un répertoire.

Bon, alors je ne touche à rien smile
- les commandes interprétées: pas difficile à faire (penser au chr$(34) pour les guillemets et à un print pour vérifier) elles sont à utiliser chaque fois qu'une variable se trouve dans la commande. Mais on a vu que certaines ne marchent pas: peut être - à vérifier - toutes celles que l'on a pas le droit d'utiliser dans la FMB ?
- les processus asynchrone (joli mot mais inconnu de moi (!); je suppose qu'il s'agit du cmd.exe évoqué dans ce fil): la façon de récupérer le "focus" n'est pas résolue (si ce n'est avec un note "bla, bla" ...pas très élégant sad)
ps: une astuce un peu plus jolie est de remplacer ce note "bla, bla" par Set Window 1011 Front, la fenêtre 1011 étant celle de l'application MapInfo... smile
re-ps: j'ai pas résisté !! j'ai fait (un peu) le ménage...

Hors ligne

 

#23 Thu 20 November 2008 09:41

Robin
GeoRezo forever
Lieu: France
Date d'inscription: 31 Aug 2005
Messages: 13614
Site web

Re: Ouvrir toutes les tables présentes dans un répertoire.

Si quelqu'un souhaite faire une synthèse, il est le bienvenu. A terme, les synthèses pourront aller dans le Wiki pour référence ultérieure, à moins que quelqu'un ne veuille le faire dès à présent, je le guiderais à travers le wiki smile

Robin.

Hors ligne

 

Pied de page des forums

Powered by FluxBB