PDA

Ver la Versión Completa : problemas en un insercion en la base de datos


alfil123
20-01-2006, 18:36:03
hola amigos tengo un problema al introducir un nuevo registro en una base de datos de access, este es el error que se produce en tiempo de ejecucion


no coinciden los tipos de datos en la espresion de criterios


eso se ocaciona cuando cuando agrego al codigo el procedimiento datachange, este es el codigo que tengo en ese procedimiento



begin
inherited;
if NOT ADOQuery1.EOF
then
Begin
// Recuperamos los valores del registro actual en los campos respectivos
// le_id01.Text:=DataSource1.Fields[0].AsString;
LabeledEdit2.Text:=ADOQuery1.FieldByName('Nombres').Value;
LabeledEdit3.Text:=ADOQuery1.FieldByName('Ap').Value;
LabeledEdit4.Text := ADOQuery1.FieldByName('AM').Value;
LabeledEdit5.Text := ADOQuery1.FieldByName('DNI').Value;
LabeledEdit6.Text := ADOQuery1.FieldByName('Direccion').Value;
LabeledEdit7.Text := ADOQuery1.FieldByName('Telefono').Value;
LabeledEdit8.Text := ADOQuery1.FieldByName('Especialidad').Value;
// bbModificar.Enabled := true;
//bbEliminar.Enabled := true;
End
{else
begin
// Recuperamos los valores del registro actual en los campos respectivos
edCodDocente.Text:= '';
edNombres.Text:= '';
edApPaterno.Text:= '';
edApMaterno.Text := '';
edDNI.Text := '';
edDireccion.Text := '';
edTelefono.Text := '';
bbModificar.Enabled := false;
bbEliminar.Enabled := false;
end;}
end;


por favor es pido ayuda

delphi.com.ar
20-01-2006, 18:54:20
Por casualidad... ¿Si comentas todo el evento no se produce el error de todos modos?
¿Cuál es la consulta del ADOQuery1?

alfil123
20-01-2006, 19:12:32
si comento todo el evento no se pruduce el error,


esta es la consulta para guardar

procedure TMantenimiento_Docente.ToolButton2Click(Sender: TObject);
begin
inherited;
if (LabeledEdit2.text='') or (LabeledEdit3.text='') or (LabeledEdit4.text='') or (LabeledEdit5.text='') or (LabeledEdit6.text='') or (LabeledEdit7.text='') or (LabeledEdit8.text='')or (LabeledEdit9.text='')
then
begin
showmessage('le falta completar los campos');
exit;
end;
ADOQuery1.Close;
ADOQuery1.sql.Clear;
ADOQuery1.SQL.Add('select *');
ADOQuery1.SQL.Add('from Docente');
ADOQuery1.open;
ADOQuery1.Append;
// ADOQuery1.FieldByName('id_Docente').asstring:= LabeledEdit1.text;
ADOQuery1.FieldByName('Nombres').asString:= LabeledEdit2.text;
ADOQuery1.fieldbyname('ap').asString:= LabeledEdit3.text;
ADOQuery1.fieldbyname('am').asString:= LabeledEdit4.text;
ADOQuery1.fieldbyname('Dni').asstring:= LabeledEdit5.text;
ADOQuery1.fieldbyname('direccion').asString:= LabeledEdit6.text;
ADOQuery1.fieldbyname('telefono').asString:= LabeledEdit7.text;
ADOQuery1.fieldbyname('Especialidad').asString:= LabeledEdit8.text;
ADOQuery1.fieldbyname('Area').asString:= LabeledEdit9.text
ADOQuery1.post;
ADOQuery1.close;
LabeledEdit2.text:='';
LabeledEdit3.text:='';
LabeledEdit4.text:='';
LabeledEdit5.text:='';
LabeledEdit6.text:='';
LabeledEdit7.text:='';
LabeledEdit8.text:='';
LabeledEdit9.text:='';
showmessage('sea agregado un nuevo docente ');

end;


y esta es la consulta de creacion del form

procedure TMantenimiento_Docente.FormShow(Sender: TObject);
begin
inherited;
ADOQuery1.close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.add('Select* from DOCENTE');
ADOQuery1.Open;
end;
procedure TMantenimiento_Docente.Formcreate(Sender: TObject);
begin
inherited;
ADOQuery1.close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.add('Select* from DOCENTE');
ADOQuery1.Open;
end;

grasias por su tiempo

fabianbbg
20-01-2006, 20:05:50
Hola:
Tengo dudas con tu aplicación: aver..
*¿Porque haces en el create del form y en el show lo mismo?
*¿No es redundante?

*Otra cosa:
cuando agregas un registro:

ADOQuery1.Close;
ADOQuery1.sql.Clear;
ADOQuery1.SQL.Add('select *');
ADOQuery1.SQL.Add('from Docente');
ADOQuery1.open;
ADOQuery1.Append;
// ADOQuery1.FieldByName('id_Docente').asstring:= LabeledEdit1.text;
ADOQuery1.FieldByName('Nombres').asString:= LabeledEdit2.text;
ADOQuery1.fieldbyname('ap').asString:= LabeledEdit3.text;
ADOQuery1.fieldbyname('am').asString:= LabeledEdit4.text;
ADOQuery1.fieldbyname('Dni').asstring:= LabeledEdit5.text;
ADOQuery1.fieldbyname('direccion').asString:= LabeledEdit6.text;
ADOQuery1.fieldbyname('telefono').asString:= LabeledEdit7.text;
ADOQuery1.fieldbyname('Especialidad').asString:= LabeledEdit8.text;
ADOQuery1.fieldbyname('Area').asString:= LabeledEdit9.text
ADOQuery1.post;


No hace falta traer todos los registros solo para que el dataset tenga la estructura que necesitas para insertar.

Si queres insertar todo con SQL podes mandar dentro del SQL.text del TADOQuery la sentencia INSERT


ADOQuery1.sql,text:='INSERT INTO Docente (Nombres,ap,am,Dni,direccion,telefono,Especialidad,Area)
SELECT '+
quotedstr(LabeledEdit2.text)+ 'AS Expr1' //asi para todos los campos



Luego a ese Query lo ejecutas con ADOQuery.ExecSql

Ahora bien.. si no te gusta la idea y seguis con tu planteo, deberias revisar si no estas queriendo guardar un valor string (label.text) en un campo tipo numerico.

y ademas podrias probar asi



ADOQuery1.FieldByName('Nombres').Value:= LabeledEdit2.text;



por supuesto por cada campo..

bueno. Saludos..