Sistema Travando

Delphi

09/01/2010

Pessoal na vida de ano aconteceu uma coisa em meu sistema que esta me deixando maluco....

Quando efetuo uma venda em meu sistema ele funciona nomal mas quando vou feichar a venda o sistema ocupa entre 85 a 99% da CPU e trava e o sistema nao fazia isso e agora eu voutei um backup da primeira versao do frente de caixa e continua fazendo a mesma coisa ja mudei tudo e continua a mesma coisa sempre quando vou finalizar a venda ele trava... deletei as dll ele funcionou durante um dia mas depois voutou a dar o mesmo problema uso as dll da bematech, elpson, daruma e elgin para o sistema...

Formatei o meu pc achando que era virus mas pelo jeito nao é...


alguemtem alguma ideia doque pode ser pois as minhas ja se esgotarao....

estou usando o delphi 2006 + firebird 2.1
Laelson Fagundes

Laelson Fagundes

Curtidas 0

Respostas

Pjrm1470

Pjrm1470

09/01/2010

Amigo debuge a parte em que o seu sistema dispara a CPU e trava. O que pode estar travando pode ser: - Thread mal feita. - Loop sem fim. - Caso esteja varrendo dados em um dataset usando o "while not dataset.eof", talvez esteja faltando o DataSet.Next.   Verifique isso. Em alguma parte há algo sendo executado sem fim. Cuidado com thread, é bacana trabalhar com ela, porém tem que saber usa-lo.   Da uma olhada e volte a postar.
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

09/01/2010

Eu axo q o problema esta aqui no loop no repeat e na until


pois o sistema trava quando eu finalizando o pagamento...


gosataria de uma dica de como posso substituir esse loop ou parar ele para nao acontecer oq esta acontecendo no sistema...

==================================================================================================================== if not Orcamento then
begin
repeat

         vValorPago     := 0;
         vValorDinheiro := 0;
         vValorCheque   := 0;
         vValorCartao   := 0;
         fm_pagamentos  := Tfm_pagamentos.Create(Application);
         try
           {$REGION 'Configura Edits que ficarão habilitado na  tela de  pagamento de acrodo com a forma de pagamento selecionada'}
           fm_pagamentos.lbl_dinheiro.Enabled := (i_Tipo in [2,6,10,14])  or (i_SolicitaEntrada = 1) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
           fm_pagamentos.edt_dinheiro.Enabled := (i_Tipo in [2,6,10,14])  or (i_SolicitaEntrada = 1) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));

           fm_pagamentos.lbl_cheque.Enabled   := (i_Tipo in [4,6,12,14])  or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
           fm_pagamentos.edt_cheque.Enabled   := (i_Tipo in [4,6,12,14])  or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));

           fm_pagamentos.lbl_cartao.Enabled   := (i_Tipo in [8,10,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
           fm_pagamentos.edt_cartao.Enabled   := (i_Tipo in [8,10,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
           {$ENDREGION 'Configura Edits que ficarão habilitado na tela de pagamento de acrodo com a forma de pagamento selecionada'}

           fTroco := (vValorDinheiro+vValorCartao+vValorCheque)-fTotalPagar;
           fm_pagamentos.lbl_restante.Caption    := FormatFloat('###,###,###,##0.00',fTroco);
           fm_pagamentos.lbl_desconto.Caption    := FormatFloat('###,###,###,##0.00',fDesconto);
           fm_pagamentos.lbl_total_pagar.Caption := FormatFloat('###,###,###,##0.00',fTotalPagar);

           if (i_Tipo in [2,4,6,8,10,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1)) then
           begin
            if fm_pagamentos.ShowModal = mrOk then
            begin
             vValorDinheiro := StrToFloat(fm_pagamentos.edt_dinheiro.Text);
             vValorCheque   := StrToFloat(fm_pagamentos.edt_cheque.Text);
             vValorCartao   := StrToFloat(fm_pagamentos.edt_cartao.Text);
             vValorPago     := (vValorDinheiro + vValorCheque + vValorCartao);
            end
            else
            begin
             SetarValorPadrao;
             JBMensagem('Ação cancelada!, para fechar a venda/orçamento pressione F2 novamente.');
             Exit;
            end;
           end;
         finally
          FreeAndNil(fm_pagamentos);
         end;// try;

         if ((i_Tipo = 16) and (i_SolicitaEntrada = 1)) then
          vVAlorEntrada := vValorDinheiro + vValorCheque + vValorCartao
         else if i_AvistaAprazo = 1 then
          vVAlorEntrada := vValorDinheiro
         else
          vVAlorEntrada := vValorDinheiro + vValorCheque + vValorCartao;

         if vVAlorEntrada >= fTotalPagar then
          vVAlorEntrada := fTotalPagar;

         if (i_AvistaAprazo = 0) and (i_Tipo in [2,4,6,8,10,12,14]) then

         if StrToFloat(FormatFloat('##0.00', vValorPago)) < StrToFloat(FormatFloat('##0.00', fTotalPagar)) then
          JBMensagem('O valor a ser pago não pode ser menor que o valor total a pagar!');

        until (vValorPago >= fTotalPagar) or (i_Tipo = 16);
        end;
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

09/01/2010

if not Orcamento then
      begin
        vValorPago     := 0;
        vValorDinheiro := 0;
        vValorCheque   := 0;
        vValorCartao   := 0;

        repeat
         fm_pagamentos  := Tfm_pagamentos.Create(Application);
         try
           {$REGION 'Configura Edits que ficarão habilitado na  tela de  pagamento de acrodo com a forma de pagamento selecionada'}
           fm_pagamentos.lbl_dinheiro.Enabled := (i_Tipo in [2,6,10,14]) or (i_SolicitaEntrada = 1) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
           fm_pagamentos.edt_dinheiro.Enabled := fm_pagamentos.lbl_dinheiro.Enabled;
           fm_pagamentos.edt_dinheiro.text := FormatFloat('###,###,###,##0.00', vValorDinheiro);

           fm_pagamentos.lbl_cheque.Enabled := (i_Tipo in [4,6,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
           fm_pagamentos.edt_cheque.Enabled := fm_pagamentos.lbl_cheque.Enabled;
           fm_pagamentos.edt_cheque.text := FormatFloat('###,###,###,##0.00', vValorCheque);

           fm_pagamentos.lbl_cartao.Enabled := (i_Tipo in [8,10,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1));
           fm_pagamentos.edt_cartao.Enabled := fm_pagamentos.lbl_cartao.Enabled;
           fm_pagamentos.edt_cartao.text := FormatFloat('###,###,###,##0.00', vValorCartao);
           {$ENDREGION 'Configura Edits que ficarão habilitado na tela de pagamento de acrodo com a forma de pagamento selecionada'}

           fTroco := (vValorDinheiro+vValorCartao+vValorCheque)-fTotalPagar;
           fm_pagamentos.lbl_restante.Caption    := FormatFloat('###,###,###,##0.00',fTroco);
           fm_pagamentos.lbl_desconto.Caption    := FormatFloat('###,###,###,##0.00',fDesconto);
           fm_pagamentos.lbl_total_pagar.Caption := FormatFloat('###,###,###,##0.00',fTotalPagar);

           if (i_Tipo in [2,4,6,8,10,12,14]) or ((i_Tipo = 16) and (i_SolicitaEntrada = 1)) then
           begin
            if fm_pagamentos.ShowModal = mrOk then
            begin
             vValorDinheiro := StrToFloat(fm_pagamentos.edt_dinheiro.Text);
             vValorCheque   := StrToFloat(fm_pagamentos.edt_cheque.Text);
             vValorCartao   := StrToFloat(fm_pagamentos.edt_cartao.Text);
             vValorPago     := (vValorDinheiro + vValorCheque + vValorCartao);
            end
            else
            begin
             SetarValorPadrao;
             JBMensagem('Ação cancelada!, para fechar a venda/orçamento pressione F2 novamente.');
             FreeAndNil(fm_pagamentos);
             Exit;
            end;
           end;
         finally
          FreeAndNil(fm_pagamentos);
         end;// try;

         if ((i_Tipo = 16) and (i_SolicitaEntrada = 1)) then
          vVAlorEntrada := vValorDinheiro + vValorCheque + vValorCartao
         else if i_AvistaAprazo = 1 then
          vVAlorEntrada := vValorDinheiro
         else
          vVAlorEntrada := vValorDinheiro + vValorCheque + vValorCartao;

         if vVAlorEntrada >= fTotalPagar then
          vVAlorEntrada := fTotalPagar;

         if (i_AvistaAprazo = 0) and (i_Tipo in [2,4,6,8,10,12,14]) and (vValorPago < fTotalPagar) then
          JBMensagem('O valor a ser pago não pode ser menor que o valor total a pagar!');

        until (vValorPago >= fTotalPagar) or (i_Tipo = 16);
        end;


verifique as linhas em negrito:
- se o if..then não for atendido (se é que há essa possibilidade), quem preenche o valor de vValorPago?
- a rotina SetarValorPadrao preenche vValorPago?

ao que parece essa variável não está sendo incrementada.

GOSTEI 0
Pjrm1470

Pjrm1470

09/01/2010

Já tentou utilizar outra forma de validação sem utilizar um loop para repetir o processo?   Já tentou utilizar labels para dar retorno a uma parte do codigo em que vc quer? Se a intenção é repetir todo o codigo da procedure, basta rechamar a procedure em vez de utilizar um loop. > Label Volta; > begin > Volta: > if True then >   goto Volta; |        FreeAndNil(fm_pagamentos); Aconselho a utilizar: > fm_pagamentos.Free;   |if StrToFloat(FormatFloat('##0.00', vValorPago)) < StrToFloat(FormatFloat('##0.00', fTotalPagar)) then |  JBMensagem('O valor a ser pago não pode ser menor que o valor total a pagar!'); Porque não colocar essa validação dentro do fm_pagamentos? Assim vc evita tambem o loop infinito e garante que a pessoa so digite um valor correto.   veja bem: if (i_Tipo in [2,4,6,8,10,12,14]) or
           ((i_Tipo = 16) and
            (i_SolicitaEntrada = 1)) then e: until (vValorPago >= fTotalPagar) or (i_Tipo = 16); O que me leva a pensar que esse loop ta na cara que vai ser infinito. Tem a possibilidade de sua variável ter valores [2,4,6,8,10,12,14] e so sai do loop se for atender um 16. "Há algo de podre no reino da dinamarca", Não acha!? se o tipo não for 16 e a outra condição do Until não atender vai sempre repetir.   Antes de tudo, você debugou para ver aonde ta travando? (com F8 e principalmente com F7)   Aguardo, pjrm1470.  
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

09/01/2010

Olá eu ja debuguei sentenas de vezes e quando trava o debug do delphi nao m mostra nada ele trava pq ele ocupa 99 da CPU e o processo fica normal so q CPU fica lotado eu to amarrado nessas funções ja faz 2 semana e nao to conseguindo sair dela nao estou sabendo usar outras funções como vc destacou eu fiz mas quando chego no

until (vValorPago >= fTotalPagar) or (i_Tipo = 16);

não estou sabendo terminar essa função eu queria sair do loop como vc falou uam função mais limpa e que faça a mesma coisa q a outra função
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

09/01/2010

Emerson ja tentei fazer oq vc falou econtinua a mesma coisa o q outro colega disse tem tudo aver mas nao estou conseguindo implementar da forma q ele mensionou...
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

09/01/2010

PJRM1470 eu usei o label voltar como vc disse mas sempre ele volta para tela de pagamento nao to sabendo como adicionar ele ao sistema...

sera q poderia m dar uma forcinha aqui com o codigo q eu postei aqui no forum...
GOSTEI 0
POSTAR