Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-12-2006
Marjinhos Marjinhos is offline
Registrado
 
Registrado: ago 2006
Posts: 9
Poder: 0
Marjinhos Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 23-12-2006
Avatar de droguerman
droguerman droguerman is offline
Miembro
 
Registrado: abr 2005
Ubicación: tierra
Posts: 999
Poder: 20
droguerman Va por buen camino
prueba con el método requery del dataset
__________________
self.free;
Responder Con Cita
  #3  
Antiguo 24-12-2006
Marjinhos Marjinhos is offline
Registrado
 
Registrado: ago 2006
Posts: 9
Poder: 0
Marjinhos Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 24-12-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 25-12-2006
Torreblanca Torreblanca is offline
Miembro
 
Registrado: jul 2005
Ubicación: Veracruz México
Posts: 52
Poder: 19
Torreblanca Va por buen camino
Prueba cerrar y abrir la tabla

TablaX.close;
TablaX.open

Esto te deberia actualizar los datos en el datagrid.
Responder Con Cita
  #6  
Antiguo 25-12-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 26-12-2006
Marjinhos Marjinhos is offline
Registrado
 
Registrado: ago 2006
Posts: 9
Poder: 0
Marjinhos Va por buen camino
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!
Responder Con Cita
  #8  
Antiguo 26-12-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 26-12-2006
Marjinhos Marjinhos is offline
Registrado
 
Registrado: ago 2006
Posts: 9
Poder: 0
Marjinhos Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 08:32:03.


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
Copyright 1996-2007 Club Delphi