Problemas com quot;REPEATquot;

11/01/2006

0

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:


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

Mahdak

Responder

Posts

11/01/2006

Massuda

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


Responder

11/01/2006

Cpd_arim

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


Responder

11/01/2006

Mahdak

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



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;



Responder

11/01/2006

Mahdak

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


Responder

11/01/2006

Aerreira

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´


Responder

11/01/2006

Michael

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].

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


Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

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

Aceitar