Fórum Analisem esse código para mim #262472
17/12/2004
0
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
Curtir tópico
+ 0Posts
17/12/2004
Lucas Silva
Gostei + 0
17/12/2004
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
17/12/2004
Vinicius2k
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
18/12/2004
Martins
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
18/12/2004
Vinicius2k
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
20/12/2004
Martins
muito obrigado pela dica.
vou dar uma olhada no link indicado por vc.
Martins
Gostei + 0
20/12/2004
Razor
e agora?
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)