Olá galera, nesta Quick Tips, irei atender a um pedido de um leitor, onde o mesmo pediu para mostra como ler umas tabelas num banco qualquer, e preencher uma TreeView representando a estrutura do mesmo, veja o banco de dados :

Modelagem do banco de dados

Figura 1: Modelagem

Temos que mostrar uma árvore mais ou menos parecida com a seguinte :

Unidade Curso Turma
São Paulo Matemática Turmas M-A, Turma M-B.
Parana Letras Turmas L-A, Turma L-B.
Pará Ed. Fisica Turmas EF-A, Turma EF-B.

Vamos agora mostrar o script, feito para Firebird, veja


CREATE TABLE "UNIDADE"  (
	"IDUNIDADE" INTEGER NOT NULL,
	"DESCRICAO" VARCHAR(20),
 PRIMARY KEY ("IDUNIDADE")
);

CREATE TABLE "CURSO"  (
	"IDCURSO" INTEGER NOT NULL,
	"IDUNIDADE" INTEGER NOT NULL,
	"DESCRICAO" VARCHAR(20),
 PRIMARY KEY ("IDCURSO")
);

CREATE TABLE "TURMA"  (
	"IDTURMA" INTEGER NOT NULL,
	"IDCURSO" INTEGER NOT NULL,
	"DESCRICAO" VARCHAR(20),
 PRIMARY KEY ("IDTURMA")
);


ALTER TABLE "CURSO" ADD FOREIGN KEY ("IDUNIDADE") 
REFERENCES "UNIDADE" ("IDUNIDADE") ON UPDATE NO ACTION ON DELETE NO ACTION ;

ALTER TABLE "TURMA" ADD FOREIGN KEY ("IDCURSO") 
REFERENCES "CURSO" ("IDCURSO") ON UPDATE NO ACTION ON DELETE NO ACTION ;

Agora vamos a montagem do código para podermos montar o TreeView, adicione em uma nova aplicação, ClientDataSet, SQLDataSet, DataSetProvider, e no adicione a seguinte query, no SQLDataSet:


SELECT U.DESCRICAO DESCUNIDADE
       C.DESCRICAO DESCCURSO,
       T.DESCRICAO DESCTURMA,
  FROM TURMA T, CURSO C, UNIDADE U
 WHERE U.IDUNIDADE = C.IDUNIDADE
   AND C.IDCURSO = T.IDCURSO
 ORDER BY U.DESCRICAO, C.DESCRICAO, T.DESCRICAO

A partir daí façam a configuração dos 3 componentes, de forma tradicional.Adicione também um TreeView, e um botão para podermos executar a montagem da árvore, veja o layout do Form. Layout do Formulário

Figura 2: Layout do formulário

No Clique do Botão iremos implementar o seguinte código :


procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  ItemUltiimoCurso, ItemUltimaUnidade, ItemUltimaTurma: TTreeNode;
  xUnidadeAnt, xCursoAnt, xTurmaAnt: String;
begin
  while not CDS.Eof do
  begin
    if xUnidadeAnt <> CDS.FieldByName('IDUNIDADE').AsString then
    begin
      ItemUltimaUnidade := TreeView1.Items.AddChild(Nil,  
      CDS.FieldByName('DESCUNIDADE').AsString);
    end;
    if xCursoAnt <> CDS.FieldByName('IDCURSO').AsString then
    begin
      ItemUltiimoCurso := TreeView1.Items.AddChild(ItemUltimaUnidade, 
      CDS.FieldByName('DESCCURSO').AsString);
    end;
    if xTurmaAnt <> CDS.FieldByName('IDTURMA').AsString then
    begin
      ItemUltimaTurma := TreeView1.Items.AddChild(ItemUltiimoCurso,    
      CDS.FieldByName('DESCTURMA').AsAsString);
    end;
    xUnidadeAnt := CDS.FieldByName('IDUNIDADE').AsString;
    xCursoAnt := CDS.FieldByName('IDCURSO').AsString;
    xTurmaAnt := CDS.FieldByName('IDTURMA').AsString;
    CDS.Next;
  end;
end;

Veja o Resultado final

Exemplo pronto

Figura 3: Exemplo pronto

Fico por aqui ate à próxima.

Um abraço

Wesley Y

wesley@lithic.com.br