#1 Thu 07 April 2005 10:58
- Virginie Girault
- Invité
Variable qui n'a pas la bonne valeur
De: V. GIRAULT
Bonjour a tous !
Contexte : J'ai une table qui contient un code postal de depart (texte) suivi d'un champ X1 et Y1 (entiers) puis un code postal arrivee (texte) suivi d'un champ X2 et Y2 qui sont egalement entiers) la table s'appelle outil.
Les champs X1, Y1, X2 et Y2 doivent recevoir les coordonnees X, Y du centroide des 2 codes postaux
Les champs X1 et Y1 sont initialises sans problemes. Reste les champs X2 et Y2.
C'est la que l'algo intervient : J'ouvre d'abord une table de toutes les communes de la region recencees. (Jusque la, ca va...) Je parcoure ensuite toute ma table (outil) et recupere la valeur de mon code postal arrivee pour aller le chercher dans ma table des communes, et une fois celui-ci trouve, je recupere les coordonnees X, Y du centroides de l'objet pour les mettre dans les champs X2 et Y2 du code arrivee correspondant dans la table outil. La, rien ne va plus.
Je pense que le raisonnement est bon. Mais cruellle deconvenue, vu qu'au depart ca ne fonctionnait pas correctement, j'ai fait moultes tests pour finalement me rendre compte que sur le positionnement de la premiere ligne de la table outil, j'essaye de recuperer ma variable code d'arrivee dont la valeur devrait etre 18197, mais en fait elle recupere une valeur fausse, 63113 et je ne vois pas pourquoi.
Pourtant je teste bien que je suis sur le premier enregistrement grace a une variable sur ROWID qui me rend effectivement 1, j'ai bien teste mon Alias pour controler si il attaque le bon champ qui est effectivement outil.CODGEO_B, bref, vous l'aurez compris, je ne sais plus par ou chercher parce que j'ai tout essaye et je ne comprend donc pas pourquoi MB s'evertue a me sortir une valeur de variable fausse sur test.
J'espere que ce n'est pas encore un coup des Alias, ou le fait de devoir passer une si simple commande sous forme de chaine (comme la derniere solution proposee a ma derniere question qui d'ailleurs, je ne vois pas pourquoi, devrait resoudre ce probleme.
Enfin voici mon algo (c'est une procedure.) et les divers temoins de mes tests infructueux en commentaires : Si vous pouvez y jeter un oeil ou avoir une petite idee, elles seront toutes deux bienvenues et salvatrices (ceci est lourd de sens.....) D'avance, Merci beaucoup !
Code:
Sub TestHorsDep Dim r, CentreX, Centrey as integer Dim ComCH1 as string Dim Alias_CODEP, Alias_AUV, Alias_OX2, Alias_OY2 as Alias COORDX2 = X2 COORDY2 = Y2 'Alias_OX2 = outil & . & COORDX2 'Alias_OY2 = outil & . & COORDY2 Fetch first from outil Do while not EOT(outil) Alias_OX2 = outil & . & COORDX2 Alias_OY2 = outil & . & COORDY2 COX2 = Alias_OX2 COY2 = Alias_OY2 r = outil.ROWID Note ROWID : +r 'Vrai, il est bien a 1 If COX2 = 0 and COY2 = 0 then Note COX2, COY2 : +COX2+ , +COY2 'Bon, tous les 2 a zero Alias_CODEP = outil & . & Name_c2 Note Alias_CODEP : +Alias_CODEP CODUSE = Val(Alias_CODEP) Note CODUSE1 : +CODUSE 'Faux, 63113, il devrait correspondre a 18197 Browse * from a 'Alias_AUV = a & . & col 'CODAUV = Val(Alias_AUV) Fetch first from a Do while not EOT (a) Alias_AUV = a & . & col CODAUV = Val(Alias_AUV) If CODAUV = CODUSE then Note CODAUV, CODUSE : + CODAUV+ , +CODUSE CentreX = CentroidX(ADCOAuv.obj) CentreY = CentroidY(ADCOAuv.obj) COX2 = CentreX COY2 = CentreY ComCh1 = Update outil Set X2 = & COX2 & where CODUSE = CODAUV Run Command ComCh1 'Update outil Set COORDY2 = COY2 where CODUSE = CODAUV Update outil Set COORDY2 = COY2 where Alias_CODEP = Alias_AUV Commit Table outil end if Fetch next from a loop 'Select * from a where CODUSE = CODAUV 'Select * from a where Val(Alias_CODEP) = CODAUV 'Note CODAUV, CODUSE : + CODAUV+ , +CODUSE 'COX2 = CentroidX(obj) 'COY2 = CentroidY(obj) 'Update outil Set COORDX2 = COX2 where Alias_CODEP = Alias_AUV 'Update outil Set COORDY2 = COY2 where Alias_CODEP = Alias_AUV 'Update outil Set COORDX2 = COX2 where CODUSE = CODAUV 'Update outil Set COORDY2 = COY2 where CODUSE = CODAUV 'Commit Table outil End if Fetch next from outil loop End Sub
#2 Tue 05 April 2005 17:06
- Christophe Barbier
- Invité
Re: Variable qui n'a pas la bonne valeur
Bonjour,
Je crois tout simplement que votre erreur vient du fait que vous utilisez
une clause ...Where... dans vos update avec une expression autre que
Rowid .
En l'occurrence rang .
Malheureusement, et c'est bien dommage, le SQL de MapInfo ne permet que
d'utiliser l'expression Rowid dans la clause ...Where.. de l'instruction
Update .
Christophe Barbier, I²G
#3 Thu 07 April 2005 12:11
- Francois Biju-Duval
- Invité
Re: Variable qui n'a pas la bonne valeur
Moi ce que je remarque, c'est un 'Commit Table outil' a l'interieur
d'une boucle 'Do while not EOT(outil) ... Fetch Next ... Loop'
Peut-etre MapBasic en perd-il ses reperes de Rowid de la table outil ?
Je vous propose de sortir 'Commit Table outil' de la boucle pour
n'enregistrer la table outil qu'a la fin de la procedure ...
#4 Thu 07 April 2005 12:12
- Frédéric Renversez
- Invité
Re: Variable qui n'a pas la bonne valeur
Bonjour,
Un conseil pour l'utilisation des alias en Mapbasic :
utilisez les toujours de cette facon :
Alias = MaTable + . + MaColonne
MaVariableDuTypeDeMaColonne = Alias
Je ne suis pas sur que MaVariable = Val(Alias) soit tres bien
compris par MB. Mais je me trompe peut-etre.
Sinon dans votre routine on ne distingue pas ce qu'est name_c2,
et surtout ou elle est affectee si c'est une variable. Mais bon
si votre alias_CODEP est bon, et que votre CODUSE ne l'est pas
c'est que Val(Alias_codep) renvoie n'importe quoi.
J'espere que j'ai pu vous aiguiller sur la bonne piste.
Frederic Renversez
Ingenieur Developpement / SIG
I2G
www.i2g.fr
#5 Thu 07 April 2005 16:13
- Virginie Girault
- Invité
Re: Variable qui n'a pas la bonne valeur
De: V.Girault
J'ai peut-etre trouve la solution !
Apres avoir epluche toutes vos solutions, remplacement des caracteres & par + dans les affectations des Alias, place le Commit en dehors de la boucle, rien n'y a fait, on etait toujours au meme stade de valeurs des variables.
Il faut savoir qu'avant que cette procedure soit lancee, a quelques lignes plus haut se trouve l'algo de mon precedent message -ALGO-1 (Update qui ne marche pas...) ou j'attaque egalement la table outil, en lui faisant des Update sur test de rowid avec une autre table.
J'ai donc d'abord essaye de mettre le ROWID (a la fin de ALGO-1) a 1, ca ne changeait toujours rien. je l'ai donc retire et ai demande d'afficher uniquement la valeur du ROWID sachant que l'on etait a la fin de la table puisque c'etait une lecture ligne a ligne. En effet, j'obtenais 202. Par contre en testant les variables pour l'algo actuel (ALGO+1), et bien la, je recupere bien 18197 dans la bonne variable. je retire mon commentaire dans ALGO -1 et la je re-obtient les mauvaises variables.
Du coup, j'en deduit que ALGO-1 n'est pas innocent dans les mauvaises valeurs dans les variables et donc je met un Fetchlast from outil a la fin de ALGO-1.
Je teste ALGO+1 qui tourne rondement. Qu'en pensez-vous ?
#6 Thu 07 April 2005 15:34
- Jplartigau
- Invité
Re: Variable qui n'a pas la bonne valeur
Bonjour
Je pense qu'il y a plus simple pour arriver au resultat souhaite.
Primo je reformule la problematique pour m'assurer que je repond bien a la question
Tu disposes de deux tables
la premiere
OUTIL
elle contient au moins les champs suivants (noms des champs generiques)
CODE_POSTAL1 char(n)
X1 entier
Y1 entier
CODE_POSTAL2 char(n)
X2 entier
Y2 entier
La seconde
COMMUNE
qui contient au moins le code postal
CODE_POSTAL char(n)
Si ce n'est pas le cas, pas la peine d'aller plus loin dans la lecture
Sinon
Le mieux est de disposer dans la table commune de deux champs numeriques
XC entier
YC entier
S'ils n'existent pas faire TABLE , GESTION TABLES , MODIFIER STRUCTURE
et ajouter les deux champs comme ci-dessus
Puis avec le menu table
Mettre a jour colonne
table mettre a jour table : COMMUNE
Utiliser une colonne de la table : COMMUNE
Colonne a mettre a jour : XC
Valeur : CentroidX(obj) (ou chercher dans expression)
et faire OK (il faut bien s'assurer que la carte est vue dans le systeme de projection souhaite et avec les unites souhaitees le metre en general)
Refaire la manipulation avec
Puis avec le menu table
Mettre a jour colonne
table mettre a jour table : COMMUNE
Utiliser une colonne de la table : COMMUNE
Colonne a mettre a jour : YC
Valeur : CentroidY(obj) (ou chercher dans expression)
Donc pour toutes les communes vous disposez du CODE_POSTAL et des coordonnees du centroide de l'objet.
Ensuite il faut faire
menu table
Mettre a jour colonne
table mettre a jour table : OUTIL
Utiliser une colonne de la table : COMMUNE
cliquer sur jointure
choisir l'option
ou la colonne :CODE_POSTAL1 : de la table OUTIL
correspond a : CODE_POSTAL : de la table COMMUNE
Colonne a mettre a jour : XC1
Valeur :
de la colonne jointe : XC
Et la theoriquement XC1 est mis a jour
On repete la manip comme cela
menu table
Mettre a jour colonne
table mettre a jour table : OUTIL
Utiliser une colonne de la table : COMMUNE
cliquer sur jointure
choisir l'option
ou la colonne :CODE_POSTAL1 : de la table OUTIL
correspond a : CODE_POSTAL : de la table COMMUNE
Colonne a mettre a jour : YC1
Valeur :
de la colonne jointe : YC
Et la theoriquement YC1 est mis a jour
menu table
Mettre a jour colonne
table mettre a jour table : OUTIL
Utiliser une colonne de la table : COMMUNE
cliquer sur jointure
choisir l'option
ou la colonne :CODE_POSTAL2 : de la table OUTIL
correspond a : CODE_POSTAL : de la table COMMUNE
Colonne a mettre a jour : XC2
Valeur :
de la colonne jointe : XC
Et la theoriquement XC2 est mis a jour
menu table
Mettre a jour colonne
table mettre a jour table : OUTIL
Utiliser une colonne de la table : COMMUNE
cliquer sur jointure
choisir l'option
ou la colonne :CODE_POSTAL2 : de la table OUTIL
correspond a : CODE_POSTAL : de la table COMMUNE
Colonne a mettre a jour : YC2
Valeur :
de la colonne jointe : YC
Et la theoriquement YC2 est mis a jour
Ainsi vos quatre colonnes sont actualisees sans aucune programmation.
Bons travaux
De: JPLARTIGAU