MULTI EMPRESA - DUVIDAS
Galera, estou iniciando um sistema multi empresa.
Mas de cara já estou com várias dúvidas, se alguem que ja trabalhou com isto puder ajudar.
Como funciona a numeração de pedidos por exemplo ? Chave primária seria uma chave dupla de ID + Empresa?
Os cadastros básicos também precisam ser separados ?
Imagino que apenas o estoque precise ter uma tabela separada para cada unidade, correto ?
Mas de cara já estou com várias dúvidas, se alguem que ja trabalhou com isto puder ajudar.
Como funciona a numeração de pedidos por exemplo ? Chave primária seria uma chave dupla de ID + Empresa?
Os cadastros básicos também precisam ser separados ?
Imagino que apenas o estoque precise ter uma tabela separada para cada unidade, correto ?
bom se posso te dar uma dica;
prepare-se para projetar bem sua base de dados;
dimensione para o uso de um campo exclusivo para este dado, de preferencia numerico, para facilitar os indices de busca;
vc vai usar para varias tabelas;
prepare-se para projetar bem sua base de dados;
dimensione para o uso de um campo exclusivo para este dado, de preferencia numerico, para facilitar os indices de busca;
vc vai usar para varias tabelas;
Saco frito, sofri também para desenvolver o meu sistema e moldá-lo para multi-empresa.
a melhor forma que encontrei foi atribuir siglas aos codigos dos pedidos, tipo PR1234 para Perfumaria Regina e PV1234 para Perfumaria Vania.
No meu caso o cliente queria o gerenciamento financeiro, estoque , cadastros tudo unificadado, ou seja o produto 1234 tinha que apresentar para ele o estoque em qualquer uma das empresas que ele estivesse.
Cometi diversos erros durante o desenvolvimento e que foram sanados apenas no dia a dia de uso do sistema.
A tempo, como se tratava de um mesmo ramo de atividade, eu achei interessante que ao se fazer um cadastro de produto por exemplo, o mesmo era disponibilizado para todas as empresas, assim como cadastros de básicos....
No meu caso eu utilizei dois bancos, sendo um denominado como BANCO MASTER, este é quem iria receber e distribuir todos os cadastros.
Neste banco abusei de Stored Procedure para automatizar este processo.
Minha dica : ABUSE de Stored Procedure maximize o uso do banco.
a melhor forma que encontrei foi atribuir siglas aos codigos dos pedidos, tipo PR1234 para Perfumaria Regina e PV1234 para Perfumaria Vania.
No meu caso o cliente queria o gerenciamento financeiro, estoque , cadastros tudo unificadado, ou seja o produto 1234 tinha que apresentar para ele o estoque em qualquer uma das empresas que ele estivesse.
Cometi diversos erros durante o desenvolvimento e que foram sanados apenas no dia a dia de uso do sistema.
A tempo, como se tratava de um mesmo ramo de atividade, eu achei interessante que ao se fazer um cadastro de produto por exemplo, o mesmo era disponibilizado para todas as empresas, assim como cadastros de básicos....
No meu caso eu utilizei dois bancos, sendo um denominado como BANCO MASTER, este é quem iria receber e distribuir todos os cadastros.
Neste banco abusei de Stored Procedure para automatizar este processo.
Minha dica : ABUSE de Stored Procedure maximize o uso do banco.
E ai pessoal. obrigado pelas respostas.
FOXMAN, nao entendi o que a Stored Procedure pode ser útil ?
Bem, no meu caso pensei nos cadastros básicos serem visiveis mesmo a todos as empresas. E as tabelas de estoque, vendas, notas fiscais e pedidos serem separadas.
Gostei da sua idéia da sigla, o problema é que isso me tiraria o auto increment da tabela o que daria um pouco mais de trabalho na hora de montar as rotinas. Mas isto já é assunto para outro tópico.
FOXMAN, nao entendi o que a Stored Procedure pode ser útil ?
Bem, no meu caso pensei nos cadastros básicos serem visiveis mesmo a todos as empresas. E as tabelas de estoque, vendas, notas fiscais e pedidos serem separadas.
Gostei da sua idéia da sigla, o problema é que isso me tiraria o auto increment da tabela o que daria um pouco mais de trabalho na hora de montar as rotinas. Mas isto já é assunto para outro tópico.
Bom dia.
Também estou fazendo um sistema completo assim, e ainda em 3 idiomas para ajudar, mas.... isso é outro assunto kkkk
Sobre multi empresa, é sempre bom levar em conta que pode haver empresa com particularidades diferentes e que não poderão ser compartilhadas entre todas, mesmo sendo do grupo. Tenho várias tabelas assim, pois as empresas tem ramos diferentes, com isso alguns cadastros são distintos.
Exemplo de cadastros assim: Departamentos, Colaboradores, e até produtos e Serviços
Assim eu tenho o cadastro que usa a ID empresa + ID departamento + ID registro para separar tudo, ficando fácil identificar.
Como tem pedidos, você provavelmente irá querer que cada empresa inicie por 1 de modo sequencial. Porém ID não pode ser assim. Neste caso você terá de ter outro campo para essa sequência e não o ID do pedido. Então ao setar uma empresa (neste caso não separaria por departamento), usaria o ID do pedido e pegaria o maior valor já cadastrado na hora de gravar e acrescentaria 1, isso com store procedure facilitaria.
Meu problema com automatização do banco é que não tenho acesso ao mesmo após licenciar o sistema, pois não vou nos clientes. Então ficar acessando os bancos posteriormente é complicado, muitos clientes tem restrições a isso, mas se for um cliente único e tem acesso ao servidor, fica mais fácil.
Eu usaria Chave dupla Empresa + Pedido e um campo auxiliar para a numeração sequencial, assim cada empresa tem a sua.
Certamente você irá passar por vários outros problemas, por isso inicie com uma análise bem cuidadosa do banco, isso é fundamental. Avalie cada módulo do sistema para criar o banco, antes de começar a programar. Tenha o máximo de certeza de todas as nuances desse módulo para não ter de refazer tudo no final.
Também estou fazendo um sistema completo assim, e ainda em 3 idiomas para ajudar, mas.... isso é outro assunto kkkk
Sobre multi empresa, é sempre bom levar em conta que pode haver empresa com particularidades diferentes e que não poderão ser compartilhadas entre todas, mesmo sendo do grupo. Tenho várias tabelas assim, pois as empresas tem ramos diferentes, com isso alguns cadastros são distintos.
Exemplo de cadastros assim: Departamentos, Colaboradores, e até produtos e Serviços
Assim eu tenho o cadastro que usa a ID empresa + ID departamento + ID registro para separar tudo, ficando fácil identificar.
Como tem pedidos, você provavelmente irá querer que cada empresa inicie por 1 de modo sequencial. Porém ID não pode ser assim. Neste caso você terá de ter outro campo para essa sequência e não o ID do pedido. Então ao setar uma empresa (neste caso não separaria por departamento), usaria o ID do pedido e pegaria o maior valor já cadastrado na hora de gravar e acrescentaria 1, isso com store procedure facilitaria.
Meu problema com automatização do banco é que não tenho acesso ao mesmo após licenciar o sistema, pois não vou nos clientes. Então ficar acessando os bancos posteriormente é complicado, muitos clientes tem restrições a isso, mas se for um cliente único e tem acesso ao servidor, fica mais fácil.
Eu usaria Chave dupla Empresa + Pedido e um campo auxiliar para a numeração sequencial, assim cada empresa tem a sua.
Certamente você irá passar por vários outros problemas, por isso inicie com uma análise bem cuidadosa do banco, isso é fundamental. Avalie cada módulo do sistema para criar o banco, antes de começar a programar. Tenha o máximo de certeza de todas as nuances desse módulo para não ter de refazer tudo no final.
Por que não fazer em bancos separados. Trabalhei com um sistema assim, onde existe duas empresas no mesmo espaço fÃsico. Os funcionários usavam dois sistemas. Nos relatórios para o dono das empresas, haviam relatórios especiais de integração. Pode ser uma boa no seu caso.
bah llaia esta forma pode trazer algumas vantagens para separar seus produtos, mas é uma forma bem mais ou menos para trabalhar;
com relação ao cadastro de produtos, estoques estas coisas, aconselho tabela especifica para o controle de saldo em cada empresa;
e se não sabe oq é store procedure, vais estuda urgente manual de banco de dados que vc escolheu;
esta ferramenta vai fazer muita diferença;
com relação ao cadastro de produtos, estoques estas coisas, aconselho tabela especifica para o controle de saldo em cada empresa;
e se não sabe oq é store procedure, vais estuda urgente manual de banco de dados que vc escolheu;
esta ferramenta vai fazer muita diferença;
LAIA, tenho outro cliente que por enquanto esta trabalhando com 3 banco de dados diferentes para as 3 filiais pois ele nao quis investir para deixar multi empresa o que ja havia sido começado. Porem no futuro precisarei fazer relatorios para o dono, e o que estou pensando é sincronizar de tempos em tempos em uma base remota tudo isso apenas para exibição de relatórios tendo com base um campo em cada tabela para dizer de qual bd veio a informação.
Pessoal, realmente antes de iniciar qualquer coisa já estou pensando em como funcionaria cada módulo para mais de uma empresa e estou lendo muito outros tópicos que encontro sobre o assunto.
Muito bom trocar experiencias com quem ja passou pelo mesmo caminho.
Com relação a esta chave IDEmpresa + Pedido parece ideal, porém tenho alguns receios quanto a duplicidade da mesma. Então estou pensando em travar o login de usuário apenas em um terminal então para gerar o ID farei a pesquisa de MAX ID da empresa + 1 no ultimo inserido pelo usuário, para nao correr risco de dar esta numeracao em outro registro inserido em outro terminal.
LUIS Herrera, no meu caso cada empresa inicialmente não terá particularidades, trabalharão da mesma forma, caso tenha alguma particularidade fazemos alterações a parte.
Imagino também que a parte de restrição de usuários tem que ser separada por empresa ou um geral para todas empresas ?
Pessoal, realmente antes de iniciar qualquer coisa já estou pensando em como funcionaria cada módulo para mais de uma empresa e estou lendo muito outros tópicos que encontro sobre o assunto.
Muito bom trocar experiencias com quem ja passou pelo mesmo caminho.
Com relação a esta chave IDEmpresa + Pedido parece ideal, porém tenho alguns receios quanto a duplicidade da mesma. Então estou pensando em travar o login de usuário apenas em um terminal então para gerar o ID farei a pesquisa de MAX ID da empresa + 1 no ultimo inserido pelo usuário, para nao correr risco de dar esta numeracao em outro registro inserido em outro terminal.
LUIS Herrera, no meu caso cada empresa inicialmente não terá particularidades, trabalharão da mesma forma, caso tenha alguma particularidade fazemos alterações a parte.
Imagino também que a parte de restrição de usuários tem que ser separada por empresa ou um geral para todas empresas ?
Fiz tudo em um banco só, graças a DEUS esta funcionando perfeitamente a 5 meses nesse cliente, onde administro 4 empresas, só é separado por tabelas, dependendo a senha que vc acessa o sistema ele identifica com qual vc esta trabalhando.
Li todas as respostas e todas fazem muito sentido.
Primeiramente deve se analizar se as empresas são do mesmo seguimento, ou seja, MATRIZ e FILIAL.
Caso positivo parte da estrutura do sistema/sgbd pode ser a mesma sendo que fica a cargo da MATRIZ todo o gerenciamento de cadastros(essa regra varia de empresa para empresa bem como de programador para programador)
Primeiramente vou explicar ao SACOFRITO a vantagem ENORME de se tratar fluxo de dados dentro do banco de dados(com SPs/Triggers).
1 - Todo o Processo quando executado no servidor é AMPLAMENTE mais rápido.
2 - Algumas instruções SQL(se possÃvel todas) devem ser executadas diretamente no servidor.
3 - Stored Procedure agiliza a execução das instruções, bem como reduz código facilitando na manutenção do sistema entre outras vantagens.
4 - Se você tiver uma Store Procedure e/ou Trigger que por exemplo duplique um cadastros em outros bancos, já te facilita E MUITO.
Preciso ressaltar que alguns bancos permitem a utilização de Trigger(esqueci de mencionar), e estes métodos/funções/gatilhos irão contribuir ainda mais para o desenvolvimento do sistema multi empresa.
No caso em questão (multi-empresa) acredito que a estrutura do banco de dados deve ser muito bem elaborada e estruturada....
Hoje por exemplo tive um pequeno problema.
Uma das empresas utiliza controle de lote-validade, em um pedido foi informado o mesmo lote de um produto duas vezes. Exemplo : PRODUTO 1 LOTE 1234 QTDE 120, LOTE 1234 QTDE 20.
O sistema categoricamente informou na NFe que o produto 1234 tinha 2 lotes. Se partir do ponto de vista NUMERO DO LOTE, o sistema agiu erradamente, se partir do ponto de vista DATA DE VALIDADE tem que saber se os dois lançamentos tinham datas de validade diferente. No caso em questão ambos os lotes erão iguais e deveria ser lançado apenas um lote totalizando a quantidade.
Neste caso bastou eu ir na SP(Stored Procedure) e alterar a instrução que retorna os lotes incluindo um GROUP BY cmpLote para corrigir o problema....Veja como foi fácil, nem precisei alterar o código do sistema.
Esta é apenas UM EXEMPLO de como uma SP/TRIGGER pode ser ÚTIL.
Primeiramente deve se analizar se as empresas são do mesmo seguimento, ou seja, MATRIZ e FILIAL.
Caso positivo parte da estrutura do sistema/sgbd pode ser a mesma sendo que fica a cargo da MATRIZ todo o gerenciamento de cadastros(essa regra varia de empresa para empresa bem como de programador para programador)
Primeiramente vou explicar ao SACOFRITO a vantagem ENORME de se tratar fluxo de dados dentro do banco de dados(com SPs/Triggers).
1 - Todo o Processo quando executado no servidor é AMPLAMENTE mais rápido.
2 - Algumas instruções SQL(se possÃvel todas) devem ser executadas diretamente no servidor.
3 - Stored Procedure agiliza a execução das instruções, bem como reduz código facilitando na manutenção do sistema entre outras vantagens.
4 - Se você tiver uma Store Procedure e/ou Trigger que por exemplo duplique um cadastros em outros bancos, já te facilita E MUITO.
Preciso ressaltar que alguns bancos permitem a utilização de Trigger(esqueci de mencionar), e estes métodos/funções/gatilhos irão contribuir ainda mais para o desenvolvimento do sistema multi empresa.
No caso em questão (multi-empresa) acredito que a estrutura do banco de dados deve ser muito bem elaborada e estruturada....
Hoje por exemplo tive um pequeno problema.
Uma das empresas utiliza controle de lote-validade, em um pedido foi informado o mesmo lote de um produto duas vezes. Exemplo : PRODUTO 1 LOTE 1234 QTDE 120, LOTE 1234 QTDE 20.
O sistema categoricamente informou na NFe que o produto 1234 tinha 2 lotes. Se partir do ponto de vista NUMERO DO LOTE, o sistema agiu erradamente, se partir do ponto de vista DATA DE VALIDADE tem que saber se os dois lançamentos tinham datas de validade diferente. No caso em questão ambos os lotes erão iguais e deveria ser lançado apenas um lote totalizando a quantidade.
Neste caso bastou eu ir na SP(Stored Procedure) e alterar a instrução que retorna os lotes incluindo um GROUP BY cmpLote para corrigir o problema....Veja como foi fácil, nem precisei alterar o código do sistema.
Esta é apenas UM EXEMPLO de como uma SP/TRIGGER pode ser ÚTIL.
eu coloco um campo em todas as tabelas empresa_id, sendo que futuramente posso fazer o que quiser.
Faça seu login para responder