Sistema Travando

09/01/2010

1

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
Responder

Posts

11/01/2010

Pjrm1470

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.
Responder
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;
Responder
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.

Responder

18/01/2010

Pjrm1470

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.  
Responder
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
Responder
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...
Responder
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...
Responder