Fórum Laço while not cdsDetalheMovFinanceiras.Eof do Dando Erro #325117

11/07/2006

0

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]

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

Marco Salles

Responder

Posts

11/07/2006

Aroldo Zanela

Colega,

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]


Responder

Gostei + 0

12/07/2006

Marco Salles

Blz Aroldo. O intercambio é isto... Trocar experiências....

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


Responder

Gostei + 0

12/07/2006

Aroldo Zanela

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?


Responder

Gostei + 0

12/07/2006

Marco Salles

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]


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar