Array
(
)

Problemas com quot;REPEATquot;

Mahdak
   - 11 jan 2006

Caros colegas, estou criando uma rotina simples para alterar o valor de todos os itens da tabela produtos para mais ou para menos, os valores serao em percentual. A rotina abaixo descreve o que estou querendo fazer, porem existe um probleminha lógico ai que nao estou conseguindo ver...

ao invés da rotina abaixo pegar item por item da tabela e calcular o percentual a ser alterado isoladamente, ele está pegando o valor da primeira linha da tabela, calculando o percentual e salvando o valor do mesmo para todas as linhas restantes da tabela produtos...

se alguem puder me dar uma luz :idea:

#Código



procedure Taltera_porcento.Btn_AlterarClick(Sender: TObject);
var
valor, tabela, calcula : Double;
begin
valor := StrToFloat(Edit_Valor.Text);
tabela := DM.Tbl_ProdutosVALOR.AsFloat;


if combo_Funcao.Text = ´Mais´ then
begin
DM.Tbl_Produtos.First;
// Modifica o preço de todos os produtos para mais
repeat
calcula := tabela + (tabela * (valor / 100)); // calculo do percentual
DM.Tbl_Produtos.Edit;
DM.Tbl_ProdutosVALOR.AsFloat := calcula;
DM.Tbl_Produtos.Post;
DM.Tbl_Produtos.ApplyUpdates;
DM.Tbl_Produtos.Next;
until DM.Tbl_Produtos.Eof;

ShowMessage(´O valor todos os produtos foram alterados´ +#13+ ´para ´ + Combo_Funcao.Text + ´ ´ + Edit_Valor.Text + ´ ¬´ )


end
else
begin
DM.Tbl_Produtos.First;

// Modifica o preço de todos os produtos para menos
repeat
calcula := tabela - (tabela * (valor / 100)); // calculo do percentual
DM.Tbl_Produtos.Edit;
DM.Tbl_ProdutosVALOR.AsFloat := calcula;
DM.Tbl_Produtos.Post;
DM.Tbl_Produtos.ApplyUpdates;
DM.Tbl_Produtos.Next;
until DM.Tbl_Produtos.Eof;

ShowMessage(´O valor todos os produtos foram alterados´ +#13+ ´para ´ + Combo_Funcao.Text + ´ ´ + Edit_Valor.Text + ´ ¬´ )
end;
end;





Massuda
   - 11 jan 2006

Não sei se entendi direito, mas acho que o valor da variável ´tabela´ deveria ser pego dentro dos loops, não fora.


Cpd_arim
   - 11 jan 2006

caro amigo, fiz uma atualização de tabela do modo abaixo,

var
w_qtdest:currency;
w_qtdand:currency;
begin
w_qtdest:=table1qtdest.value;
w_qtdand:=table1qtdand.value;
table1.first;
while not table1.Eof do
begin
table1.edit;
table1cuscon.value:=table1cuscon.Value/(w_qtdest+w_qtdand);
table1.post;
table1.next;
end;

qq duvida cpd_arim@hotmail.com


Mahdak
   - 11 jan 2006

Cpd, muito obrigado pela força... consegui com mais um amigo solucionar o problema da seguinte forma:
Obs: te adicionei no meu msn... jpxst@hotmail.com


#Código



procedure Taltera_porcento.Btn_AlterarClick(Sender: TObject);
var
valor, tabela, calcula : Double;
begin
valor := StrToFloat(Edit_Valor.Text);

if combo_Funcao.Text = ´Mais´ then
begin
DM.Tbl_Produtos.First;
// Modifica o preço de todos os produtos para mais
repeat
tabela := DM.Tbl_ProdutosVALOR.AsFloat;
calcula := tabela + (tabela * (valor / 100)); // calculo do percentual
DM.Tbl_Produtos.Edit;
DM.Tbl_ProdutosVALOR.AsFloat := calcula;
DM.Tbl_Produtos.Post;
DM.Tbl_Produtos.ApplyUpdates;
DM.Tbl_Produtos.Next;
until DM.Tbl_Produtos.Eof;

ShowMessage(´O valor todos os produtos foram alterados´ +#13+ ´para ´ + Combo_Funcao.Text + ´ ´ + Edit_Valor.Text + ´ ¬´ )


end
else
begin
DM.Tbl_Produtos.First;

// Modifica o preço de todos os produtos para menos
repeat
tabela := DM.Tbl_ProdutosVALOR.AsFloat;
calcula := tabela - (tabela * (valor / 100)); // calculo do percentual
DM.Tbl_Produtos.Edit;
DM.Tbl_ProdutosVALOR.AsFloat := calcula;
DM.Tbl_Produtos.Post;
DM.Tbl_Produtos.ApplyUpdates;
DM.Tbl_Produtos.Next;
until DM.Tbl_Produtos.Eof;

ShowMessage(´O valor todos os produtos foram alterados´ +13+ ´para ´ + Combo_Funcao.Text + ´ ´ + Edit_Valor.Text + ´ ¬´ )
end;
end;



Mahdak
   - 11 jan 2006


Citação:
Não sei se entendi direito, mas acho que o valor da variável ´tabela´ deveria ser pego dentro dos loops, não fora.


foi justamente isso massuda.... :D


Aerreira
   - 11 jan 2006

Sugiro algo mais objetivo (usando é claro os comandos para criar e executar os respectivos SQLs)

if combo_Funcao.Text = ´Mais´ then
update PRODUTOS set VALOR = VALOR + (VALOR * (PERCENTUAL / 100))
else
update PRODUTOS set VALOR = VALOR - (VALOR * PERCENTUAL / 100))


Sendo ´percentual´ o conteúdo do seu campo ´Edit_Valor.Text´


Michael
   - 11 jan 2006

Vc não deveria usar repeat para fazer loops pelos registros de um DataSet, pois o código dentro dele será sempre executado pelo menos uma vez, e se a tabela estiver vazia, erros irão ocorrer em vários locais, como no método Next.

Use while..do no lugar de repeat..until.

#Código

while not DM.Tbl_Produtos.Eof do
begin
...
DM.Tbl_Produtos.Next;
end;


Bom, isso é apenas para constar. A dica do colega aerreira é o melhor caminho no seu caso.

[]´s