Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Comparar 2 numeros (https://www.clubdelphi.com/foros/showthread.php?t=66354)

jzginez 15-02-2010 22:41:25

Comparar 2 numeros
 
Hola amigos aunque el titulo suena muy simple el problema que tengo es el siguiente: estoy haciendo un procedimiento de cobros (abonos) el cual es muy simple tengo una factura para el ejemplo es por $45,289.41 y en esta ventana acepto los pagos menores o iguales al total de la factura (bueno fuera que alguien me quisiera pagar de mas :D ) en un Tedit se captura la cantidad que el cliente esta abonando, antes de guardar a la base de datos (en sql Server por cierto) verifico que la cantidad no sea mayor al saldo de la factura y si es menor no hay problema pero si es igual, en este caso $45,289.41, me indica que la cantidad no puede ser mayor, el código que utilizo es el siguiente:
Código Delphi [-]
Function TFBABMAbonos.Verifica: Boolean;
Var
  CadTemp: String;
  Monto: Real;
Begin
  CadTemp:= StringReplace(Edit1.Text,'$ ','',[rfReplaceAll]);
  CadTemp:= StringReplace(CadTemp,',','',[rfReplaceAll]);
  Monto:= StrTofloat(CadTemp);
  if (ADOFacturasSaldo.Value < Monto)
    Then Begin
      MessageBox(Handle, PChar('Datos incorrectos'+#10#13+
                              'La cantidad a abonar no puede ser mayor al saldo de la factura'+#10#13+
                              'No se guardardo la información vuelva a intentarlo'),
                PChar('Error al guardar'),
                MB_OK+MB_ICONERROR+MB_DEFBUTTON1+MB_APPLMODAL);
      Result:= False;
      Exit;
    End;
  Result:= True;
End;

Al depurar con F8 veo que la cantidad es igual no tiene ningún carácter o numero de mas, además al verificar el tipo de datos me indica que el que obtengo de la base de datos es currency así que ya use StrToCurr obteniendo el mismo error al comparar; en SQL Server el dato es de tipo numerico(10,2)

De antemano gracias por sus comentarios y ayuda

AzidRain 15-02-2010 23:09:08

El problema que tienes es que estas capturando un valor tipo real a partir de un TEdit comun y corriente. Ya vi que antes de comparar eliminas el '$' y las comas. Pero ¿Y si puso cualquier otro caracter? Te recomiendo usar mejor un control TMaskEdit que ya trae forma de definir mascarillas par ala captura de cantidades en dinero. Ya casi nadie los usa porque hya muchos bibliotecas como las Rx que traen un componente especial para capturar cantidades en dinero y en donde no hay que hacer mas conversiones.

jzginez 16-02-2010 01:08:51

Hola AzidRain te comento que en el TEdit tengo programado keypress y otros eventos para evitar que entre algo diferente a numeros y punto decimal, el signo de $ y las comas las aumento cuando el foco pasa a otro control solo por efecto visual, el TMaskEdit no lo uso porque visualmente no me gustó como muestra en este caso los números, probare los RX que mencionas

Onti 16-02-2010 01:30:56

Te recomiendo usar las Rx

jzginez 16-02-2010 17:34:57

Ya baje e instale los Rx voy a probarlas pero ahorita por lo avanzado y urgente del proyecto tuve que hacer el siguiente cambio

Código Delphi [-]
 if (ADOFacturasSaldo.Value < Monto)

por

 if ((ADOFacturasSaldo.Value+0.00001) < Monto)

como verán no es la mejor solución pero mientras el cliente prueba el demo me da tiempo de probar bien y hacer el cambio usando los RX

DriverOp 16-02-2010 21:53:55

Me parece que el problema de fondo es de redondeo. Trata de hacer pasar ambos valores por la función RoundTo() al momento de comparar. Por ejemplo:

Código Delphi [-]
if (RoundTo(ADOFacturasSaldo.Value,-2) < RoundTo(Monto,-2)) then
...
Redondea en la segunda cifra decimal.

Ahora el chivo :D

En mi página web tengo un componente desendiente de TEdit que solo captura números enteros o reales y hace la conversión automáticamente, también previene que el usuario escriba otra cosa que no sea números, punto o coma y los signos mas o menos. Se llama TEditReal.

jzginez 18-02-2010 02:41:11

Hola DriverOp gracias tu solución funciono de maravilla y me ahora el tener que estar cambiando componentes, aunque ya instale los Rx y se ven interesantes, te comento que el TEdit que uso es muy parecido a tu componente, de este foro obtuve el código hacerlo nada mas que no lo lleve al nivel de componente sino que escribí todo el código dentro del código de mi ventana.


Gracias por tu ayuda


La franja horaria es GMT +2. Ahora son las 14:06:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi