Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Delphi MySQL - Problema sumando/escribiendo en BD (https://www.clubdelphi.com/foros/showthread.php?t=86625)

martini002 09-09-2014 17:40:24

Delphi MySQL - Problema sumando/escribiendo en BD
 
Hola amigos,

Desde hace un par de semanas he estado teniendo un problema extraño
con la escritura en una BD MySQL en la misma red.

Constantemente tengo que incrementar los puntos Turnos y CestaTickets de un empleado
en la tabla el campo era de tipo double 8,2 - pero hace poco mas de una semana lo cambie a decimal 8,2
aun no logro determinar si el problema radica en el codigo de la aplicacion, construida en Delphi
usando Zeos o en la base de datos...

Les muestro un poco mas

Este es el procedimiento completo para incrementar los puntos

Código Delphi [-]
procedure TIdentificacionInicial.BCambiarNuevaRutaClick(Sender: TObject);
var
  Año,Mes,Dia:Word;
  Año2,Mes2,Dia2:Word;
  MesModficado:String;
  NombreTabla,TipoRuta:String;
  //1:ID Conductor, 2:ID Unidad, 3:ID Ruta, 4: Turno, 5:Pago por turno, 6:Pago por CT
  VectorNuevoCambioRuta:Array [1..6] Of String;
  //1:Turnos Conductor, 2:CT Conductor, 3: Turnos Unidad, 4 Turnos Ruta
  VectorTurnosCT:Array [1..4] Of String;
  I:Integer;
begin
  if (BoxValidacionRuta.ItemIndex>=0) And
     (BoxValidacionTurno.ItemIndex>=0) And
     (BoxValidacionConductor.ItemIndex>=0) And
     (BoxValidacionUnidad.ItemIndex>=0) And
     (DTValidacionFecha.Date<=Date+1) then
    begin
      //esto solo permite cambio de rutas de los dias del mes y año actual
      //osea la quincena actual!
      //no se pueden hacer cambios en periodos anteriores
      //Consultamos si la tabla correspondiente a esa fecha existe
      DecodeDate(DTValidacionFecha.Date, Año, Mes, Dia);
      DecodeDate(Date, Año2, Mes2, Dia2);
      MesModficado:=AgregarCeroAlMes(IntToStr(Mes2));
      //Construimos nombre RC
      NombreTabla:='RC'+MesModficado+IntToStr(año2)+VectorInformacionAdmin[4];

      ZQuery1.Close;
      ZQuery1.SQL.Text:='Select Exists (Select 1 From Relaciones.'+NombreTabla+')';
      ZQuery1.Open;

      //vamos a reiniciar todos los vectores porque me parece que es lo que esta dando
      //errores con la carga de turnos, hasta ahora al parecer simplemente se escribia en ellos
      
      for I := 1 to 6 do
        VectorNuevoCambioRuta[i]:='';
      for I := 1 to 4 do
        VectorTurnosCT[i]:='';

      if ZQuery1.Fields[0].AsString<>'' then//existe la tabla
        begin
          //consultamos si la ruta y el turno existe
          ZQuery1.Close;
          ZQuery1.SQL.Text:='Select NumeroRuta From Relaciones.'+NombreTabla+' Where NombreRuta = "'+BoxValidacionRuta.Text+'" And TurnoRuta = "'+BoxValidacionTurno.Text+'"';
          ZQuery1.Open;

          if (ZQuery1.Fields[0].AsString<>'') then  //existe el turno y la ruta
            begin
              //consultamos si esta vacia
              ZQuery1.Close;
              ZQuery1.SQL.Text:='Select `'+IntToStr(Dia)+'` From Relaciones.'+NombreTabla+' Where NombreRuta = "'+BoxValidacionRuta.Text+'" And TurnoRuta = "'+BoxValidacionTurno.Text+'"';
              ZQuery1.Open;

              if Not (ZQuery1.Fields[0].AsString<>'0') then//esta vacia
                begin
                  VectorNuevoCambioRuta[1]:=IDConductorBox;
                  VectorNuevoCambioRuta[2]:=IntToStr(BoxValidacionUnidad.ItemIndex+1);
                  VectorNuevoCambioRuta[3]:=IntToStr(BoxValidacionRuta.ItemIndex+1);
                  VectorNuevoCambioRuta[4]:=BoxValidacionTurno.Text;

                  //Consultamos el pago por turno y el pago por ct

                  ZQuery1.Close;
                  ZQuery1.SQL.Text:='Select PagoPorTurno, PagoPorCT From Transportes.SubRutas Where HoraTurno = "'+VectorNuevoCambioRuta[4]+'" And IdentificadorRuta = "'+VectorNuevoCambioRuta[3]+'"';
                  ZQuery1.Open;

                  VectorNuevoCambioRuta[5]:=ZQuery1.Fields[0].AsString;
                  VectorNuevoCambioRuta[6]:=ZQuery1.Fields[1].AsString;

                  //Insertamos en RC
                  ZQuery1.Close;
                  ZQuery1.SQL.Text:='Update Relaciones.'+NombreTabla+' Set `'+IntToStr(Dia)+'` = "'+VectorNuevoCambioRuta[1]+'" Where IdentificadorRuta = "'+VectorNuevoCambioRuta[3]+'" And TurnoRuta = "'+VectorNuevoCambioRuta[4]+'"';
                  ZQuery1.ExecSQL;

                  //Construimos el nombre de la tabla RU

                  NombreTabla:='RU'+MesModficado+IntToStr(año2)+VectorInformacionAdmin[4];

                  //insertamos en RU.
                  ZQuery1.Close;
                  ZQuery1.SQL.Text:='Update Relaciones.'+NombreTabla+' Set `'+IntToStr(Dia)+'` = "'+BoxValidacionUnidad.Text+'" Where IdentificadorRuta = "'+VectorNuevoCambioRuta[3]+'" And TurnoRuta = "'+VectorNuevoCambioRuta[4]+'"';
                  ZQuery1.ExecSQL;

                  //Consultamos cuantos turnos y ct tiene el conductor
                  ZQuery1.Close;
                  ZQuery1.SQL.Text:='Select TurnosConductor, CestaTickets From Relaciones.TurnosConductores Where NumeroConductor = "'+VectorNuevoCambioRuta[1]+'"';
                  ZQuery1.Open;

                  VectorTurnosCT[1]:=ZQuery1.Fields[0].AsString;
                  VectorTurnosCT[2]:=ZQuery1.Fields[1].AsString;

                  //Sumamos los turnos actuales mas el nuevo
                  VectorTurnosCT[1]:=FloatToStr(StrToFloat(VectorTurnosCT[1])+StrToFloat(VectorNuevoCambioRuta[5]));
                  VectorTurnosCT[2]:=FloatToStr(StrToFloat(VectorTurnosCT[2])+StrToFloat(VectorNuevoCambioRuta[6]));

                  //Consultamos cuantos turnos lleva la unidad y la ruta
                  ZQuery1.Close;
                  ZQuery1.SQL.Text:='Select (Select TurnosUnidad From Relaciones.TurnosUnidades Where NumeroUnidad = "'+VectorNuevoCambioRuta[2]+'"),(Select TurnosActuales From Relaciones.TurnosRutas Where IdentificadorRuta = "'+VectorNuevoCambioRuta[3]+'" And HoraTurno = "'+VectorNuevoCambioRuta[4]+'")';
                  ZQuery1.Open;

                  VectorTurnosCT[3]:=ZQuery1.Fields[0].AsString;
                  VectorTurnosCT[4]:=ZQuery1.Fields[1].AsString;

                  VectorTurnosCT[3]:=FloatToStr(StrToFloat(VectorTurnosCT[3])+1);
                  VectorTurnosCT[4]:=FloatToStr(StrToFloat(VectorTurnosCT[4])+1);

                  //actualizamos los datos del conductor
                  ZQuery1.Close;
                  ZQuery1.SQL.Text:='Update Relaciones.TurnosConductores Set TurnosConductor = "'+VectorTurnosCT[1]+'", CestaTickets = "'+VectorTurnosCT[2]+'" Where NumeroConductor = "'+VectorNuevoCambioRuta[1]+'"';
                  ZQuery1.ExecSQL;

                  //actualizamos los datos de la unidad
                  ZQuery1.Close;
                  ZQuery1.SQL.Text:='Update Relaciones.TurnosUnidades Set TurnosUnidad = "'+VectorTurnosCT[3]+'" Where NumeroUnidad = "'+VectorNuevoCambioRuta[2]+'"';
                  ZQuery1.ExecSQL;

                  //actualizamos los datos de la ruta
                  ZQuery1.Close;
                  ZQuery1.SQL.Text:='Update Relaciones.TurnosRutas Set TurnosActuales = "'+VectorTurnosCT[4]+'" Where IdentificadorRuta = "'+VectorNuevoCambioRuta[3]+'" And HoraTurno = "'+VectorNuevoCambioRuta[4]+'"';
                  ZQuery1.ExecSQL;

                  //registramos el cambio

                  NotaDelFlag:='editado porque es muy largo';

                  //registramos el cambio
                  ZQuery1.Close;
                  ZQuery1.SQL.Text:='Insert Into Registros.RegistroCambios Values("","Validación de Ruta",CurDate(),CurTime(),"'+VectorInformacionAdmin[1]+'","Validación","'+NotaDelFlag+'")';
                  ZQuery1.ExecSQL;

                  //buscamos el tipo de la ruta

                  ZQuery1.Close;
                  ZQuery1.SQL.Text:='Select TipoRuta From Transportes.SubRutas Where NombreRuta = "'+BoxValidacionRuta.Text+'" And HoraTurno = "'+BoxValidacionTurno.Text+'"';
                  ZQuery1.Open;

                  TipoRuta:=ZQuery1.Fields[0].AsString;

                  //registramos el cambio en registrosconductoresrutas

                  ZQuery1.Close;
                  ZQuery1.SQL.Text:='editado porque es inutil y muy extenso';
                  ZQuery1.ExecSQL;

                  ShowMessage('Bien! Ruta cargada y validada correctamente...');
                  BoxValidacionTurno.ItemIndex:=-1;
                  BoxValidacionConductor.ItemIndex:=-1;
                  ImagenModificarRuta.Picture:=nil;

                  GrupoOpcionesRuta.ItemIndex:=0;
                end
              else
                begin
                  ShowMessage('Esta ruta ya tiene registros validados, no puede ser cambiada!');
                end;
            end
          else
            begin
              ShowMessage('Lo siento, no existe el turno o la ruta en ese período');
            end;
        end
      else
        begin
          ShowMessage('Lo siento, no tengo registros de ese período.');
        end;
    end;
end;

Este codigo lo he cambiado ya varias veces intentando encontrar que es lo que pasa,
pero aun no he tenido exito en mi busqueda, recurro a ustedes a ver si ven algo que seguramente
yo no puedo ver.

Miren lo siguiente:

Consultamos cuantos puntos paga la ruta por guardia(Turnos, y Cestatickets)
en esa tabla cambie en este momento PagoPorTurno y PagoPorCT de double 8,2 a decimal 8,2.
Código Delphi [-]
//Consultamos el pago por turno y el pago por ct

                  ZQuery1.Close;
                  ZQuery1.SQL.Text:='Select PagoPorTurno, PagoPorCT From Transportes.SubRutas Where HoraTurno = "'+VectorNuevoCambioRuta[4]+'" And IdentificadorRuta = "'+VectorNuevoCambioRuta[3]+'"';
                  ZQuery1.Open;

                  VectorNuevoCambioRuta[5]:=ZQuery1.Fields[0].AsString;
                  VectorNuevoCambioRuta[6]:=ZQuery1.Fields[1].AsString;


Luego consultamos cuantos turnos y cestatickets tiene el conductor.
Código Delphi [-]
//Consultamos cuantos turnos y ct tiene el conductor
                  ZQuery1.Close;
                  ZQuery1.SQL.Text:='Select TurnosConductor, CestaTickets From Relaciones.TurnosConductores Where NumeroConductor = "'+VectorNuevoCambioRuta[1]+'"';
                  ZQuery1.Open;

                  VectorTurnosCT[1]:=ZQuery1.Fields[0].AsString;
                  VectorTurnosCT[2]:=ZQuery1.Fields[1].AsString;

                  //Sumamos los turnos actuales mas el nuevo
                  VectorTurnosCT[1]:=FloatToStr(StrToFloat(VectorTurnosCT[1])+StrToFloat(VectorNuevoCambioRuta[5]));
                  VectorTurnosCT[2]:=FloatToStr(StrToFloat(VectorTurnosCT[2])+StrToFloat(VectorNuevoCambioRuta[6]));


Finalmente actualizamos los puntos del conductor,
aqui es donde esta el problema, supongamos que el conductor tiene 2.0 o 1.5
a veces y aleatoriamente al parecer NO suma correctamente los puntos,
y no se si es la BD o el codigo realmente.

Código Delphi [-]
//actualizamos los datos del conductor
                  ZQuery1.Close;
                  ZQuery1.SQL.Text:='Update Relaciones.TurnosConductores Set TurnosConductor = "'+VectorTurnosCT[1]+'", CestaTickets = "'+VectorTurnosCT[2]+'" Where NumeroConductor = "'+VectorNuevoCambioRuta[1]+'"';
                  ZQuery1.ExecSQL;


Tengo que destacar lo siguiente, son dos aplicaciones, en una los empleados se registran solos;
este fue el codigo de la otra aplicacion, donde el operador los registra a ellos,
el codigo de la primera aplicacion es practicamente igual a este.

Lo dejare por aqui si alguien quiere darle un ojito
en un comentario ya que aqui no cabe, el post supera los 20.000 caracteres.
--
En pocas palabras el problema esta en que los puntos no son sumados/escritos correctamente
en un momento determinado o aleatorio, realmente no puedo captar esto,
quisiera hacer un pequeño log cuando los turnos vallan a ser actualizados, pero se me hace complicado
por el sitio donde estan funcionando estas aplicaciones.

Saludos amigos, gracias por su tiempo en leer esto, espero puedan ayudarme.

martini002 09-09-2014 17:43:25

Código Delphi [-]
procedure TFormPrincipal.BAceptarClick(Sender: TObject);
var
  //VectorDatosTemporales : Array [1..10] Of String;
  Fecha:TDate;
  Hora:TTime;
  Año,Mes,Dia:Word;
  NombreTablaRC, NombreTablaRU:String;
  SumarTurno:String;
  NombreConductor,aux:String;
  NotaFlag:String;
  I:Integer;
  //variables de prueba mientras no funcione la suma correcta de decimales
  //sumaremos turnos y cesta tickets
  TurnosActuales,TurnosCTActuales,TurnosNuevos,TurnosCTNuevos:Real;
begin
  BarraProgreso.StepIt;
  //Bloqueamos interfaz
  DesactivarBotones(False);

  BarraProgreso.StepIt;

  DecodeDate(Date, Año, Mes, Dia);

  NombreTablaRC:='RC'+AgregarCeroAlMes(IntToStr(Mes))+IntToStr(Año)+VectorInformacionSalidaChoferPorID[6];
  NombreTablaRU:='RU'+AgregarCeroAlMes(IntToStr(Mes))+IntToStr(Año)+VectorInformacionSalidaChoferPorID[6];

  //Tuplas: 1 Nombre Unidad, 2 Nombre Ruta, 3 Turno
  //Tuplas: 1 Numero Unidad, 2 Numero Ruta, 3 Hora Turno expresado en Horas, 4 Numero Subruta, 5 Pago por el turno, 6 ID Cliente
  //Comprobamos que no se halla registrado en la RU
  ZQuery1.Close;
  ZQuery1.SQL.Text:= 'Select `'+IntToStr(Dia)+'` From Relaciones.'+NombreTablaRU+' Where IdentificadorRuta = '+VectorInformacionSalidaChoferPorID[2]+' And TurnoRuta = '+VectorInformacionSalidaChoferPorID[3];
  ZQuery1.Open;

  BarraProgreso.StepIt;

  if (ZQuery1.Fields[0].AsString='0') Or (ZQuery1.Fields[0].AsString='') then
    begin

      //Actualizamos Relacion Unidades
      ZQuery1.Close;
      ZQuery1.SQL.Text:='Update Relaciones.'+NombreTablaRU+' Set `'+IntToStr(Dia)+'` = "'+VectorInformacionSalidaChofer[1]+'" Where IdentificadorRuta = '+VectorInformacionSalidaChoferPorID[2]+' And TurnoRuta = '+VectorInformacionSalidaChoferPorID[3];

      ZQuery1.ExecSQL;

      BarraProgreso.StepIt;

      //Actualizamos Relacion Conductores

      ZQuery1.Close;
      ZQuery1.SQL.Text:='Update Relaciones.'+NombreTablaRC+' Set `'+IntToStr(Dia)+'` = "'+VectorInformacionSalidaChoferPorID[7]+'" Where IdentificadorRuta = '+VectorInformacionSalidaChoferPorID[2]+' And TurnoRuta = '+VectorInformacionSalidaChoferPorID[3];
      ZQuery1.ExecSQL;

      BarraProgreso.StepIt;

      //actualizamos turnos conductores

      ZQuery1.Close;
      ZQuery1.SQL.Text:='Select TurnosConductor From Relaciones.TurnosConductores Where NumeroConductor = "'+VectorInformacionSalidaChoferPorID[7]+'"';
      ZQuery1.Open;

      //TurnosActuales,TurnosCTActuales,TurnosNuevos,TurnosCTNuevos,PrecioTurno,PrecioCT:Real;
      TurnosActuales:=ZQuery1.Fields[0].AsFloat;
      TurnosNuevos:=StrToFloat(VectorInformacionSalidaChoferPorID[5])+TurnosActuales;

      //SumarTurno:=FloatToStr(StrToFloat(ZQuery1.Fields[0].AsString)+StrToFloat(VectorInformacionSalidaChoferPorID[5]));
      SumarTurno:=FloatToStr(TurnosNuevos);

      BarraProgreso.StepIt;

      ZQuery1.Close;
      ZQuery1.SQL.Text:='Update Relaciones.TurnosConductores Set TurnosConductor = "'+SumarTurno+'" Where NumeroConductor = "'+VectorInformacionSalidaChoferPorID[7]+'"';
      ZQuery1.ExecSQL;

      //actualizamos turnos unidades

      ZQuery1.Close;
      ZQuery1.SQL.Text:='Select TurnosUnidad From Relaciones.TurnosUnidades Where NumeroUnidad = "'+VectorInformacionSalidaChoferPorID[1]+'"';
      ZQuery1.Open;

      SumarTurno:=FloatToStr(StrToFloat(ZQuery1.Fields[0].AsString)+1);

      BarraProgreso.StepIt;

      ZQuery1.Close;
      ZQuery1.SQL.Text:='Update Relaciones.TurnosUnidades Set TurnosUnidad = "'+SumarTurno+'" Where NumeroUnidad = "'+VectorInformacionSalidaChoferPorID[1]+'"';
      ZQuery1.ExecSQL;

      //actualizamos turnos rutas

      ZQuery1.Close;
      ZQuery1.SQL.Text:='Select TurnosActuales From Relaciones.TurnosRutas Where IdentificadorRuta = "'+VectorInformacionSalidaChoferPorID[2]+'" And HoraTurno = "'+VectorInformacionSalidaChoferPorID[3]+'"';
      ZQuery1.Open;

      SumarTurno:=FloatToStr(StrToFloat(ZQuery1.Fields[0].AsString)+1);

      BarraProgreso.StepIt;

      ZQuery1.Close;
      ZQuery1.SQL.Text:='Update Relaciones.TurnosRutas Set TurnosActuales = "'+SumarTurno+'" Where IdentificadorRuta = "'+VectorInformacionSalidaChoferPorID[2]+'" And HoraTurno = "'+VectorInformacionSalidaChoferPorID[3]+'"';
      ZQuery1.ExecSQL;

      //actualizamos cesta tickets

      SumarTurno:='';

      ZQuery1.Close;
      ZQuery1.SQL.Text:='Select CestaTickets From Relaciones.TurnosConductores Where NumeroConductor = "'+VectorInformacionSalidaChoferPorID[7]+'"';
      ZQuery1.Open;

      //TurnosActuales,TurnosCTActuales,TurnosNuevos,TurnosCTNuevos,PrecioTurno,PrecioCT:Real;

      TurnosCTActuales:=ZQuery1.Fields[0].AsFloat;
      TurnosCTNuevos:=StrToFloat(VectorInformacionSalidaChoferPorID[8])+TurnosCTActuales;

      //SumarTurno:=FloatToStr(StrToFloat(ZQuery1.Fields[0].AsString)+StrToFloat(VectorInformacionSalidaChoferPorID[8]));
      SumarTurno:=FloatToStr(TurnosCTNuevos);

      BarraProgreso.StepIt;

      ZQuery1.Close;
      ZQuery1.SQL.Text:='Update Relaciones.TurnosConductores Set CestaTickets = "'+SumarTurno+'" Where NumeroConductor = "'+VectorInformacionSalidaChoferPorID[7]+'"';
      ZQuery1.ExecSQL;

      //Bloqueamos la unidad por hora
      Hora:=Time;

      BarraProgreso.StepIt;

      ZConnection1.Disconnect;
      //Cambiamos la BD a transportes
      ZConnection1.Database:='Transportes';
      ZConnection1.Connect;

      BarraProgreso.StepIt;

      ZQuery1.Close;
      ZQuery1.SQL.Text:='Update Transportes.EstadoUnidades Set Activa = "DES", QuienDesactivo = "SYS", HoraDesactivacion = "'+TimeToStr(Hora)+'" Where NumeroUnidad = "'+VectorInformacionSalidaChoferPorID[1]+'"';
      ZQuery1.ExecSQL;

      //Seleccionamos el nombre y apellido del conductor

      ZQuery1.Close;
      ZQuery1.SQL.Text:='Select Nombre1,Apellido1 From Conductores Where NumeroConductor = "'+VectorInformacionSalidaChoferPorID[7]+'"';
      ZQuery1.Open;

      NombreConductor:=ZQuery1.Fields[0].AsString+' '+ZQuery1.Fields[1].AsString;

      BarraProgreso.StepIt;

      //Agregamos el nuevo registro
      //Tuplas: 1 Numero Unidad, 2 Numero Ruta, 3 Hora Turno expresado en Horas, 4 Numero Subruta, 5 Pago por el turno, 6 ID Cliente, 7 id conductor, 8 pago por ct, 9 tipo ruta



      ZQuery1.Close;
      ZQuery1.SQL.Clear;
      ZQuery1.SQL.Add('Insert Into EstadisticasConductores.RegistrosConductoresRutas(NumeroConductor,EstadoReporte,QuienRegistro,FechaR  egistro,HoraRegistro,FechaValidacion,HoraValidacion,Ruta,IdentificadorRuta,Turno,TipoRuta,Unidad,Nom  breConductor) Values(');
      ZQuery1.SQL.Add('"'+VectorInformacionSalidaChoferPorID[7]+'",');
      ZQuery1.SQL.Add('"PENDIENTE",');
      ZQuery1.SQL.Add('"SYS",');
      ZQuery1.SQL.Add('"'+FormatDateTime('yyyy/mm/dd', Date)+'",');
      ZQuery1.SQL.Add('"'+TimeToStr(Time)+'",');
      ZQuery1.SQL.Add('"'+FormatDateTime('yyyy/mm/dd', Date)+'",');
      ZQuery1.SQL.Add('"'+TimeToStr(Time)+'",');
      ZQuery1.SQL.Add('"'+VectorInformacionSalidaChofer[2]+'",');
      ZQuery1.SQL.Add('"'+VectorInformacionSalidaChoferPorID[2]+'",');
      ZQuery1.SQL.Add('"'+VectorInformacionSalidaChoferPorID[3]+'",');
      ZQuery1.SQL.Add('"'+VectorInformacionSalidaChoferPorID[9]+'",');
      ZQuery1.SQL.Add('"'+VectorInformacionSalidaChofer[1]+'",');
      ZQuery1.SQL.Add('"'+NombreConductor+'")');
      ZQuery1.ExecSQL;

      //Creamos un nuevo evento de que acaba de ser registrada la ruta
      //esto lo enviaremos por correo a la planta

      //Tuplas: 1 Numero Unidad, 2 Numero Ruta, 3 Hora Turno expresado en Horas, 4 Numero Subruta, 5 Pago por el turno, 6 ID Cliente, 7 id conductor, 8 pago por ct, 9 tipo ruta
      //VectorInformacionSalidaChoferPorID: Array [1..9] Of String;

      NotaFlag:=VectorInformacionSalidaChoferPorID[9]+' | '+VectorInformacionSalidaChofer[2]+' | '+VectorInformacionSalidaChoferPorID[3]+' | '+NombreConductor+' | '+FormatDateTime('yyyy/mm/dd', Date)+' | '+TimeToStr(Time);

      ZQuery1.Close;
      ZQuery1.SQL.Clear;
      ZQuery1.SQL.Add('Insert Into Transportes.FlagsPendientes(FechaCreacion,HoraCreacion,Estado,TipoFlag,Nota) Values(');
      ZQuery1.SQL.Add('"'+FormatDateTime('yyyy/mm/dd', Date)+'",');
      ZQuery1.SQL.Add('"'+TimeToStr(Time)+'",');
      ZQuery1.SQL.Add('"S",');
      ZQuery1.SQL.Add('"3",');
      ZQuery1.SQL.Add('"'+NotaFlag+'")');
      ZQuery1.ExecSQL;

      for I := 1 to 9 do
        VectorInformacionSalidaChoferPorID[i]:='';

      for I := 1 to 3 do
        VectorInformacionSalidaChofer[i]:='';


      BarraProgreso.StepIt;

      Label1.Caption:='Ok! Bon Voyage!';
      BarraProgreso.StepIt;

      while BarraProgreso.Position<100 do
        BarraProgreso.StepIt;

      ZConnection1.Disconnect;
      //Cambiamos la BD a transportes
      ZConnection1.Database:='Transportes';
      ZConnection1.Connect;

      OkMeVoy.Enabled:=True;
    end//fin condicion de ruta registrada
  else
    begin
      DesactivarBotones(True);
      ShowMessage('ERROR! Esta ruta ya fue registrada!');
      BAceptar.Enabled:=False;
    end;
  //CargarDatosConexion;
end;

engranaje 15-09-2014 13:50:58

Si pusieras un ejemplo de valores esperados y encontrados igual no me arriesgaba a poner nada, pero el hecho de que digar que los fallos son aleatorios y no suceden siempre me hace arriesgarme. Soy recurrente en este asunto pero a mi me ha pasado algunas veces y con distintas bases de datos. Un número con dos decimales en decimal puede tener infinitos decimales en binario. A la hora de guardar datos decimales en una bd internamente se guardan en binario, y al extralerlos o trabajar con ellos bien pudiera ser que el redondeo a 2 decimales te juegue una mala pasada. Ya digo que voi a ciegas y apunto a este problema si le fallo es por un decimal.

Puedes probar a guardar en uno de esos campos el valor 2.1 y despues extarelo a ver que obtienes. 2.1 si lo pasas a binario (según el formato) podria acabar convirtiendose en 2.09999 la hacer el cambio inverso. sin embargo con 2.2 el cambio sería exacto. Como en algunas ocasiones este ha sido mi problema yo lo comento para que lo tengas en cuenta y por si fuera el problema. Bien es posible que el cambio de double 8,2 a decimal 8,2 tuviera como consecuencia en algunos casos un error en el redondeo.


La franja horaria es GMT +2. Ahora son las 04:52: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