Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   No continua la ejecucion un procedimiento (https://www.clubdelphi.com/foros/showthread.php?t=48520)

FGarcia 26-09-2007 21:56:04

No continua la ejecucion un procedimiento
 
Hola!

Tengo un procedimiento que es llamado cada segundo desde un timer. La Intencion de este procedimiento es que revisa la hora del dia y:

1. Si es la hora exacta actualiza un stringgrid.
2. Si es otra hora y coincide con una ya almacenada genera un reporte impreso llamado diario.
3. Nuevamente si es otra hora y coincide con otra ya almacenada genera otro reporte llamado de turno el cual puede comprender tres periodos diferentes.

En forma individual cada actualizacion del stringgrid y reporte se genera perfectamente. Sin embargo si la hora de la actualizacion del stringgrid (Exacto a la hora) coincide con la hora el reporte de diario y/o de turno estos no se generan, solo se genera la actualizacion del stringgrid. Tambien si la hora de los reportes no coincide con la del stringgrid estos reportes (ambos) se generan correctamente.

El codigo que uso:

Código Delphi [-]
Procedure TfrmMain.CadaSegundo ;
begin
  //Decodifico la hora actual
  DecodeTime(Now, miHora,miMin,miSeg,miMseg);
  
  //Si es la Hora exacta actualiza los datos en la rejilla 
  if (miMin = 0) and (miSeg = 0) then
    begin
      //Resto 60 min a la hora actual
      UltimaHora := IncMinute(Now, -60);
      ActualizaCadaHora(Datetimetostr(UltimaHora),DateTimetoStr(Now));
    end;
  
  if (rpdImprime) and (rpdHabilita) then
    if (miHora = dHora) and (miMin = dMin) and (miSeg = dSeg) then DataCnx.GeneraDiario;
    
  if (rptImprime) and (rptHabilita) then
    begin
     if (miHora = pHora) and (miMin =pMin) and (miSeg = pSeg) then
        begin
          DataCnx.GeneraPrimero;
          exit
        end;
      
      if (miHora = sHora) and (miMin = sMin) and (miSeg = sSeg)then
        begin
          DataCnx.GeneraSegundo;
          Exit;
        end;
      
      if (miHora = tHora) and (miMin = tmin) and (miSeg = tSeg) then
        begin
          DataCnx.GeneraTercero;
          Exit;
        end;
    end;
end;

Agradesco su ayuda.

maeyanes 26-09-2007 22:07:23

Hola...

A simple vista, me parece que tu problema está en los Exit que tienes... ya que al ejecutarse esa parte del código, el Exit te envía fuera del procedimiento evitando que el código que debe seguir no se ejecute...


Saludos...

FGarcia 26-09-2007 22:15:55

De hecho es lo que quiero que haga, es decir que si se cumple la condicion de generar el reporte de primer turno (p.e. 06:00 14:00) vaya a la generacion del reporte y salga del procedimiento ya que no tiene caso continuar. Lo mismo para los otros dos reportes de segundo y tercero si no se cumple el primero entonces revisa si se cumple el segundo y si no el tercero. Pero aun asi si comento esa seccion no genera el diario despues de la actualizacion. Pero si comento la actualizacion si me genera ambos reportes.

maeyanes 26-09-2007 22:24:32

No le veo nada raro... a menos que...

Veo que las variables miHora, miMin, miSeg, miMseg no están declaradas como locales en el procedimiento... si estas son globales, podría darse el caso que algún otro procedimiento las modifique y esto ocasione que no funcionen las cosas como deberían...

Fuera de eso, me parece que todo está bien... ya probaste haciendo el debug paso a paso y verificando los valores de las variables?


Saludos..

FGarcia 26-09-2007 22:46:57

Si de hecho esas variables son globales pero en los otros procedimientos donde se usan su uso se hace "manualmente" es decir que les llamo con un boton a algo asi, en este procedimiento es el unico donde se hace en forma automatica. :confused: De hecho ya llevo toda la mañana corriendo debugs y demas cosas que se me han ocurrido pero no detecto error, como te comento si las horas y minutos no coinciden con los de la actualizacion del stringgrid todo se ejecuta ok.

basti 26-09-2007 22:55:47

Se me ocurre que mientras se está ejecutando el procedimiento, el timer vuelva a ejecutarse y te pueda crear algún tipo de conflicto. Prueba a deshabilitar el timer al comienzo del procedimiento y volver a habilitarlo al final.

egostar 26-09-2007 23:02:52

Probe tu código, cambiando algunas cosas por supuesto pero imagino que debe de ser algo similar lo que haces y sí pasó por cada una de las comparaciones que tienes.

aquí la imagen

y aquí el código que meti para probar.

Código Delphi [-]
procedure TForm1.FormShow(Sender: TObject);
begin
  rptHabilita := True;
  rptImprime := True;
  rpdHabilita := True;
  rpdImprime := True;

  dHora := 15;
  dMin  := 57;
  dSeg  := 30;

  pHora := 15;
  pMin  := 57;
  pSeg  := 34;

  sHora := 15;
  sMin  := 57;
  sSeg  := 38;

  tHora := 15;
  tMin  := 57;
  tSeg  := 42;
end;

No será en otro lado tu problema?

Salud OS

FGarcia 26-09-2007 23:26:23

Cuando es la hora exacta se llama a este procedimiento el cual:

1. Ejecuta la consulta.
2. convierte la cadena iHora a un Datetime
3. Extrae los componentes de ese datetime y compara la hora
4. de acuerdo a la hora escribe en el stringgrid

Código Delphi [-]
procedure TfrmMain.ActualizaCadaHora(iHora: string; eHora: string) ;
var
  estaHora: Tdatetime;
  consultaVacia: Boolean;
  esteTotal: string ;
  etHora,etMin,etSeg,etMseg: word;
begin
  consultaVacia := False;
  with QyHora do
    begin
      Close ;
      SQL.Clear ;
      SQL.Add('SELECT COUNT(*) AS HSacos, ' +
              'SUM (Peso) AS [HTotal] ' +
              'FROM Captura WHERE (HoraFecha BETWEEN :FIni AND :FFin)');
      Parameters.ParamByName('FIni').Value := iHora;
      Parameters.ParamByName('FFin').Value := eHora;
      Open ;
      if (QyHora.RecordCount = 0) then
        consultaVacia := True;
    end;
 
  if not consultaVacia then
    begin
      //Convierto la cadena iHora a un formato de datetime
      estaHora := StrToDateTime(iHora);
      DecodeTime(estaHora, etHora,etMin,etSeg,etMseg);
      //Pruebo que este campo de la consulta no sea NULL
      if QyHora.Fields.FieldByName('HTotal').IsNull  then
        esteTotal := '0'
      else
        begin
          esteTotal := QyHora.FieldValues['HTotal'];
          esteTotal := Format('%.0n', [strtoFloat(esteTotal)]);
        end;
      case etHora of
      0:  begin
            StringGrid1.Cells[1,1] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,1] := esteTotal;
          end;
      1:  begin
            StringGrid1.Cells[1,2] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,2] := esteTotal;
          end;
      2:  begin
            StringGrid1.Cells[1,3] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,3] := esteTotal;
          end;
      3:  begin
            StringGrid1.Cells[1,4] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,4] := esteTotal;
          end;
      4:  begin
            StringGrid1.Cells[1,5] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,5] := esteTotal;
          end;
      5:  begin
            StringGrid1.Cells[1,6] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,6] := esteTotal;
          end;
      6:  begin
            StringGrid1.Cells[1,7] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,7] := esteTotal;
            Stringgrid1.TopRow := 7;
          end;
      7:  begin
            StringGrid1.Cells[1,8] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,8] := esteTotal;
          end;
      8:  begin
            StringGrid1.Cells[1,9] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,9] := esteTotal;
          end;
      9:  begin
            StringGrid1.Cells[1,10] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,10] := esteTotal;
          end;
      10: begin
            StringGrid1.Cells[1,11] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,11] := esteTotal;
          end;
      11: begin
            StringGrid1.Cells[1,12] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,12] := esteTotal;
          end;
      12: begin
            StringGrid1.Cells[1,13] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,13] := esteTotal;
          end;
      13: begin
            StringGrid1.Cells[1,14] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,14] := esteTotal;
          end;
      14: begin
            StringGrid1.Cells[1,15] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,15] := esteTotal;
            Stringgrid1.TopRow := 15;
          end;
      15: begin
            StringGrid1.Cells[1,16] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,16] := esteTotal;
          end;
      16: begin
            StringGrid1.Cells[1,17] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,17] := esteTotal;
          end;
      17: begin
            StringGrid1.Cells[1,18] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,18] := esteTotal;
          end;
      18: begin
            StringGrid1.Cells[1,19] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,19] := esteTotal;
          end;
      19: begin
            StringGrid1.Cells[1,20] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,20] := esteTotal;
          end;
      20: begin
            StringGrid1.Cells[1,21] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,21] := esteTotal;
          end;
      21: begin
            StringGrid1.Cells[1,22] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,22] := esteTotal;
          end;
      22: begin
            StringGrid1.Cells[1,23] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,23] := esteTotal;
            Stringgrid1.TopRow := 23;
          end;
      23: begin
            StringGrid1.Cells[1,24] := QyHora.FieldValues['HSacos'];
            StringGrid1.Cells[2,24] := esteTotal;
          end;
      end;
    end;
end;

como dije al principio del mensaje si la hora de generar los reportes no coincide con la actualizacion de el stringgrid los reportes se generan perfectamente, solo es en la coincidencia de hora donde ya los reportes no se generan.

Por cierto ya cambie las variables a local para evitar dudas. Y si, esa idea se me ocurrio basti de que sea un problema con la actualizacion del timer.


La franja horaria es GMT +2. Ahora son las 03:27:59.

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