Fórum Autoincremento com select max(campo) é recomendado? #58497
05/07/2007
0
Boa noite pessoal, bom o problema eh o seguinte:
Preciso fazer um autoincremento para gerar numeros de funcionarios, mais nao pode ser chave primaria pois vai seri assim
A tabela esta com referencia a tabela empresa
entao vai ser assim
empresa1
1-funcionario1
2-funcionario2
empresa2
1-funcionario1
empresa3
1-funcionario1
2-funcionario2
3-funcionario3
...
----------------------------------
Bom entao fiz um codigo assim no Delphi
Esta funcionando, como podem ver tem uma variavel (No caso fiz como global) que soma o ultimo id_func com a funçao MAX e incrementa + 1.
Ai percebi que tem um furo neste select que no caso cheguei a repetir o mesmo numero da ID_FUNC na mesma empresa. O que nao pode ocorrer.
Entao para resolver isso criei uma Trigger assim
Bom nao sei se esta correta esta Trigger, mais pelo menos vi que disparou quando tentei repetir o codigo do ID_FUNC.
Mais a duvida eh que por enquanto estou testando esse codigo sozinho, e gostaria de saber dos colegas no caso quando for feito por varios usuarios ao mesmo tempo serah que vai funcionar corretamente?
Poderia disparar por uma trigger, mais nao sei como faze-la
Preciso nessa trigger fazer um select pra depois criar o autoincremento(Eu acho, mais nao esta saindo nada neste codigo abaixo)
Alguem pode me ajudar?
Grato Adriano
Preciso fazer um autoincremento para gerar numeros de funcionarios, mais nao pode ser chave primaria pois vai seri assim
A tabela esta com referencia a tabela empresa
entao vai ser assim
empresa1
1-funcionario1
2-funcionario2
empresa2
1-funcionario1
empresa3
1-funcionario1
2-funcionario2
3-funcionario3
...
----------------------------------
Bom entao fiz um codigo assim no Delphi
with dm.cdsQFunc do begin close; sql.clear; sql.add(´select max(id_func)as chavepri from salario_m where id_empresa = :pchaveempresa´); idempr:=dm.sdsEmpr.fieldbyname(´id_empresa´).asInteger; Parambyname(´pchaveempresa´).asinteger := idempr; //variavel que recebe o codigo da empresa Open; Prox:=FieldByName(´chavePri´).asInteger+1; //Mostra a soma do ID maior + 1 para gerar um novo codigo do funcionario LBProx.Caption:=IntToStr(Prox); end;
Esta funcionando, como podem ver tem uma variavel (No caso fiz como global) que soma o ultimo id_func com a funçao MAX e incrementa + 1.
Ai percebi que tem um furo neste select que no caso cheguei a repetir o mesmo numero da ID_FUNC na mesma empresa. O que nao pode ocorrer.
Entao para resolver isso criei uma Trigger assim
CREATE TRIGGER EXCEPTID_FUNC FOR SALARIO_M ACTIVE BEFORE INSERT POSITION 0 AS begin /* Trigger text */ if (Exists(Select ID_FUNC from salario_m WHERE id_func = NEW.id_func and id_empresa = new.id_empresa)) then Exception RESTRICAO ´Atenção Usuário!!! Dados já consta cadastrado no Banco de Dados!´; end
Bom nao sei se esta correta esta Trigger, mais pelo menos vi que disparou quando tentei repetir o codigo do ID_FUNC.
Mais a duvida eh que por enquanto estou testando esse codigo sozinho, e gostaria de saber dos colegas no caso quando for feito por varios usuarios ao mesmo tempo serah que vai funcionar corretamente?
Poderia disparar por uma trigger, mais nao sei como faze-la
Preciso nessa trigger fazer um select pra depois criar o autoincremento(Eu acho, mais nao esta saindo nada neste codigo abaixo)
CREATE TRIGGER AUTOINCFUNCMAX FOR SALARIO_M ACTIVE BEFORE INSERT POSITION 0 AS begin /* Trigger text */ if (exists(select id_func, id_empresa from salario_m where id_empresa = id_empresa)) then select coalesce(max(id_func),0)+1 from salario_m into new.id_func; end
Alguem pode me ajudar?
Grato Adriano
Adriano_servitec
Curtir tópico
+ 0
Responder
Posts
07/07/2007
Sremulador
Mais a duvida eh que por enquanto estou testando esse codigo sozinho, e gostaria de saber dos colegas no caso quando for feito por varios usuarios ao mesmo tempo serah que vai funcionar corretamente?
Sim, funcionará, no modo de concorrencia..,
você fala que com chave primaria não funcionaria, mas um detalhe a chave você deve colocar, empresa, funcionario, isso dispensaria o gatilho, o qual você poderia emplementar nele esta parte
with dm.cdsQFunc do begin close; sql.clear; sql.add(´select max(id_func)as chavepri from salario_m where id_empresa = :pchaveempresa´); idempr:=dm.sdsEmpr.fieldbyname(´id_empresa´).asInteger; Parambyname(´pchaveempresa´).asinteger := idempr; //variavel que recebe o codigo da empresa Open; Prox:=FieldByName(´chavePri´).asInteger+1; //Mostra a soma do ID maior + 1 para gerar um novo codigo do funcionario LBProx.Caption:=IntToStr(Prox); end;
Responder
Gostei + 0
07/07/2007
Adriano_servitec
Obrigado pela dica amigo.
Ja fiz o relacionamento entre as tabelas.
Valeu.
Ja fiz o relacionamento entre as tabelas.
Valeu.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)