Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-10-2005
tramjauer tramjauer is offline
Miembro
 
Registrado: ene 2005
Posts: 42
Poder: 0
tramjauer Va por buen camino
Question Como validar el precio en un DBtext (Double)

Muy buenas a todos, trabajo con Delphi 7 i access y para la connexion utilizo los componentes ADO. Mi duda, ya dicha es que no se como validar i donde poner el codigo para que se valide un DBedit que contiene el precio que es un Double. Para saber si el precio que he insertado o modificado es correcto utilizo lo siguiente:

Código Delphi [-]
try
Variable := StrToFloat(Edit1.Text);
except
ShowMessage('No se ha introducido un valor numérico válido');
end;

Entonces el codigo este previamente lo havia puesto en el evento de la tabla: BeforePost, pero al poner un numero(incorrecto) i cambiar de DBEdit me sale que el contenido no es un float. Espero que me puedan indicar donde poner el codigo anterior para una buena validacion y en caso de que haya alguna validacion mejor que me la puedan indicar.

Muchas gracias de nuevo.

PD: Ya he buscado en el foro pero no he encontrado nada.

Tram.
Responder Con Cita
  #2  
Antiguo 02-10-2005
Chaja Chaja is offline
No confirmado
 
Registrado: ago 2004
Ubicación: Mar del Plata
Posts: 238
Poder: 0
Chaja Va por buen camino
dbtext y float

Master:
Te tira el error cuando la cifra es mayor de 999, puede ser que cuando lo pones no te reconoce bien el separador decimal o de miles. Usa en vez de StrToFloa FormatFloat(const Format: string; Value: Extended): string y yo talvez borraria los separadores de miles.
Fijate...

Bye

Luis Roldan
Mar del Plata
Argentina
Responder Con Cita
  #3  
Antiguo 03-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Si tu caso es el de separadores de miles y/o decimal, mira este hilo.

La causa, es que dicha validación se hace en el OnExit del DBedit, por tanto, es allí donde tendrías que realizarla.

Si tienes varios DBEdits que funcionan así, puedes poner un ApplicationEvents, y allí (evento OnException) detectar la excepción concreta y mostrar tu mensaje, de esta forma, una sola validación te serviría para todos los dbedits.

Un saludo.
Responder Con Cita
  #4  
Antiguo 03-10-2005
tramjauer tramjauer is offline
Miembro
 
Registrado: ene 2005
Posts: 42
Poder: 0
tramjauer Va por buen camino
Gracias por contestar, pero mi problema no es el de separacion si es por punto o por coma (eso creo yo, ya que si pongo un numero correcto con comas no se queja i graba perfectamente). Mi problema es validar si es un double o no. Ya que si en el DBedit pongo:
Código Delphi [-]
42,2,5
salta un error que es: 42,2,5 is not a valid floating point value for field 'preu'

Entonce como he dixo antes para validarlo iba a utilizar (que no se si esta bien eso, ya que tampoco funciona):
Código Delphi [-]
try
Variable := StrToFloat(DBedt.text);
except
ShowMessage('No se ha introducido un valor numérico válido');
[font=span class='quote''Times New Roman'/span]end;[/font]

Y lo havia puesto en el beforePost, pero al cambiar me salta ese error. Espero que me hayan entendido y que me haya explicado bien.

Gracias de nuevo.

Tram.

Última edición por tramjauer fecha: 03-10-2005 a las 16:04:33.
Responder Con Cita
  #5  
Antiguo 03-10-2005
Delfino Delfino is offline
Miembro
 
Registrado: jul 2003
Ubicación: Madrid
Posts: 974
Poder: 21
Delfino Va por buen camino
Porque no lo implementas en el evento OnChange del field? incluso puedes usar StrToFloatDef..
__________________
¿Microsoft? No, gracias..
Responder Con Cita
  #6  
Antiguo 03-10-2005
tramjauer tramjauer is offline
Miembro
 
Registrado: ene 2005
Posts: 42
Poder: 0
tramjauer Va por buen camino
Angry

buenas de nuevo, lo he provado en el onExit del componente i en el onChage de del campo de la tabla i quando pongo el numero que anterior mente e puesto, ej: 41,,4 o el numero 41,33,4,

me sigue saliendo el mismo error, ya que se dispara antes el error que el evento.

Gracias!

Última edición por tramjauer fecha: 03-10-2005 a las 17:08:13.
Responder Con Cita
  #7  
Antiguo 03-10-2005
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
tal vez te pueda servir el "Onvalidate" de los campos?
(boton derecho sobre el componente de la tabla o query, y luego click en fieldsEditor, le pones en agregar todos, los que no agregues no podras trabajar con ellos)
y luego seleccionas el campo y en el object inspector en eventos seleccionas el OnValidate
te genera algo asi como:

procedure TForm1.Table1enteroValidate(Sender: TField);
begin
If Sender.NewValue < Sender.OldValue Then
Raise ERangeError.CreateFmt( '%d debe ser mayor a %d',[Integer(Sender.NewValue), Integer(Sender.OldValue)]);

end;
si mal no recuerdo puedes generar un "sysutils.Abort" para que se cancele el posteo de la informacion
Responder Con Cita
  #8  
Antiguo 03-10-2005
tramjauer tramjauer is offline
Miembro
 
Registrado: ene 2005
Posts: 42
Poder: 0
tramjauer Va por buen camino
Unhappy

Lo siento pero con el onValidate tambien lo he probado y nada tambien salta ese error. No puede ser que nadie haya echo la validacion de algun precio que se introduzca o alguna cosa simiilar.

Tram.
Responder Con Cita
  #9  
Antiguo 04-10-2005
Delfino Delfino is offline
Miembro
 
Registrado: jul 2003
Ubicación: Madrid
Posts: 974
Poder: 21
Delfino Va por buen camino
Me parece q el error no lo tienes en Delphi sino en Access. Abre tu BD con Access y verifica este campo. O mejor deja de usar Acces y usa el Firebird Embedded por ejemplo..
__________________
¿Microsoft? No, gracias..
Responder Con Cita
  #10  
Antiguo 04-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
El problema es que se trata de un EDatabaseError, y es controlado por el propio DBedit. Los EdatabaseError no tienen codigo de error, por tanto, se hace más dificil capturarlo.

Como dije antes, con esto:
Código Delphi [-]
procedure TForm1.ApplicationEvents1Exception(Sender: TObject;
  E: Exception);
begin
     if E is DatabaseError then
       ShowMessage('mi mensaje' + E.Message+'   '+EDatabaseError(E).ClassName);
end;
Si se captura parcialmente el error.

El problema en sí, es que un DBEdit hereda de TCustomMaskEdit que trabaja con texto, al intentar convertir el texto a float, es cuando lanza ese error:

Constante de texto usada:SInvalidFloatValue (Unidad DBConst, linea 28)
que se lanza desde: TFloatField.SetAsString (Unidad DB, linea 4905)

La forma más facil de capturar el error es en evento OnSetText del propio campo de la base de datos. (Doble clic a tu tabla, clic al campo en cuestion, inspector de objetos--> eventos -->setText)

Código Delphi [-]
procedure TForm1.Table1BultosSetText(Sender: TField; const Text: String);
begin
TRY
     StrToFloat(Text)
except
    ShowMessage('mi mensaje de fallo' );
end;
end;

Puedes construir una rutina genérica y asignarla a todos los campos de tipo Float que tengas.

Un saludo
Responder Con Cita
  #11  
Antiguo 04-10-2005
tramjauer tramjauer is offline
Miembro
 
Registrado: ene 2005
Posts: 42
Poder: 0
tramjauer Va por buen camino
Question

Gracias por la respuesta lepe, he puesto el codigo que m'he has dixo en el evento settext del campo de la tabla, y gracias a esto si introduzco un precio equivocado (ej. 44,,7) me salta el error, hasta aqui perfecto, pero si modifico un precio y introduzco un valor correcto (ej. 44,7), se dispara el evento no muestra el error pero en el componente DBedit sigue habiendo el valor anterior, es decir es como si no hubiera introducido nada. Como puedo hacer para que el valor introducido se quede en el DBedit?, ya que si assigno el texto a la tabla haria un bucle infinito!

Tram.
Responder Con Cita
  #12  
Antiguo 05-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Lamento ese inconveniente, obvié algunas pruebas:
Código Delphi [-]
  try
    StrToFloat(Text);  //probamos a convertir
    Sender.AsString := Text; // si no hay fallos al convertir, 
                                      // asignamos el nuevo valor
  except
    ShowMessage('mi fallo');
    sysutils.Abort; // excepción silenciosa.
  end;

El problema es que se producía una excepción al convertir el valor; la capturabamos mediante el except, pero no haciamos nada, por tanto el DBEdit no se "entera" de que ha habido un fallo e intenta validar el texto antiguo.

Ahora nos aseguramos de que "se entere" mediante Sysutils.Abort, y además, si no ha habido fallo, asignamos nosotros el valor mediante Sender.AsString.

Un saludo
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 21:53:40.


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
Copyright 1996-2007 Club Delphi