if ( #comsion ) = 0 aun teniendo 0.72 me lo toma en CERO


([N1] leonardo daniel velazquez fuentes) #1

Hola a todos, tengo un detalle con un IF que no se como arreglar

resulta que tengo un campo comision y en algunos casos es muy baja, debajo del 1, osea 0.90, 0.30, etc, etc.

para validar los campos requeridos tengo esto y manda mensaje si hay campos vacios

El detalle es que la comision siempre me la marca como vacia aunque sea mayor a cero, digo hablando logicamente un valor 0.60 es mayor a un valor 0.00 o no ??

if ( #comision = 0 )
    Set(Validar, 1)
    Libre
if ( isEmpty(#decripcion) )
    Set(Validar, 1)
    Libre
if ( Validar = 1 )
    Mensaje("hay campos vacios")
    set retorno "NO"
    etc
else
   procesar boton Aceptar para que guarde
   libre

esto para que al final valide los campos vacios


([N1] wikan) #2

Debug al canto.
No se si dependerá del separador de decimales, vete a saber. Mejor el debug para quitar dudas


([N1] mrv1) #3

Sugerencia:

para estos casos

if ( #comision = 0 )

los convierto a String

Ejemplo:
if ( rightJustified(numberToString(#comision, “f”, 2), 12, “0”) = rightJustified(numberToString(0, “f”, 2), 12, “0”) )

Caso muy especifico de Velneo para valores numericos puros

Esta condicion es larga pero segura.


([N3] NexusFireMan) #4

Buenos días,

El planteamiento lo tienes bienes realizado pero si te para a leer la condición dice:

if ( #comision = 0 )

O lo que es lo mismo:

#comision es exactamente igual a 0

Sin embargo lo que tú quieres saber es:

#comision es menor que 0

Para esto tendrías que poner:

if ( #comision < 0 )

A todos nos pasa de vez en cuando que no leemos bien el código y andamos dando vueltas hasta que damos con ello.

También recuerda que no es lo mismo compara contra un valor entero “0, 1, 2, 3,…” que contra un valor con decimales “0.00, 1.00, 2.00, …” al fin y al cabo los números, o mas bien, las variables que contengan esos números, pueden tener o no decimales, todo depende de como declares.

Animo y un saludo.


([N3] pacosatu) #5

Hola leonardo daniel velazquez fuentes.

Vamos a ver, (#comision = 0) es Verdadero si (#comision = 0) y es siempre falso si (#comision = 0.60).

No hay fantasmas ni comportamientos extraños, de lo contrario deberíamos dejar de usar Velneo inmediatamente y pedir daños y perjuicios.

Revisa tu código (la variable Validar se pone a 1 de varias maneras), revisa los decimales que admite el campo #comision, revisa el control numérico que usas para editar el campo #comision, etc.

Saludos
Paco Satué


([N1] leonardo daniel velazquez fuentes) #6

pues ya lo solucione, talvez no de la mejor manera, pero ya …

PERO QUE MAL… QUE TE DIGA QUE ES " CERO " CUANDO ES 0.63 0.99 ETC., EN FIN

P.D. ya estaba revisado el campo en la B.D., tambien el control de edicion numerica, incluso cree una variable comision y le asigne el dato 0.63 y el if (comision = 0) y entra…

Set ( MILLAS_STR, numberToString(#PRECIO_MILLAS, "f", 2) )
Set ( POS_PUNTO, indexOfString(MILLAS_STR, ".", 0, 0) )
Set ( ENTEROS, stringToNumber(mid(MILLAS_STR, 0, POS_PUNTO)) )
Set ( DECIMALES, stringToNumber(mid(MILLAS_STR, POS_PUNTO+1, 2)) )

ASI SI FUNCIONO
If ( ( ENTEROS = 0) & ( DECIMALES = 0) )  

([N3] pacosatu) #7

Hola leonardo daniel velazquez fuentes.

Viendo tu código para determinar si un valor numérico decimal es cero, solo se me ocurren 2 palabras im…presionante.
Por favor, no cuentes a la competencia cómo resolvemos este problema, porque las risas se van a oir desde muy lejos.

Sigo insistiendo, la condición (#CAMPO = 0) debe funcionar correctamente, de lo contrario tienes un Bug.

Saludos
Paco Satué


([N1] wikan) #8

Acabo de hacer una prueba muy muy rápida.
imagen

Como dije desde el principio, hay que tener en cuesta el separador de decimales.
En mi caso entra en el segundo if

Aún así, creo que no debería entrar.


([N3] pacosatu) #9

Hola Manuel.

Creo que no es problema de comas ni puntos.
Los valores numéricos literales en Velneo, como en la mayoría de las plataformas, se introducen con el punto como separador decimal.

El comando Set (IMPORTE, 0,63) te tiene que dar error.

Otra cuestión es la presentación de los datos numéricos en pantalla o el uso de comandos StringToNumber o NumberToString, donde los puntos y las comas sí que tienen importancia.

De todas formas, si esto fuera de otro modo, tendría que revisar urgentemente todos mis programas.

Saludos
Paco Satué


([N3] NexusFireMan) #10

[quote quote=43961]El comando Set (IMPORTE, 0,63) te tiene que dar error.
[/quote]

En teoría sí y en teoría no.

Si nos damos cuenta cuando usamos NumbreToString tenemos varias formas de indicar como queremos la conversión del número, esto también ataña a la forma en la que se gestiona en las comparativas.

Al usar el numero 0.63 si lo esta haciendo bien puesto que no es 0, pero por el contrario si comparamos 0,63 da positivo ya que solo esta comparando el primer carácter y entiende que lo que hay después de la coma es otra cosa, parámetros por decirlo a groso modo.

Pero para realizar bien la comparación, como dije antes, es mejor usar mayor o menor si sabes que puedes encontrarte decimales y usar solo el igual para casos en los que los valores a comparar sean absolutos.

De esta manera te puedes evitar muchos quebraderos de cabeza.

Un saludo.


([N4] gontorre) #11

Buenos días Leonardo

Me picaba la curiosidad y he creado un manejador de eventos en uno de mis formularios de introducción de líneas de detalle.

if (#PRECIO=0)
Mensaje(“El precio es cero”,)
else
Mensaje(“El precio NO es cero”,)

Me funciona siempre. Ponga el valor que ponga en el precio siempre me detecta si es cero o no.

No sé que te puede ocurrir, pero si no funcionaran esas comparaciones yo tendría (e imagino que todos) un problema muy grave.

Un saludo


([N1] wikan) #12

El señor Paco tiene toda la razón.

set(IMPORTE, 0,63)
Da error en el inspector de errores.

Así que queda claro que los números literales en código deben ir con punto.

Leonardo, usa el debug para verificar lo que estás comparando, además revisa si el campo está declarado de manera correcta. Faltaría más que una plataforma especializada en aplicaciones empresariales tenga errores con estas cosas :wink:


([N1] wikan) #13

¿Dices que siempre entra en que es cero?


([N3] blanyi) #14

Hola Leonardo Daniel Velasques Fuentes y demas colegas.

He realizado la prueba con un campo númerico que contiene decimales y me funciona sin problemas. En una tabla tengo un campo llamado TARIFA_CREE al que le he asignado un valor de 0.8 que al validarlo, segun se muestra en la parte derecha del archivo adjunto, entra por donde debe ser, presentando el mensaje correcto para cada caso.

La imagen tambie presenta, del lado izquierdo, como tengo definido el campo.

Espero sirva para que se encuentre el error.

Dios les bendiga.

YIMY MORA ACONCHA



([N4] gontorre) #15

Buenas tardes Manuel

No. Me refiero a que detecta en cada caso si es cero o no lo es. Vamos, que funciona como es debido.

Un saludo


([N1] leonardo daniel velazquez fuentes) #16

PUES CON LA NOVEDAD, DE QUE YA FUNCIONO LA VALIDACION… PORQUE NI SE… CAMBIE LOS IFs POR ELSEIF

Asi estaba.

Set ( VALIDAR, 0 )
If ( isEmpty(#NACIONALIDAD) )
      Set ( VALIDAR, 1 )
    libre
if ( isEmpty(#SINGLE_TEAM) )
      Set ( VALIDAR, 1 )
    libre
if ( isEmpty(#ANTIGUEDAD) )
      Set ( VALIDAR, 1 )
    libre
if ( #PRECIO_MILLAS = 0 )
      Set ( VALIDAR, 1 )
    libre
Libre
If ( VALIDAR = 1 )
      Mensaje ( "Some fields are empty", Exclamación, , "Alert" )
      Interfaz: Establecer foco ( ED_NACIONALIDAD )
      Set retorno proceso = NO
Else
      Interfaz: Aceptar
Libre

Asi quedo…

Set ( VALIDAR, 0 )
If ( isEmpty(#NACIONALIDAD) )
      Set ( VALIDAR, 1 )
Else if ( isEmpty(#SINGLE_TEAM) )
      Set ( VALIDAR, 1 )
Else if ( isEmpty(#ANTIGUEDAD) )
      Set ( VALIDAR, 1 )
Else if ( #PRECIO_MILLAS = 0 )
      Set ( VALIDAR, 1 )
Libre
If ( VALIDAR = 1 )
      Mensaje ( "Some fields are empty", Exclamación, , "Alert" )
      Interfaz: Establecer foco ( ED_NACIONALIDAD )
      Set retorno proceso = NO
Else
      Interfaz: Aceptar
Libre

([N1] wikan) #17

A ver, Leonardo. Por eso no habrá arreglado, seguramente te estaba entrando por otro if entonces. De ahí que el debug tenga sentido.