Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Problema al Actualizar Valor Double (https://www.clubdelphi.com/foros/showthread.php?t=36551)

caramelillo 16-10-2006 17:13:26

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;

Lepe 16-10-2006 21:09:37

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.

caramelillo 17-10-2006 14:43:37

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.

Lepe 17-10-2006 16:16:22

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?:confused:

Saludos

Arturo 18-10-2006 23:36:38

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


La franja horaria es GMT +2. Ahora son las 04:19:34.

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