Cadastro de grupos e subgrupos.

Delphi

01/08/2013

Estou tendo dificuldades para criar um cadastro de grupos e subgrupos, eu quero criar um grupo do tipo BEBIDAS e salvar depois criar um subgrupo dentro do BEBIDAS que vai ser o REFRIGERANTES.

Como ficaria a tabela?

O melhor para isso seria criar 2 tabelas? Criar 1 tabela?

Gostaria da opinião de vocês.
Nícolas Braz

Nícolas Braz

Curtidas 0

Respostas

Francisco Macário

Francisco Macário

01/08/2013

Olá.

De forma básica:

Tabela Grupo, campos ID, CODIGO, DESCRICAO.

Tabela SubGrupo, campos ID, FK_ID_GRUPO, CODIGO, DESCRICAO.

Seria isso.
GOSTEI 0
Nícolas Braz

Nícolas Braz

01/08/2013

É que eu queria que quando o usuário fosse cadastrar um produto e ele fosse selecionar o grupo ficasse assim.

http://imageshack.us/photo/my-images/441/nkvo.png/
GOSTEI 0
Nícolas Braz

Nícolas Braz

01/08/2013

É que eu queria que quando o usuário fosse cadastrar um produto e ele fosse selecionar o grupo ficasse assim.

http://imageshack.us/photo/my-images/441/nkvo.png/
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

01/08/2013

A estrutura que o amigo sugeriu é adequada à situação.
GOSTEI 0
Rodolpho Silva

Rodolpho Silva

01/08/2013

Bem, eu faria da seguinte maneira...

Criaria apenas uma tabela, com a seguinte estrutura:
Tabela GRUPOS
  IDGRUPO Inteiro,
  CODHIERARQUICO Texto,
  DESCRICAO Texto

Onde controlaria os níveis dos sub-grupos através do código hierárquico. Essa estrutura é bastante usada em sistemas de contabilidade, no cadastramento das contas-contábeis. Dessa forma, você praticamente não terá limite nas inserções de sub-grupos, ex:
COD Descrição
01 Bebidas
0101 Refrigerantes
010101 Coca-Cola
010102 Pepsi
010103 Fanta
0102 Sucos
010201 Del Vale
010202 XPTO
.....


Espero ter ajudado.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

01/08/2013

O problema que eu vejo nesse formato, apesar de ser interessante, é que dificulta o relacionamento entre grupo e seus subgrupos.
GOSTEI 0
Rodolpho Silva

Rodolpho Silva

01/08/2013

O problema que eu vejo nesse formato, apesar de ser interessante, é que dificulta o relacionamento entre grupo e seus subgrupos.

Mas dificulta em qual sentido?
GOSTEI 0
Francisco Macário

Francisco Macário

01/08/2013

O problema que eu vejo nesse formato, apesar de ser interessante, é que dificulta o relacionamento entre grupo e seus subgrupos.

Mas dificulta em qual sentido?


Nos mostre como consultaria apenas o sub-grupo SUCOS.

GOSTEI 0
Rodolpho Silva

Rodolpho Silva

01/08/2013

Nos mostre como consultaria apenas o sub-grupo SUCOS.


select idgrupo, codhierarquico, descricao from grupos where codhierarquico like '01020%';
GOSTEI 0
Nícolas Braz

Nícolas Braz

01/08/2013

Criando duas tabelas como Grupos e subgrupos eu consigo deixar 3 níveis de grupos?

01 bebidas
01.01 refrigerantes
01.01.01 coca-cola
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

01/08/2013

O problema que eu vejo nesse formato, apesar de ser interessante, é que dificulta o relacionamento entre grupo e seus subgrupos.

Mas dificulta em qual sentido?

Então, já foi exemplificado pelo amigo acima, certo?
Eu acho que esse código de hierarquia caberia como um campo "extra", apenas para organização.
GOSTEI 0
Rodolpho Silva

Rodolpho Silva

01/08/2013

Eu acho que esse código de hierarquia caberia como um campo "extra", apenas para organização.

Bem, eu não consideraria-o como "extra" mas sim "fundamental" para descobrir quais são as coordenadas X e Y da minha estrutura.

É apenas minha modesta opinião....
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

01/08/2013

Sim, sim, com "extra" eu não quis dizer que ele não é importante, eu quis dizer apenas que não acho que deva ser ele a única forma de identificar a hierarquia do grupo.
GOSTEI 0
Francisco Macário

Francisco Macário

01/08/2013

Olá Rodolpho123.

Este seu exemplo se encaixa para controles contabeis como vc informou, mas acho muito para um cadastro de grupos e sub.

Temos que notar que há diferença entre como armazenamos a estrutura e como ela é exibida.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

01/08/2013

Talvez uma outra forma seja ter uma única tabela de grupos, onde cada grupo de um um identificador único e um campo "pai" (faltou um nome melhor). Se este campo for nulo, indica que é um grupo do mais alto nível da hierarquia, se tiver o código "1", indica que é um subgrupo do grupo 1 e assim por diante.

Exemplo:
Grupo: Roupas Código: 1 Grupo_Pai: 0 (ou null)
Grupo: Camisas Código: 2 Grupo_Pai: 1 (subgrupo do grupo Roupas)
Grupo: Regatas Código: 3 Grupo_Pai: 2 (subgrupo do subgrupo Camisas)
GOSTEI 0
Rodolpho Silva

Rodolpho Silva

01/08/2013

Talvez uma outra forma seja ter uma única tabela de grupos, onde cada grupo de um um identificador único e um campo "pai" (faltou um nome melhor). Se este campo for nulo, indica que é um grupo do mais alto nível da hierarquia, se tiver o código "1", indica que é um subgrupo do grupo 1 e assim por diante.

Exemplo:
Grupo: Roupas Código: 1 Grupo_Pai: 0 (ou null)
Grupo: Camisas Código: 2 Grupo_Pai: 1 (subgrupo do grupo Roupas)
Grupo: Regatas Código: 3 Grupo_Pai: 2 (subgrupo do subgrupo Camisas)

Sim, isso também é bacana (self join). Usa-se muito essa técnica também....
GOSTEI 0
Nícolas Braz

Nícolas Braz

01/08/2013

Talvez uma outra forma seja ter uma única tabela de grupos, onde cada grupo de um um identificador único e um campo "pai" (faltou um nome melhor). Se este campo for nulo, indica que é um grupo do mais alto nível da hierarquia, se tiver o código "1", indica que é um subgrupo do grupo 1 e assim por diante.

Exemplo:
Grupo: Roupas Código: 1 Grupo_Pai: 0 (ou null)
Grupo: Camisas Código: 2 Grupo_Pai: 1 (subgrupo do grupo Roupas)
Grupo: Regatas Código: 3 Grupo_Pai: 2 (subgrupo do subgrupo Camisas)


A tabela ficaria assim.

Então seriam os campos:

Código, nome do grupo, codigo do subgrupo e nome do subgrupo?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

01/08/2013

Não, não. Seria só Código, Descrição e Código do "Pai".
GOSTEI 0
Nícolas Braz

Nícolas Braz

01/08/2013

Código é auto incremento correto? Nome e o código pai?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

01/08/2013

Exato.
GOSTEI 0
Nícolas Braz

Nícolas Braz

01/08/2013

Joel,

Com essa estrutura eu consigo visualizar assim no dbgrid?

http://imageshack.us/f/4/7q4q.png/

Não precisa aparecer o código.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

01/08/2013

Cara, pra trazer dessa forma em um select talvez dê um pouco de trabalho, mas creio que fazendo uns loops em uma lista de objetos você consiga.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

01/08/2013

Ah,no caso aí vai precisar de um método recursivo, pelo menos partir do segundo nível de grupos.
GOSTEI 0
Nícolas Braz

Nícolas Braz

01/08/2013

Finalmente voltei a mexer com os grupos.

Ficou assim a minha tabela.

codigo, descricao, codigo_superior, comissao e adicionais_codigo

1 | Carnes | null | null | null
2 | picanha | 1 | 10% | 2 (COM ALHO)
3 | bebidas | null | null |null
4 | Sucos | 3 | 10%| 3 (COM GELO)
GOSTEI 0
Nícolas Braz

Nícolas Braz

01/08/2013

Pessoal depois de muito pensar eu finalizei a tabela e ficou assim.

http://imageshack.us/photo/my-images/716/725h.png/

Precisei do campo char mesmo para a hierarquia porque eu quero que ele fique seguindo o formato de 2 casas sempre e comece como 01.

Obrigado a todos.
GOSTEI 0
Nícolas Braz

Nícolas Braz

01/08/2013

Eu estou usando o modelo do [b]Rodolfo123[/b] e me surgiu a seguinte dúvida como eu vou fazer o auto incremento de um campo char? Eu teria que converter os caracteres que eu quero para integer incrementar e depois voltar eles para char?
GOSTEI 0
Nícolas Braz

Nícolas Braz

01/08/2013

Consegui fazer ele auto incrementar o meu Grupo que no caso são os valores: 01,02, ... 10,11,12,13.

O problema agora está sendo para incrementar o subgrupo, porque eu tenho que clicar em um grupo para poder incrementar o subgrupo adicionando o .01 só que caso já exista o .01 ele precisa incrementar para .02 e assim sucessivamente.

Alguém poderia me dar uma luz?
GOSTEI 0
Nícolas Braz

Nícolas Braz

01/08/2013

Voltei a mexer com essa parte e ainda estou com essa dúvida de como auto incrementar meus subgrupos.
GOSTEI 0
Paulo Andrade

Paulo Andrade

01/08/2013

Tenho um sistema de vendas e uso o padrão para centro de resultados e estou pretendendo moldar para trabalhar com grupos e subgrupos como você pretende fazer.

Para criar os grupos eu faço primeiro uma verificação (usando o Treeview) para verificar se é primeira conta e se é o primeiro nível:
  if (cdsCentroResultado.IsEmpty) OR (Treeview1.Items.Count = 0) then
    novo_nivel := 0
  else
    novo_nivel := ContaPai;
[\code]
se for uma conta filho, pego o código da conta pai pelo função:

[code]
function TfCadCentroResultado.ContaPai: integer;
var
  GrupoPai,ContaCorrelata: String;
begin
  result := 0;
  if not(TreeView1.Selected = nil) then
  begin
    GrupoPai := TreeView1.Selected.Text;
    ContaCorrelata := Funcoes.RetornaTexto(GrupoPai,'|');
    result := StrToInt(ContaCorrelata);
  end;
end;
[\code]

Feito as validações, crio a nova conta verificando se é conta pai, filho e qual dígito está fazendo incremento:

[code]
function TfCadCentroResultado.CriaConta(ContaPai,
  ContaWoner: String): String;
var
  tmpConta: TADODataSet;
  vPos,qNumero_Conta,vPai: Integer;
  dv_subconta,DV,DV_NovaConta,
  GrupoPai, ContaCorrelata,conta: string;
begin
  result := '1.';

  tmpConta := TADODataSet.Create(nil);
  try
    tmpConta.Connection := cdsCentroResultado.Connection;
    tmpConta.CommandText := 'SELECT Max(CentroResultado.Conta) AS SubConta'
                           +' FROM CentroResultado'
                           +' GROUP BY CentroResultado.IdCentroResultado_Woner'
                           +' HAVING CentroResultado.IdCentroResultado_Woner Like :pConta;';
    tmpConta.Parameters.ParamByName('pConta').Value := ContaWoner;
    try
      tmpConta.Open;
    except
      On E: Exception do
        raise E.Create(PChar('Erro ao tentar criar nova conta!'+#13+#10+'ERRO: '+E.Message));
    end;
    DV_SubConta := tmpConta.FieldByName('SubConta').AsString;
    vPos := Pos('.', Funcoes.ReversoTexto(DV_SubConta));
    if vPos > 0 then
    begin
      DV := RightStr(DV_SubConta, vPos);
      qNumero_Conta := vPos-1;
    end
    else
    begin
      DV := DV_SubConta;
      qNumero_Conta := 0;
    end;
    DV := StringReplace(DV, '.', '',[rfReplaceAll]);
    if Trim(DV) = EmptyStr then
      DV := '0';
    vPos := StrToInt(DV);
    Inc(vPos);
    vPai := (Pos('.',ContaPai)-1);
    if vPai = 1 then
      result := ContaPai+ZerosEsquerda(vPos,qNumero_Conta-1)
    else
      result := ContaPai+'.'+ZerosEsquerda(vPos,qNumero_Conta-1);
  finally
    tmpconta.Close;
    tmpConta.Free;
  end;
end;


Espero ter ajudado.
GOSTEI 0
POSTAR