Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Problemas con Zquery y manejo de flotantes (https://www.clubdelphi.com/foros/showthread.php?t=54858)

voldemmor 01-04-2008 20:08:49

Problemas con Zquery y manejo de flotantes
 
Hola amigos. Hos pido ayuda nuevamente, y de antemano les agradesco XD.

El Problema:

Estoy usando Compponentes Zeos+ delphi 6 + Mysql5
Tengo que hacer la insercion de varias notas a una tabla, pero al momento de de ejecutar el SQL de insercion me da un error

Código:


Out of range value adjusted for colum 'nota' at row 1
Valor fuera de rango en la cumna 'nota' en la fila1


el codigo



Código Delphi [-]
procedure TfrmNotas.BitBtn1Click(Sender: TObject);
var cant,i : integer;
begin
 cant := sgNotas.RowCount - 1;
try
 AcademicData.ZConnection1.StartTransaction;
 with AcademicData.ZQuery1 do
 begin
   {.....inicia el trabajo dentro de la transaccion........}
    sql.Clear;
    SQL.Text := 'INSERT INTO nota (cod_estudiante,cod_matricula,cod_periodo,cod_materia,nota,detalle)'+
    'VALUES(:pcod_estudiante,:pcod_matricula,:pcod_periodo,:pcod_materia,:pnota,:pdetalle)';
    for i := 1 to  cant do
    begin
    {insercion masiva de datos------falta}
    ParamByName('pcod_estudiante').AsInteger:= strtoint(sgNotas.Cells[1,i]);
    ParamByName('pcod_matricula').AsInteger:= strtoint(sgNotas.Cells[0,i]);
    {periodo de notas}
    ParamByName('pcod_periodo').AsInteger:= CodigoPeriodoEvaluacion(cbxPeriodoNotas.Text);
    ParamByName('pcod_materia').AsInteger:= CodigoMateriaNombre(cbxMateria.Text);
    ParamByName('pnota').AsFloat:=StrToFloat(sgNotas.Cells[3,i]);
    ParamByName('pdetalle').AsString:=sgNotas.Cells[4,i];
    ExecSQL;
    end;
    Close
 end;
 AcademicData.ZConnection1.Commit;
 
except
 AcademicData.ZConnection1.Rollback;
 AcademicData.ZQuery1.Close;
end;
end;






y la tabla esta asi


Código SQL [-]
CREATE TABLE `nota` (
  `codigo` int(11) NOT NULL auto_increment,
  `cod_estudiante` int(11) default NULL,
  `cod_matricula` int(11) default NULL,
  `cod_periodo` int(11) default NULL,
  `cod_materia` int(11) default NULL,
  `nota` float(2,2) NOT NULL default '0.00',
  `detalle` varchar(30) default NULL,
  PRIMARY KEY  (`codigo`),
  KEY `cod_estudiante` (`cod_estudiante`),
  KEY `cod_matricula` (`cod_matricula`),
  KEY `cod_periodo` (`cod_periodo`),
  CONSTRAINT `nota_coducta_fk` FOREIGN KEY (`cod_estudiante`) REFERENCES `estudiantes` (`codigo`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `nota_coducta_fk1` FOREIGN KEY (`cod_matricula`) REFERENCES `matriculas` (`codigo`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `nota_coducta_fk2` FOREIGN KEY (`cod_periodo`) REFERENCES `periodos` (`codigo`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

voldemmor 01-04-2008 23:01:11

cambiar a decimal
 
En ka estructura de la tabla intente cambiar el tipo de dato del campo nota de Float a Decimal.
Pero el error es el mismo.

Lepe 02-04-2008 03:36:13

no conozco mysql, pero si declaras un Float(2,2) intuyo que como máximo, podría almacenar un valor de 99,99 ¿no? al parecer, el primer registro que se intenta insertar, tiene un valor mayor a 99 ¿puede ser?

Ya digo que sólo intuyo, porque no sé realmente como va MySql.

Saludos

Caral 02-04-2008 04:45:05

Hola
Aparte de lo dicho por Lepe que por supuesto es lógico yo intentaría variarlo asi:
Código Delphi [-]
sql.Clear;
    SQL.Text := 'INSERT INTO nota (cod_estudiante,cod_matricula,cod_periodo,cod_materia,nota,detalle)'+
    'VALUES(:Cod_estudiante, :Cod_matricula, :Cod_periodo, :Cod_materia, :Nota, :detalle)';
    for i := 1 to  cant do
    begin
    Parameters[0].Value:=  strtoint(sgNotas.Cells[1,i]);
    Parameters[1].Value:=  strtoint(sgNotas.Cells[0,i]);
    Parameters[2].Value:=  CodigoPeriodoEvaluacion(cbxPeriodoNotas.Text);
    Parameters[3].Value:=  CodigoMateriaNombre(cbxMateria.Text);
    Parameters[4].Value:=  StrToFloat(sgNotas.Cells[3,i]);
    Parameters[5].Value:=  sgNotas.Cells[4,i];
    ExecSQL;
    end;
Con Value evito el uso del concepto del campo, bueno, asi lo hago yo.
Saludos

voldemmor 02-04-2008 17:17:26

Voy a verlo
 
Bueno sobre el valor que intento ingresar , ya que yo hago las pruebas en este momento, estoy seguro que se trata de uno que esta dentro del valor (10 11,5).

Pero ahora que lo mencionan no he visto como se esta representando por delphi, ejemplo (10,000000000),O algo asi.

Voy a checarlo a ver que pasa y Probare tu modificación tambien Caral

voldemmor 03-04-2008 19:30:15

problema resuelto____ O Burlado?
 
Bueno gracias por los consejos.

El problema si se encontraba en la Tabla asi que probe, formateando el flotante, pero no ce si lo hice bien, creo que no porque me dio un error

Código Delphi [-]
 
ParamByName : = strtoFloat(format(%2:%2,[sgNotas.Cell[3,i]]));


La solucion o el pequeño atajo.

cambie la definicion de la tabla a su forma original

Campo nota -> Float (9,3), y asi no me da ningun error.

:D

Bueno aunque un atajor por hoy, el chiste es que debo cumplir con el cliente.

Bye y gracias


La franja horaria es GMT +2. Ahora son las 17:51:58.

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