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 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

 

Pied de page des forums

Powered by FluxBB