Array
(
)

problemas com quot;whilequot;

Mahdak
   - 25 jan 2006

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!

#Código


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;



Macario
   - 25 jan 2006

Olá voce pode usar um for 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.


Sabe.geraldo
   - 25 jan 2006

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

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


Michael
   - 25 jan 2006

O problema acontece pq vc não atualiza os valores de quantidade e soma dentro do loop.

#Código

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 Macario disse, vc poderia usar um loop for aqui, pois o intervalo a ser percorrido é conhecido.

#Código
for I:= quantidade downto 1 do
...


[]´s


Mahdak
   - 25 jan 2006

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


Rjun
   - 25 jan 2006

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


Mahdak
   - 25 jan 2006

ta na mão:

#Código


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;



Edilcimar
   - 25 jan 2006

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


Mahdak
   - 25 jan 2006

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

abração!!!!!

#Código


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;



Rjun
   - 25 jan 2006

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

#Código


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;



Michael
   - 25 jan 2006

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

Outro problema é que vc está mudando o valor do contador I dentro do loop for, 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 Dec(Quantidade) mudam seu valor.

Use while ou for no seu caso. Não os dois, pelo menos do jeito que está.

[]´s


Mahdak
   - 25 jan 2006

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

muito obrigado pela atenção! :D

abraços!