PDA

Ver la Versión Completa : Error al refrescar el Query


Rc96
31-01-2019, 19:20:51
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:

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

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
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
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
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
[...]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
¿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:
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
with Modulo.DMBox.FDQCategoria do
begin
Close;


Lo anterior cierra el dataset Modulo.DMBox.FDQCategoria.


Open;
BD_Codigo:=FieldByName('codigo').AsString;
if IsEmpty then
begin
Close;

Lo anterior también cierra el dataset Modulo.DMBox.FDQCategoria.


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