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)
-   -   No se porque tengo un error cuando intento insertar en la tabla (https://www.clubdelphi.com/foros/showthread.php?t=58267)

Anyu 14-07-2008 20:58:19

No se porque tengo un error cuando intento insertar en la tabla
 
1 Archivos Adjunto(s)
hola a todos :p, tengo un pequeño drama con mi tabla TZQuery, sucede lo sgte:
tengo un sistema en delphi y tengo que registrar las remisiones que se hagan en un local, osea que en mi DB tengo una tabla de remision cabecera y remision detalle que debo llenar desde el ABM de remision, al hacer click en el boton de grabar me dice que la tabla remision (TZQuery) no se encuentra en el modo de insertar o editar, ya le di muchas vueltas y estoy segura que ha de ser una estupides, porque en mi DB me guarda los datos que ingero, y cuendo edito alguna nota de remision ya almacenada, tambien me modifica sin problemas, solo que no puedo evitar que me salte ese mensaje, y asi no lo puedo entregar, por favor si me pueden ayudar, porque soy nueva con Delphi y estoy segura que me debo estar saltando algun atributo o algo que debo marcar en true o cosa parecida.

P.D: Adjunto el mensaje de error por ahi se les hace familiar


Desde ya muchas gracias por su ayuda

Fenareth 14-07-2008 21:07:03

Hola Anyu !

Código Delphi [-]
Remi.Edit;

El mismo error te lo menciona... :)

enecumene 14-07-2008 21:09:21

Hola, si vas a insertar datos lo primero que debes hacer es poner el dataset en modo Insert:

Código Delphi [-]
ZQuery1.Insert;
// sentencias codigos
ZQuery1.Post;

Si vas a modificar datos primero debes ponerlo en modo Edit;

Código Delphi [-]
ZQuery1.Edit;
// sentencias codigos
ZQuery1.Post;

Saludos.

Anyu 14-07-2008 21:23:30

Este es el procedimiento que se ejecuta con el boton de agregar para los detalles, en el boton editar formulario, esta el remi.Edit pero en el boton de nuevo formulario tengo remi.append, entonces en lugar de eso tiene que ser remi.insert verdad?, quizas por eso agrega pero me lanza ese error...


procedure Tf_remision2.AgregarClick(Sender: TObject);
var
idremision: integer;
cantidad: real;
begin
if remi.State=dsInsert then
begin
remi.Fields[1].AsInteger:=strtoint(DBComprobante.Text);
remi.Fields[2].AsDateTime:=feini.Date;
remi.Fields[3].AsDateTime:=fefin.Date;
remi.Fields[4].AsString:=DBMotivo.Text;
remi.Fields[5].AsString:=DBRazon.Text;
remi.Fields[6].AsString:=DBRUC.Text;
remi.Fields[7].AsString:=DBDestino.Text;
remi.Fields[8].AsString:=DBPartida.Text;
remi.Fields[9].AsString:=f_menu.nomusu.Text;
remi.Fields[10].AsDateTime:=now();
remi.Fields[11].AsString:=DBLocal.Text;
remi.Fields[12].AsInteger:=strtoint(DBRemision.Text);
remi.Post;
remi.ApplyUpdates;
f_menu.conex.Commit;
remi.Close;
remi.Open;
remi.Last;
end;
if remi.State=dsEdit then
begin
remi.Fields[1].AsInteger:=strtoint(DBComprobante.Text);
remi.Fields[2].AsDateTime:=feini.Date;
remi.Fields[3].AsDateTime:=fefin.Date;
remi.Fields[4].AsString:=DBMotivo.Text;
remi.Fields[5].AsString:=DBRazon.Text;
remi.Fields[6].AsString:=DBRUC.Text;
remi.Fields[7].AsString:=DBDestino.Text;
remi.Fields[8].AsString:=DBPartida.Text;
remi.Fields[9].AsString:=f_menu.nomusu.Text;
remi.Fields[10].AsDateTime:=now();
remi.Fields[11].AsString:=DBLocal.Text;
remi.Post;
remi.ApplyUpdates;
f_menu.conex.Commit;
remi.Close;
remi.Open;
remi.Locate('id_remision',idremision,[]);
end;
des;

try
cantidad:=strtofloat(Cant.Text);
except
cantidad:=0;
end;

if cantidad <= merca.Fields[3].AsInteger then
begin
detalle.Append;
detalle.Fields[1].AsInteger:=remi.Fields[0].AsInteger;
detalle.Fields[3].AsInteger:=merca.Fields[0].AsInteger;
detalle.Fields[2].AsFloat:=strtofloat(cant.Text);
detalle.Post;
detalle.ApplyUpdates;
idremision:=remi.Fields[0].AsInteger;
f_menu.conex.Commit;
remi.Close;
remi.Open;
remi.Locate('id_remision',idremision,[]);
end
else
begin
showmessage('No se agregaron detalles, no hay cantidad suficiente o se modifico la cabecera');
Cant.SetFocus;
end;
abredetalle;

end;

Fenareth 14-07-2008 22:22:06

Cita:

Empezado por Anyu (Mensaje 300451)
Este es el procedimiento que se ejecuta con el boton de agregar para los detalles, en el boton editar formulario, esta el remi.Edit pero en el boton de nuevo formulario tengo remi.append, entonces en lugar de eso tiene que ser remi.insert verdad?, quizas por eso agrega pero me lanza ese error...


Código Delphi [-]
procedure Tf_remision2.AgregarClick(Sender: TObject);
var
idremision: integer;
cantidad: real;
begin
  if remi.State=dsInsert then
  begin
        remi.Fields[1].AsInteger:=strtoint(DBComprobante.Text);
        remi.Fields[2].AsDateTime:=feini.Date;
        remi.Fields[3].AsDateTime:=fefin.Date;
        remi.Fields[4].AsString:=DBMotivo.Text;
        remi.Fields[5].AsString:=DBRazon.Text;
        remi.Fields[6].AsString:=DBRUC.Text;
        remi.Fields[7].AsString:=DBDestino.Text;
        remi.Fields[8].AsString:=DBPartida.Text;
        remi.Fields[9].AsString:=f_menu.nomusu.Text;
        remi.Fields[10].AsDateTime:=now();
        remi.Fields[11].AsString:=DBLocal.Text;
        remi.Fields[12].AsInteger:=strtoint(DBRemision.Text);
        remi.Post;
        remi.ApplyUpdates;
        f_menu.conex.Commit;
        remi.Close;
        remi.Open;
        remi.Last;
  end;
  if remi.State=dsEdit then
  begin
        remi.Fields[1].AsInteger:=strtoint(DBComprobante.Text);
        remi.Fields[2].AsDateTime:=feini.Date;
        remi.Fields[3].AsDateTime:=fefin.Date;
        remi.Fields[4].AsString:=DBMotivo.Text;
        remi.Fields[5].AsString:=DBRazon.Text;
        remi.Fields[6].AsString:=DBRUC.Text;
        remi.Fields[7].AsString:=DBDestino.Text;
        remi.Fields[8].AsString:=DBPartida.Text;
        remi.Fields[9].AsString:=f_menu.nomusu.Text;
        remi.Fields[10].AsDateTime:=now();
        remi.Fields[11].AsString:=DBLocal.Text;
        remi.Post;
        remi.ApplyUpdates;
        f_menu.conex.Commit;
        remi.Close;
        remi.Open;
        remi.Locate('id_remision',idremision,[]);
  end;
  des;

  try
        cantidad:=strtofloat(Cant.Text);
  except
        cantidad:=0;
  end;

  if cantidad <= merca.Fields[3].AsInteger then
  begin
   detalle.Append;
   detalle.Fields[1].AsInteger:=remi.Fields[0].AsInteger;
   detalle.Fields[3].AsInteger:=merca.Fields[0].AsInteger;
   detalle.Fields[2].AsFloat:=strtofloat(cant.Text);
   detalle.Post;
   detalle.ApplyUpdates;
   idremision:=remi.Fields[0].AsInteger;
   f_menu.conex.Commit;
   remi.Close;
   remi.Open;
   remi.Locate('id_remision',idremision,[]);
   end
else
   begin
   showmessage('No se agregaron detalles, no hay cantidad suficiente o se modifico la cabecera');
   Cant.SetFocus;
   end;
   abredetalle;

end;

Se ve más bonito :)... intenta ese cambio y nos platicas

coso 14-07-2008 22:40:26

hola, tambien sirve...

Código Delphi [-]
 
if remi.state <> dsBrowse...
...
if not remi.state = dsEdit then remi.Fields[12].AsInteger:=strtoint(DBRemision.Text);
...
mas que nada para no repetir el mismo codigo.

Caro 15-07-2008 05:26:13

Cita:

Empezado por Anyu (Mensaje 300451)
Este es el procedimiento que se ejecuta con el boton de agregar para los detalles, en el boton editar formulario, esta el remi.Edit pero en el boton de nuevo formulario tengo remi.append, entonces en lugar de eso tiene que ser remi.insert verdad?, quizas por eso agrega pero me lanza ese error...

Hola Anyu, puedes añadir registros con Insert o Append ese no es el error, la diferencia entre uno y otro es: con Append registramos al final de los registros ya existentes y con Insert registramos delante del registro actual.

Saluditos

Anyu 15-07-2008 21:03:56

Rw:
 
ya lo pude resolver gracias a todos y saludos

Fenareth 15-07-2008 21:08:36

Cita:

Empezado por Anyu (Mensaje 300662)
ya lo pude resolver gracias a todos y saludos

Y porqué no nos dices cómo y sirve que todos aprendemos ? :) ;)

Anyu 15-07-2008 21:18:56

jajaja, lo que sucede es que le meti tanta.... mano que ya nose cual de todos fue la solucion jajaja, pero fue algo que deje pasar por desantenta, una variable que no fue inicializada:
mi idremision fue declarado como un integer, pero no lo inicialize en el caso de que mi DBGrid Remi este en remi.edit, y otro error fue que necesitaba de otro campo mas en mi tabla para poder manippularlo que era el nro de nota de remision ya que el id era un generador autoincrementable, y otras cositas, ak y alla, si les interesa les paso el código sin ningun problema, solo que no se si les sirva, si lo quieren lo paso mañana bien comentado porque ahora ya estoy de salida del laburo... tengo que ir a la facu...

saludos y besos

AzidRain 15-07-2008 23:29:35

clásico...ya lo resolví pero averigüen como lo hice..chaaaaleeeee.

El conocido error de querer crear las tablas hijas cuando aún no ha sido creada la tabla maestra y por lo tanto no tenemos clave principal para identificar. Ahí se los paso el semestre que entra cuando me acuerde de ustedes loosers....jajjajaja


Que mal plan no?

Anyu 15-07-2008 23:45:40

jajaja AzidRain:cool:, ese no fue mi error.... fue algo más estupido aun, porque la tabla cabecera y el detalle estaban ambos bien creados, e insertaba correctamente, solo que ese error que adjunte en un pricipio me saltaba igual, aun estando mi TZQuery en .append para el nuevo registro y .edit para editar uno ya existente, lo que se me paso por alto por desatenta fue inicializar mi idremision(variable local), en la segunda consulta de mi "if remi.state = dsEdit ..." y por eso insertaba sin problema pero las modificaciones solo lo hacia en el primer registro insertado al principio de la tabla.... esas son cosas que uno ve al dia sgte recien, despues de haber consultado a la almohada jaja


La franja horaria es GMT +2. Ahora son las 00:35:24.

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