Problemas com quot;REPEATquot;
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:
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:
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;
Mahdak
Curtidas 0
Respostas
Massuda
11/01/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.
GOSTEI 0
Cpd_arim
11/01/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
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
GOSTEI 0
Mahdak
11/01/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
Obs: te adicionei no meu msn... jpxst@hotmail.com
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;
GOSTEI 0
Mahdak
11/01/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.
foi justamente isso massuda.... :D
GOSTEI 0
Aerreira
11/01/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´
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´
GOSTEI 0
Michael
11/01/2006
Vc não deveria usar [b:736f105a13]repeat [/b:736f105a13]para fazer loops pelos registros de um DataSet, pois o código dentro dele será sempre executado pelo menos [b:736f105a13]uma vez[/b:736f105a13], e se a tabela estiver vazia, erros irão ocorrer em vários locais, como no método [b:736f105a13]Next[/b:736f105a13].
Use [b:736f105a13]while..do[/b:736f105a13] no lugar de [b:736f105a13]repeat..until[/b:736f105a13].
Bom, isso é apenas para constar. A dica do colega [b:736f105a13]aerreira[/b:736f105a13] é o melhor caminho no seu caso.
[]´s
Use [b:736f105a13]while..do[/b:736f105a13] no lugar de [b:736f105a13]repeat..until[/b:736f105a13].
while not DM.Tbl_Produtos.Eof do begin ... DM.Tbl_Produtos.Next; end;
Bom, isso é apenas para constar. A dica do colega [b:736f105a13]aerreira[/b:736f105a13] é o melhor caminho no seu caso.
[]´s
GOSTEI 0