Fórum Analisem esse código para mim #262472

17/12/2004

0

Com o código abaixo, eu pego o código do Funcionário da Tabela Funcionários, e após lançados os eventos manuais ela lança os eventos automáticos e calcula o seguinte: Total Bruto(Soma todas as vantagens), Total de Desconto(Todos os descontos, inclusive INSS), Líquido (Total Bruto - Total de Descontos), gostaria q vc olhassem e me informassem um meio de otmizar a mesma, apontando possíveis falhas q essa rotina tenha, sei q tem!, conto com vcs.
procedure TForm1.Button17Click(Sender: TObject);
Var K,F,Winss,Wirrf, Wfgts,Pinss,Pirrf,Pfgts:Extended;
    Wcod, Wnome:String;
begin
Q2.First;
 While Not Q2.Eof do
  begin
     Winss:=0;
     PInss:=0;
        Q1.close;
        Q1.SQL.Clear;
        Q1.SQL.Text:=´select T.* from Teste T where T.Codigo=´+QuotedStr(Q2Codigo.AsString);
        Q1.Open;
     K:=0;
     F:=0;
     While Not Q1.Eof do
     begin
     Q1.Edit;
     If (DS1.DataSet.FieldByName(´Tipo´).AsString) = ´P´ then
        begin
          K:=K+DS1.DataSet.FieldByName(´Valor´).AsFloat;
        end
     Else If (DS1.DataSet.FieldByName(´Tipo´).AsString) = ´D´ then
        begin
          F:=F+DS1.DataSet.FieldByName(´Desconto´).AsFloat;
        end;
          Q1.Post;
          Q1.Next;
     end;

  //Calcule Aliquotas do Inss e Valores //
            If K <= QTabAte_Inss.Value then
               Begin
                 PInss:=QTabAliquota_Inss1.Value;
                 WInss:=(K*QTabAliquota_Inss1.Value)/100;
               end
           else If (K >= QTabDe_Inss1.Value) and (K <= QTabAte_Inss1.Value) then
               Begin
                 PInss:=QTabAliquota_Inss2.Value;
                 WInss:=(K*QTabAliquota_Inss2.Value)/100;
               end
           else If (K >= QTabDe_Inss2.Value) and (K <= QTabAte_Inss2.Value) then
               Begin
                 PInss:=QTabAliquota_Inss3.Value;
                 WInss:=(K*QTabAliquota_Inss3.Value)/100;
               end
           else If (K >= QTabDe_Inss3.Value) and (K <= QTabAte_Inss3.Value) then
               Begin
                 PInss:=QTabAliquota_Inss3.Value;
                 WInss:=(K*QTabAliquota_Inss3.Value)/100;
               end
           else If (K >= QTabAte_Inss3.Value) then
               Begin
                 PInss:=QTabAliquota_Inss4.Value;
                 WInss:=(K*QTabAliquota_Inss4.Value)/100;
               end;

//Adiciona novos eventos na Tabela
                    Q1.Append;
                    Ds1.DataSet.FieldByName(´Codigo´).AsString:=DbEdit1.Text;
                    Ds1.DataSet.FieldByName(´Funcionario´).AsString:=DbEdit2.Text;
                    Ds1.DataSet.FieldByName(´CodEvent´).AsString:=´090´;
                    Ds1.DataSet.FieldByName(´Descr Event´).AsString:=´I.N.S.S.´;
                    DS1.DataSet.FieldByName(´Desconto´).AsFloat:=Winss;
                    DS1.DataSet.FieldByName(´Referencia´).AsFloat:=Pinss;
                    DS1.DataSet.FieldByName(´Rotina´).AsString:=´090´;
                    DS1.DataSet.FieldByName(´Tipo´).AsString:=´D´;
   {******* Salvando registros *********** }
                    Q1.Post; //Salva as inclusões
            Q1.Post;
            Q1.Refresh;
            Q2.Next;
  end; 
end;


Estou usando para este teste o ´Piradox´.

Por favor, conto com seus comentários.

Obrigado!


Martins

Martins

Responder

Posts

17/12/2004

Lucas Silva

Eu acho meio complicado, você consegui um solução para este problema aqui.....


Responder

Gostei + 0

17/12/2004

Martins

[quote:f98f013949=´Lucas Alves Silva´]Eu acho meio complicado, você consegui um solução para este problema aqui.....[/quote:f98f013949]

Não entendi direito, vc quer dizer q aqui não irei conseguir muita ajuda para esse problema é isso? Se for, onde posso conseguir?

A rotina funciona, só queria saber se posso otmizar seu funcionamento, tipo diminuir o número de linha de código, transformar em uma rotina menor.

Valew pela dica!

Martins


Responder

Gostei + 0

17/12/2004

Vinicius2k

Martins,

Realmente, só vc mesmo pode analisar a lógica...
Observei alguns pontos em relação a estrutura de código, no WHILE da Q1 ela está sendo Editada e Postada, ao meu ver sem necessidade, e vc precisa reavaliar a necessidade de alguns ELSE, dependendo da lógica dos desvios talvez alguns possam ser dispensados...

Estruturei e ´enxuguei´ um pouco seu código, veja :
procedure TForm1.Button17Click(Sender: TObject);
var
  K, F, Winss, Wirrf, Wfgts, Pinss, Pirrf, Pfgts: Extended;
  Wcod, Wnome: String;
begin
  Q2.First;
  while not Q2.Eof do
  begin
    Winss := 0;
    PInss := 0;

    { **** }

    K := 0;
    F := 0;
    with Q1 do
    begin
      Close;
      SQL.Clear;
      SQL.Text := ´select T.* from Teste T where T.Codigo=´+QuotedStr(Q2Codigo.AsString);
      Open;
      while not Eof do
      begin
        if (FieldByName(´Tipo´).AsString) = ´P´ then
          K := K + FieldByName(´Valor´).AsFloat
        else
          if (FieldByName(´Tipo´).AsString) = ´D´ then
            F := F + FieldByName(´Desconto´).AsFloat;
        Next;
      end;
    end;

    { **** }

    if K <= QTabAte_Inss.Value then
    begin
      PInss := QTabAliquota_Inss1.Value;
      WInss := (K * QTabAliquota_Inss1.Value) / 100;
    end
    else
      if (K >= QTabDe_Inss1.Value) and (K <= QTabAte_Inss1.Value) then
      begin
        PInss := QTabAliquota_Inss2.Value;
        WInss := (K * QTabAliquota_Inss2.Value) / 100;
      end
      else
        if (K >= QTabDe_Inss2.Value) and (K <= QTabAte_Inss2.Value) then
        begin
          PInss := QTabAliquota_Inss3.Value;
          WInss := (K * QTabAliquota_Inss3.Value) / 100;
        end
        else
        begin
          if (K >= QTabDe_Inss3.Value) and (K <= QTabAte_Inss3.Value) then
          begin
            PInss := QTabAliquota_Inss3.Value;
            WInss := (K * QTabAliquota_Inss3.Value) / 100;
          end
          else
            if (K >= QTabAte_Inss3.Value) then
            begin
              PInss := QTabAliquota_Inss4.Value;
              WInss := (K * QTabAliquota_Inss4.Value) / 100;
            end;

    { **** }

    with Q1 do
    begin
      Append;
      FieldByName(´Codigo´).AsString := DbEdit1.Text;
      FieldByName(´Funcionario´).AsString := DbEdit2.Text;
      FieldByName(´CodEvent´).AsString := ´090´;
      FieldByName(´Descr Event´).AsString := ´I.N.S.S.´;
      FieldByName(´Desconto´).AsFloat := Winss;
      FieldByName(´Referencia´).AsFloat := Pinss;
      FieldByName(´Rotina´).AsString := ´090´;
      FieldByName(´Tipo´).AsString := ´D´;
      Post;
      Refresh;
    end;

    { **** }

    Q2.Next;
  end;
end;


Observei ainda q vc parece ter alguns vícios na escrita que podem ser considerados ´incorretos´... fora do padrão recomendado...
Normalmente, isso não nossa culpa... adotamos os padrões de nomenclatura e escrita dos instrutures ou livros com os quais aprendemos.

Veja este artigo, que é uma visão geral sobre estruturação de código (convenção) : http://community.borland.com/article/0,1410,10280,00.html

Espero ter ajudado...
T+


Responder

Gostei + 0

18/12/2004

Martins

Martins, Realmente, só vc mesmo pode analisar a lógica... Observei alguns pontos em relação a estrutura de código, no WHILE da Q1 ela está sendo Editada e Postada, ao meu ver sem necessidade, e vc precisa reavaliar a necessidade de alguns ELSE, dependendo da lógica dos desvios talvez alguns possam ser dispensados... Estruturei e ´enxuguei´ um pouco seu código, veja :
procedure TForm1.Button17Click(Sender: TObject);
var
  K, F, Winss, Wirrf, Wfgts, Pinss, Pirrf, Pfgts: Extended;
  Wcod, Wnome: String;
begin
  Q2.First;
  while not Q2.Eof do
  begin
    Winss := 0;
    PInss := 0;

    { **** }

    K := 0;
    F := 0;
    with Q1 do
    begin
      Close;
      SQL.Clear;
      SQL.Text := ´select T.* from Teste T where T.Codigo=´+QuotedStr(Q2Codigo.AsString);
      Open;
      while not Eof do
      begin
        if (FieldByName(´Tipo´).AsString) = ´P´ then
          K := K + FieldByName(´Valor´).AsFloat
        else
          if (FieldByName(´Tipo´).AsString) = ´D´ then
            F := F + FieldByName(´Desconto´).AsFloat;
        Next;
      end;
    end;

    { **** }

    if K <= QTabAte_Inss.Value then
    begin
      PInss := QTabAliquota_Inss1.Value;
      WInss := (K * QTabAliquota_Inss1.Value) / 100;
    end
    else
      if (K >= QTabDe_Inss1.Value) and (K <= QTabAte_Inss1.Value) then
      begin
        PInss := QTabAliquota_Inss2.Value;
        WInss := (K * QTabAliquota_Inss2.Value) / 100;
      end
      else
        if (K >= QTabDe_Inss2.Value) and (K <= QTabAte_Inss2.Value) then
        begin
          PInss := QTabAliquota_Inss3.Value;
          WInss := (K * QTabAliquota_Inss3.Value) / 100;
        end
        else
        begin
          if (K >= QTabDe_Inss3.Value) and (K <= QTabAte_Inss3.Value) then
          begin
            PInss := QTabAliquota_Inss3.Value;
            WInss := (K * QTabAliquota_Inss3.Value) / 100;
          end
          else
            if (K >= QTabAte_Inss3.Value) then
            begin
              PInss := QTabAliquota_Inss4.Value;
              WInss := (K * QTabAliquota_Inss4.Value) / 100;
            end;

    { **** }

    with Q1 do
    begin
      Append;
      FieldByName(´Codigo´).AsString := DbEdit1.Text;
      FieldByName(´Funcionario´).AsString := DbEdit2.Text;
      FieldByName(´CodEvent´).AsString := ´090´;
      FieldByName(´Descr Event´).AsString := ´I.N.S.S.´;
      FieldByName(´Desconto´).AsFloat := Winss;
      FieldByName(´Referencia´).AsFloat := Pinss;
      FieldByName(´Rotina´).AsString := ´090´;
      FieldByName(´Tipo´).AsString := ´D´;
      Post;
      Refresh;
    end;

    { **** }

    Q2.Next;
  end;
end;
Observei ainda q vc parece ter alguns vícios na escrita que podem ser considerados ´incorretos´... fora do padrão recomendado... Normalmente, isso não nossa culpa... adotamos os padrões de nomenclatura e escrita dos instrutures ou livros com os quais aprendemos. Veja este artigo, que é uma visão geral sobre estruturação de código (convenção) : http://community.borland.com/article/0,1410,10280,00.html Espero ter ajudado... T+

Ok! valeu Vinicius, eu tb já havia modificado aqui meu código, imprimi e dei uma olhada nele, consegui reduzir e remover alguns ´ELSE´, mas a sua estruturação tá show tb, vou aproveitá-la, quanto aos meus vícios, quais são?

Obrigado pela ajuda!

Martins


Responder

Gostei + 0

18/12/2004

Vinicius2k

Foram estes q eu percebi :
Errado :
Var  K,F,Winss,Wirrf, Wfgts,Pinss,Pirrf,Pfgts:Extended;
  Wcod, Wnome:String;

Lista de variáveis iniciando na mesma linha que a palavra reservada ´var´ e
ealtam espaços após a vírgula de cada var e um espaço antes do tipo.

Certo :
Var 
  K, F, Winss, Wirrf, Wfgts, Pinss, Pirrf, Pfgts: Extended;
  Wcod, Wnome: String;


Errado:
Winss:=0;
PInss:=0; 

Atribuição de valor. Faltam espaçõs entre a variável o ´:=´ e o valor.

Certo:
Winss := 0;
PInss := 0; 


Errado :
Q1.close;
Q1.SQL.Clear;
Q1.SQL.Text:=´select T.* from Teste T where T.Codigo=´+QuotedStr(Q2Codigo.AsString);
Q1.Open;

Falta de hábito de utilizar WITH < objeto > DO, fazendo com que vc repita valores em muitas linhas.

Certo :
with Q1 do
begin
   Close;
   SQL.Clear;
   SQL.Text := ´select T.* from Teste T where T.Codigo=´+QuotedStr(Q2Codigo.AsString);
   Open;
end;


Errado :
            If K <= QTabAte_Inss.Value then
               Begin
                 PInss:=QTabAliquota_Inss1.Value;
                 WInss:=(K*QTabAliquota_Inss1.Value)/100;
               end
           else If (K >= QTabDe_Inss1.Value) and (K <= QTabAte_Inss1.Value) then
               Begin
                 PInss:=QTabAliquota_Inss2.Value;
                 WInss:=(K*QTabAliquota_Inss2.Value)/100;
               end


Identação no BEGIN subsequente ao IF, falta de espaços entre variáveis e operadores e início de IF na mesma linha do ELSE.

Certo :
    if K <= QTabAte_Inss.Value then
    begin
      PInss := QTabAliquota_Inss1.Value;
      WInss := (K * QTabAliquota_Inss1.Value) / 100;
    end
    else
      if (K >= QTabDe_Inss1.Value) and (K <= QTabAte_Inss1.Value) then
      begin
        PInss := QTabAliquota_Inss2.Value;
        WInss := (K * QTabAliquota_Inss2.Value) / 100;
      end


E outros menores em relação à nomenclatura, mas quanto à estes eu também não me atenho muito... não se deve utilizar underscores, por exemplo, mas isto eu não observo, utilizo o tempo todo conscientemente.

No artigo do link tem mais exemplos... dá uma olhada...

T+


Responder

Gostei + 0

20/12/2004

Martins

Valew novamente!
muito obrigado pela dica.

vou dar uma olhada no link indicado por vc.

Martins


Responder

Gostei + 0

20/12/2004

Razor

analisado......
e agora?


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar