Problemas com quot;REPEATquot;

11/01/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:


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

Respostas

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 Citar

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 Citar

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 Citar

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 Citar

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 Citar

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 Citar