Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-10-2006
caramelillo caramelillo is offline
Registrado
 
Registrado: may 2006
Posts: 4
Poder: 0
caramelillo Va por buen camino
Problema al Actualizar Valor Double

Saludos muchachos.... tengo un problemita que no he podido solucionar... Sucede que tengo un ADOQuery en el cual hago un select de todos los registros de una tabla de productos. Luego, de acuerdo a unos botones de First, Previous, Next y Last me muevo entre los registros. Tambien tengo opciones para grabar los registros (insertar y actualizar) y para eliminarlos.

Sucede que cuando yo recupero un registro (del ADOQuery) y despliego el valor de los campos de la DB en los campos del form (son campos normales no son componentes de bases de datos) todo funciona perfecto. Cuando presiono el boton para actualizar los datos me di cuenta de que si ninguno de los campos cambio su valor me daba un error diciendome: "No se puede encontrar la fila para su actualización: algunos valores han cambiado desde la última vez que se leyó". Bueno, debido a este error tuve que comparar los valores de los campos del form con los valores de los campos de la DB para ver si habia algun cambio y entonces hacer la actualización. Lo hize y funciono perfectamente. Pero sucede que ahora me da ese mismo error cuando actualizo el campo PRECIO que es de tipo DOUBLE en la base de datos. Si quito la parte donde se actualiza este campo todo funciona perfectamente. Pero si dejo esa parte (incluyendo la parte donde comparo los valores) entonces el programa me da el error antes mencionado. Necesito su ayuda urgente con este asunto. Yo utilizo Delphi 7 y MySQL 5.0.19 y me conecto a traves de ODBC con el driver MySQL ODBC 3.51. Aqui les pongo el código de la actualización por si les sirve de algo:

Código Delphi [-]
procedure TfProductos.UpdateRecord;
var
  TmpImpuestos:integer;
begin
  if cbImpuestos.Checked then TmpImpuestos := 1
  else TmpImpuestos := 0;
  with dmDatos.qryDatos do
  begin
    if Mode = 'A' then
    begin
      if (Fields[1].AsString <> eDescripcion.Text) or
      //Si quito esta linea y la de la actualizacion funciona perfectamente
      (FloatToStrF(Fields[2].AsFloat,ffNumber,15,2) <> AnsiReplaceStr(ePrecio.Text, ',','')) or
      (Fields[3].AsString <> eCodigo.Text) or
      (Fields[5].AsString <> eImagen.Text) or
      (Fields[6].AsString <> TiposID.Strings[cbTipo.ItemIndex]) or
      (Fields[7].AsInteger <> TmpImpuestos) then
      begin
        Edit;
        Fields[1].AsString := eDescripcion.Text;
        //Si quito esta linea y la de la comparación funciona perfectamente
        Fields[2].AsFloat := StrToFloat(AnsiReplaceStr(ePrecio.Text, ',',''));
        Fields[3].AsString := eCodigo.Text;
        Fields[5].AsString := eImagen.Text;
        Fields[6].AsInteger := StrToInt(TiposID.Strings[cbTipo.ItemIndex]);
        Fields[7].AsInteger := TmpImpuestos;
        Refresh;
      end;
    end;
  end;
end;
Responder Con Cita
  #2  
Antiguo 16-10-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Aunque no tenga decimales, puesto que está declarado como double, deberías buscar la coma o el punto decimal (a saber lo que ha puesto el usuario), despues reemplazarla por un punto (ya que es el separador decimal que espera StrToFloat) o usar SysUtils.DecimalSeparator para averiguar cual es; por último, añadirle al menos un decimal (un cero) para que pueda interpretarse como un Double.

Saludos y suerte.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 17-10-2006
caramelillo caramelillo is offline
Registrado
 
Registrado: may 2006
Posts: 4
Poder: 0
caramelillo Va por buen camino
Gracias por tu respuesta Lepe

Eso que me dices yo ya lo he tomado en cuenta. Si notas en el codigo yo sustituyo la coma por un string vacio.
Responder Con Cita
  #4  
Antiguo 17-10-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Pero entonces no es un Double, no tiene parte decimal, además si tenemos 150,40 €y quitas la coma, quedaría 1540 € que al pasarlo a double sale 1540.00 € ¿no?

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 18-10-2006
Arturo Arturo is offline
Miembro
 
Registrado: sep 2004
Posts: 91
Poder: 20
Arturo Va por buen camino
saludos:

pues que yo sepa ese es un error de delphi 5 en el D7 deberia no dar problemas con "No se puede encontrar la fila para su actualización: algunos valores han cambiado desde la última vez que se leyó". y mas con ado, yo lo use y baje el driver para mysql 3.51.12 despues de ir buscando, decidi desinstalarlo el D7 y volver a instalar y todo los demas componentes que ya tenia, y ya no me salio, por que no se.

y una cosa que he notado y espero que sea de ayuda es con los formatos de moneda, fecha y punto decimal asi me paso una vez y hasta que en aqui me mencionaron el tip que puediera ser, ademas no se porque el tipo extend es mas eficiente que el double en delphi o sera por las cantidad a manejar.

Aun no lo se pero ami me paso eso del error, he cambiado de componentes y dejar los ado, ademas es una alternativa pero es una capa mas odbc.

bye
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Actualizar un valor en un generador desde un Sp muli Firebird e Interbase 16 11-06-2008 14:56:05
Problema con Double Buffer guillonet C++ Builder 0 29-08-2006 19:26:22
Problema al actualizar rocio84 SQL 1 28-04-2006 21:12:07
Problema con Decimales de Double Precision Triton Firebird e Interbase 8 08-09-2004 02:12:00
Valor double de una fecha cone220 Varios 2 26-04-2004 22:38:38


La franja horaria es GMT +2. Ahora son las 01:34:07.


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