Carregar um treeview com dados do BD sem usar o EOF?

Delphi

25/11/2006

Pessoal bom dia, gostaria de saber se tem como:
[b:4080525f12]Carregar um treeview com dados do BD sem usar o EOF?[/b:4080525f12]

Estou usando o codigo assim:
procedure TForm5.FormActivate(Sender: TObject);
var
  Node, SubNode1, SubNode2: TTreeNode;
begin
fechatabelaS;
abretabelaS;

dm.ibdbgridsaida.active:=true;
dm.ibdbgridsaida.Close;
dm.ibdbgridsaida.SQL.Text := ´select CNPJ from saidas GROUP BY CNPJ´;
dm.ibdbgridsaida.Open;
TreeView1.Items.Clear;
  while not dm.ibdbgridsaida.Eof do
  begin
    SubNode1 := TreeView1.Items.AddChild(Node, dm.ibdbgridsaida.fieldbyname(´cnpj´).value);
    SubNode1.ImageIndex := 1;
    SubNode1.SelectedIndex := 0;
 
  dm.ibdbgridsaida.Next;
  end;
  dm.ibdbgridsaida.Close;

Carregando logo quando inicio o form no evento onactive do form, o problema eh que o BD cresceu muito ai ateh chegar no final do banco ele demora alguns segundos ateh minuto nao sei bem ao certo.

Entao gostaria de saber se tem outra maneira de carregar todos os dados que esta no select acima sem ter que demorar muito, ou seja carregar na hora, pois assim esta muito pesado.

Agradeço a ajuda de todos
Adriano.


Adriano_servitec

Adriano_servitec

Curtidas 0

Respostas

Paullsoftware

Paullsoftware

25/11/2006

creio que não tenha como você ler todos os registros de uma tabela sem lê-la do inicio até o final, mais, para ficar melhor e para o usuário ver o processo da sua aplicação seria legal implementar uma barra de progresso, outra coisa, você abre e fecha a tabela antes de começar o precesso, porque?
var
Node, SubNode1, SubNode2: TTreeNode;
begin
fechatabelaS;
abretabelaS;
//Esse linha pode ser cancelada...
//dm.ibdbgridsaida.active:=true; 
dm.ibdbgridsaida.Close; 
dm.ibdbgridsaida.SQL.Text := ´select CNPJ from saidas GROUP BY CNPJ´; 
dm.ibdbgridsaida.Open; 
TreeView1.Items.Clear; 
//desabilitar os controle ligados a tabela, para melhorar a performance
dm.ibdbgridsaida.DisabledControls;
  while not dm.ibdbgridsaida.Eof do 
  begin 
    SubNode1 := TreeView1.Items.AddChild(Node, dm.ibdbgridsaida.fieldbyname(´cnpj´).value); 
    SubNode1.ImageIndex := 1; 
    SubNode1.SelectedIndex := 0; 
  dm.ibdbgridsaida.Next; 
  end; 
  dm.ibdbgridsaida.EnabledControls;
  dm.ibdbgridsaida.Close;

se alguém sabe uma forma de fazer isso, sem ler toda tabela, o que acho pouco porvável, post ae nós então!! :roll:


GOSTEI 0
Adriano_servitec

Adriano_servitec

25/11/2006

creio que não tenha como você ler todos os registros de uma tabela sem lê-la do inicio até o final, mais, para ficar melhor e para o usuário ver o processo da sua aplicação seria legal implementar uma barra de progresso, outra coisa, você abre e fecha a tabela antes de começar o precesso, porque?
Obrigado por me ajudar amigo, mesmo assim fica muito lento, como estou usando somente um campo dentro do treeview, acho que ficaria melhor eu optar por um dbgrid ja que esse abre os dados muito mais rapidos. Entao vem a pergunta, tem como colocar um imagelist com a imagem dentro de um dbgrid como uso no treeview?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

25/11/2006

além disso, você pode exibir as alterações somente depois de terem sido finalizadas:
var
  Node, SubNode1, SubNode2: TTreeNode;
begin
  fechatabelaS;
  abretabelaS;

  with dm.ibdbgridsaida do
  begin
    Close;
    SQL.Text := ´select CNPJ from saidas GROUP BY CNPJ´;
    Open;

    // adicione a linha abaixo.
    // ela prepara o treeview para edicao e não reporta as alterações
    // para a tela enquanto não terminar o processo, tornando o
    // procedimento mais veloz
    TreeView1.Items.BeginUpdates;

    TreeView1.Items.Clear;
    //desabilitar os controle ligados a tabela, para melhorar a performance
    DisabledControls;

    while not Eof do
    begin
      SubNode1 := TreeView1.Items.AddChild(Node, fieldbyname(´cnpj´).asstring);
      SubNode1.ImageIndex := 1;
      SubNode1.SelectedIndex := 0;
      Next;
    end;

    EnabledControls;
    Close;

    // informa ao treeview que as alterações foram finalizadas
    TreeView1.Items.EndUpdates;
  end;

note que o código foi reescrito somente para melhor entendimento. dê importância para as linhas TreeView1.Items.BeginUpdates e TreeView1.Items.EndUpdates.
espero que isso ajude a melhorar a performande da sua rotina


GOSTEI 0
Adriano_servitec

Adriano_servitec

25/11/2006

Olah Emerson.En, acho que nao funciona os codigos:
[b:004b7a6537]BeginUpdates;
[/b:004b7a6537] e [b:004b7a6537]EndUpdates[/b:004b7a6537] no Delphi 5

Olha o erro na hora de compilar
[color=red:004b7a6537][Error] UExcluirAssociado.pas(188): Undeclared identifier: ´BEGINUPDATES´[/color:004b7a6537]

Tambem estou querendo montar esse ListView para mostrar os dados mais nao estou conseguindo
begin
DM.IBQ1.First;
ListView1.AllocBy:= DM.IBQ1.RecordCount;
WHILE NOT DM.IBQ1.Eof DO
  BEGIN
    //ListView1.BEGINUPDATES;
    With ListView1.ITEMS.ADD DO
    BEGIN
      Caption:= DM.ibq1.FieldByName(´ASSOCIADO´).AsString;
      subitems[0]:= DM.IBQ1.FieldByName(´MATRICULA´).AsString;
      subitems[1]:= DM.IBQ1.FieldByName(´ASSOCIADO´).AsString;
      SubItems[2]:= DM.IBQ1.Fieldbyname(´NATURAL´).AsString;
      SubItems[3]:= DM.IBQ1.Fieldbyname(´PAI´).AsString;
      SubItems[4]:= DM.IBQ1.Fieldbyname(´MAE´).AsString;
    end;

  //ListView1.ENDUPDATES;
  DM.IBQ1.NEXT;

  END;
Aparece o seguinte erro na hora de executa-lo [color=red:004b7a6537]List index out bounds (0)[/color:004b7a6537]

Grato a ajuda de todos.
Obrigado Adriano

[/b]


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

25/11/2006

1o. - é BEGINUPDATE e ENDUPDATE (singular)
2o. - o método é aplicado aos Itens e não diretamente ao ListView ou TreeView
- ListView1.Items.BeginUpdate / ListView1.Items.EndUpdate
- TreeView1.Items.BeginUpdate / TreeView1.Items.EndUpdate
3o. - Realmente não sei se esse método está disponível no componente do Delphi 5.


GOSTEI 0
POSTAR