problema com autoincrement no bde
Olá amigos, estou migrando um sistema com base de dados paradox para interbase 6.0 porém estou tendo alguns problemas com campos autoincrement gerados por triggers. Estou usando TDatabase e TQuery, e delphi 3 mas quando vou adicionar um novo cliente, o interbase não gera o código do cliente, ao invés disso ele diz que o campo não pode ser nulo mas como pode isso se a trigger fica no evento beforepost da tabela? Como fazer pro bde reconhecer o autoincrement?
Já estou ficando meio estressado com esse probleminha, não sei se é pq meu delphi é velho mas no momento não posso fazer o upgrade e imagino que solução há, só não a conheço quem sabe alguém aqui pode me ajudar nisso...
Obrigado.
Já estou ficando meio estressado com esse probleminha, não sei se é pq meu delphi é velho mas no momento não posso fazer o upgrade e imagino que solução há, só não a conheço quem sabe alguém aqui pode me ajudar nisso...
Obrigado.
Anonymous
Curtidas 0
Respostas
Afarias
08/04/2003
Como vc está gerando os códigos via TRIGGERS (no servidor) este código só será gerado quando o registro ´bater´ no servidor!
Desta forma, vc não poderá conhecer o valor gerado antes de fechar e executar novamente a Query. E, para q funcione, vc tem q configurar a propriedade Required to TField (q representa sua chave) para FALSE!
Caso vc precise saber o código gerado NA INCLUSÃO (antes ou durante) vc deve pedir este código ao IB e coloca-lo via código no programa.
Ex:
Crie uma query com o SQL:
SELECT GEN_ID(NOME_GENERATOR, 1) FROM RDB$DATABASE
sempre no evento OnNewRecord ou BeforePost execute esta query, pegue seu valor de retorno e jogue no campo chave!
Se vc usar IBX, basta usar a propriedade GENERATORFIELD e configurar para POST ou APPEND
Abraço.
Desta forma, vc não poderá conhecer o valor gerado antes de fechar e executar novamente a Query. E, para q funcione, vc tem q configurar a propriedade Required to TField (q representa sua chave) para FALSE!
Caso vc precise saber o código gerado NA INCLUSÃO (antes ou durante) vc deve pedir este código ao IB e coloca-lo via código no programa.
Ex:
Crie uma query com o SQL:
SELECT GEN_ID(NOME_GENERATOR, 1) FROM RDB$DATABASE
sempre no evento OnNewRecord ou BeforePost execute esta query, pegue seu valor de retorno e jogue no campo chave!
Se vc usar IBX, basta usar a propriedade GENERATORFIELD e configurar para POST ou APPEND
Abraço.
GOSTEI 0
Anonymous
08/04/2003
Oi afarias, obrigado pela ajuda eu testei no ibconsole e parece realmente funcionar.
Só uma dúvida, eu estou criando os generators pelo IBexpert, e esse comando GEN_ID ele no caso incrementa sozinho ou eu preciso ter uma trigger e uma storedprocedure pra cada autoincrement? Pois no caso se o comando for autosuficiente então significa que eu posso apagar a trigger e a storedproc?
Desculpa o mal jeito, comecei faz pouco tempo no interbase se puder me esclarecer um pouco mais... é que eu gostaria de entender e não só copiar e colar os códigos.
Só uma dúvida, eu estou criando os generators pelo IBexpert, e esse comando GEN_ID ele no caso incrementa sozinho ou eu preciso ter uma trigger e uma storedprocedure pra cada autoincrement? Pois no caso se o comando for autosuficiente então significa que eu posso apagar a trigger e a storedproc?
Desculpa o mal jeito, comecei faz pouco tempo no interbase se puder me esclarecer um pouco mais... é que eu gostaria de entender e não só copiar e colar os códigos.
GOSTEI 0
Afarias
08/04/2003
Bom, é isso o GEN_ID incrementa o generator e retorna esse valor incrementado!! -- as Triggers/StoredProcs não tem nada com isso.
Como vc vai ´pedir´ os IDs pelo cliente, realmente NÃO precisa das Triggers ou StoredProcs!
Algumas pessoas mantem as triggers más com o seguinte código:
if (campo_chave is null) then
campo_chave = gen_id(nome_generator, 1);
só em caso de em processos onde não for preenchido o campo_chave no lado cliente, o servidor faz o papel! -- más acho q em geral não é o caso!
Abraço
PS: Não se preocupe! querer entender é um DIFERENCIAL!
Como vc vai ´pedir´ os IDs pelo cliente, realmente NÃO precisa das Triggers ou StoredProcs!
Algumas pessoas mantem as triggers más com o seguinte código:
if (campo_chave is null) then
campo_chave = gen_id(nome_generator, 1);
só em caso de em processos onde não for preenchido o campo_chave no lado cliente, o servidor faz o papel! -- más acho q em geral não é o caso!
Abraço
PS: Não se preocupe! querer entender é um DIFERENCIAL!
GOSTEI 0
Anonymous
08/04/2003
Bem que eu desconfiei: quando uma coisa parece complicada demais quase sempre a gente está é atirando pro lado errado, no fim era uma coisa tão simples.
Acho que também um pouco da culpa é do paradox, o jeito é reaprender a programar usando arquitetura client/server e estudando seus macetes.
Mais uma vez obrigado.
Acho que também um pouco da culpa é do paradox, o jeito é reaprender a programar usando arquitetura client/server e estudando seus macetes.
Mais uma vez obrigado.
GOSTEI 0