Cadastro de grupos e subgrupos.
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.
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
Curtidas 0
Respostas
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.
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
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/
http://imageshack.us/photo/my-images/441/nkvo.png/
GOSTEI 0
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/
http://imageshack.us/photo/my-images/441/nkvo.png/
GOSTEI 0
Joel Rodrigues
01/08/2013
A estrutura que o amigo sugeriu é adequada à situação.
GOSTEI 0
Rodolpho Silva
01/08/2013
Bem, eu faria da seguinte maneira...
Criaria apenas uma tabela, com a seguinte estrutura:
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:
Espero ter ajudado.
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
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
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
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
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
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
01 bebidas
01.01 refrigerantes
01.01.01 coca-cola
GOSTEI 0
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
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
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
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.
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
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)
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
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)
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
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)
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
01/08/2013
Não, não. Seria só Código, Descrição e Código do "Pai".
GOSTEI 0
Nícolas Braz
01/08/2013
Código é auto incremento correto? Nome e o código pai?
GOSTEI 0
Joel Rodrigues
01/08/2013
Exato.
GOSTEI 0
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.
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
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
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
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)
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
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.
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
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
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?
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
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
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:
Espero ter ajudado.
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