Plano de contas com nível através de MySQL

MySQL

18/12/2012

Bom dia. Preciso de um procedimento em MySQL que liste os meus planos de conta por níveis, como uma ol em html, por exemplo:

<ol>
<li>Mantenção</li>
<ol>
<li>Operacionais</li>
<li>Não Operacionais</li>
<li>Outras Entradas</li>
</ol>
<li>Saídas</li>
<ol>
<li>Operacionais</li>
<li>Não Operacionais</li>
<li>Imobilizado</li>
<li>Investimentos</li>
</ol>
</ol>

Atualmente minha tabela está de maneira resumida assim:

CREATE TABLE plano_de_contas(
  id BIGINT NOT NULL AUTO INCREMENT PRIMARY KEY,
  master_id BIGINT, //armazena o id do plano pai
  descricao VARCHAR(20)
);


Presumo que seja mais fácil organiza-la dessa maneira no próprio banco, pelo Delphi até dá pra fazer algo parecido com o JvDBTreeView, mas iremos portar a aplicação futuramente pra web, então ficaria bem mas flexível por SQL. Caso queiram que eu modifique a estrutura da tabela para ficar mais apropriada tem como fazer.

Abraços
Júnior Garcia

Júnior Garcia

Curtidas 0

Respostas

William

William

18/12/2012

Colega acredito que desta maneira não vai ter jeito, pois os registros são exibidos de forma diferente, mas usando instruções SQL da para fazer algo assim:

Manutenção | Operacionais
Manutenção | Não Operacionais
Manutenção | Outras Entradas

Saídas | Operacionais
Saídas | Não Operacionais
Saídas | Imobilizado
Saídas | Investimentos
GOSTEI 0
Júnior Garcia

Júnior Garcia

18/12/2012

bom, é uma saída amigo, e como poderia fazer algo assim?

abraço.
GOSTEI 0
William

William

18/12/2012

Por gentileza, poste quais campos existem nas suas tabelas e como está o relacionamento entre elas.
GOSTEI 0
Júnior Garcia

Júnior Garcia

18/12/2012

tenho a tabela plano_de_contas. Campos: id (chave primaria), descricao varchar, master_id (armazena o id do plano pai, faz referencia ao campo id da própria tabela)
GOSTEI 0
William

William

18/12/2012

Bom Júnior de acordo com sua explicação montei o seguinte cenário:

- Tabela plano_pai
ID | DESCRICAO
1 | MANUTENÇÃO
2 | SAÍDAS


- Tabela plano_contas
ID | DESCRICAO | MASTER_ID
1 | OPERACIONAIS | 1
2 | NÃO OPERACIONAIS | 1
3 | OUTRAS ENTRADAS | 1
4 | OPERACIONAIS | 2
5 | NÃO OPERACIONAIS | 2
6 | IMOBILIZADO | 2
7 | INVESTIMENTOS | 2


Montei a seguinte instrução SQL:
SELECT p.descricao AS Plano_Pai, c.descricao as Plano_Contas
FROM plano_contas c INNER JOIN plano_pai p ON c.master_id = p.id


Resultado:
PLANO_PAI | PLANO_CONTAS
Manutenção | Operacionais
Manutenção | Não Operacionais
Manutenção | Outras Entradas
Saídas | Operacionais
Saídas | Não Operacionais
Saídas | Imobilizado
Saídas | Investimentos


Veja se consegui entender sua dúvida e resolve-la.
GOSTEI 0
Júnior Garcia

Júnior Garcia

18/12/2012

fala cara! Até deu certo, mas ele está repetindo as categorias na categoria master, assim:

Manutenção | Manutenção //o master_id aqui é NULL no banco, mas repete como sendo o master o mesmo da categoria atual
Manutenção | Outras Entradas
Manutenção | Operacionais

Saídas | Saídas //repete denovo
Saídas | Imobilizado
...


Como faz pra ele parar de dizer que o master é o mesmo que o atual qdo o campo é NULL?
GOSTEI 0
William

William

18/12/2012

Colega, acho que um LEFT na tabela plano_contas deve ajudar:

SELECT p.descricao AS Plano_Pai, c.descricao as Plano_Contas
FROM plano_contas c LEFT JOIN plano_pai p ON c.master_id = p.id 
GOSTEI 0
Júnior Garcia

Júnior Garcia

18/12/2012

tentei e ainda assim não dá certo :/

Meu SQL está assim:
SELECT
  p.descricao AS plano_master,
  p.id AS id_master,
  c.descricao AS plano_conta,
  c.id AS id_plano
FROM
  plano_de_contas c
INNER JOIN plano_de_contas p on (c.master_id = p.id)
ORDER BY
  c.master_id


O resultado é esse:
[code]
plano_master id_master plano_conta id_plano
Manutenção 1 Manutenção 1
Manutenção 1 Outras Entradas 5
Manutenção 1 Não Operacionais 4
Manutenção 1 Operacionais 3
Saídas 2 Saídas 2
Saídas 2 Não Operacionais 7
Saídas 2 Imobilizado 8
Saídas 2 Investimentos 9
Saídas 2 Não Operacionais 10
Saídas 2 Operacionais 6
GOSTEI 0
William

William

18/12/2012

Na tabela Plano_Contas existe o cadastro de "Manutenção" e "Saída"?

Achei que esses planos só estivessem cadastrados na tabela Plano_Pai!
GOSTEI 0
Júnior Garcia

Júnior Garcia

18/12/2012

na verdade está na mesma tabela mesmo, hehe
GOSTEI 0
POSTAR