Calculos y porcentajes VFP consultas

1,181 views
Skip to first unread message

Emiliano Sorba

unread,
Mar 13, 2014, 12:37:26 PM3/13/14
to vfpl...@googlegroups.com
Buenas, tengo un form con lo siguiente

Caja de texto 1 y 2

Y luego 3 y 4 (lo explico asi para poder separarlo ya que la mitad funciona perfecto.)

En la caja de texto 1 y 2 funcionan de la siguiente forma
En la caja de texto 1, colocas un valor, y la segunda hace un redondeo de múltiplo de 5

importe2 = thisform.txt1.Value / 5
importe2 = ROUND(importe2, 0)
importe2 = importe2 *5

thisform.txt2.Value = importe2

Hasta ahi todo perfecto me redondea el valor a multiplos de 5... ej txt1 = 107.58, txt2 = 110

Pero luego debo calcular un porcentaje, entonces tengo txt 1, 3 y 4... donde en txt1 pongo el valor donde empieza todo, en txt3 debo poner el numero el cual sera usado para calcular un porcentaje (5,10,15) 
Segun el calculo de porcentajes tengo que ej: 100 + 25% = 125


totalporc = thisform.txt1.Value 
porcentaje = thisform.txt3.Value

totalporc = totalporc * porcentaje (aqui me da el error me dice "Date type Mismatch", que no coinciden los tipos de datos) 
totalporc = totalporc /100
totalporc = totalporc / 5

totalporc = ROUND(totalporc , 0)
totalporc = totalporc *5
thisform.txt4.Value = totalporc

Analyzer

unread,
Mar 13, 2014, 1:02:37 PM3/13/14
to vfpl...@googlegroups.com
>totalporc = totalporc * porcentaje (aqui me da el error me dice "Date type Mismatch", que no coinciden los tipos de datos)

Los errores de falta de coincidencia en los tipos se originan por intentar hacer cálculos u otras operaciones con tipos de datos diferentes. Ejemplo: 5+ "dos"  Es obvio que no se puede sumar un numero (5) mas una cadena de texto ("dos").

Si estas usando mysql, deberías poder comprobar que los tipos de dato en las tablas sean del tipo correcto.

Si al hacer los cálculos en el form te marca errores de mismatch posiblemente debas usar alguna funcion de conversión de tipos como: val, str, transform, dtoc, ctod, etc.

Y en el caso de manejar cadenas de texto tener cuidado de eliminar los espacios con las funciones Rtrim, Ltrim, Alltrim, etc. antes de concatenarlas.


Saludos!


--
Has recibido este mensaje porque estás suscrito al grupo "Visual Foxpro Latinoamérica" de Grupos de Google.
Visita este grupo en http://groups.google.com/group/vfplatino .

Analyzer

unread,
Mar 13, 2014, 1:26:49 PM3/13/14
to vfpl...@googlegroups.com
Para determinar los tipos puedes usar la ventana de comandos e imprimir tanto el valor que arrastras como el tipo:

mivariable=thisform.txt1.value

? mivariable
? type(mivariable)

o usar messagebox ("mi mensaje en forma de cadena de texto")

O

wait window 'mi mensaje en forma de cadena de texto'


Adicionalmente hay otras funciones como:

isdigit(), isalpha(), etc.



Saludos!

Analyzer

unread,
Mar 13, 2014, 1:46:47 PM3/13/14
to vfpl...@googlegroups.com
También recuerda que puedes configurar tus cuadros de texto de la siguiente manera:

Format=KR
Inputmask=999,999,999.99
Value=0

Y poner un SET CONFIRM ON en el evento load del form para que el enfoque no salte al teclear el último digito en el cuadro de texto.





Saludos!

Analyzer

unread,
Mar 13, 2014, 1:56:07 PM3/13/14
to vfpl...@googlegroups.com
Puedes hacer una prueba con un form vacío.

Pon 3 cuadros de texto y un boton de comando en el form.

En el click del boton pon lo siguiente:

Thisform.text3.value=Thisform.text1.Value+thisform.text2.value

Y configura las propiedades de los 3 texts de la siguiente manera:

Value=0
Format=KR
Inputmask=999,999,999.99

Ahora escribe SET CONFIRM ON en el load del form

Observa que pasa y notarás la idea..
 


Saludos!

Fidel Charny

unread,
Mar 13, 2014, 2:13:30 PM3/13/14
to vfpl...@googlegroups.com
Recuerda que, por defecto, los textbox funcionan para caracteres. Cuando los valores que esperan los textbox serán ingresado por el usuaro (o sea, no provienen de una tabla o cursor o del valor de una variable o propiedad), tienes que hacer una de dos cosas:
a) En el diseñador de formularios, con Properties, le colocas Value=0
b) En el init del form, haces explícitamente eso:
with thisform
       .txt1.value=0
       .txt2.value=0
* etc
endwith
Si no lo haces así, por más que le escribas un número, Visual Fox lo tomará como alfanumérico.
Si necesitas un Textbox que traiga una fecha, la configuración sería
with thisform.TxtFecha
            .Format="D"
            .Value=Ctod("")
endwith
Eso te asegura que el valor ingresado se trate como "Date" y que el formato se corresponda con el SET DATE elegido (generalmente en el programa de inicio de la aplicación).

Como dice Analyzer, fijate en la conveniencia de utilizar InputMask y Format (por ejemplo Format="Z" evita que se vean los textbox en cero cuando no tienen el enfoque, se ven en blanco).

Fidel Charny

unread,
Mar 13, 2014, 2:22:04 PM3/13/14
to vfpl...@googlegroups.com
Perdón Emiliano. Me olvidé de un detalle. Evita en lo posible las variables de paso. Si las usas, no omitas la declaración de LOCAL importe2.
Para tu ejemplo, esto es mejor (y más rápido)
thisform.txt2.Value = ROUND(thisform.txt1.Value / 5, 0) * 5


El jueves, 13 de marzo de 2014 13:37:26 UTC-3, Emiliano Sorba escribió:

Emiliano Sorba

unread,
Mar 14, 2014, 8:00:01 AM3/14/14
to vfpl...@googlegroups.com
Muchas gracias a todos al final resolví el botón de calcular porcentaje (el segundo ya que el primero funcionaba) de la siguiente forma...
Siendo txt4 donde coloco el numero de % que deseo (20) txt1 donde esta la suma que me trae de los productos (ej: 517) el calculo me trae el 20% = 103 y lo redondea con multiplo de 5 = 105

thisform.txt4.Value = ROUND((thisform.txt1.Value * thisform.txt3.Value /100) /5,0) *5



--

Alex Orihuela Rosales

unread,
Mar 14, 2014, 9:35:39 AM3/14/14
to vfpl...@googlegroups.com
Asegurate de que el txt3 sea un valor numérico, en el evento init haz lo siguiente:
thisform.txt3.value = 0.00
Saludos
Alex


--

Emiliano Sorba

unread,
Mar 14, 2014, 9:38:55 AM3/14/14
to vfpl...@googlegroups.com
Si, le puse 0 en la propiedad de los txt box Value = 0
Reply all
Reply to author
Forward
0 new messages