Analisem esse código para mim
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.
Estou usando para este teste o ´Piradox´.
Por favor, conto com seus comentários.
Obrigado!
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
Curtidas 0
Respostas
Lucas Silva
17/12/2004
Eu acho meio complicado, você consegui um solução para este problema aqui.....
GOSTEI 0
Martins
17/12/2004
[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
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
GOSTEI 0
Vinicius2k
17/12/2004
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 :
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+
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+
GOSTEI 0
Martins
17/12/2004
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 :
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+
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;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
GOSTEI 0
Vinicius2k
17/12/2004
Foram estes q eu percebi :
Errado :
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 :
Errado:
Atribuição de valor. Faltam espaçõs entre a variável o ´:=´ e o valor.
Certo:
Errado :
Falta de hábito de utilizar WITH < objeto > DO, fazendo com que vc repita valores em muitas linhas.
Certo :
Errado :
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 :
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+
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+
GOSTEI 0
Martins
17/12/2004
Valew novamente!
muito obrigado pela dica.
vou dar uma olhada no link indicado por vc.
Martins
muito obrigado pela dica.
vou dar uma olhada no link indicado por vc.
Martins
GOSTEI 0
Razor
17/12/2004
analisado......
e agora?
e agora?
GOSTEI 0