PDA

Ver la Versión Completa : Problemas con Zquery y manejo de flotantes


voldemmor
01-04-2008, 20:08:49
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


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



el codigo



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


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

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
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
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


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