Alterando o valor do generator via código delphi!

14/12/2006

0

Pessoal, gostaria que os colegas me desse uma ajuda sobre como ajustar o valor do generator via delphi... Uso a peleta Interbase com o IbDataBases, IbTransaction e IbTables...

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

Cmtbravo

Responder

Posts

14/12/2006

Emerson Nascimento

nesse caso você não precisa do generator.
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?


Responder

14/12/2006

Cmtbravo

fá tentei faze do jeito que vc falou, mas este comando ´coalesce´ dá pau quando executo na trigger, o interbase diz que não conhece..

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!


Responder

24/12/2006

Raserafim

emerson, muito embora os buracos na numeração possam parecer ilógicos, mas ocupar estes espaços não é uma medida segura. a razão para isso é a integridade.

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.


Responder

24/12/2006

Emerson Nascimento

foi exatamente o que eu quis dizer. esse controle é totalmente desnecessário.


Responder

24/12/2006

Raserafim

este controle soluciona dois problemas:

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.


Responder

24/12/2006

Emerson Nascimento

pois é... por isso esse valor deve ser gerado ao [b:78e42e6ce0]gravar[/b:78e42e6ce0] o registo. não ao incluir. seja via generator ou via ´selec max()´


Responder

24/12/2006

Raserafim

sim, é verdade. o código deve ser apenas verificado e gravado no momento em que o registro for ser salvo.

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.


Responder

06/01/2007

Emerson Nascimento

se o ´select max´ não impede o generator também não...


Responder

09/01/2007

Raserafim

analise com calma, e verá que estás equivocado


Responder

09/01/2007

Emerson Nascimento

raserafim, não estou falando do select max de uma forma genérica. estou falando que o select max tem o mesmo efeito do generator, desde que usado numa trigger, como no exemplo passado, e [b:e6f09fb27e]disparado no momento da gravação do registro[/b:e6f09fb27e]. eu trabalho assim há alguns anos, com mais de 50 usuário simultâneos só na unidade de São Paulo (há mais 18 unidades on-line pelo Brasil, então imagine quantos usuário simultâneos acessam o sistema). posso garantir que, nas condições acima descritas, a eficácia do select max será a mesma do generator.


Responder

12/09/2017

Lucas Guimarães

SET GENERATOR <NOME_DO_GENERATOR> TO <VALOR>
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar