Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Ultimo campo do ClientDataSet


Anderson Scinfo

Pergunta

Boa noite a todos....eu trabalho com clientdataset pra guardar os dados que vem do banco até um numero de 50 e dai os transmito para um dbgrid, mas quando é selecionado o ultimo registro do dataset e se tem mais no banco precizo fazer um novo select e os guardar novamente no dataset pra dai exibilos no grid novamente, mas não sei como faço p/ saber se a linha selecionada atualmente é a ultima do dataset, pois se for, devo executar um procedimento no qual guardo os valores da atual e faço a seleção das proxima 50....é isso....

Anderson

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0
Boa noite a todos....eu trabalho com clientdataset pra guardar os dados que vem do banco até um numero de 50 e dai os transmito para um dbgrid, mas quando é selecionado o ultimo registro do dataset e se tem mais no banco precizo fazer um novo select e os guardar novamente no dataset pra dai exibilos no grid novamente, mas não sei como faço p/ saber se a linha selecionada atualmente é a ultima do dataset, pois se for, devo executar um procedimento no qual guardo os valores da atual e faço a seleção das proxima 50....é isso....
Talvez você possa utilizar a propriedade RecordNo para saber se é = as RecordCount (50 no seu caso).

Mas, há algum motivo especial para realizar este procedimento?

É que este procedimento é basicamente o que o próprio DBGrid usa para obter os dados do dataset e mostrá-los no seu grid. Assim, você estaria fazendo um retrabalho.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

é o seguinte, eu não conheço muito, eu tava pensando, fica dificel p/ uma query pegar tipo 100.000 registros que estão no banco e trazer para o grid, então pensei, eu jogo 50 itens apenas no clientdatase, os mostro no grid, quando chegar no final eu do um clear no dataset e pego mais 50 dali pra frente, e assim vai indo, pensei em economizar memória e processador da maquina, tem outra forma mais facil de fazer isso?

Link para o comentário
Compartilhar em outros sites

  • 0
é o seguinte, eu não conheço muito, eu tava pensando, fica dificel p/ uma query pegar tipo 100.000 registros que estão no banco e trazer para o grid, então pensei, eu jogo 50 itens apenas no clientdatase, os mostro no grid, quando chegar no final eu do um clear no dataset e pego mais 50 dali pra frente, e assim vai indo, pensei em economizar memória e processador da maquina, tem outra forma mais facil de fazer isso?

Anderson que componente você está utilizando?

A classe base da maioria dos componentes de acesso ao banco de dados é TDataSet. Através de uma propriedade private chamada FDataLink é feita a ligação do seu dataset (seja TTable, TQuery, ...) ao DBGrid. Quando há movimentação no grid, quando por exemplo você tecla a setinha para cima/baixo, pgup/pgdown,..., o procedimento para o evento OnKeyDown do seu grid vai fazer uso desta propriedade chamando o seu método MoveBy(<deslocamento>) (mover posição baseado no deslocamento - offset).

// fragmento do código da unit DBGrids.pas
procedure TCustomDBGrid.KeyDown(var Key: Word; Shift: TShiftState);
...
        VK_NEXT:
          begin
            ClearSelection;
            FDataLink.MoveBy(VisibleRowCount);
          end;
        VK_PRIOR:
          begin
            ClearSelection;
            FDataLink.MoveBy(-VisibleRowCount);
          end;
...
end;
Este método por sua vez, simplesmente chamará o método de mesmo nome do dataset ao qual ele está vinculado:
// fragmento do código da unit DB.pas 
function TDataLink.MoveBy(Distance: Integer): Integer;
begin
  Result := DataSet.MoveBy(Distance);
end;
no dataset, esta movimentação basicamente é "seqüencial" como você poderá observa no código do método:
function TDataSet.MoveBy(Distance: Integer): Integer;
...
      while Distance > 0 do
      begin
        if FActiveRecord < FRecordCount - 1 then Inc(FActiveRecord) else
        begin
          if FRecordCount < FBufferCount then I := 0 else I := 1;
          if GetNextRecord then  <== *** AQUI AVANÇA PRÓXIMO
          begin
            Dec(ScrollCount, I);
            if FActiveRecord < FRecordCount - 1 then Inc(FActiveRecord);
          end else
          begin
            FEOF := True;
            Break;
          end;
        end;
        Dec(Distance);
        Inc(Result);
      end;
...
end;
alguns componentes podem eventualmente sobrescrever este método de modo a otimizar o acesso aos dados do banco. Como vê, acho que não haveria justificativa para sua implementação, baseado nos argumentos que você passou. Como você vê, não seriam acessados os 100.000 registros de uma só vez. A título de otimização, uma das coisas que podem ser feitas é, quando do uso de datasets do tipo query, não utilizar o "*" na cláusula SELECT. Especifique o nome das colunas - você estará trazendo apenas as informações necessárias naquele momento e evitando tráfego desnecessário na rede e recursos de memória. Mas, se ainda preferir esta abordagem, acredito que se você colocar no evento OnDataChange do seu componente DataSource ligado que liga o DBGrid ao seu dataset, você poderia testar se RecNo=50:
procedure TForm1.DataSourceDataChange(Sender :TObject);
begin
  case seuClientDataSet.RecNo of
    50 : begin
         // Refaz a consulta dos próximos 50 registros
         end;
     1 : begin
         // Refaz a consulta dos 50 registros anteriores
         end;
  end;
end;

é apenas uma idéia. Ainda, acho que haverão questões a serem consideradas como verificar EOF e BOF, já que o simples fato de chegar ao registro 50, não significa que irá "pular de página" (o cara parou ali, não tentou ir a diante ainda). Também, pode ser preciso algum tipo de controle, já que o evento OnDataChange muito provavelmente ocorrerá quando você manipular a nova consulta (ele sempre é gerado para cada movimentação/alteração feita no dataset).

Bom, espero não ter lhe confundido mais.

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...