PDA

Ver la Versión Completa : Usar Barras de Progreso con consultas


GerTorresM
05-04-2010, 23:11:36
Hola a todos:


La situación que hace dias se me presenta es la siguiente:

Organizando parte del código de mi aplicación decidi desglozar gran parte del mismo utilizando consultas como se ve a continuación


procedure TDMLiquidacion.liquidaTarifa(pCodigoSuscriptor : Integer);
var QAuxiliarLiquidacion_temporal : TQuery;
codigoServicio_local, codigoRango_local : Integer;
begin
QAuxiliarLiquidacion_temporal:= CrearConsulta;
codigoServicio_local:= 0;
with QAuxiliarLiquidacion_temporal do
begin
Close;
Sql.Text:= ' Select * From Tarifas '+
' where CodigoRango not in (1,2,3,5,6) '+
' And CodigoPeriodoPago =' + IntToStr(getCampo('DatosLiquidacion','CodigoPeriodo')) +
' And CodigoAno =' + IntToStr(getCampo('DatosLiquidacion','CodigoAno')) +
' And CodigoTipoServicio = ' + IntToStr(ObtenerTipoServicio(pCodigoSuscriptor)) +
' And Estrato = ' + IntToStr(obtenerEstrato(pCodigoSuscriptor));
open;
while not eof do
begin
codigoServicio_local:= FieldByName('CodigoServicio').AsInteger;
codigoRango_local:= FieldByName('CodigoRango').AsInteger;
if verificaEstadoSuscriptor(pCodigoSuscriptor) then
if verificaServicioSuscriptor(pCodigoSuscriptor,codigoServicio_local) then
AdicionarRegistro('HistoricoPagos',' NumeroFactura,CodigoSuscriptor,Codigoservicio,CodigoReferencia,' +
' CodigoPeriodo,CodigoAno,CodigoPeriodoOrigen,CodigoAnoOrigen, Clase, Valor,' +
' ValorSubsidio, FechaDePago, Estado, Movimiento, ControlFacturacion, '+
' NumeroFacturaOrigen, CodigoAnoPeriodo,CodigoRango',
IntToStr(0) + ',' + IntToStr(pCodigoSuscriptor) + ','+ IntToStr(codigoServicio_local) + ',' + IntToStr(codigoServicio_local) +
',' + IntToStr(GetCampo('DatosLiquidacion','CodigoPeriodo')) + ',' + IntToStr(GetCampo('DatosLiquidacion','CodigoAno')) +
',' + IntToStr(GetCampo('DatosLiquidacion','CodigoPeriodo')) + ',' + IntToStr(GetCampo('DatosLiquidacion','CodigoAno')) +
',0,' + FloatToStr(obtenerTarifa(codigoServicio_local,codigoRango_local,pCodigoSuscriptor)) +
',' + FloatToStr(obtenerTarifa(codigoServicio_local,codigoRango_local,pCodigoSuscriptor) * obtenerFactorSubsidio(codigoServicio_local,codigoRango_local,pCodigoSuscriptor)) +
',NULL, FALSE,' + chr(39) + 'C' + chr(39) + ',NULL, 0,' + obtenerCodigoAnoPeriodo + ' ,' + IntToStr(codigoRango_local));
next;
end
End;
FreeAndNil(QAuxiliarLiquidacion_temporal);
end;


en orden de ideas varios de los procedimientos se presentan de la forma anterior formando algo así:

procedure TDMLiquidacion.LiquidarPeriodo(pZona : String; PProgresoGeneral, PProgresoParcial : TGauge );
Var QlistadoSuscriptoresLiquidacion_temporal: TQuery;
CodigoSuscriptor_local, pCodigoSuscriptor : Integer;
PBProgreso_local, PBParcial_local : TGauge;
begin
PBProgreso_local:= TGauge.Create(PProgresoGeneral);
PBParcial_local:= TGauge.Create(PProgresoParcial);

QlistadoSuscriptoresLiquidacion_temporal:= CrearConsulta;
if not verificarCritica then
with QlistadoSuscriptoresLiquidacion_temporal do
begin
Close;
sql.Text:= ' Select codigoSuscriptor ' +
' From Suscriptores '+
' Where Zona in (' + pZona + ')';
open;
PBProgreso_local.MaxValue:= RecordCount;
QlistadoSuscriptoresLiquidacion_temporal.DisableControls;
While not eof do
begin
pCodigoSuscriptor:= FieldByName('CodigoSuscriptor').AsInteger;
borraLiquidacion(pCodigoSuscriptor);
divideLecturas(pCodigoSuscriptor);
liquidaInteresDiario(pCodigoSuscriptor);
// liquida Interes de mora mensual
// liquida reconexiones
liquidaTarifa(pCodigoSuscriptor);
liquidaTarifa(pCodigoSuscriptor,1,GetCampo('Lecturas','Basico','CodigoSuscriptor = ' + IntToStr(pCodigoSuscriptor)));
liquidaTarifa(pCodigoSuscriptor,2,GetCampo('Lecturas','Complementario','CodigoSuscriptor = ' + IntToStr(pCodigoSuscriptor)));
liquidaTarifa(pCodigoSuscriptor,3,GetCampo('Lecturas','Suntuario','CodigoSuscriptor = ' + IntToStr(pCodigoSuscriptor)));
liquidaTarifa(pCodigoSuscriptor,5,GetCampo('Lecturas','Multado','CodigoSuscriptor = ' + IntToStr(pCodigoSuscriptor)));
liquidaPorcentaje(pCodigoSuscriptor);
liquidaNovedadesPeriodo(pCodigoSuscriptor);
liquidaNovedadesFinanciadas(pCodigoSuscriptor);
liquidaSaldoPrepago(pCodigoSuscriptor);
asignaNumeroFactura(pCodigoSuscriptor);
asignaNumeroFacturaOrigen(pCodigoSuscriptor);
PBProgreso_local.Progress:= PBProgreso_local.Progress + 1;
next;
end;
actulizaEstadoLiquidacion(true);
end;

FreeAndNil(QlistadoSuscriptoresLiquidacion_temporal);
end;




bien la cosa que surge es la siguiente como se puede ver se toma una consulta y partiendo de los registro devueltos por la misma se realiza la ejecución de los procesos mensionados; como se dijo al inicio los procesos se guardan en un módulo de datos y los procesos son llamados en una forma con dos barras de Progresos para el caso TGauge, pero no se ve el progreso reflejado en las barras.

en lo que he encontrado relacionado con el tema he encontrado que el BDE (que el lo que utilizo para el trabajo de datos) no tiene sesiones multihilo y que tiende a dar ejecución a lo demás una vez termina.


agradezco de antemano cualquier colaboracion y ayuda



gertorresm
colombia

roman
05-04-2010, 23:16:38
Intenta poner Application.ProcessMessages al final de cada vueta del ciclo.

// Saludos

GerTorresM
06-04-2010, 10:29:18
Gracías Roman por tu respuesta, pero lamentamente las barras siguen marcan ningun avance, lo único que se ve es que da una especie de liberación al formulario, es decir lo puedo mover libremente por la ventana y el boton (en el que le hacia click) queda como se no estuviese presionado, cosa que no podia hacer antes, pero de las barras nada.

¿Que podrá esta faltando ?


Gracias de Antemano



gertorresm
Colombia