#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