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

GEODATA DAYS 2024

#1 Thu 23 February 2006 16:35

guidodo
Participant occasionnel
Lieu: Saint-Maur-des-Fossés
Date d'inscription: 4 Jan 2006
Messages: 26

Comment réaliser une double itération dans MapBasic

Bonjour à tous,

Je vais essayer d'exposer mon problème le plus clairement possible !

J'ai une base Access déclarée en ODBC avec deux tables (1: Continents, 2: Pays) contenant les coordonnées X/Y des centroides des objets. L'objectif est de créer un MBX qui créé automatiquement une table mapinfo par enregistrement dans mes 2 tables.

Pour ma table "Continents", j'utilise le MBX suivant (trouvé sur ce forum), qui me créé effectivement mes 6 tables MI dans le répertoire voulu.

============
Declare Sub Main
Sub Main
dim a,b,c,d as string
dim ConnNum,i As Integer
For i= 1 to 6
  b="Select * From IP_ECH1_CONTINENTS WHERE ID_CONTINENT="+i+""
  c="DSN=BDD"
  d="ODBC"
  server link table b using c toolkit d into "ECH1_CONTINENTS" file "TABLES\test\ECH1_CONTINENTS\CONTINENT_"+i+""
Close all interactive
Server 1 Disconnect
next
End Sub
============


Les choses se corsent lorsque je veux réaliser la même chose pour la table "Pays" (209 enregistrements, donc 209 tables MI à créer). Le code est le suivant :

============
Declare sub main
Sub main
dim a,b,c,d as string
dim ConnNum,i As Integer
For i= 1 to 209
  b="Select * From IP_ECH2_PAYS WHERE ID_PAYS="+i+""
  c="DSN=BDD"
  d="ODBC"
  server link table b using c toolkit d into "ECH2_PAYS" file "TABLES\test\ECH2_PAYS\PAYS_"+i+""
Close all interactive
Server 1 Disconnect
next
End Sub
============

Là encore, aucun souci, cela fonctionne. Cependant, je voudrais rajouter un "tri" dans cela, à savoir je voudrais pouvoir rajouter un "integer" j correspondant à ma colonne "ID_CONTINENT" dans la table "IP_ECH2_PAYS", afin de pouvoir ensuite automatiquement trier par continent les tables MI créées par le MBX dans des sous-répertoires (c'est à dire avoir 6 répertoires avec mes continents, contenant les tables MI correspondantes). Ce qui sous-entend de rajouter une deuxième condition du type (en gras/souligné)

================
  b="Select * From IP_ECH2_PAYS WHERE ID_CONTINENT="+j+" AND ID_PAYS="+i+""
  server link table b using c toolkit d into "ECH2_PAYS" file "TABLES\test\CONTINENT_"+j+"\PAYS_"+i+""
================


J'espère que je suis suffisamment clair, mais là je ne vois pas vraiment comment préciser davantange les choses.


Par avance merci pour vos idées !

Hors ligne

 

#2 Thu 23 February 2006 23:49

Damien BEAUSEIGNEUR
Participant assidu
Lieu: meyzieu
Date d'inscription: 5 Sep 2005
Messages: 425

Re: Comment réaliser une double itération dans MapBasic

On va commencer par les continents, ensuite incrémenter l'information pour les pays.

Declare Sub Main
Sub Main
dim a,b,c,d as string
dim ConnNum,i As Integer
Dim hdbc, hstmt As Integer
For j= 1 to 6
  For i = 1 to 209
    b="Select * From IP_ECH2_PAYS WHERE ID_CONTINENT="+j+" AND  ID_PAYS="+i+""
    c="DSN=BDD"
    d="ODBC"
    ConnNum = server execute
    hdbc = Server_Connect(”ODBC”, DSN=BDD;DLG=1”)
    hstmt = Server_Execute (hdbc,b)
    Server hstmt Fetch FIRST
    if not Server_eot(hstmt) then 'Si le pays i appartient au continent j
      server link table b using c toolkit d into "ECH2_PAYS" file  "TABLES\test\CONTINENT_"+j+"\PAYS_"+i+""
Close all interactive
   end if
   server Close hstmt
   Server 1 Disconnect
  next
next
End Sub

Celà devrais correspondre

Hors ligne

 

#3 Fri 24 February 2006 07:16

guidodo
Participant occasionnel
Lieu: Saint-Maur-des-Fossés
Date d'inscription: 4 Jan 2006
Messages: 26

Re: Comment réaliser une double itération dans MapBasic

Je vais essayer cela de suite, je reviens pour annoncer le résultat !!

Hors ligne

 

#4 Fri 24 February 2006 07:44

guidodo
Participant occasionnel
Lieu: Saint-Maur-des-Fossés
Date d'inscription: 4 Jan 2006
Messages: 26

Re: Comment réaliser une double itération dans MapBasic

Damien,

J'ai deux erreurs qui ressortent lors de la compilation, mais vu que je ne connais pas ces commandes, je ne sais pas comment les corriger...(J'utilise MB 6.0) :

(tab_creator.mb:15) Unrecognized command: execute.
(tab_creator.mb:23) Missing '=' in assignment to hstmt.

Un grand merci à toi en tout cas pour avoir proposé une solution à mon problème

Hors ligne

 

#5 Fri 24 February 2006 08:20

guidodo
Participant occasionnel
Lieu: Saint-Maur-des-Fossés
Date d'inscription: 4 Jan 2006
Messages: 26

Re: Comment réaliser une double itération dans MapBasic

Bon j'ai réussi à corriger les bugs, et maintenant cela fonctionne impecc. Il me créé bien les tables "pays" nommées comme il faut, et les mets dans le répertoire du continent d'appartenance.

Un grand merci à Damien !


Je copie colle la source du MB corrigée, on sait jamais ca peut intéresser :

-------------------------------
Sub main
dim a,b,c,d as string
dim ConnNum,i,j As Integer
Dim hdbc, hstmt As Integer
For j= 1 to 6
For i= 1 to 209
  b="Select * From IP_ECH2_PAYS WHERE ID_CONTINENT="+j+" AND ID_PAYS="+i+""
  c="DSN=BDD_BIODIVERSITE"
  d="ODBC"
    hdbc = Server_Connect("ODBC","DSN=BDD_BIODIVERSITE")
    hstmt = Server_Execute(hdbc,b)
    Server hstmt Fetch FIRST
    if not Server_eot(hstmt) then 'Si le pays i appartient au continent j
      server link table b using c toolkit d into "ECH2_PAYS_"+i+"" file  "TABLES\test\CONTINENT_"+j+"\PAYS_"+i+""
End if
Close all interactive
server hstmt close
Server 1 Disconnect
  next
next
End Sub
------------------------------

Hors ligne

 

Pied de page des forums

Powered by FluxBB