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)
-   -   Error: Cannot perform this operation on a closed dataset (https://www.clubdelphi.com/foros/showthread.php?t=57930)

Netyco 02-07-2008 15:58:16

Error: Cannot perform this operation on a closed dataset
 
Hola gente,

Les cuento que estoy haciendo un programita el cual me esta llevando mucho tiempo porque me sale un error que no se como solucionarlo, me podrían ayudar?

Resulta que tengo un formulario donde agrego tareas, lo ejecuto y funciona, pero cuando agrego varias tareas a la vez me sale el siguiente error:

' Cannot perform this operation on a closed dataset' y la verdad es que no tengo idea de como solucionarlo.

Agradecere mucho su ayuda, saludos:)

coso 02-07-2008 16:03:20

Hola,

la traduccion de este error es que no se puede hacer la operacion en un conjunto de datos cerrados. Esto es, tienes el query o la tabla cerrados. Para abrirlos, debes usar query.open o bien query.active := true. En caso de ser tablas, table.Open. Ten en cuenta que si usas ado y queries, despues de un 'select' debes usar active := true, mientras que para el resto debes usar ExecSQL.

saludos

Netyco 02-07-2008 16:11:01

Hola, gracias por la rapidez de tu repuesta.

Pero te cuento que esas consideraciones las tuve en cuenta. En agregar una tarea uso un insert, (tarabajo con ado y query), y al terminar pongo ExecSQL,

Y tengo otro procediemiento donde uso un select, decime escribo query.active:= true o query.open?

Igual probe de las dos maneras y me sigue saliendo error. :confused:

coso 02-07-2008 16:13:22

Bien, deberias hacer algo asi

Código Delphi [-]
 
  query.Active := false;
  query.SQL.Text := 'insert into ...';
  query.ExecSQL;
  query.SQL.Text := 'select * from ...';
  query.Active := true;

al final debes abrirla para poder seguir trabajando con ella. Usa el debugger (f5,f7,f8) para saber exactamente en que linea te salta y prueba de ponernos el codigo, si aun no se soluciona.

PD: personalmente siempre uso active := false, active := true, aunque creo que son completamente equivalentes. Eso si, para el select el active/open. Para el resto, el execsql. No entiendo esta distincion en ado, pues en bde no ocurre, pero asi es. Saludos.

Netyco 02-07-2008 16:36:46

ok, mira sos super, muchas gracias por tu ayuda, pero no tuve exito, asi que te paso mi codigo original y decime como lo arreglo porfis:


Código Delphi [-]
procedure tftarea.agregartarea;
begin   
   buscarOperador;   
   dm.Qtareas.Close;     
  dm.Qtareas.SQL.Clear;    
  dm.Qtareas.SQL.Add('INSERT INTO tarea (fecha, hora, asunto, comentario, id_operador,');
    dm.Qtareas.SQL.Add('HoraAReal, FechaAReal, estado, bandera) values (:fech, :hor, :asu, :com, :id,');
    dm.Qtareas.SQL.Add(' :hora, :fecha, :est, :band)');
    dm.Qtareas.Parameters.ParamByName('fech').Value:= strtodate(lfecha.Caption);
    dm.Qtareas.Parameters.ParamByName('hor').Value:= lhora.Caption;
    dm.Qtareas.Parameters.ParamByName('asu').Value:= cbasunto.Text;
    dm.Qtareas.Parameters.ParamByName('com').Value:= Mcom.Text;
    dm.Qtareas.Parameters.ParamByName('id').Value:= strtoint(dbgrid1.Fields[0].Value);
    dm.Qtareas.Parameters.ParamByName('hora').Value:= timetostr(dtphora.DateTime);
    dm.Qtareas.Parameters.ParamByName('fecha').Value:= dtpfecha.DateTime;
    dm.Qtareas.Parameters.ParamByName('est').Value:= 'Pendiente';
    dm.Qtareas.Parameters.ParamByName('band').Value:= 'n';
    dm.Qtareas.ExecSQL;


end;

donde buscaroperador es:

Código Delphi [-]
procedure tftarea.buscarOperador;

begin      
     dm.Qoperador.Close      
     dm.Qoperador.SQL.Clear;       
      dm.Qoperador.SQL.Add('select id from operador where nombre = :nom');
      dm.Qoperador.Parameters.ParamByName('nom').Value:= cbop.Text ;
      dm.Qoperador.Open;
end;

coso 02-07-2008 16:39:30

y donde te salta la excepcion? en el execsql? o despues?
creo que el problema te viene del dbgrid1.Fields[0].Value, y, si cbasunto y mcom son dbedits, quiza tambien por alli. prueba de poner valores de test a estos o ves comentando las lineas, para saber exactamente que es lo que te lo esta provocando, si no es en el execsql. Usa f5,f7,f8 para saber exactamente donde te salta. El debugger esta precisamente para esto.

juanelo 02-07-2008 16:44:19

No estan funcionando correactamente las etiquetas de DELPHI

coso 02-07-2008 16:45:18

debes usar... (delphi) al inicio, (/delphi) al final, siendo los parentesis corchetes [,].

Código Delphi [-]
Test

:confused: creo q si...

Netyco 02-07-2008 16:49:56

apenas pasa el ExecSQL me salta el error :(

coso 02-07-2008 16:55:53

vamos a ver... si pones un breakpoint (F5) en la linea
Código Delphi [-]
...
dm.Qtareas.Close; 
...

y vas con el F8 siguiendo linea por linea...te salta en la linea

Código Delphi [-]
...
dm.Qtareas.ExecSQL;
...

?

me esta dando la impresion que te salta antes, cuando asignas los valores a los parametros. O bien despues del execsql, en alguna otra funcion que se ejecute a continuacion. En el codigo que has mostrado actualmente no veo ningun error.

Netyco 02-07-2008 17:09:31

Te cuento lo que me salio:

voy con f8 y pasa ExecSQL, y me sale el error que te comento, y una vez que acepto el error el puntero se posiciona en el formulario que crea el form de agregar tarea

ftarea:=Tftarea.Create(self);
ftarea.Showmodal;
ftarea.Free; (aqui apunta )

me siento una inutil :(.

Yo me estoy yendo a clases, pero por favor si puedes responde si sabes como lo soluciono, seguramente durante la tarde le dare una miradita. Saludos y muchas gracias:)

coso 02-07-2008 17:16:14

Cita:

me siento una inutil :(.
juas! :D si esto de la programacion es lo que tiene, que de tantas tonterias que tiene uno se siente idiota :p (aunque, evidentemente, no lo sea :o:):D)

Cita:

ftarea:=Tftarea.Create(self);
ftarea.Showmodal;
ftarea.Free; (aqui apunta )
aqui apunta? no te entendi.

sinceramente, no se verlo. Si es en la linea execsql donde te salta, no lo entiendo. Quiza tengas la tabla abierta en modo exclusivo por otro lado, por lo que acceder a ella te provoque el error, o quizas codigo en los eventos OnDataChange, OnPost, etc... que te cierre la tabla. Sinceramente, no lo se. Creia que era en el momento en que asignas los argumentos, y que el error de tabla cerrada te lo daba de otra que no fuese tarea.

PD: prueba de poner

Código Delphi [-]
   dm.Qtarea.ExecSql;   
   dm.Qtarea.SQL.Text := 'select * from tarea';
   dm.Qtarea.Active := true;

a ver si soluciona algo...


La franja horaria es GMT +2. Ahora son las 07:00:06.

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