PDA

Ver la Versión Completa : Ayuda con Cached Updates


Maxter
05-08-2003, 21:12:19
Tengo una aplicación sencilla de captura de facturas.

Uso Delphi 5, y componentes sencillos: TTable (con CachedUpdates = True) y TDataSource con un DBGrid .

Para trabajar he elegido usar Cached Updates y todo trabajaba bien hasta que decidí tratar de mostrar un ProgressBar que reflejara el progreso de la actualización. Para tal efecto decidí usar el evento OnUpdateRecord que sería el que afectaría el avance en el ProgressBar. Sin embargo no funciona como esperaba. He escrito el valor de UpdateAction a uaApplied, pero en la tabla no se escribe nada. No me marca ningún error, ni nada. Si no le doy a UpdateAction ningún valor, entonces me marca un error de 'Table is Read Only'. Si elimino el evento OnUpdateRecord, la actualización de lleva a cabo correctamente.

Resumiendo:

procedure TFEditFactsMany.TFactsGeneralUpdateRecord(DataSet: TDataSet;
UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
begin
UpdateAction:= uaApplied
end;

no actualiza la tabla

procedure TFEditFactsMany.TFactsGeneralUpdateRecord(DataSet: TDataSet;
UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
begin
// otro código cualquiera que no
// cambia el puntero de registro
end;

marca 'Table Is ReadOnly'

y sin el evento todo trabaja bien.

Ojalá alguien me pueda dar una pista de porqué este comportamiento, qué estoy haciendo mal. O bien, si hay otra forma de presentar un ProgressBar al usuario que muestre el avance de la actualización.

De antemano muchas gracias.

jachguate
06-08-2003, 14:10:44
No se exactamente a que te referis con el progreso de la actualización... pero supongo que es mostrar al usuario el porcentaje de progreso cuando se están aplicando los cambios a la base de datos. Si es esto lo que queres hacer, salvo que el usuario quiera actualizar millones de registros, te recomiendo abandonar la idea, porque sencillamente estas trabajando de mas.

El evento OnUpdateRecord sirve para sustituir el comportamiento del BDE al hacer las actualizaciones, para asumir nosotros esa responsabilidad.

El significado de los parámetros es:

UpdateKind:

ukInsert: Hay que insertar un nuevo registro con los datos de la fila activa
ukModify: Hay que actualizar un registro existente con los datos de la fila activa
ukDelete: Hay que borrar el registro correspondiente a la fila activa.

UpdateAction:

uaFail: Lanza una excepción, indicando el fallo de las actualizaciones
uaAbort: Lanza una excepción silenciosa (EAbort)
uaSkip: Ignora el registro contenido en la fila activa, y continua con el siguiente
uaApplied: La actualización se realizó exitosamente.

Como te comento, la responsabilidad de realizar las actualizaciones al utilizar este evento, es tuya.

Hasta luego.

;)

Maxter
06-08-2003, 16:28:00
Te agradezo el tiempo que te tomaste para responder mi cuestión.

Aunque sí había notado que las actualizaciones a las bases eran muy rápidas, por cuestiones de pura presentación sí quería mostrar una barra de progreso.

Creo que tomaré tu sugerencia y no lo haré, pero aún así me intriga el comportamiento del evento OnUpateRecord.

Si yo voy a tomar la responsabilidad de efectuar las actualizaciones, ¿cómo lo hago?

Estoy pensando que cuando creé el evento y escribí

UpdateAction:= uaApplied;

como única línea del evento, la tabla no se actualizaba, ¿como debo actualizarla entonces?.

De nueva cuenta, gracias por tu ayuda. Saludos.

jachguate
06-08-2003, 16:56:39
Pues podes hacerlo con un TQuery, de la forma:


Update MiTabla
Set Campo1 = :New_Campo1
where CampoLlave = :CampoLlave;


En este evento tenes acceso a las propiedades Old_Value y New_Value (o solo Value, no recuerdo) de los fields del DataSet, que son necesarios para las actualizaciones y los borrados.

Hasta luego.

;)

Maxter
07-08-2003, 22:43:03
Creo que ya entendí... voy a experimentar y a ver que pasa.

Saludos.