loop infinito onde esta o erro ?

Delphi

06/06/2014

Bom dia!
A poucos dias estava pensando em uma logica para gera um gráfico, só que, na hora de executa ele entrou em lopo infinito.
segue o código:
 
DataModuleGeral.cdsFluxoCaixa.First;
while Not DataModuleGeral.cdsFluxoCaixa.Eof do
begin// Rotina Para Gravar os Saldos
  DataModuleGeral.cdsFluxoCaixa.Edit;            { Formula: SALDO_DO_DIA = VALOR_RECEBER-VALOR_PAGAR}
  DataModuleGeral.cdsFluxoCaixaSALDO_DO_DIA.AsCurrency := (DataModuleGeral.cdsFluxoCaixaVALOR_RECEBER.AsCurrency -
                                                                                                          DataModuleGeral.cdsFluxoCaixaVALOR_PAGAR.AsCurrency);//Saldo do Dia
  zSA := zSA + DataModuleGeral.cdsFluxoCaixaSALDO_DO_DIA.AsCurrency;
  DataModuleGeral.cdsFluxoCaixaSALDO_ACUMULADO.AsCurrency := zSA; //Saldo Acumulado {zSA é Variável para acumular o valor do dia}   
  DataModuleGeral.cdsFluxoCaixa.Post;
  DataModuleGeral.cdsFluxoCaixa.Next;
end;

não sei o que pode está acontecendo.
utilizo Dlephi 7 e Db firebird
Eduardo Mendonça

Eduardo Mendonça

Curtidas 1

Melhor post

Ricardo

Ricardo

06/06/2014

Tire o post de dentro do laço.
GOSTEI 1

Mais Respostas

Rodolpho Silva

Rodolpho Silva

06/06/2014

Veja se não tem algum evento no seu Dataset que possa estar alterando a posição do seu registro.
GOSTEI 0
Eduardo Mendonça

Eduardo Mendonça

06/06/2014

Não tem eventos do dataset e nem no ClientDataSet.
GOSTEI 0
Eduardo Mendonça

Eduardo Mendonça

06/06/2014

Se eu retira o post de dentro como ele ira gravar no DB?
GOSTEI 0
Raylan Zibel

Raylan Zibel

06/06/2014

Tem campo agregado ou calculado? Ou algum timer que atualize valor no dataset? O dataset está sempre aberto ou abriu pra fazer esse while?
GOSTEI 0
Rodolpho Silva

Rodolpho Silva

06/06/2014

Tem algum índice neste Cds?
GOSTEI 0
Ricardo

Ricardo

06/06/2014

Se eu retira o post de dentro como ele ira gravar no DB?


Você tem razão, foi um equívoco meu. Então, hoje eu me deparei com um problema parecido em um projeto que estou trabalhando; quando mando gravar o resultao de uma uma consulta em ClientDataSet ele entra em loop infinito.

Eu estava usando while na mesma sintaxe que você e o loop não terminava nunca. Mudei para for x := 0 to recordcount - 1 funcionou perfeitamente. Tenta fazer essa mesma mudança aí no seu código.
GOSTEI 0
Eduardo Mendonça

Eduardo Mendonça

06/06/2014

ok vou tentar aqui! e
GOSTEI 0
Eduardo Mendonça

Eduardo Mendonça

06/06/2014

Tem campo agregado ou calculado? Ou algum timer que atualize valor no dataset? O dataset está sempre aberto ou abriu pra fazer esse while?

o cds não Tem campo agregado ou calculado e não tem timer que atualize valor no dataset. eu só abro cds para fazer o loop e mostrar no gráfico.
não sei o porque disso.
um coloquei no passo a passo e ele pula o código, tipo como se não desse o
DataModuleGeral.cdsFluxoCaixa.Next;
.
GOSTEI 0
Cauê Nishijima

Cauê Nishijima

06/06/2014

Posta a query fazer uma simulação mais precisa
GOSTEI 0
Raylan Zibel

Raylan Zibel

06/06/2014

Tente deletar esse CDS do form e cria outro, pode copiar os Fields que já tem nesse (Control C + Control V).
GOSTEI 0
Eduardo Mendonça

Eduardo Mendonça

06/06/2014

Fiz assim:
var
  dDatVen ...
 
...
      dDatVen := DateToStr(DataModuleGeral.cdsFluxoCaixaDATA.AsDateTime);
      while Not DataModuleGeral.cdsFluxoCaixa.Eof do
      begin// Rotina Para Gravar os Saldos
        DataModuleGeral.cdsFluxoCaixa.Edit;
        DataModuleGeral.cdsFluxoCaixaSALDO_DO_DIA.AsCurrency := DataModuleGeral.cdsFluxoCaixaVALOR_RECEBER.AsCurrency-DataModuleGeral.cdsFluxoCaixaVALOR_PAGAR.AsCurrency;//Saldo do Dia
        zSA := zSA + DataModuleGeral.cdsFluxoCaixaSALDO_DO_DIA.AsCurrency;
        DataModuleGeral.cdsFluxoCaixaSALDO_ACUMULADO.AsCurrency := zSA; //Saldo Acumulado
        DataModuleGeral.cdsFluxoCaixa.Post;
        DataModuleGeral.cdsFluxoCaixa.Locate('DATA', StrToDate(dDatVen),[]);
        DataModuleGeral.cdsFluxoCaixa.Next;
        dDatVen := DateToStr(DataModuleGeral.cdsFluxoCaixaDATA.AsDateTime);
      end;//Fim  while Not cdsFluxoCaixa do

ficou lendo quando ele tem que gravar informações de mais de 30 dias...

Estou trabalhando para resolver isso
GOSTEI 0
Eduardo Mendonça

Eduardo Mendonça

06/06/2014

Posta a query fazer uma simulação mais precisa


Ela é meio grande
SELECT                                         
       TABNOV.VALOR_VENCIMENTO,                    
       TABNOV.DATA_VENCIMENTO                      
    FROM                                           
       ( SELECT                                    
            T1.DATA_VENCTO1 AS DATA_VENCIMENTO,    
            T1.VALOR_VENCTO1 AS VALOR_VENCIMENTO   
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO1 IS NOT NULL         
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO2 AS DATA_VENCIMENTO,    
            T1.VALOR_VENCTO2 AS VALOR_VENCIMENTO   
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO2 IS NOT NULL         
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO3 AS DATA_VENCIMENTO,    
            T1.VALOR_VENCTO3 AS VALOR_VENCIMENTO   
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO3 IS NOT NULL         
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO4 AS DATA_VENCIMENTO,    
            T1.VALOR_VENCTO4 AS VALOR_VENCIMENTO   
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO4 IS NOT NULL         
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO5 AS DATA_VENCIMENTO,    
            T1.VALOR_VENCTO5 AS VALOR_VENCIMENTO   
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO5 IS NOT NULL         
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO6 AS DATA_VENCIMENTO,    
            T1.VALOR_VENCTO6 AS VALOR_VENCIMENTO   
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO6 IS NOT NULL         
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO7 AS DATA_VENCIMENTO,    
            T1.VALOR_VENCTO7 AS VALOR_VENCIMENTO   
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO7 IS NOT NULL         
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO8 AS DATA_VENCIMENTO,    
            T1.VALOR_VENCTO8 AS VALOR_VENCIMENTO   
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO8 IS NOT NULL         
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO9 AS DATA_VENCIMENTO,    
            T1.VALOR_VENCTO9 AS VALOR_VENCIMENTO   
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO9 IS NOT NULL         
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO10 AS DATA_VENCIMENTO,   
            T1.VALOR_VENCTO10 AS VALOR_VENCIMENTO  
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO10 IS NOT NULL        
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO11 AS DATA_VENCIMENTO,   
            T1.VALOR_VENCTO11 AS VALOR_VENCIMENTO  
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO11 IS NOT NULL        
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO12 AS DATA_VENCIMENTO,   
            T1.VALOR_VENCTO12 AS VALOR_VENCIMENTO  
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO12 IS NOT NULL        
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO13 AS DATA_VENCIMENTO,   
            T1.VALOR_VENCTO13 AS VALOR_VENCIMENTO  
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO13 IS NOT NULL        
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO14 AS DATA_VENCIMENTO,   
            T1.VALOR_VENCTO14 AS VALOR_VENCIMENTO  
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO14 IS NOT NULL        
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO15 AS DATA_VENCIMENTO,   
            T1.VALOR_VENCTO15 AS VALOR_VENCIMENTO  
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO15 IS NOT NULL        
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO16 AS DATA_VENCIMENTO,   
            T1.VALOR_VENCTO16 AS VALOR_VENCIMENTO  
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO16 IS NOT NULL        
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO17 AS DATA_VENCIMENTO,   
            T1.VALOR_VENCTO17 AS VALOR_VENCIMENTO  
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO17 IS NOT NULL        
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO18 AS DATA_VENCIMENTO,   
            T1.VALOR_VENCTO18 AS VALOR_VENCIMENTO  
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO18 IS NOT NULL        
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO19 AS DATA_VENCIMENTO,   
            T1.VALOR_VENCTO19 AS VALOR_VENCIMENTO  
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO19 IS NOT NULL        
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO20 AS DATA_VENCIMENTO,   
            T1.VALOR_VENCTO20 AS VALOR_VENCIMENTO  
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO20 IS NOT NULL        
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO21 AS DATA_VENCIMENTO,   
            T1.VALOR_VENCTO21 AS VALOR_VENCIMENTO  
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO21 IS NOT NULL        
        UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO22 AS DATA_VENCIMENTO,   
            T1.VALOR_VENCTO22 AS VALOR_VENCIMENTO  
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO22 IS NOT NULL        
       UNION ALL                                   
        SELECT                                     
            T1.DATA_VENCTO23 AS DATA_VENCIMENTO,   
            T1.VALOR_VENCTO23 AS VALOR_VENCIMENTO  
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO23 IS NOT NULL        
       UNION ALL                                  
         SELECT                                    
            T1.DATA_VENCTO24 AS DATA_VENCIMENTO,   
            T1.VALOR_VENCTO24 AS VALOR_VENCIMENTO  
         FROM HONORARIOS T1                        
         WHERE T1.DATA_VENCTO24 IS NOT NULL ) TABNOV 
    WHERE 1 = 1                                      
      //SQl para Pagamentos Previsto - Contas a Pagar
      vSqlCP := 'SELECT                                             
             TABNOV.DATA_VENCIMENTO,                        
             TABNOV.VALOR_VENCIMENTO                        
         FROM                                               
         	( SELECT                                       
                  T1.DATA_VENCIMENTO1 AS DATA_VENCIMENTO,   
                  T1.VALOR_VENCIMENTO1 AS VALOR_VENCIMENTO  
               FROM CONTAS_PAGAR T1                         
               WHERE                                        
               	 T1.DATA_VENCIMENTO1 IS NOT NULL           
              UNION ALL                                     
               SELECT                                       
                  T1.DATA_VENCIMENTO2 AS DATA_VENCIMENTO,   
                  T1.VALOR_VENCIMENTO2 AS VALOR_VENCIMENTO  
               FROM CONTAS_PAGAR T1                         
               WHERE                                        
                  T1.DATA_VENCIMENTO2 IS NOT NULL           
              UNION ALL                                     
               SELECT                                       
                  T1.DATA_VENCIMENTO3 AS DATA_VENCIMENTO,   
                  T1.VALOR_VENCIMENTO3 AS VALOR_VENCIMENTO  
               FROM CONTAS_PAGAR T1                         
               WHERE                                        
                  T1.DATA_VENCIMENTO3 IS NOT NULL           
              UNION ALL                                     
               SELECT                                       
                  T1.DATA_VENCIMENTO4 AS DATA_VENCIMENTO,   
                  T1.VALOR_VENCIMENTO4 AS VALOR_VENCIMENTO  
               FROM CONTAS_PAGAR T1                         
               WHERE                                        
                  T1.DATA_VENCIMENTO4 IS NOT NULL           
              UNION ALL                                     
               SELECT                                       
                  T1.DATA_VENCIMENTO5 AS DATA_VENCIMENTO,   
                  T1.VALOR_VENCIMENTO5 AS VALOR_VENCIMENTO  
               FROM CONTAS_PAGAR T1                         
               WHERE                                        
                  T1.DATA_VENCIMENTO5 IS NOT NULL           
              UNION ALL                                     
               SELECT                                       
                  T1.DATA_VENCIMENTO6 AS DATA_VENCIMENTO,   
                  T1.VALOR_VENCIMENTO6 AS VALOR_VENCIMENTO  
               FROM CONTAS_PAGAR T1                         
               WHERE                                        
                  T1.DATA_VENCIMENTO6 IS NOT NULL           
              UNION ALL                                     
               SELECT                                       
                  T1.DATA_VENCIMENTO7 AS DATA_VENCIMENTO,   
                  T1.VALOR_VENCIMENTO7 AS VALOR_VENCIMENTO  
               FROM CONTAS_PAGAR T1                         
               WHERE                                        
                  T1.DATA_VENCIMENTO7 IS NOT NULL           
              UNION ALL                                     
               SELECT                                       
                  T1.DATA_VENCIMENTO8 AS DATA_VENCIMENTO,   
                  T1.VALOR_VENCIMENTO8 AS VALOR_VENCIMENTO  
               FROM CONTAS_PAGAR T1                         
              WHERE                                         
                  T1.DATA_VENCIMENTO8 IS NOT NULL           
              UNION ALL                                     
               SELECT                                       
                  T1.DATA_VENCIMENTO9 AS DATA_VENCIMENTO,   
                  T1.VALOR_VENCIMENTO9 AS VALOR_VENCIMENTO  
               FROM CONTAS_PAGAR T1                         
               WHERE                                        
                  T1.DATA_VENCIMENTO9 IS NOT NULL           
             UNION ALL                                      
               SELECT                                       
                  T1.DATA_VENCIMENTO10 AS DATA_VENCIMENTO,  
                  T1.VALOR_VENCIMENTO10 AS VALOR_VENCIMENTO 
               FROM CONTAS_PAGAR T1                         
               WHERE                                        
                  T1.DATA_VENCIMENTO10 IS NOT NULL          
              UNION ALL                                     
               SELECT                                       
                  T1.DATA_VENCIMENTO11 AS DATA_VENCIMENTO,  
                  T1.VALOR_VENCIMENTO11 AS VALOR_VENCIMENTO 
               FROM CONTAS_PAGAR T1                         
               WHERE                                        
                  T1.DATA_VENCIMENTO11 IS NOT NULL          
             UNION ALL                                      
               SELECT                                       
                  T1.DATA_VENCIMENTO12 AS DATA_VENCIMENTO,  
                  T1.VALOR_VENCIMENTO12 AS VALOR_VENCIMENTO 
               FROM CONTAS_PAGAR T1                         
               WHERE                                        
                  T1.DATA_VENCIMENTO12 IS NOT NULL ) TABNOV 
         WHERE 1 = 1
GOSTEI 0
Eduardo Mendonça

Eduardo Mendonça

06/06/2014

O mais interessante é que no primeiro dia ela rodou bem sem problemas e dia seguinte ele entrou em loop infinito
GOSTEI 0
Eduardo Mendonça

Eduardo Mendonça

06/06/2014

e a copia de segurança que fiz ta igualzinha e da o mesmo loop
GOSTEI 0
Eduardo Mendonça

Eduardo Mendonça

06/06/2014

Oi Boa tarde.
Depois de Deixar essa parte do projeto de lado por alguns dias eu simplesmente rodei o projeto e não deu o loop infinito.
O mais incrível é que, do mesmo modo que ele entrou em loop Infinito ele Voltou ao normal (Misteriosamente)
Obrigado a Todos pela atenção
GOSTEI 0
POSTAR