Funcion VAL

22/09/2004 - 22:54 por Wilmer | Informe spam
Quisiera saber si la funcion VAL redondea una cifra con
decimales.
Gracias por la ayuda

Preguntas similare

Leer las respuestas

#6 Fernando D. Bozzo
27/09/2004 - 12:52 | Informe spam
Hola Pedro, lo que dice Luis María sigue siendo correcto en todo sentido.
El ejemplo que ponés te muestra mal los valores porque están siendo
redondeados por el SET DECIMALS TO 1 que pusiste, esto afecta a cualquier
comando de visualización: El textbox, ?, etc.
Esto es así porque estás indicando que se muestre con 1 sólo decimal,
entonces se redondea el primero (que es un 9) de acuerdo al valor del
segundo (que es un 5), por lo que el redondeo produce un nuevo entero: El
redondeo matemático de 123,95 con un decimal es 124,0

Ahora comento en partes de tu mensaje:

WAIT WINDOW oform.text1.Value+0.01 && 123,96



correcto

Sin embargo desde la ventana de comandos escribes

? _screen.ActiveForm.text1.Value+0.01 && Y muestra 124,01



El comando '?' es para visualizar datos, por ende redondea la salida

Aparte de que el primer textbox contiene 124,0, con lo que al editar ,
partimos de un valor erróneo.



Esto es erróneo, porque el primer textbox no contiene 124, sino 123,95 ,
pero como el textbox es un control de entrada/salida de datos muestra el
valor indicado con SET DECIMALS. La prueba de ello es que el segundo
textbox toma el valor del primero y le suma 0,01 y muestra 123,96 como
hacés notar al final de tu mensaje.
Para ver ambos decimales en tu mismo ejemplo sólo cambiá el SET DECIMALS a
2 y ejecutá el mismo form.
Otra forma de verificar el valor real de una variable o propiedad es
asignándolo a una variable temporal y mostrándolo con DISPLAY MEMORY LIKE
(variable), lo que te muestra el valor como se visualiza redondeado y
entre paréntesis el valor real que está manejando VFP.

Saludos,

Fernando D. Bozzo


Fernando D. Bozzo (Argentino)
Ciudad de Coslada - Madrid (España)
Habitante de "La Comunidad del Zorro"

-
PortalFox :: Nada corre como un zorr
http://www.portalfox.co

PortalFox - NNTP Forum Gatewa
Respuesta Responder a este mensaje
#7 Pedro José Hernández Muñoz
27/09/2004 - 14:51 | Informe spam
Hola

En este caso concreto, al utilizar _screen.activeform.text1, se utiliza el
valor mostrado ya redondeado, incluso al acceder desde otro form creado
posteriormente (adjuntos los valores en el depurador):

LOCAL nValoroForm ,;

nValorActiveForm

PUBLIC oForm as Form

PUBLIC oform2 as form



PUBLIC nVal

SET DECIMALS TO 1

SET FIXED Off

nVal=VAL("123,95") && nVal = 124

oForm = CREATEOBJECT("form")

oform.AddObject("Text1","textbox")

oform.AddObject("Text2","textbox")

oform.AddObject("Text3","textbox")

oform.Text1.ControlSource = "nVal" && Aqui Text1.Value = 124

oform.Text1.InputMask = "999.99"

oform.text1.visible = .t.

oform.text2.visible = .t.

oform.text2.top = 30

oform.text2.value = oform.text1.value + 0.01 && 124,01 ( El redondeo lo
hace en text1 )

oform.text3.visible = .t.

oform.text3.top = 60

oform.text3.value = nVal

oform.Show



oform2 = CREATEOBJECT("form")

oform2.AddObject("Text1","textbox")

oform2.text1.value = oform.text1.value

oform2.text1.visible = .t.

oform2.show



WAIT WINDOW oform.text1.Value+0.01

MESSAGEBOX(oform.text1.Value+0.01)



nValoroForm = oform.text1.Value && 124

nValorActiveForm = _screen.ActiveForm.text1.Value && 124



ACTIVATE WINDOW trace

suspend



Te respondo tambien:


>Sin embargo desde la ventana de comandos escribes

>? _screen.ActiveForm.text1.Value+0.01 && Y muestra 124,01

El comando '?' es para visualizar datos, por ende redondea la salida



No estoy de acuerdo. El redondeo se produjo ya en Text1, si lo hiciera en
esa sentencia devolveria 124:

? _screen.Activeform.Text1.Value + 0.01
123,95 + 0.01 = 123.95 -> Al redondear con ? = 124

Sin embargo:
nValor = _screen.Activeform.Text1.Value + 0.01 && Almacena 124.01


>Aparte de que el primer textbox contiene 124,0, con lo que al editar ,
>partimos de un valor erróneo.

Esto es erróneo, porque el primer textbox no contiene 124, sino 123,95 ,



No estoy de acuerdo. Al utilizar el valor de Text1 del primer form o bien
desde la ventana de comandos o bien desde otro form tambien devuelve 124,
tal como muestro en el codigo del principio.

Desde la ventana de depuración:

nValorActiveForm = _screen.ActiveForm.text1.Value && Contiene 124
nValoroForm = oform.text1.Value && Contiene 124
nTextActiveForm = _screen.ActiveForm.text1.Text && Contiene 124

y en el segundo form muestro el valor de Text1 del primer form, tambien
contiene 124


Para ver ambos decimales en tu mismo ejemplo sólo cambiá el SET DECIMALS a
2 y ejecutá el mismo form.


Gracias, lo tendre en cuenta ... :-)

Otra forma de verificar el valor real de una variable o propiedad es
asignándolo a una variable temporal y mostrándolo con DISPLAY MEMORY LIKE
(variable), lo que te muestra el valor como se visualiza redondeado y
entre paréntesis el valor real que está manejando VFP.


Vale, entonces le digo al usuario que escriba eso en la ventana de comandos
o donde ? :-)



Lo que yo pretendo decir es que,
1-Internamente en el form yo puedo utilizar el valor sin problemas (123.95)
2-Al acceder a la propiedad Value o Text del cuadro de texto Text1
externamente (mediante referencias _screen.activeform o oForm )obtengo el
valor redondeado (124).
3- Deduzco que al hacer el redondeo para mostrar, esta almacenando en Value
y Text el valor ya redondeado
4-En la ventana de depuración, si SET DECIMALS = 1 al utilizar VAL veo
valores redondeados


Se me escapa algo ?

Pedro José Hernández Muñoz

blog: http://pedrohdz.blogspot.com/
atom: http://pedrohdz.blogspot.com/atom.xml
"Fernando D. Bozzo" escribió en el mensaje
news:%
Hola Pedro, lo que dice Luis María sigue siendo correcto en todo sentido.
El ejemplo que ponés te muestra mal los valores porque están siendo
redondeados por el SET DECIMALS TO 1 que pusiste, esto afecta a cualquier
comando de visualización: El textbox, ?, etc.
Esto es así porque estás indicando que se muestre con 1 sólo decimal,
entonces se redondea el primero (que es un 9) de acuerdo al valor del
segundo (que es un 5), por lo que el redondeo produce un nuevo entero: El
redondeo matemático de 123,95 con un decimal es 124,0

Ahora comento en partes de tu mensaje:

>WAIT WINDOW oform.text1.Value+0.01 && 123,96

correcto

>Sin embargo desde la ventana de comandos escribes

>? _screen.ActiveForm.text1.Value+0.01 && Y muestra 124,01

El comando '?' es para visualizar datos, por ende redondea la salida

>Aparte de que el primer textbox contiene 124,0, con lo que al editar ,
>partimos de un valor erróneo.

Esto es erróneo, porque el primer textbox no contiene 124, sino 123,95 ,
pero como el textbox es un control de entrada/salida de datos muestra el
valor indicado con SET DECIMALS. La prueba de ello es que el segundo
textbox toma el valor del primero y le suma 0,01 y muestra 123,96 como
hacés notar al final de tu mensaje.
Para ver ambos decimales en tu mismo ejemplo sólo cambiá el SET DECIMALS a
2 y ejecutá el mismo form.
Otra forma de verificar el valor real de una variable o propiedad es
asignándolo a una variable temporal y mostrándolo con DISPLAY MEMORY LIKE
(variable), lo que te muestra el valor como se visualiza redondeado y
entre paréntesis el valor real que está manejando VFP.

Saludos,

Fernando D. Bozzo


Fernando D. Bozzo (Argentino)
Ciudad de Coslada - Madrid (España)
Habitante de "La Comunidad del Zorro"


PortalFox :: Nada corre como un zorro
http://www.portalfox.com

PortalFox - NNTP Forum Gateway
Respuesta Responder a este mensaje
#8 Javier Herrera
27/09/2004 - 16:37 | Informe spam
Y si en lugar de poner "," le pones "."

SET DECIMALS TO 1
? VAL("123.95") && Muestra 124.0
? VAL("123.94") && Muestra 123.9

SET DECIMALS TO 2
? VAL("123.95") && Muestra 123.95
? VAL("123.94") && Muestra 123.94



Hola
No estoy de acuerdo ...

SET DECIMALS TO 1
? VAL("123,95") && Muestra 124,0


Pedro José Hernández Muñoz

blog: http://pedrohdz.blogspot.com/
atom: http://pedrohdz.blogspot.com/atom.xml
"Luis María Guayán" escribió


en el mensaje
news:%
La función VAL no redondea, pero convierte a valor




numérico una cadena de
caracteres que contiene números hasta 16 caracteres, si




es mayor a 16
carcateres SI redondea.

? VAL("125235874878457827")

Tener en cuenta que VAL() convierte los caracteres de




izquierda a derecha,
hasta la aparición de un caracter no numérico. Según




que tengas
configurado
como caracter de punto decimal, puede ser el caso de




que te redondea a un
valor entero, como el siguiente ejemplo:

? VAL("712.52")
? VAL("712,52")

Luis María Guayán
Tucumán, Argentina
________________________________
SysOp de www.PortalFox.com
Microsoft Visual FoxPro MVP
________________________________
La palabra imposible solo figura
en el diccionario de los tontos


"Wilmer" escribió




en el mensaje
news:04a201c4a0e6$6c9e6a60$
> Quisiera saber si la funcion VAL redondea una cifra




con
> decimales.
> Gracias por la ayuda






.

Respuesta Responder a este mensaje
#9 Pedro José Hernández Muñoz
27/09/2004 - 17:57 | Informe spam
Hola

No se trata de eso ... pero como nadie lee

"Javier Herrera" escribió en el
mensaje news:44e301c4a49f$7a4739a0$
Y si en lugar de poner "," le pones "."

SET DECIMALS TO 1
? VAL("123.95") && Muestra 124.0
? VAL("123.94") && Muestra 123.9

SET DECIMALS TO 2
? VAL("123.95") && Muestra 123.95
? VAL("123.94") && Muestra 123.94



Hola
No estoy de acuerdo ...

SET DECIMALS TO 1
? VAL("123,95") && Muestra 124,0


Pedro José Hernández Muñoz

blog: http://pedrohdz.blogspot.com/
atom: http://pedrohdz.blogspot.com/atom.xml
"Luis María Guayán" escribió


en el mensaje
news:%
La función VAL no redondea, pero convierte a valor




numérico una cadena de
caracteres que contiene números hasta 16 caracteres, si




es mayor a 16
carcateres SI redondea.

? VAL("125235874878457827")

Tener en cuenta que VAL() convierte los caracteres de




izquierda a derecha,
hasta la aparición de un caracter no numérico. Según




que tengas
configurado
como caracter de punto decimal, puede ser el caso de




que te redondea a un
valor entero, como el siguiente ejemplo:

? VAL("712.52")
? VAL("712,52")

Luis María Guayán
Tucumán, Argentina
________________________________
SysOp de www.PortalFox.com
Microsoft Visual FoxPro MVP
________________________________
La palabra imposible solo figura
en el diccionario de los tontos


"Wilmer" escribió




en el mensaje
news:04a201c4a0e6$6c9e6a60$
> Quisiera saber si la funcion VAL redondea una cifra




con
> decimales.
> Gracias por la ayuda






.

Respuesta Responder a este mensaje
#10 Fernando D. Bozzo
27/09/2004 - 18:27 | Informe spam
Hola Pedro, ahora sí pude ver mejor lo que pasa.
Pareciera que en algún momento VFP se olvida de que SET DECIMALS es sólo
para formatear la salida y es tomado por el value del control. Luego,
cualquier intento de cambiar nuevamente el SET DECIMALS a 2 o mas no tiene
ningún efecto una vez que se asignaron los valores.

Ahora que queda clara la cuestión, pregunto: ¿y es necesario el SET DECIMALS
a 1 o sólo era para notificar del problema?

Saludos,

Fernando D. Bozzo

"La programación es más eficiente cuando menos se piensa en el código"




"Pedro José Hernández Muñoz" escribió en
el mensaje news:
Hola

En este caso concreto, al utilizar _screen.activeform.text1, se utiliza el
valor mostrado ya redondeado, incluso al acceder desde otro form creado
posteriormente (adjuntos los valores en el depurador):

LOCAL nValoroForm ,;

nValorActiveForm

PUBLIC oForm as Form

PUBLIC oform2 as form



PUBLIC nVal

SET DECIMALS TO 1

SET FIXED Off

nVal=VAL("123,95") && nVal = 124

oForm = CREATEOBJECT("form")

oform.AddObject("Text1","textbox")

oform.AddObject("Text2","textbox")

oform.AddObject("Text3","textbox")

oform.Text1.ControlSource = "nVal" && Aqui Text1.Value = 124

oform.Text1.InputMask = "999.99"

oform.text1.visible = .t.

oform.text2.visible = .t.

oform.text2.top = 30

oform.text2.value = oform.text1.value + 0.01 && 124,01 ( El redondeo lo
hace en text1 )

oform.text3.visible = .t.

oform.text3.top = 60

oform.text3.value = nVal

oform.Show



oform2 = CREATEOBJECT("form")

oform2.AddObject("Text1","textbox")

oform2.text1.value = oform.text1.value

oform2.text1.visible = .t.

oform2.show



WAIT WINDOW oform.text1.Value+0.01

MESSAGEBOX(oform.text1.Value+0.01)



nValoroForm = oform.text1.Value && 124

nValorActiveForm = _screen.ActiveForm.text1.Value && 124



ACTIVATE WINDOW trace

suspend



Te respondo tambien:


> >Sin embargo desde la ventana de comandos escribes
>
> >? _screen.ActiveForm.text1.Value+0.01 && Y muestra 124,01
>
> El comando '?' es para visualizar datos, por ende redondea la salida

No estoy de acuerdo. El redondeo se produjo ya en Text1, si lo hiciera en
esa sentencia devolveria 124:

? _screen.Activeform.Text1.Value + 0.01
123,95 + 0.01 = 123.95 -> Al redondear con ? = 124

Sin embargo:
nValor = _screen.Activeform.Text1.Value + 0.01 && Almacena 124.01


> >Aparte de que el primer textbox contiene 124,0, con lo que al editar ,
> >partimos de un valor erróneo.
>
> Esto es erróneo, porque el primer textbox no contiene 124, sino 123,95 ,

No estoy de acuerdo. Al utilizar el valor de Text1 del primer form o bien
desde la ventana de comandos o bien desde otro form tambien devuelve 124,
tal como muestro en el codigo del principio.

Desde la ventana de depuración:

nValorActiveForm = _screen.ActiveForm.text1.Value && Contiene 124
nValoroForm = oform.text1.Value && Contiene 124
nTextActiveForm = _screen.ActiveForm.text1.Text && Contiene 124

y en el segundo form muestro el valor de Text1 del primer form, tambien
contiene 124


> Para ver ambos decimales en tu mismo ejemplo sólo cambiá el SET DECIMALS


a
> 2 y ejecutá el mismo form.
Gracias, lo tendre en cuenta ... :-)

> Otra forma de verificar el valor real de una variable o propiedad es
> asignándolo a una variable temporal y mostrándolo con DISPLAY MEMORY


LIKE
> (variable), lo que te muestra el valor como se visualiza redondeado y
> entre paréntesis el valor real que está manejando VFP.
Vale, entonces le digo al usuario que escriba eso en la ventana de


comandos
o donde ? :-)



Lo que yo pretendo decir es que,
1-Internamente en el form yo puedo utilizar el valor sin problemas


(123.95)
2-Al acceder a la propiedad Value o Text del cuadro de texto Text1
externamente (mediante referencias _screen.activeform o oForm )obtengo el
valor redondeado (124).
3- Deduzco que al hacer el redondeo para mostrar, esta almacenando en


Value
y Text el valor ya redondeado
4-En la ventana de depuración, si SET DECIMALS = 1 al utilizar VAL veo
valores redondeados


Se me escapa algo ?

Pedro José Hernández Muñoz

blog: http://pedrohdz.blogspot.com/
atom: http://pedrohdz.blogspot.com/atom.xml
"Fernando D. Bozzo" escribió en el mensaje
news:%
> Hola Pedro, lo que dice Luis María sigue siendo correcto en todo


sentido.
> El ejemplo que ponés te muestra mal los valores porque están siendo
> redondeados por el SET DECIMALS TO 1 que pusiste, esto afecta a


cualquier
> comando de visualización: El textbox, ?, etc.
> Esto es así porque estás indicando que se muestre con 1 sólo decimal,
> entonces se redondea el primero (que es un 9) de acuerdo al valor del
> segundo (que es un 5), por lo que el redondeo produce un nuevo entero:


El
> redondeo matemático de 123,95 con un decimal es 124,0
>
> Ahora comento en partes de tu mensaje:
>
> >WAIT WINDOW oform.text1.Value+0.01 && 123,96
>
> correcto
>
> >Sin embargo desde la ventana de comandos escribes
>
> >? _screen.ActiveForm.text1.Value+0.01 && Y muestra 124,01
>
> El comando '?' es para visualizar datos, por ende redondea la salida
>
> >Aparte de que el primer textbox contiene 124,0, con lo que al editar ,
> >partimos de un valor erróneo.
>
> Esto es erróneo, porque el primer textbox no contiene 124, sino 123,95 ,
> pero como el textbox es un control de entrada/salida de datos muestra el
> valor indicado con SET DECIMALS. La prueba de ello es que el segundo
> textbox toma el valor del primero y le suma 0,01 y muestra 123,96 como
> hacés notar al final de tu mensaje.
> Para ver ambos decimales en tu mismo ejemplo sólo cambiá el SET DECIMALS


a
> 2 y ejecutá el mismo form.
> Otra forma de verificar el valor real de una variable o propiedad es
> asignándolo a una variable temporal y mostrándolo con DISPLAY MEMORY


LIKE
> (variable), lo que te muestra el valor como se visualiza redondeado y
> entre paréntesis el valor real que está manejando VFP.
>
> Saludos,
>
> Fernando D. Bozzo
>
>
> Fernando D. Bozzo (Argentino)
> Ciudad de Coslada - Madrid (España)
> Habitante de "La Comunidad del Zorro"
>
>
> PortalFox :: Nada corre como un zorro
> http://www.portalfox.com
>
> PortalFox - NNTP Forum Gateway


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida