Laço while not cdsDetalheMovFinanceiras.Eof do Dando Erro
Em primeiro lugar , estou trabalhando com [b:087f870091]ClientDataSet[/b:087f870091] em Arquivos [b:087f870091]XML[/b:087f870091].... Também trabalho com Mestre Detalhe
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]
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. :?: :?: :?: :?: :?:
[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>
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>
O Engraçado é que quando se tem um Registro no Detalhe o Laço é executado uma Vez . Porem quando se tem [b:087f870091]n[/b:087f870091] Registros no Detalhe para [b:087f870091]n > 1[/b:087f870091] o Laço é executado[b:087f870091] n-1[/b:087f870091] Vezez
Marco Salles
Curtidas 0
Respostas
Aroldo Zanela
11/07/2006
Colega,
Fiz um teste aqui e funcionou normalmente:
Mas se não encontrar o problema, tente com [b:05702c99bc]Repeat...until[/b:05702c99bc]
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
Marco Salles
11/07/2006
Blz Aroldo. O intercambio é isto... Trocar experiências....
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]
[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:
[b:ccaec15f70]Resultado :[/b:ccaec15f70] :arrow: O último registro não aparece
Fiz um teste aqui e funcionou normalmente:
No meu caso tb deveria funcionar... Fiz isto a vida toda . Sempre usei assim...
[b:ccaec15f70]
Estou trabalhando com estrutuura Mestre Detalhe...e a condição que ´amarra´ o Escravo do Mestre é o Campo Id_Recebimento....
[/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
Aroldo Zanela
11/07/2006
Colega,
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?
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
Marco Salles
11/07/2006
Colega,
Tenho certeza que você vai encontrar o problema
.se for um problema de logica sim...
´Se não deu é porque ainda não chegou a hora´
Mas me diga, existe algum filtro no CDS?
Neste Cds não
Há alguma instrução nos manipuladores de eventos OnPost ou outro?
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));
A primeira Mostra que o Total de Registro é Tres... Confere
A segunda Mostra que o Numero (RecNo) é Um , pois foi dado apos o First
Portanto confere
A terceira mensagem , esperava Zero , pois não deveria ter mais relacionamento.. Porem Mostra Um... :arrow: Não confere
A qurta Mensagem Mostra que o RecNo é Igual a um..
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:
Confesso que descobri tudo isso depois que esta mensagem estava pronta para ser enviada... Por isso vou deixa-la na intrega sem cortes
[b:fb54aa14de]Muito obrigado Aroldo[/b:fb54aa14de]
GOSTEI 0