Paco,
The help has very few words on it:
...You can reference the variable using m. or m-> plus the variable name...
The only place - I think - this is ever mentioned in the vfp help.
What's more important:
If a variable has the same name as a field, Visual FoxPro always gives precedence to the field name.
Once you know you can adress a table field by it's name only, and you know a field name has the same naming rules as a variable name (starting with letter or _, etc etc), you actually already know there could be that precedence conflict.
The question what IS adressed, if both a variable and field of the same name exist, should come to any vfp developers mind, anyway, once you knwo you can adress a field of the selected workarea by the field name only. But don't be ashamed, it's something most developers will not think about, even if they work with foxpro for quite some time.
The typical and more dangerous m. problem is to read a table field, where you wanted to access a variable. But that's not your problem here. You WANT to adress the field instead of the variable. What is byting you is, that a variable name does not NEED to be adressed via m., but you are surely aware of that, as you also did use variables before, or didn't you?
So you actually did know that this could also adress a variable, if that field was not present. Just by the name of vartype() you know it's quite clear it was initially meant for variables. You know you can also check for fields, but you also are aware, this could also check for a variable, don't you? It's not called fieldtype(), is it? And so not knowing about m. does not explain, why you fell into that trap.
I used VARTYPE() in db update scripts, too, but VARTYPE(tablename.fieldname). Doesn't this sound much more concrete? In fact it can also fail with an object having the same name as a table, but the environment of an update script is limited, it's the only thing started.
So, you ask yourself where the variable comes from? Most probably by scatter memvar. And that is a thing of the past, when you bound controls to variables. It was replaced by buffering quite some time ago, still people use scattering and do create variables in an uncontrollable manner. There is SCATTER NAME to keep that encapsulated in one object variable, just don't fall for nameing that object like the table...
Actually, the ultimate way to check for fields would rather be AFIELDS() or looping FIELD

from 1 to FCOUNT() or using dbgetprop(). I would rather opt for adressing fields including the alias at any time! And so I'd opt for RELEASE (ALIAS()) and checking Type(Alias()+".Autre"). Check out the difference of Type() vs Vartype() to understand why you can work with Alias() here and need to put the field name into quotes.
Be verbose in your code, eg adressing alias.fieldname to adress a field, using the IN alias clause instead of depending on the correct alias being the active workarea. Always.
The other problem with m. is performance. As vfp checks for a field of that name first, an active workarea with many fields can slow down variable access. It seldom has a big effect, only in loops with many iterations. The clean way is to always adress variables with m., another way is to SELECT 0 before chewing on variables. You could also use arrays for all variables, always adressing variablename(1). Actually nothing, that would save you from your case, you just were not verbose enough.
Bye, Olaf.