Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error al refrescar el Query (https://www.clubdelphi.com/foros/showthread.php?t=93726)

Rc96 31-01-2019 19:20:51

Error al refrescar el Query
 
Saludos,
Llevo rato intentando resolver el siguiente problema pero aun no encuentro nada :confused:, luego de cada insert, update o delete que realizo en la base de datos ingreso el siguiente codigo para refrescar el Query:

Código Delphi [-]
Query.DBGrid.DataSource.DataSet.Refresh;

el problema esta en que, aunque realiza la rutina sql correctamente, me genera el siguiente error:

Query: cannot perform this operation on a closed dataset.

Espero puedan ayudarme, gracias de antemano.

Ñuño Martínez 31-01-2019 19:31:32

Comprueba que la propiedad Active del DataSet sea TRUE. Ten en cuenta que algunas operaciones pueden cerrarlo así que revisa lo que haces y, en última instancia, usa el método Open.

Rc96 31-01-2019 19:49:02

Cita:

Empezado por Ñuño Martínez (Mensaje 530512)
Comprueba que la propiedad Active del DataSet sea TRUE. Ten en cuenta que algunas operaciones pueden cerrarlo así que revisa lo que haces y, en última instancia, usa el método Open.


El Dataset esta activo, intente con el metodo open luego del rutina pero genera el siguiete error:

Cannont Open / define command use Execute / ExcSql

Código Delphi [-]
procedure Guardar;
  var
  BD_Codigo:String;
begin
  with Modulo.DMBox.FDQCategoria do
  begin
    Close;
    SQL.Text:='select * from inv_gpo_prod where "codigo"=:c';
    ParamByName('c').AsString:=MCategoria.E_Codigo.Text;
    Open;
    BD_Codigo:=FieldByName('codigo').AsString;
    if IsEmpty then
    begin
      Close;
      SQL.Clear;
      SQL.Add('insert into inv_gpo_prod ("codigo","descripcion","clasificacion","lote","observacion","status")');
      SQL.Add('values (:c,:d,:clasif,:l,:ob,:s)');
      Param_Guardar; ExecSQL; DMBox.FDConexion.Commit;
    end
    else
    begin
      Close;
      SQL.Clear;
      SQL.Add('update inv_gpo_prod set "codigo"=:c,"descripcion"=:d,"clasificacion"=:clasif,"lote"=:l,"observacion"=:ob,"status"=:s');
      SQL.Add('where "codigo"=:c');
      Param_Guardar; ExecSQL; DMBox.FDConexion.Commit;
    end;
  end;
end;

Soa Pelaez 31-01-2019 22:36:24

Prueba cerrando y abriendo el query, aunque tambien puedes revisar que sentencia sql tiene tu query, que de pronto no se quede pegado con tus sentencias de update o insert y que este si tenga la de algún tipo de select de datos.

ElKurgan 01-02-2019 07:50:24

¿No será que en alguna función, como el paramguardar o el ExecSQL lo estás cerrando sin querer?

Saludos

Rc96 01-02-2019 13:01:33

Cita:

Empezado por Soa Pelaez (Mensaje 530514)
Prueba cerrando y abriendo el query, aunque tambien puedes revisar que sentencia sql tiene tu query, que de pronto no se quede pegado con tus sentencias de update o insert y que este si tenga la de algún tipo de select de datos.


Buen día Soa, la unica forma de refrescar es realizando una rutina select despues de el insert, update o delete. Con esto resuelvo, aun asi me gustaria entender la causa de este error, debido a que estaba funcionando correctamente.



Gracias a todos por sus respuestas.

Casimiro Notevi 01-02-2019 13:43:16

Cita:

Empezado por Rc96 (Mensaje 530519)
Buen día Soa, la unica forma de refrescar es realizando una rutina select despues de el insert, update o delete. Con esto resuelvo, aun asi me gustaria entender la causa de este error, debido a que estaba funcionando correctamente.
Gracias a todos por sus respuestas.

Es el tipo de pregunta que resulta casi imposible de contestar si no vemos el código fuente implicado en el caso.
Sólamente podemos intentar averiguar.

Rc96 01-02-2019 14:13:06

Cita:

Empezado por Casimiro Notevi (Mensaje 530520)
Es el tipo de pregunta que resulta casi imposible de contestar si no vemos el código fuente implicado en el caso.
Sólamente podemos intentar averiguar.


Saludos, casimiro si observas el comentario #3 encontraras el codigo.


Gracias.

Casimiro Notevi 01-02-2019 18:02:15

Ya, pero me refería a otro posible código asociado, triggers, etc.


Además, te recomiendo, aunque sea por probar, que no uses with Modulo.DMBox.FDQCategoria do

Al González 01-02-2019 18:16:58

Cita:

Empezado por Rc96 (Mensaje 530519)
[...]estaba funcionando correctamente.

¿Exactamente con ese mismo código? ;)

Porque así, como se ve, después de hacer el Insert o Update ningún Refresh funcionaría con el objeto Modulo.DMBox.FDQCategoria.

Y concuerdo con Casimiro: ¡No uses With en ningún caso! Tiene un enorme defecto de fábrica.

Rc96 01-02-2019 18:57:15

Cita:

Empezado por Al González (Mensaje 530525)
¿Exactamente con ese mismo código? ;)

Porque así, como se ve, después de hacer el Insert o Update ningún Refresh funcionaría con el objeto Modulo.DMBox.FDQCategoria.

Y concuerdo con Casimiro: ¡No uses With en ningún caso! Tiene un enorme defecto de fábrica.


Saludos,


Veran les comentare que paso y es probable que uds aclaren mis dudas :D


todos los componentes para la conexion de la base de datos, consultas y demas rutinas, estan alojados en un Data Module donde el Unit es "Modulo" y el Data Module "DataModulo".


Esto asi, funcionaba al realizar un insert, update o delete pero al realizar una consulta a la tabla, solo se veia que consultaba por el cursos sql, mas no mostraba los datos en el dbgrid.


Lo que hice fue renombrar el Data module a "DMBox" y ya me consultaba normalmente pero ahora al guardar, modificar o eliminar me generaba el error que comente al principio, y esto sin cambiar nada el codigo solo el nombre del Data Module.


Suena extraño pero eso fue lo que note y asi solvente.


Es problable que algo hice que produjo esa falla, por otra parte me gustaria saber el porque el with no es recomendable.


Gracias de antemano.

Casimiro Notevi 01-02-2019 19:38:31

Pues tienes un ejemplo muy claro en tu código:
Código Delphi [-]
with Modulo.DMBox.FDQCategoria do 
begin 
  Close;
Ese "Close", puede referirse a FDQCategoria.close o a form.close, no está claro y puedes encontrarte sorpresas.

orodriguezca 07-02-2019 16:12:21

Código Delphi [-]
 with Modulo.DMBox.FDQCategoria do
  begin
    Close;

Lo anterior cierra el dataset Modulo.DMBox.FDQCategoria.

Código Delphi [-]
 Open;
    BD_Codigo:=FieldByName('codigo').AsString;
    if IsEmpty then
    begin
      Close;
Lo anterior también cierra el dataset Modulo.DMBox.FDQCategoria.

Código Delphi [-]
      SQL.Add('insert into inv_gpo_prod ("codigo","descripcion","clasificacion","lote","observacion","status")');
      SQL.Add('values (:c,:d,:clasif,:l,:ob,:s)');
      Param_Guardar; 
      ExecSQL; // Esto no abre el dataset
     DMBox.FDConexion.Commit;

El método ExecSQL no abre un dataset, solo ejecuta la instrucción SQL definida.


Suponiendo que el dataset al cual le estás haciendo Refresh es Modulo.DMBox.FDQCategoria no hay forma de que esté activo, pues no solo lo cierras explicitamente varias veces sino que ademas cambias la instruccion sql a Insert o Update lo que bajo ninguna circunstancia abre un dataset.

Por otra parte, suponiendo que el dataset al cual le haces Refresh NO es Modulo.DMBox.FDQCategoria, quizás el problema te lo esté generando la instrucción Commit, particularmente si la base de datos es Interbase o Firebird. En estas dos bases de datos una instrucción Commit, o Rollback, no solo finaliza la transacción sino que además se cierran todos los dataset asociados a la transacción, por lo que muchos programadores hacen uso de la instrucción CommitRetaining para solventar esta dificultad.

Casimiro Notevi 07-02-2019 17:32:58

Cita:

Empezado por orodriguezca (Mensaje 530580)
Suponiendo que el dataset al cual le estás haciendo ...
Por otra parte, suponiendo que el dataset al cual le haces ...

Pues eso, entre el lo que se supone que hace lo que hay dentro del with y el resto de suposiciones... no hay nada claro.


La franja horaria es GMT +2. Ahora son las 09:29:33.

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