Alterando o valor do generator via código delphi!
14/12/2006
0
O motivo que o seguinte: Toda vez que excluir um registro, quero executar uma query para saber o maior valor da tabela e, de acordo com o resultado, excutar o código ´ SET GENERATOR [NOME_DO_GEN] TO VALOR
VALEU PESSOAL!
Cmtbravo
Posts
14/12/2006
Emerson Nascimento
CREATE trigger X for TABELA active before insert position 0 AS BEGIN IF (NEW.CAMPO IS NULL) THEN select coalesce(max(CAMPO),0)+1 from TABELA into NEW.CAMPO; END
nunca entendi o porque desse controle...
e no seguinte caso:
registros
1
2
3
4
5
eu apago o 2, o 3 e o 4. quando eu incluir o seguinte, como fica?
1
5
6
do que adianta esse controle de numeração se pode ficar um ´buraco´ entre os registros?
14/12/2006
Cmtbravo
O motivo de eu quere saber como alterar o valor do generator por dentro do projeto é simples ...
na minha trigger, quando excluo um registro, exemplo;
1
2
3
se excluo o 3, quando excluo novamente, ele cria o 4. Isso eu não quero que aconteca, então se eu puder fazer o seguinte:
selemact max(codigo) as vmax from tabela
pegar o valor máximo e setar o generator com ele :
set generator [nome] to [valor]
onde valor seria = ao valor maximo que a query me retornou... pra mim seria melhor entende.!!
mas valeu pela dica .. se vc tiver o código pra esta solução ficaria muito grato!!
Abraço!
24/12/2006
Raserafim
imagine que vc tinha uma ordem de serviço cadastrado e o cliente tem um papel impresso desta ordem com o seu código. se vc apaga este registro e depois cria um outro e este mesmo número fosse ocupado, este outro cliente teria o mesmo código da ordem de serviço do outro cliente.
agora imagina uma outra situação. vc cadastraria um cliente e seus telefones. depois vc apaga este cliente e vc não tinha feito o relacionamento para a exclusão dos dados em cascata. depois quando vc cadastrar um outro cliente ele assumirá os telefones do cliente antigo.
ou seja, autonumeração tem que garantir uma numeração única para cada registro.
24/12/2006
Emerson Nascimento
24/12/2006
Raserafim
1- utilizar o select max faz varrer a tabela inteira em busca do maior valor (tudo bem que o índice agilize este processo, mas de qualquer maneira tem que checar a tabela)
2- quando a aplicação funciona em rede e tem acesso concorrencial, esta medida (select max) pode provocar com muita frequência erro de duplicidade de primary key.
imagine se dois usuários abrir o form cadastro de clientes e tentarem salvar quase que no mesmo instante, os dois usuários irão receber o select max o mesmo valor.
este contador é imprescidível para uma aplicação em rede, pois desta forma o firebird garante a unicidade dos registros. e se vc quiser fazer o controle semi-automático, pegando o valor deste contador, o firebird tem uma função que ao ler este valor do contador ele já é incrementado.
24/12/2006
Emerson Nascimento
24/12/2006
Raserafim
mas o select max não impede que o mesmo valor seja resgatado por dois usuários. a probabilidade será maior ou menor quanto maior for a quantidade de usuários e quanto maior for o lag da rede, o processamento da aplicação, etc.
enquanto que com o contador, o simples fato de ler o valor já pode ser incrementado o valor, impossibilitando que dois usuários peguem o mesmo valor.
06/01/2007
Emerson Nascimento
09/01/2007
Emerson Nascimento
Clique aqui para fazer login e interagir na Comunidade :)