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 02-07-2004
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 21
sitrico Va por buen camino
Question Como Refrescar un Query

Tengo 2 formularios, el primero contiene un DBGrid donde listo el resultado de un Query por Ej

Código SQL [-]
Select * from TABLA

Y en el segundo tengo un grupo de tEdit para actualizar los campos, para ello al crear el 2do from paso los parametros DatabaseName, TableName, CampoClave y ValorClave

Código Delphi [-]
constructor Create(Owner: TComponent; Accion:Integer;
                          DatabaseName,TableName,CampoClave,ValorClave:String);
                          Virtual;

Uso 2 TQuery en el segundo formulario uno lee el registro usando (SELECT * FROM TableName WHERE CampoClave = ValorClave) y el otro lo uso para actualizar con INSERT, UPDATE o DELETE.

El Problema es que después de guardar los cambios y cerrar el 2do formulario (ModalResult = mrOK) lanzo un refresh sobre la tabla del DBGrid y no me aparecen las actualizaciones.

Código Delphi [-]
Try
   f.ShowModal; // este Form actualiza los datos usando 2 tQuerys
Finally
   f.Free;
   End;
q.Refresh;  // No Hace Nada

Pero si cierro el formulario (f.free) y lo vuelvo a abrir (f.create .. ShowModal) si aparecen los cambios. Tambien funciona con un q.Close; q.Open; en lugar del q.Refresh; pero me parece ilógico tener que cerrar y abrir una base de datos para refrescarla.

Nota
Por ahora trabajo sobre Paradox 7 con Delphi 7 pero la intención es poder usar otros motores de BdD.
__________________
Sitrico

Última edición por sitrico fecha: 02-07-2004 a las 21:01:00.
Responder Con Cita
  #2  
Antiguo 02-07-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Pues aunque no te parezca lógico algunas bases de datos no tienes más remedio que abrir y cerrar para refrescarlas, pero no es el caso de Paradox, me da la impresión aunque no veo el código, que haces el refresco sobre la tabla, pero no cierras y abres la consulta que es la que te muestra los datos, con el refresh actualizas la tabla, pero la consulta no puesto que su datos son anteriores al refresco, prueba por ese lado y nos cuentas como te va.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 02-07-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Quizá, aunque más bien es pregunta para Marcos, si el Query tiene su propiedad RequestLive en true, no haga falta cerrar y abrir la consulta.

// Saludos
Responder Con Cita
  #4  
Antiguo 02-07-2004
Avatar de vic_ia
vic_ia vic_ia is offline
Miembro
 
Registrado: ene 2004
Posts: 238
Poder: 21
vic_ia Va por buen camino
Hola...

Cita:
Empezado por sitrico
Código Delphi [-]
Try
   f.ShowModal; // este Form actualiza los datos usando 2 tQuerys
Finally
   f.Free;
   End;
q.Refresh;  // No Hace Nada

Pero si cierro el formulario (f.free) y lo vuelvo a abrir (f.create .. ShowModal) si aparecen los cambios. Tambien funciona con un q.Close; q.Open; en lugar del q.Refresh; pero me parece ilógico tener que cerrar y abrir una base de datos para refrescarla.

Nota
Por ahora trabajo sobre Paradox 7 con Delphi 7 pero la intención es poder usar otros motores de BdD.
yo trabajo con Delphi 6, no he trabajado con paradox, y muy poco con querys, pero te puedo decir que la misma situación se presenta al trabajar con componentes TTable y archivos DBF; segun la documentación (o lo que he entendido de ella) el "Refresh" realiza una función similar al cerrar y abrir nuevamente un TDataSet; pero es mas elegante y optimizada (segun) pero repito a mi no me ha funcionado, por lo que he tenido que recurir al cerrar y abrir... no se si deba ha algun problema del BDE o que haya que configurar algo mas en los componentes; pareciera que el problema son los caches o bufers pero yo los he deshabilitados todos y nada.

saludos...
Responder Con Cita
  #5  
Antiguo 02-07-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Hola Román, según creo RequesLive lo que permite es actualizar la consulta, es decir poder añadir un registro en una rejilla o modificar uno de los que se muestra, pero siempre y cuando no se hagan referencias a otras tablas y algún condicionante más, para ello tenemos la propiedad CanModify que es necesario consultar a pesar de tener RequestLive activado, pues no siempre se pueden actualizar o modificar las consultas.

De hecho cuando esto no es posible se utiliza el componente UpdateSql.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #6  
Antiguo 02-07-2004
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 21
sitrico Va por buen camino
Gracias por responder (y tan rápido). El código que funciona quedo así:

Código Delphi [-]
procedure TfGridForm.aRefrescarExecute(Sender: TObject);
Var
s : String;
begin
s := q.FieldByName(CamposClave[IdFormulario]).AsString; // Registro actual
q.Close;
q.Open;
AjustarColumnas;  // Maquillaje del DBGrid
q.Locate(CamposClave[IdFormulario],s,[]); // Reposicionar actual
end;
__________________
Sitrico
Responder Con Cita
  #7  
Antiguo 02-07-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hola,

Ya hice algunas pruebas. Como dice Marcos, RequestLive tiene limitaciones, pero si la consulta asociada al DBGrid toma datos de una sola tabla (y algunas otras condiciones), puedes poner Query.RequestLive en true y al hacer Query.Refresh verás las actualizaciones de inmediato.

Por otra parte, no sé si has considerado usar controles dbedit en el segundo formulario en lugar de edit normales. Si enlazas los dbedit del segundo formulario al mismo datasource del grid en el primer formulario, y tienes RequestLive en true, entonces ni siquiera necesitas el refresh, los cambios se ven atomáticamente.

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


La franja horaria es GMT +2. Ahora son las 19:23:10.


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