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

(Resolvido) Estrutura em TreeView


Frega

Pergunta

bom dia, estou criando um mini-sistema com MRP gostaria de listar as estruturas do produto nivel a nivel em um DBGrid

por exemplo:

Cadeira amostra

---Estrutura da cadeira amostra

------Pés frontais

------Pés trazeiros

------Travessas

---Assento da cadeira amostra

------Chapa do assento

------Tecido

------Espuma

dentro da estrutura da cadeira teria cadastrado só: Estrutura da cadeira e assento da cadeira

dentro da estrutura da cadeira teria os pés travessas etc...

estive pensando em algo com Inner join ou algo do genero para fazer isso... mas eu não conseguiria dar o espasso para "distinguir" os niveis ficaria tudo "desordenado" asim:

Cadeira Amostra

Estrutura Cadeira Amostra

Pés Frontais

Pés Traseiros

Travessas

Assento da Cadeira Amostra

....

Editado por Frega
Link para o comentário
Compartilhar em outros sites

17 respostass a esta questão

Posts Recomendados

  • 0
bom dia, estou criando um mini-sistema com MRP gostaria de listar as estruturas do produto nivel a nivel em um DBGrid

por exemplo:

Cadeira amostra

---Estrutura da cadeira amostra

------Pés frontais

------Pés trazeiros

------Travessas

---Assento da cadeira amostra

------Chapa do assento

------Tecido

------Espuma

dentro da estrutura da cadeira teria cadastrado só: Estrutura da cadeira e assento da cadeira

dentro da estrutura da cadeira teria os pés travessas etc...

Frega, baseado no exemplo que você postou, não ficaria mais simples va utilizar um TreeView para fazer isto?

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
mas não sei como vou fazer por que a tabela tem que conter...

referencia, descricao, unidade de medida, quantidade etc....

Bom, neste caso, se não é apenas a listagem na forma como você postou antes, tem que visualizar o layout final esperado para uma melhor avaliação.

Com os componentes padrões não dá para fazer isto de forma direta. Vai precisar buscar os dados de tal forma que possam ser utilizados no desenho personalizado do componente (seja um DBGrid ou TreeView).

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
o jeito é fazer um simples DBGrid abrir somente a estrutura do produto e não a estrutura nivel a nivel

Frega, se você conseguir trazer um indicador de níveis, ou algo que os identifique o nível junto ao registro retornado pelo dataset, talvez possamos fazer um ajuste visual utilizando os eventos OnDrawColumnCell.

Veja o que consegue e post um exemplo do resultado da consulta com os campos em questão.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

então, eu não sei como fazer para abrir mais de um nivel... só consigo fazer o primeiro nivel aparecer... para os demais niveis acho que teria que ter mais query's.... (uma query para cada nivel) não?

qNivel1 ... where produto_pai ilike 'cadeira1'

qNivel2 ... where produto_pai ilike qNivel1filho.asstring

...

Link para o comentário
Compartilhar em outros sites

  • 0
então, eu não sei como fazer para abrir mais de um nivel... só consigo fazer o primeiro nivel aparecer... para os demais niveis acho que teria que ter mais query's.... (uma query para cada nivel) não?
Bom, até o momento, eu saberia menos ainda. :unsure:

Para tentar lhe ajudar, você deveria pelo menos postar as colunas da tabela(s)(e/ou relacionamentos) em questão.

Link para o comentário
Compartilhar em outros sites

  • 0

tabela produto

referencia varchar(8);

descricao varchar(50);

tabela estrutura

pai varchar(8);

filho varchar(8);

quantidade numeric(5);

existe foreign key onde estrutura.pai/filho = produto.referencia

não sei como fazer os dados aparecerem de forma "visual" e de facil entendimento... =/

talvez se fizesse algo no evento "onclick" do treeview, para pegar o registro selecionado na query, e fazer aparecer o resto dos dados (quantidade etc..) em alguns label's ao lado do treeview...

Editado por Frega
Link para o comentário
Compartilhar em outros sites

  • 0
não sei como fazer os dados aparecerem de forma "visual" e de facil entendimento... =/

talvez se fizesse algo no evento "onclick" do treeview, para pegar o registro selecionado na query, e fazer aparecer o resto dos dados (quantidade etc..) em alguns label's ao lado do treeview...

se não forem muitas colunas, e se for apenas para visualização, talvez você pudesse mostrar as informações em um TreeView mesmo.

Veja como poderia ser feito (é só uma idéia e que talvez você possa aproveitar:

treeviewhierarquicoph1.png

By micheus at 2008-09-17

Exemplo comentado: TreeView Colunado

Foram setadas as propriedades ReadOnly=True e ShowRoot=False; Para o header usei o componente THeaderControl (paleta Win32), configurado com as colunas da largura que são usadas no desenho do treeview.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

aee, obrigado mesmo pela ajuda, era isso mesmo que eu queria!!!! um treeview com colunas estou estudando o codigo ainda... mas queria fazer um edit com pesquisa por exemplo: se digitar no Editbox por "amostra" e der um pesquisar aparecer somente os filhos da cadeira amostra...

nesse caso aparece todos pais, se tivesse cadeira amostra2 iria aparecer ela tambem... se é que me entende....

não entendi o codigo SQL muito bem para ver onde colocar o ' where pai like '+QuotedStr(edit.text);

Link para o comentário
Compartilhar em outros sites

  • 0
(...) mas queria fazer um edit com pesquisa por exemplo: se digitar no Editbox por "amostra" e der um pesquisar aparecer somente os filhos da cadeira amostra...

nesse caso aparece todos pais, se tivesse cadeira amostra2 iria aparecer ela tambem... se é que me entende....

Entendo...

não entendi o codigo SQL muito bem para ver onde colocar o ' where pai like '+QuotedStr(edit.text);
Bom, eu apenas montei uma estrutura de tabelas e dados de acordo com o que você passou. Na prática, você pode ter alguma situação em que não foi prevista por mim.

Postando aqui o que pus no código:

select Referencia, Descricao

from Produto P

where not exists(select * from Estrutura E where E.Filho = P.Referencia)

order by Descricao

// esta consulta tem como objetivo buscar os nós raiz

// dada a falta de informação mais específica sobre quem compõe o

// 1º item da hierarquia, foi assumido que este produto será aquele

// que não é filho na tabela Estrutura.

E esta é uma suposição que pode não ser verdadeira - apenas você poderá saber se é válida em todos os momentos.

Em caso de não ser, fica a continuação do comentário:

// O uso de um campo, na tabela Estrutura, indicando o nível do item nela

// existente, ajudaria em muito neste processo

não entendi o codigo SQL muito bem para ver onde colocar o ' where pai like '+QuotedStr(edit.text);
na verdade você não está sabendo o que comparar. Observe pelo seu exemplo que você quer procurar pelo texto da descrição do produto e não do pai (que é um código, penso eu, e que corresponde a referência do produto)

Assim, se a idéia é pesquisar apenas nos nós raiz (os pais iniciais), a única alteração a ser feita e nesta SQL que busca os nós raiz e ele ficaria assim

select Referencia, Descricao

from Produto P

where not exists(select * from Estrutura E where E.Filho = P.Referencia)

and upcase(P.Descricao) like :Descricao

order by Descricao

no código:

...
  QryPai.SQL.Add('select Referencia, Descricao');
  QryPai.SQL.Add('from Produto P');
  QryPai.SQL.Add('where not exists(select * from Estrutura E where E.Filho = P.Referencia)');
  QryPai.SQL.Add('and upper(P.Descricao) like :Descricao');  // <<<<<<<< AQUI
  QryPai.SQL.Add('order by Descricao');
  try
    QryPai.ParamByName('Descricao').AsString := AnsiUpperCase(Edit1.Text);  // <<<<<<<< AQUI
  // se for componente da paleta ADO: QryPai.Parameters.ParamByName('Descricao').Value := AnsiUpperCase(Edit1.Text);
    QryPai.Open;
    while not QryPai.EOF do
  ...

observar que usamos a função UPPER no SQL e passamos o parâmetro já convertido em caixa alta de modo a garantir que não haja distinção entre maiúsculas e minúsculas.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

hmm agora até que entendi, eu não tenho muito conhecimento em SQL ai tava dificil de entender mas agora com as coisas explicadas e um google.com até que ficou bem claro =D

valeu pela ajuda Micheus... é uma foto da aparencia final (no link)

http://img372.imageshack.us/my.php?image=semttulogi6.jpg

a ultima duvida é se tem como fazer aparecer aqueles botoes do lado (no link)

http://img88.imageshack.us/my.php?image=comoxf6.jpg

se eu mudo o default draw para false os botoes somem mas não fica negrito e fica na aparencia normal... se eu boto true, aparece os botoes mas fica em negrito e com as outras tabelas junto |1|UN....

como posto %7Boption%7D no forum? :/

Editado por Frega
Link para o comentário
Compartilhar em outros sites

  • 0
a ultima duvida é se tem como fazer aparecer aqueles botoes do lado (no link)

http://img88.imageshack.us/my.php?image=comoxf6.jpg

se eu mudo o default draw para false os botoes somem mas não fica negrito e fica na aparencia normal... se eu boto true, aparece os botoes mas fica em negrito e com as outras tabelas junto |1|UN....

Frega, desculpe a demora em retornar, mas só hoje pude gastar um tempinho para verificar como resolver o problema.

A resposta é bem simples, mas se você me perguntar o porque dela, eu não saberei lhe explicar. :blush:

No procedimento do evento OnCustomDrawItem, você pode remover a linha:

DefaultDraw := False;

e acrescente esta linha antes do primeiro TextRect:

Sender.Canvas.Font.Color := clBlack;

Você poderá usar qualquer cor que quiser, exceto clWindowText - é a utilizada por padrão e que está "gerando" o negrito. Esta a a parte que você não deve me perguntar o porque. ;)

como posto %7Boption%7Dno forum? :/
se você utilizar os botoezinhos do form de edição fica bem fácil - ele só lhe pedirá a url - é o primeiro botão após a caixa de lista das "carinhas".

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
perfeito, agora acho que vai dar certo.... =D
Frega, desculpe ter esquecido da questão das barrinhas ("|") - me concentrei no negrito e esqueci delas.

Vamos resolver o problema de outra maneira...

A idéia agora é armazenar na propriedade Data do TreeNode, o campo de referência para buscarmos os dados na sua tabela quando formos desenhar as colunas. Caso este campo fosse um Inteiro, ficaria simples apenas fazermos um type-cast e jogarmos ele direto na propriedade mas, como se trata de um string, precisaremos alocar memória para isto e guardarmos nesta propriedade.

Esta abordagem, nos obriga a criar um procedimento para liberação da memória alocada para estas strings e, como no processo de população da árvore, usaremos um procedimento recursivo.

Fiz também um upgrade na questão visual, possibilitando que cada coluna possa ser desenhada com um alinhamento específico (catei a rotina de outro código que eu tinha). Veja como ficou o resultado:

treeviewhierarquicope7.png

By micheus at 2008-09-26

Novo link para download do código.

Não darei maiores detalhes aqui, porque o código está devidamente comentado e acredito ser suficiente. Qualquer dúvida extra, é só postar.

Abraços

Editado por Micheus
Link para o comentário
Compartilhar em outros sites

  • 0
Guest --thiago --

frega por favor se não for pedir muito poste seu trabalho pra download , eu estou desenvolvendo um treeview + ou - nas mesmas regras ke você. E pra mim seria muito util.

Grato.

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,1k
    • Posts
      651,8k
×
×
  • Criar Novo...