Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Tablas planas
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-07-2005
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
Question Problemas de actualización con los DBGrid

Desearía saber si alguien sabe por qué los DBGrid no actualizan instantáneamente.
Estoy trabajando con componentes ADOQuery y bases de datos Access XP.
He probado con activar y desactivar los ADOQuery, los DataSource, etc
sin ningún tipo de resultado.
Igualmente no se si el problema en si es del DBGrid o de la base de datos.
Cualquier ayuda será bienvenida.
Por si sirve de algo, trabajo con Delphi 7.
Saludos.
Responder Con Cita
  #2  
Antiguo 13-07-2005
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Saludos

El DbGrid solo sirve para visualizar el contenido del dataset, por ende no es el culpable.

Tienes la propiedad CacheUpdate Activada? si es asi, tienes que aplicar los cambios realizados.

Suerte
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #3  
Antiguo 13-07-2005
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
¿Dónde debería estar la propiedad CacheUpdate?

Sólo me aparece la propiedad CacheSize.

¿Cómo lo soluciono?

Última edición por Dexter182 fecha: 13-07-2005 a las 17:12:39.
Responder Con Cita
  #4  
Antiguo 13-07-2005
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Tienes Razon
Esa propiedad no esta en ese componente, me lleve de los demaz xxQuery que utilizo con regularidad.

No manejo mucho estos componenes, disculpa
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #5  
Antiguo 14-07-2005
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
Igualmente gracias por tu ayuda.

Vamos a ver que puedo lograr.

Si llego a descubrir la manera para que funcione, la postearé aquí.

Te agradezco de nuevo tu ayuda.

Saludos
Responder Con Cita
  #6  
Antiguo 16-07-2005
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
Unhappy Y los problemas se duplican

Aquí estoy de vuelta porque aún no he encontrado la solución.

Además tengo otro problema que creo que es parte de lo mismo (por eso lo posteo aquí y no en un nuevo hilo).

Tengo en mi aplicación dos opciones de menú:

Resguardo de la base de datos y Restauración de la base de datos.

El primero hace un copia de seguridad de la BD: CopyFile('Datos.mdb', 'Datos.bkp', FALSE) y el segundo lo inverso: CopyFile('Datos.bkp', 'Datos.mdb', FALSE).

Esto anda perfecto, pero el problema es que cuando hago una restauración, no me actualiza los cambios (es como si siguiera trabajando con la base anterior).

Si cierro la aplicación y vuelvo a ejecutarla, recién ahí me muestra la BD que recuperé.

He probado con las propiedades enabled, active, etc, y nada.

¿Que estoy haciendo mal? Les recuerdo que trabajo con una base de datos Access XP y con componentes TADOQuery.

Espero que alguien pueda ayudarme.

Saludos.
Responder Con Cita
  #7  
Antiguo 18-07-2005
iuqrul iuqrul is offline
Miembro
 
Registrado: dic 2004
Ubicación: Cartagena
Posts: 36
Poder: 0
iuqrul Va por buen camino
No creo que Access -ni ninguna base de datos- permita sustituir la base de datos en caliente, tendrás que desconectarte de ella para realizar esa operación. Otra cosa es usar un servicio de restauración de copias de seguridad en caliente, pero no es este caso, ni access lo permite.

Como siempre windows, en lugar de bloquearte para que no puedas realizar algo 'incorrecto', te deja hacer, pero se queda con el archivo guardado para mantener su integridad a salvo de torpes*, tú das por correcta la copia del archivo, pero te das cuenta que la cosa no funciona, el problema es que un archivo que el sistema está usando, y más en el caso de una base de datos debe liberarse de su uso antes de ser sobreescrito.

Un saludo.

*No me refiero a tí, sino al tratamiento que en algunos casos da este sistema operativo a los usuarios, permitiendo acciones que a la postre generan conflictos.
Responder Con Cita
  #8  
Antiguo 19-07-2005
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Saludos
Vamos por paso:
1) Que movimientos haces en el Query? o Base de datos?, antes de actualizar!
2) Los movimientos se guardan, a pesar de que no se muestra en el DbGrid?
3) Puedes mostrarno el codigo?
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #9  
Antiguo 21-07-2005
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
Smile Problemas solucionados (o por lo menos eso creo)

Cita:
Empezado por iuqrul
No creo que Access -ni ninguna base de datos- permita
sustituir la base de datos en caliente, tendrás que desconectarte de ella para
realizar esa operación. Otra cosa es usar un servicio de restauración de
copias de seguridad en caliente, pero no es este caso, ni access lo permite.

Como siempre windows, en lugar de bloquearte para que no puedas realizar
algo 'incorrecto', te deja hacer, pero se queda con el archivo guardado para
mantener su integridad a salvo de torpes*, tú das por correcta la copia del
archivo, pero te das cuenta que la cosa no funciona, el problema es que un
archivo que el sistema está usando, y más en el caso de una base de datos
debe liberarse de su uso antes de ser sobreescrito.
Como bien dijiste, el problema estaba en que la BD estaba siendo usada, por
lo cual, si bien la copia del archivo se realizaba a la perfección, no lo podía
usar hasta tanto no reiniciara la aplicación.
Pero cuando ya estaba por rendirme, se me ocurrió usar un ADOConnection
(antes simplemente me conectaba desde la propiedad ConnectionString del
ADOQuery).
Entonces lo pude solucionar de la siguiente manera:

ADOConnection.Connected := FALSE;
CopyFile('Datos.bkp', 'Datos.mdb', FALSE);
ADOConnection.Connected := TRUE;

Cita:
Empezado por vtdeleon
Vamos por paso:
1) Que movimientos haces en el Query? o Base de datos?, antes de
actualizar!
2) Los movimientos se guardan, a pesar de que no se muestra en el DbGrid?
3) Puedes mostrarno el codigo?.
Bien, con respecto a esto te comento que los cambios se guardaban en la
base sin ningún tipo de problemas. Lo único que pasaba era que los resultados
tardaban su tiempito en aparecer en el DBGrid.
Intentaré describir la situación y mostraré código fuente. Y luego explicaré
como lo solucioné.

Código:
procedure TForm_Venta.Button_AddClick(Sender: TObject);
//Agrega al DBGrid de Ítems el Artículo seleccionado
// en el DBGrid de Resultados
var
Aux1:Integer;
Aux2:Currency;
begin
If (DBGrid_Resultado.SelectedField.Text <> '') AND (SpinEdit_Cantidad.Value > 0) then
	begin
	 //Busca los datos del Artículo seleccionado
	 Aux.Active := FALSE; // Aux es una variable de tipo TADOQuery
	 Aux.SQL.Clear;
	 Aux.SQL.Add('SELECT * FROM TablaAux WHERE Descripcion
='''+DBGrid_Resultado.Fields[0].Text+'''');
	 Aux.Active := TRUE;
	 If not Aux.IsEmpty then
		begin
		 Aux1 := Aux.FieldByName('Cantidad').AsInteger;
		 Aux1 := Aux1 + SpinEdit_Cantidad.Value;
		 //Agrega al DBGrid de Ítems el Artículo seleccionado si la cantidad
		 //solicitada es menor o igual al stock actual del mismo. Además
		 //realiza las actualizaciones correspondientes de stock y subtotal
		 If Aux1 <= StrToInt(DBGrid_Resultado.Fields[1].Text) then
			begin
			 Aux2 := Aux.FieldByName('Precio Unit').AsCurrency;
			 Aux2 := Aux1 * Aux2;
			 Aux.Active := TRUE;
			 Aux.SQL.Clear;
			 Aux.SQL.Add('UPDATE TablaAux SET Cantidad =
					'+InttoStr(Aux1)+' , Subtotal = "'+FloatToStr(Aux2)
					 +'" WHERE Descripcion =
				   '''+DBGrid_Resultado.Fields[0].Text+'''');
			 Aux.ExecSQL;
			end;
		end
	 else
		begin
		 Aux.Active := TRUE;
		 Aux.SQL.Clear;
		 Aux.SQL.Add('INSERT INTO TablaAux VALUES
			   '''+DBGrid_Resultado.Fields[0].Text+''',
			   '+IntToStr(SpinEdit_Cantidad.Value)+',
			   "'+DBGrid_Resultado.Fields[2].Text+'" ,
			   "'+FloatToStr(SpinEdit_Cantidad.Value*
			   StrToFloat(DBGrid_Resultado.Fields[2].Text))+'")');
		 Aux.ExecSQL;
		end;
	 Modulo.ConsultaAux.Active := FALSE;
	 Modulo.ConsultaAux.Active := TRUE;
	 //Actualiza el máximo valor del SpinEdit y en caso de ser igual
	 //a cero, lo deshabilita. Además limpia su contenido.
	 SpinEdit_Cantidad.MaxValue := SpinEdit_Cantidad.MaxValue
- SpinEdit_Cantidad.Value;
	 If SpinEdit_Cantidad.MaxValue = 0 then
		SpinEdit_Cantidad.ReadOnly := TRUE
	 Else
		SpinEdit_Cantidad.ReadOnly := FALSE;
	 SpinEdit_Cantidad.Value := 0;
	 //Actualiza el monto total de la venta o presupuesto
	 ViewTotal;
 
	end;
end;
Como verán el código era un despelote (ni yo lo entendía).
Lo que intentaba de hacer era que cuando el usuario clickeara el botón Add,
agregara el artículo que se había seleccionado en el DBGrid_Resultados
(muestra el resultado de una búsqueda y permite encontrar un Artículo en
particular) al DBGrid de Ítems (muestra los artículos que posteriormente se
facturarán, mostrando descripción, cantidad a vender, precio unitario y
subtotal.
Hasta acá era fácil. El problema era que yo necesitaba saber si ese artículo ya
se encontraba en el DBGrid de Ítems, y luego dependiendo de eso, debía o
actualizar la cantidad a vender o simplemente agregar el artículo.
Y bueno, no se si era por la cantidad de consultas sobre la misma base o por
alguna otra razón que desconozco, la cuestión que cuando clickeaba mi botón
ADD, el DBGrid se tomaba un tiempito para actualizar (si es que lo lograba).
Entonces decidí cambiar de estrategia y directamente no permitir ingresar el
artículo nuevamente.
Así, si realmente se arrepintió de la cantidad ingresada y quería agregar más a
ese artículo, debe primero quitarlo y luego agregarlo nuevamente con la
cantidad deseada.
Esto no solo simplificó mi código (tanto de este evento como de todos los
posteriores), si no que además ahora anda.
El código actual es el siguiente.

Código:
procedure TForm_Venta.Button_AddClick(Sender: TObject);
//Agrega al DBGrid de Ítems el Producto seleccionado
begin
If (DBGrid_Resultado.SelectedField.Text <> '') AND (SpinEdit_Cantidad.Value > 0) then
	begin
	 //Busca el Producto seleccionado en la tabla de ítems a facturar / presupuestar
	 Aux.Active := FALSE;
	 Aux.SQL.Clear;
	 Aux.SQL.Add('SELECT * FROM TablaAux WHERE Descripcion =
					   '''+DBGrid_Resultado.Fields[1].Text+'''');
	 Aux.Active := TRUE;
	 If Aux.IsEmpty then
		begin // Agrega el producto a la lista de ítems
		 Aux.Active := TRUE;
		 Aux.SQL.Clear;
		 Aux.SQL.Add('INSERT INTO TablaAux VALUES
			   '''+DBGrid_Resultado.Fields[1].Text+''',
			   '+IntToStr(SpinEdit_Cantidad.Value)+',
			   "'+DBGrid_Resultado.Fields[2].Text+'" ,
			   "'+FloatToStr(SpinEdit_Cantidad.Value*
			   StrToFloat(DBGrid_Resultado.Fields[2].Text))+'")');
		 Aux.ExecSQL;
		 Modulo.ConsultaAux.Active := FALSE;
		 Modulo.ConsultaAux.Active := TRUE;
 
//Actualiza el monto total de la venta o presupuesto 
		 VerTotal;
		end
	 else // Si Aux no esta vacío
		MessageBox(Handle, 'El producto ya existe en la lista de ítems',
		'ERROR', MB_OK+MB_ICONEXCLAMATION);
	end;
end;
Bueno, espero que se entienda algo de todo esto.
Desde ya les agradezco sus respuestas y les pido disculpas por no poder
contestarles rápidamente.
Un saludo y gracias de nuevo.

Última edición por Dexter182 fecha: 21-07-2005 a las 10:21:02.
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 23:38:25.


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