FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
#1
|
|||
|
|||
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. |
#2
|
||||
|
||||
prueba con el método requery del dataset
__________________
self.free; |
#3
|
|||
|
|||
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. |
#4
|
||||
|
||||
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#5
|
|||
|
|||
Prueba cerrar y abrir la tabla
TablaX.close; TablaX.open Esto te deberia actualizar los datos en el datagrid. |
#6
|
||||
|
||||
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#7
|
|||
|
|||
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! |
#8
|
||||
|
||||
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. Última edición por Lepe fecha: 26-12-2006 a las 15:32:43. |
#9
|
|||
|
|||
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. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
DataGrid | altp | .NET | 1 | 27-10-2006 19:06:54 |
Checkbox en un datagrid | joel20 | .NET | 5 | 18-04-2006 13:39:02 |
Cabecera DataGrid | mamen | .NET | 4 | 26-10-2004 13:16:51 |
DataGrid en asp.net | mamen | .NET | 2 | 04-10-2004 13:00:26 |
|