GARANTIR DESCONTO

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
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

Adriano_servitec

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar