Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   ADO y datagrid (https://www.clubdelphi.com/foros/showthread.php?t=38694)

Marjinhos 23-12-2006 11:38:31

ADO y datagrid
 
El problema:

Utilizo ADO para conectarme con mi base de datos Access.

Tengo un Datagrid donde se muestran ciertos datos de una tabla y un botón 'Eliminar' que realiza las comprobaciones pertinentes y elimina de la base de datos el elemento seleccionado del datagrid a través de ADODataSet.delete

Despues de eliminar hago un refresh del form para que al pasar por el FormPaint me haga de nuevo la consulta sobre la tabla (que ya no debería tener el registro eliminado) y la asocie con el datagrid a través del datasource.

El problema es la consulta que realizo en el FormPaint (con un ADODataSet.CommandText := 'select ....') no me caza el cambio realizado.
Si vuelvo a pasar por el formPaint finalmente si me refleja los cambios.

Esto me ocurre tambien al insertar un elemento de la tabla desde otro form, y al pasar al form que contiene el datagrid no me muestra el nuevo hasta que refresco varias veces.

Es un problema de commit?, debería utilizar algo diferente?

Si me pudiesen ayudar les estaría muy agradecido.

droguerman 23-12-2006 18:08:22

prueba con el método requery del dataset

Marjinhos 24-12-2006 16:55:18

Requery
 
Lo del requery no me ha solucionado el problema.

La consulta que realizo en el FormPaint sobre la tabla de la que he eliminado el registro, todavía lee ese registro que acabo de eliminar. Esta consulta es a través de una select sobre un ADODataSet.

En cambio si realizo la búsqueda del registro en concreto con la instrucción Locate no me lo encuentra.

Supongo que no será tan raro utilizar un DataGrid conectado a través de un DataSource directamente, y no tiene por qué haber ese retardo tan grande.
Tal vez es un problema de commit o de la conexión con la base de datos, no sé.

Si se te ocurre alguna solución ... gracias de antemano.

Lepe 24-12-2006 19:55:16

El evento Paint de un Form se llama muchas veces, no es sitio para poner una acción de una consulta.

Construye una rutina que actualice los datos y lo llamas después de eliminar los registros

Saludos

Torreblanca 25-12-2006 01:56:36

Prueba cerrar y abrir la tabla

TablaX.close;
TablaX.open

Esto te deberia actualizar los datos en el datagrid.

Lepe 25-12-2006 12:46:30

Repito dando algo más de explicación, ya que tenía bastante prisa:
- El evento Paint se dispara muchas veces seguidas dentro del form, por tanto, puede que se esté abriendo la consulta y se mande a cerrar de nuevo una y otra vez.

- El evento Paint (en general, no solo para el Form) tiene baja prioridad en Windows, por tanto puede obviarse el evento y no hacer lo que quieres en el momento deseado.

El DataSource tiene un evento OnDataChange, (cuando se modifica un registro) o incluso OnStateChange (cuando pasa de Explorar la tabla a modificar, a editar, etc).

Puede usarse el OnDataChange para hacer lo que consideres oportuno.

Saludos

Marjinhos 26-12-2006 15:00:54

Gracias Lepe.

Todavía no he podido probar lo que me has dicho, pero ya me doy cuenta de que el problema va por ahí.

Es que todavía ando un poco pez en esto de delphi, pero no me convencía el hecho de utilizar el evento FormPaint (por los argumentos que diste).

Pero me surge una duda: para refresacar los datos de un form, o cargar combos que contenga con valores que se hayan generado por la transacción recien ejecutada, no se usa el FormPaint tampoco?. Cúal es la alternativa?

Espero no haber abusado mucho de tu ayuda.

Gracias!

Lepe 26-12-2006 15:28:50

En el FormPaint, como su nombre indica, se debe usar para pintar algo en el Form, por ejemplo usando la función Draw, DrawText . También podría usarse para actualizar un gráfico, pero si usamos un TImage, sería más conveniente usar el propio evento Paint de dicho TImage.

Todo lo que sea pintar sobre el Form, (como pintar con tiza sobre una pizarra), si usaríamos el evento Paint. Ejemplo: Pintar una flecha "------->" que salga de un Edit y que apunte a otro control. Al cambiar de tamaño la ventana "la pizarra se borraría" y haría falta el evento Paint para pintarlo de nuevo.

Un evento muy usado por ejemplo en los DBgrids es el DrawColumnCell que se dispara al pintar la celda, en este caso se podría usar para "incrustar" un combobox, un TDatetime, etc en la columna apropiada.

Todo se reduce a lo mismo, usar cada evento para lo que fue diseñado. Si quieres actualizar los datos de un datagrid al borrar desde un botón, puedes usar ese mismo botón para añadir el código de refresco. Incluso hacerte una rutina "ActualizaDatos" para llamarla desde varios eventos (el boton de borrar, el botón de añadir...).

En este caso no estamos pintando nada sobre el form, sino actualizando los datos que se inyectan a los controles DataAware, de ahí que sugiera otro evento o mecánica distinta. Lo lógico sería usar los eventos del TADODataset, dando una vuelta por F1 para saber cual es el más apropiado para nuestra necesidad.

Saludos

Marjinhos 26-12-2006 21:36:31

Aquí de nuevo.

Si de esta no soy capaz de solucionar mi problema desisto y queda como está.

El problema sigue siendo que la consulta que realizo después de la eliminación del elemento seleccionado en el dataGrid a través del botón eliminar, todavía lee el registro recien eliminado. La consulta es:

lsSQL := 'SELECT * FROM ' + TBL_FUNCION + ' WHERE NOMUSUARIO = "' +
obUsuario.Nombre + '" AND NOMPROYECTO = "' + obProyecto.Nombre + '" AND FECHA = "' + obEstimacion.Fecha + '" AND HORA = "' + obEstimacion.Hora + '" AND TIPO = "T" ORDER BY NOMFUNCION';

frmPrincipal.ADODataSet1.CommandText := lsSQL;
frmPrincipal.ADODataSet1.Open;

DBGrid1.DataSource := datasource1; {donde datasource1.DataSet = ADODataSet1}

He probado a realizar esta consulta despues de la eliminación, cuando salta el evento AfterDelete, realizar un commit y no hay manera. Si busco el registro inmediatamente con locate ya no está, pero si realizo la consulta anterior, sí me lo encuentra.

Debo estar haciendo algo de forma muy torpe pero no caigo.

No sé si influye pero el DataGrid lo tengo con readonly = true, porque solo lo quiero para mostrar los datos de la tabla FUNCION.

Siento ser tan pesado.

Todos los comentarios anteriores me han ayudado también, gracias.


La franja horaria es GMT +2. Ahora son las 18:04:43.

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