25/01/2006

problemas com quot;whilequot;

caros colegas, no código abaixo tenho um edit, onde informo a quantidade de etiquetas a ser gerada.
A idéia é a seguinte após o usuario digitar a quantidade:

´enquanto a quantidade nao for = zero fassa ´

o problema que está acontecendo é o seguinte: nao acontece nada!, nao vejo o edit decrementando valores e nada é salvo na tabela....

desconfio que o problema esta na linha: ´while not quantidade=0 do´

abraços!

procedure TForm1.Button3Click(Sender: TObject);
var
soma, quantidade, cod : integer;
begin

    quantidade := StrToInt(Edit_quantidade.Text);
    Soma       := quantidade - 1;

    while not quantidade=0 do
    begin
        // Contador de codigo
        Tbl_Etiquetas.Open;
        Tbl_Etiquetas.Last;
        Cod := Tbl_EtiquetasCODIGO.AsInteger + 1;
        Label_Codigo.Caption := IntToStr(Cod);
        //--------------------------------------

        // salva em uma tabela temporaria
        Tbl_Etiquetas.Insert;
        Tbl_EtiquetasCODIGO.AsInteger   := Cod;
        Tbl_EtiquetasCODIGO_E.AsInteger := Tbl_ProdutosCODIGO.AsInteger;
        Tbl_EtiquetasNOME.AsString      := Tbl_ProdutosNOME.AsString;
        Tbl_Etiquetas.Post;
        Tbl_Etiquetas.ApplyUpdates;

        // diminui o valor contido no edit para o while verificar se ja chegou a zero
        Edit_quantidade.Text := IntToStr(soma);
    end;
end;



Mahdak

Respostas

25/01/2006

Macario

Olá voce pode usar um [b:30071a0f9a]for[/b:30071a0f9a] para este tipo de laço!

Outra coisa seu while esta errado mesmo, pois voce não esta impondo decremento a condição de parada.

Voce esta pegando dados de uma mesma tabela e o inserindo novamente?!?!

Colega esta muito confuso este seu codigo...para que possa entender o que voce necessita.


Responder Citar

25/01/2006

Sabe.geraldo

Para dar certo voce tem que decrementar a quantidade em - 1 dentro do cilo do while.

Ex.: quantidade := ( quantidade - 1 );


Responder Citar

25/01/2006

Michael

O problema acontece pq vc não atualiza os valores de quantidade e soma [b:76bd38d77f]dentro [/b:76bd38d77f]do loop.

while quantidade > 0 do
begin  
  soma := Pred(quantidade); // O mesmo que quantidade - 1
  ...
  Dec(quantidade); // O mesmo que quantidade := quantidade - 1;
end;


E, como o colega [b:76bd38d77f]Macario [/b:76bd38d77f]disse, vc poderia usar um loop [b:76bd38d77f]for [/b:76bd38d77f]aqui, pois o intervalo a ser percorrido é conhecido.

for I:= quantidade downto 1 do
...


[]´s


Responder Citar

25/01/2006

Mahdak

colegas, quero agradecer muito a ajuda, mas nao estou conseguindo arrumar o código de acordo com o sugerido... tentei aqui e o executavel trava...
alguem poderia me dar uma mão? é que eu tenho que entregar isso para o cliente hoje ainda...
Abraços...


Responder Citar

25/01/2006

Rjun

Se você fez o que o pessoal sugeriu era para funcionar. Poste o código novamente.


Responder Citar

25/01/2006

Mahdak

ta na mão:

procedure TForm1.Button3Click(Sender: TObject);
var
soma, quantidade, cod,I : integer;
begin

    quantidade := StrToInt(Edit_quantidade.Text);
    while quantidade > 0 do

    begin
        Soma := Pred(quantidade);
        for I:= quantidade downto 1 do
        begin
            // Contador de codigo
            Tbl_Etiquetas.Open;
            Tbl_Etiquetas.Last;
            Cod := Tbl_EtiquetasCODIGO.AsInteger + 1;
            Label_Codigo.Caption := IntToStr(Cod);
            //--------------------------------------

            // salva em uma tabela temporaria
            Tbl_Etiquetas.Insert;
            Tbl_EtiquetasCODIGO.AsInteger   := Cod;
            Tbl_EtiquetasCODIGO_E.AsInteger := StrToInt(edit_codigo.Text);
            Tbl_EtiquetasNOME.AsString      := edit_produto.Text;
            Tbl_Etiquetas.Post;
            Tbl_Etiquetas.ApplyUpdates;

            // diminui o valor contido no edit para o while verificar se ja chegou a zero
            Edit_quantidade.Text := IntToStr(soma);
        end;
    end;
end;



Responder Citar

25/01/2006

Edilcimar

vc fez um while com quantidade, onde é que vc decrementou o valor de quantidade?


Responder Citar

25/01/2006

Mahdak

opa!!!, pessoal, consegui... desculpa a minha ignorancia... vai abaixo o código correto:

abração!!!!!

procedure TForm1.Button3Click(Sender: TObject);
var
soma, quantidade, cod,I : integer;
begin

    quantidade := StrToInt(Edit_quantidade.Text);
    while quantidade > 0 do

    begin
        Soma := Pred(quantidade);

        for I:= quantidade downto 1 do
        begin
            // Contador de codigo
            Tbl_Etiquetas.Open;
            Tbl_Etiquetas.Last;
            Cod := Tbl_EtiquetasCODIGO.AsInteger + 1;
            Label_Codigo.Caption := IntToStr(Cod);
            //--------------------------------------

            // salva em uma tabela temporaria
            Tbl_Etiquetas.Insert;
            Tbl_EtiquetasCODIGO.AsInteger   := Cod;
            Tbl_EtiquetasCODIGO_E.AsInteger := StrToInt(edit_codigo.Text);
            Tbl_EtiquetasNOME.AsString      := edit_produto.Text;
            Tbl_Etiquetas.Post;
            Tbl_Etiquetas.ApplyUpdates;


            // diminui o valor contido no edit para o while verificar se ja chegou a zero
            Dec(quantidade);
            Edit_quantidade.Text := IntToStr(quantidade);
        end;
    end;
end;



Responder Citar

25/01/2006

Rjun

Você não precisa usar For e While. Use um dos dois.

procedure TForm1.Button3Click(Sender: TObject); 
var 
  Quantidade, 
  i: Integer;
begin 
  Quantidade := StrToInt(Edit_quantidade.Text); 
  
  for i := Quantidade downto 1 do 
  begin 
    // Contador de codigo 
    Tbl_Etiquetas.Open; 
    Tbl_Etiquetas.Last; 
    Cod := Tbl_EtiquetasCODIGO.AsInteger + 1; 
    Label_Codigo.Caption := IntToStr(Cod); 
     //-------------------------------------- 

     // salva em uma tabela temporaria 
     Tbl_Etiquetas.Insert; 
     Tbl_EtiquetasCODIGO.AsInteger   := Cod; 
     Tbl_EtiquetasCODIGO_E.AsInteger := StrToInt(edit_codigo.Text); 
     Tbl_EtiquetasNOME.AsString      := edit_produto.Text; 
     Tbl_Etiquetas.Post; 
     Tbl_Etiquetas.ApplyUpdates; 

     Edit_quantidade.Text := IntToStr(i); 
  end; 
end; 



Responder Citar

25/01/2006

Michael

Um for dentro do [b:c78cf67f8f]while[/b:c78cf67f8f]? Vc usou as duas dicas que o colega [b:c78cf67f8f]Macario [/b:c78cf67f8f]e eu demos, mas elas eram mutuamente exclusivas!

Outro problema é que vc está mudando o valor do contador [b:c78cf67f8f]I[/b:c78cf67f8f] dentro do loop [b:c78cf67f8f]for[/b:c78cf67f8f], e isso é totalmente desaconselhável, pois pode resultar em loops eternos.

Do jeito que está, o loop while só é executado uma vez, pois o valor de quantidade é decrementado até 0 - em uma ordem não linear, pois tanto o loop for quanto [b:c78cf67f8f]Dec(Quantidade)[/b:c78cf67f8f] mudam seu valor.

Use [b:c78cf67f8f]while [/b:c78cf67f8f]ou [b:c78cf67f8f]for [/b:c78cf67f8f]no seu caso. Não os dois, pelo menos do jeito que está.

[]´s


Responder Citar

25/01/2006

Mahdak

ok, ja esta arrumado conforme o colega Rjun sugeriu...

muito obrigado pela atenção! :D

abraços!


Responder Citar