terça-feira, agosto 25, 2009

DbTreeView no Delphi - JvDbTreeView

Bom, depois de apanhar um pouco para conseguir colocar para funcionar, aqui vai a dica de como fazer um plano de contas ser mostrado numa TreeView, no caso vamos usar a jvDbTreeView que é uma TreeView dbaware no Delphi.

Como vamos usar o componente na JVCL, aqui vai o link para baixar http://sourceforge.net/projects/jvcl/, é um excelente pacote de componentes, praticamente tudo que você precisar, acaba descobrindo que tem lá.

Criei a minha tabela no Firebird, a estrutura abaixo:

Campo Tipo Descrição
Cta_ID integer Numero da conta
Cta_Master integer Conta “pai”
Cta_Descricao Varchar(30) Nome da conta

Coloque um componente JvDbTreeView no formulário, conecte-o via a propriedade DataSource à tabela do banco de dados.

Ajuste as suas propriedades do JvDbTreeView como abaixo:
Obs.: No meu caso o dataSource chama-se dsPlanContas.

Propriedade Valor
DataSource dsPlanContas
DetailField Cta_Master
ItemField Cta_Descricao
MasterField Cta_ID

   Pronto, já está OK e pronto para funcionar.

A explicação das propriedades é a seguinte:
DataSource: Obviamente é a conexão à base de dados;

DetailField: É o campo que contém o valor que aponta para a conta pai.

ItemField: é o texto que vai aparecer na TreeView.

MasterField: é a chave única da tabela.

       Quem reescreveu o componente deve ter problemas sérios para atribuir nomes às propriedades, custei para conseguir entender, mas aí está o mapa da mina.

Abaixo um exemplo do que está no banco de dados:

Cta_Id Cta_Master Cta_Descricao
1 0 DESPESAS
2 1 DESPESAS FIXAS
3 2 PESSOAL
4 11 ALUGUEL
5 11 CONDOMINIO
6 0 RECEITAS
7 6 RECEITAS DIRETAS
8 3 CLT
9 3 FREES
10 2 CUSTOS DIRETOS
11 10 IMÓVEIS
12 1 DESPESAS VARIAVEIS
13 12 COMBUSTIVEIS
14 12 COMISSÕES
15 12 MATERIAL DE EXPEDIENTE
16 12 MANUTENÇÕES
17 12 EXAMES MÉDICOS

15 comentários:

Anônimo disse...

oi Amilton,

não sei pq, mas não tou conseguindo por a funcionar.

tou usando o access com ADO e a tabela tá assim:

- ID: autonumber (primary)
- tipo: number ( liga ao pai na propria tabela)
- descricao: text (texto da descrição)
- outros

depois no delphi tenho:
- tADOconnection
- tADOtable (com os campos configurados)
- TDataSource (ligada a tabela)

no TJvDBTreeView liguei assim:

- datasource: dsMaster
- detailfield: tipo
- itemfield: descricao
- masterfield: id

os componentes referidos estão dodos enabled e/ou active e tenho inclusive uma dbgrid ligada e com os dados a mostrar.

criei um projecto novo para testar, portanto não é conflito com mais nada.

não fiz nem mais nem menos do que escrevi.

lembra alguma coisa que esteja a faltar?

não tá aparecendo nada no treeview. nem a root.

Anônimo disse...

esqueci do nome :)

Carlos


Cumprimentos

Anônimo disse...

já descobri.

tava faltando preencher o campo StartMasterValue que no meu caso ficou a 0.

fica a dica para outros que possam usar :)

Cumprimentos,

Carlos

AcidBytes disse...

Tu estás rápido hein? Não deu nem tempo para eu responder, quando eu fui ler o comentário tu já tinha achado a solução.
Valeu a dica.

Cosmo Verbal disse...

Orra Acid, isto ja tava aqui:

http://www.cosmoverbal.net/tag/dbtreeview

Desde maio/2007 :-)

Anônimo disse...

Todo DBTreeview que ví até agora só funciona com índice integer.
Será que alguem teve coragem de criar um que se basei somente no campo conta ?
Integers se alterados em algum nó pode arrebentar com a estrutura. Por outro lado se a base for a string da conta separada por pontos não tem erro.

Anônimo disse...

Gostaria de usar apenas 2 níveis, e uso duas imagens no image list.

No primeiro nivel ele aparece a imagen do nivel 1 (principal)
e a imagen 2 do sub nivel 1.

Exemplo.
Receitas (img 1)
|
|_Recebimentos (img 2)
Despesas(img 1)
|
|_Pagamentos(aqui nao aparece img2)

o que devo pra isso funcionar?

AcidBytes disse...

Não entendi muito bem, deveria funcionar na boa.
Tem como você me enviar o código para eu dar uma olhada e tentar te ajudar? Pode enviar para acidbytes@gmail.com.

Unknown disse...

Bza. conseguir usando o mysql.

Su_ disse...

Sei que o post é antigo, mas eu sou iniciante e o seu post realmente me salvou =) muito bom mesmo..

AcidBytes disse...

Obrigado Su_, é sempre bom saber que conseguimos ajudar alguém!

Jefferson disse...

muito bom seu exemplo, mas eu queria fazer da seguintes forma: eu queria colocar os primeiros dados em uma tabela diferente, os dados que ficam com 0 e o restante colocar em outra tabela é possível? e depois mostrar tudo no dbtreeview normalmente.

Anônimo disse...

Tutorial Instalar TJvDBTreeView

Fazer o download: http://sourceforge.net/projects/jvcl/files/JVCL%203/JVCL%203.48/JVCL348CompleteJCL26-Build5178.zip/download

Extrair o arquivo: JVCL348CompleteJCL26-Build5178

Instalar JCL: jcl/Install.bat

Abrir o arquivo JvRichEdit.pas e na linha onde se lê

dwCookie :=DWORD_PTR(AConverter);

substitua por este código:

dwCookie := {$IFDEF COMPILER19_UP}DWORD_PTR{$ELSE}Longint{$ENDIF}(AConverter);

Na linha onde se lê:

dwCookie := DWORD_PTR(Cookie);

substitua por este código:

dwCookie := {$IFDEF COMPILER19_UP}DWORD_PTR{$ELSE}Longint{$ENDIF}(Cookie);

Instalar JVCL: jvcl/Install.bat

Acessar a Paleta: Jv Data Controls

Usar o: TJvDBTreeView

Anônimo disse...

Muito bom este post... obrigado por compartilhar!

Unknown disse...

( COMPLEMENTANDO )
-- Montar a Tabela --
MasterField - Campo ID da Tabela (PK)
DetailField - Campo Integer
ItemField - Campo Varchar (Titulo do Nó)

-- Parametrizar no JvDBTreeView --
StartMasterValue = 0
Campos Master, Detail e Item obedecer acima

-- Detalhes dos Dados na Tabela --
MasterField:
ID Tabela (a PK mesmo).

DetailField:
Se Nó Pai, colocar 0;
Se Nó Filho, colocar o ID do seu Pai.

ItemField = Caption do Nó