Fórum Laço while not cdsDetalheMovFinanceiras.Eof do Dando Erro #325117
11/07/2006
0
Quero levantar uma situação um tanto para mim , inusitada. Com isto chamar a atençao de alguem que ja passou ou ira passar por isto.
Fiz uma rotina abaixo e consideraria [b:087f870091]100¬ correta [/b:087f870091]... Nen precisaria testa-la , por acha-la tao banal e livre de qualquer desconfiança
[b:087f870091]o controle abaixo tem por objetivo alterar todos os registros .. do primeiro ao ultimo... [/b:087f870091]
cdsDetalheMovFinanceiras.First; while not cdsDetalheMovFinanceiras.Eof do begin cdsDetalheMovFinanceiras.Edit; cdsDetalheMovFinanceirasAtivo.AsBoolean:=true; cdsDetalheMovFinanceirasId_Recebimento.AsInteger:=-1; cdsDetalheMovFinanceiras.Post; cdsDetalheMovFinanceiras.Next; end;
Mas ai que vem a surpresa....
Ao executar passo a passo verifiquei que ao chegar no ultimo registro da Tabela , simplesmente[b:087f870091] cdsDetalheMovFinanceiras.Eof fica valendo True [/b:087f870091]e portanto sai do Laço. :?: :?: :?: :?: :?:
Portanto , o ultimo registro não é executado e portanto não é alterado. Logo esta rotina simples neste caso dá erro.
[b:087f870091]Fica dificil dizer aqui o que que esta errado e porque [/b:087f870091]... So posso dizer que não da para ter certeza de nada e é mais uma relato do ocorrido para ficar registrado.
[b:087f870091]Não sei se é o caso , porque nao fiz testes ainda com ClientDataSet ´Puros´ [/b:087f870091]. Mas uso uma estrutura de[b:087f870091] mestre Detalhe [/b:087f870091], aonde percorro os registros do <Detalhe>
Marco Salles
Curtir tópico
+ 0Posts
11/07/2006
Aroldo Zanela
Fiz um teste aqui e funcionou normalmente:
var I, N: SmallInt; begin N := 10; For I := 1 to N do begin cds1.AppendRecord([I, FormatFloat(´00000´, I)]); end; cds1.First; mmo1.Lines.Clear; while not cds1.Eof do begin mmo1.Lines.Add(cds1CODIGO.AsString + ´ ´ + cds1DESCRICAO.Value); cds1.Next; end; end;
Mas se não encontrar o problema, tente com [b:05702c99bc]Repeat...until[/b:05702c99bc]
Gostei + 0
12/07/2006
Marco Salles
No meu caso tb deveria funcionar... Fiz isto a vida toda . Sempre usei assim...
[b:ccaec15f70]
Este campo é alterado quando executo O laço ..
[b:ccaec15f70]cdsDetalheMovFinanceirasId_Recebimento.AsInteger:=-1; [/b:ccaec15f70]
Porque estou dizendo tudo isto.... Porque fiz um teste simples
Somente com um laço , sem alterar o Valor do Campo
[b:ccaec15f70]Teste Simples[/b:ccaec15f70]
procedure TForm7.Button1Click(Sender: TObject); begin cdsDetalheMovFinanceiras.First; while not cdsDetalheMovFinanceiras.Eof do begin showmessage(cdsDetalheMovFinanceirasId_Movimentacao.AsString); cdsDetalheMovFinanceiras.Next; end; end;
[b:ccaec15f70]Resulatdo:[/b:ccaec15f70] :arrow: Todos os registros do cdsDetalheMovFinanceiras
são mostrados... com deveria
Mas ja com o Laço.... :cry: :cry: :cry: :cry:
cdsDetalheMovFinanceiras.First; while not cdsDetalheMovFinanceiras.Eof do begin cdsDetalheMovFinanceiras.Edit; cdsDetalheMovFinanceirasAtivo.AsBoolean:=true; cdsDetalheMovFinanceirasId_Recebimento.AsInteger:=-1; cdsDetalheMovFinanceiras.Post; cdsDetalheMovFinanceiras.Next; end;
[b:ccaec15f70]Resultado :[/b:ccaec15f70] :arrow: O último registro não aparece
Gostei + 0
12/07/2006
Aroldo Zanela
Tenho certeza que você vai encontrar o problema. Mas me diga, existe algum filtro no CDS? Há alguma instrução nos manipuladores de eventos OnPost ou outro?
Gostei + 0
12/07/2006
Marco Salles
se for um problema de logica sim...
´Se não deu é porque ainda não chegou a hora´
Neste Cds não
Tb não
Esta sua colocação , procede de maneira consciente para elucidar o misterio...
Vou rodar o programa passo a passo , colocando algumas linhas de breakpoint para tentar esclarecer melhor.
Vou rodar o rpograma sabendo que existem para um determinado registro do Mestre Tres registros Do Detalhe... E que o que amarra esses registros é o campo Id_Recebimento.AsInteger
Coloquei quatro Instruçoes de mensagens ....
showmessage(inttostr(cdsDetalheMovFinanceiras.RecordCount)); showmessage(inttostr(cdsDetalheMovFinanceiras.RecNo)); while not cdsDetalheMovFinanceiras.Eof do begin cdsDetalheMovFinanceiras.Edit; cdsDetalheMovFinanceirasAtivo.AsBoolean:=true; cdsDetalheMovFinanceirasId_Recebimento.AsInteger:=-1; cdsDetalheMovFinanceiras.Post; cdsDetalheMovFinanceiras.Next; end; showmessage(inttostr(cdsDetalheMovFinanceiras.RecordCount)); showmessage(inttostr(cdsDetalheMovFinanceiras.RecNo));
Note a Imagem antes de Eliminar o Relacionamento
[b:fb54aa14de]Note que para o Primeiro Regsitro selecionado ha tres registros Detalhes que aparece no Grid Abaixo[/b:fb54aa14de]
[URL=http://imageshack.us][img:fb54aa14de]http://img99.imageshack.us/img99/4716/imagemaroldo12xu.png[/img:fb54aa14de][/URL]
[b:fb54aa14de]Apos a execução do Botão eliminar note que restou o ultimo registro
no escrevo e a mensagem informando a quantidade de registro Escravo[/b:fb54aa14de]
[URL=http://imageshack.us][img:fb54aa14de]http://img99.imageshack.us/img99/1016/imagemaroldo28qo.png[/img:fb54aa14de][/URL]
[b:fb54aa14de][color=darkred:fb54aa14de]Ops........Ops............Ops...... [/color:fb54aa14de][/b:fb54aa14de]
Eu disse o [b:fb54aa14de]ultimo Registro [/b:fb54aa14de]e na figura acima o que sobrou foi o [b:fb54aa14de]Segundo Registro [/b:fb54aa14de]< O Registro Do meio >.. [b:fb54aa14de][color=darkred:fb54aa14de]Foi a Deixa que eu precisava.[/color:fb54aa14de][/b:fb54aa14de]Porque o do meio :?: :?: :?:
:arrow: :arrow: :arrow: :arrow:
[b:fb54aa14de]Fui correndo para o ´programa´ e desconfiei da Instrução cdsDetalheMovFinanceiras.Next;... [/b:fb54aa14de]
:idea: :idea: :idea: :idea: :idea:
Ora , o next nesse caso ja é a eliminação do Relacionamento e dar um Next sera uma redundância
[b:fb54aa14de]Matado o problema...[/b:fb54aa14de]
:lol: :lol: :lol:
[b:fb54aa14de]Muito obrigado Aroldo[/b:fb54aa14de]
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)