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!
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
Curtidas 0
Respostas
Macario
25/01/2006
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.
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.
GOSTEI 0
Sabe.geraldo
25/01/2006
Para dar certo voce tem que decrementar a quantidade em - 1 dentro do cilo do while.
Ex.: quantidade := ( quantidade - 1 );
Ex.: quantidade := ( quantidade - 1 );
GOSTEI 0
Michael
25/01/2006
O problema acontece pq vc não atualiza os valores de quantidade e soma [b:76bd38d77f]dentro [/b:76bd38d77f]do loop.
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.
[]´s
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
GOSTEI 0
Mahdak
25/01/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...
alguem poderia me dar uma mão? é que eu tenho que entregar isso para o cliente hoje ainda...
Abraços...
GOSTEI 0
Rjun
25/01/2006
Se você fez o que o pessoal sugeriu era para funcionar. Poste o código novamente.
GOSTEI 0
Mahdak
25/01/2006
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;
GOSTEI 0
Edilcimar
25/01/2006
vc fez um while com quantidade, onde é que vc decrementou o valor de quantidade?
GOSTEI 0
Mahdak
25/01/2006
opa!!!, pessoal, consegui... desculpa a minha ignorancia... vai abaixo o código correto:
abração!!!!!
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;
GOSTEI 0
Rjun
25/01/2006
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;
GOSTEI 0
Michael
25/01/2006
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
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
GOSTEI 0
Mahdak
25/01/2006
ok, ja esta arrumado conforme o colega Rjun sugeriu...
muito obrigado pela atenção! :D
abraços!
muito obrigado pela atenção! :D
abraços!
GOSTEI 0