Multi-empresa...duvidas

Firebird

29/11/2004

Fala pessoarr!!...galera...estou com algumas duvidas sobre sistema multi-empresa, por favor, se alguem puder me ajudar ficarei muito grato. Tipo, estou utilizando Firebird Super Server como Banco, e minhas duvidas sao:

1º - Qual a melhor solucao para sistemas multi-empresas, deixar pronto vários gdb nomeando-os emp_001.gdb..emp_002.gdb e assim por diante?

2º - Deixar um campo por exemplo...(Cod_Emp)...em cada tabela mas usar somente um gdb...assim todas as informacoes de todas as empresas serao gravadas em uma so tabela...mas nao vai ficar muito pesado?...e alem de tudo, os valores correntes dos campos ´codigo´ nao estarao corretos para cada empresa, pois uma tabela Funcionario por exemplo...comeca com um valor corrente do 1, 2, 3...para a empresa 001, e na empresa 002 ja comecara no 4...:/...?

3º - Se eu criar e deixar pronto varios gdb...ou seja...um para cada empresa...como eu faco para pegar informacoes de uma outra empresa quando conectado a um gdb de uma outra empresa, tem algum select no Firebird que une um gdb a outro gdb?

4º - E quando eu quiser copiar os valores de uma tabela e passar para outra...por exemplo: uma tabela do plano de contas da contabilidade, quero usar o mesmo plano para a empresa tal...tem como fazer isso?


Bom, sao basicamente estas as minhas duvidas...se alguem puder me ajudar..ficarei muito agradecido...


Até mais pessoal...valew!!!


Tchelllo

Tchelllo

Curtidas 0

Respostas

Fsflorencio

Fsflorencio

29/11/2004

Se o seu propósito é fazer um relatório consolidando as informações, sugiro deixar tudo no mesmo gdb. Não conheço nenhum comando sql que unifique as informações de dois gdbs. Acredito que não deve ficar pesado, se vc usar os índices direitinho não deve haver problema.

No caso do Plano de Contas, você não precisaria colocar o código da empresa na chave primária, podendo assim usar os mesmos registros do plano de contas por todas as empresas cadastrando ele uma vez só.


GOSTEI 0
Tchelllo

Tchelllo

29/11/2004

Nao, a principio nao penso em fazer estes tipos de relatorios, o que esta pegando é o fato que o cliente quer que os campos do tipo codigo sejam numerados sequencialmente para cada empresa, por exemplo...a tabela funcionario da empresa 001, ele quer que o primeiro cadastrado comece com o codigo nº 01....e para a empresa 002...o primeiro funcionario cadastrado comece com o codigo 01 tambem, para ele, essa sequencia é importante. Neste caso nao posso manter tudo em um gdb apenas. Só para conferir, a melhor maneira de se fazer isto é deixando pronto uns 200 gdbs +-, o que eu ja acho muito, para o cliente cadastrar suas empresas ou vc tem uma maneira melhor de se fazer?


GOSTEI 0
Fsflorencio

Fsflorencio

29/11/2004

Não vejo inconveniente em deixar no mesmo gdb.

Quando for gerar o próximo código, a empresa deve ser filtrada para não haver dois códigos iguais na mesma empresa.
ex: select max(cod_funcionario) from funcionarios where cod_empresa = 1;

Mesmo usando generators para tal, para cada empresa que vc inserir vc pode criar dinamicamente um generator para ela e excluindo a empresa, exclui o generator. Ex gen_funcionarios1, gen_funcionarios2.

Se for o caso, vc deverá ter uma tabela com o nome das tabelas para que os generators seram criados a partir dela.
Ex.
Empresa1: gen_clientes1, gen_funcionarios1, gen_produtos1;
Empresa2: gen_clientes2, gen_funcionarios2 ...


GOSTEI 0
Tchelllo

Tchelllo

29/11/2004

entendi...mas o valor corrente do campo codigo nao ira crescer corretamente para cada empresa, veja a seguinte extrutura deste pequeno exemplo:

Table: Funcionario
Cod_Func int primary key,
Nome varchar(80),
Salario Decimal(10,2),
Cod_Emp int

Digamos que eu tenho 3 funcionarios inseridos nela:

01, Joao, 1000.00, 01
02, Carlos, 500.00,01
03, Manoel, 800.00, 01

repare que estes estao inseridos na empresa 01. Bom, agora o usuario quer inserir mais funcionarios na empresa 02

04, Juca, 250.00,02
05, Kiko, 10.00,02
...

O cliente quer que o campo Cod_Func comece no codigo 01 para cada empresa que ele registre, mas, se eu manter os registros em apenas uma tabela isso nao da pois a primary key nao deixa, a nao ser que eu crie uma outra table Funcionario, mas dai o gdb ira ficar com muitas tabelas.


Deste jeito nao me resta outra alternativa nao é?


GOSTEI 0
Martins

Martins

29/11/2004

Nobre colega, segue minha sugestão para vc, ressaltando q ainda não testei, mas q deve funcionar....

Vc poderia escrever uma rotina para pegar o último registro da empresa q vc ativar para trabalhar e jogar em uma variavel (inteira), sendo assim, vc poderá alterar o generator para o próximo código... mantendo a ordem...

um exemplo....

[b:4eea15f10c]set generator ´nome_do_generator´ to 10;[/b:4eea15f10c]

O Genarator assume o valor 10...

Apenas uma sugestão....


GOSTEI 0
Ant.carlos/sp

Ant.carlos/sp

29/11/2004

Table: Funcionario
Cod_Func int ,
Nome varchar(80),
Salario Decimal(10,2),
Cod_Emp int

GERE A PK dessa forma: (CODEMP,CODFUNC)

Digamos que eu tenho 3 funcionarios inseridos nela:

|CODEMP|CODFUNC|NOME|SALARIO|
01,01, Joao, 1000.00
01,02, Carlos, 500.00
01,03, Manoel, 800.00

repare que estes estao inseridos na empresa 01. Bom, agora o usuario quer inserir mais funcionarios na empresa 02

02,02,zzzzz,200.00
02,03,xxxx,300.00
02,04, Juca, 250.00
02,05, Kiko, 100.00

Ao incluir faça o Filtro p/ empresa é pege o ultimo no +1

Isto funiona, mas se vc usar em rede...

T+

ANT.CARLOS/SP


GOSTEI 0
Fsflorencio

Fsflorencio

29/11/2004

Caro tchelllo, para resolver este problema da sequência vc precisa criar um generator para cada tabela x empresa.

Ex 1:
Inserí uma empresa e seu código é ´1´.

As tabelas são as seguintes CLIENTES, FUNCIONARIOS

CREATE GENERATOR GEN_CLIENTES1;
CREATE GENERATOR GEN_FUNCIONARIOS1;

Automaticamente serão criados generators. GEN_CLIENTES1, GEN_FUNCIONARIOS1.

Ex 2: Inserí outra empresa e o código é ´2´

Crie os generators GEN_CLIENTES2, GEN_FUNCIONARIOS2.

CREATE GENERATOR GEN_CLIENTES2;
CREATE GENERATOR GEN_FUNCIONARIOS2;

Ex3: Excluí a empresa 1.

Drop generator GEN_CLIENTES1;
Drop generator GEN_FUNCIONARIOS1;

É tudo feito de forma dinâmica.
Inclusive vc deve rever como está fazendo pra pegar o próximo código, pois desta forma o generator a ser utilizado deve ser o generator com o código da empresa em uso.


GOSTEI 0
POSTAR