Fórum Problema com DV #39525
17/10/2003
0
Estou com um probleminha em uma trigger.
Criei um compo de auto incremento, utilizando um generator. Quando se usa esse recurso, é necessário inserir a seguinte linha de codigo na trigger:
Tabela.campo = gen_id(GeneratorCriado, 1);
onde tabela e o campo se refere ao campo COD, gen_id é uma função do interbase e GeneratorCriado é o generator criado para gerar a sequencia numerica.
o problema é que eu tenho um campo DV (Digito Verificador) que é feito com o calculo do numero gerado pela generator. a conta é a seguinte
digamos que o novo codigo é 125 então ficaria assim:
Pegar o ultimo numero ( 5 ) e multiplicar por 8
Pegar o restante ( 12 ), calcular o resto da divisao por 10 e multiplicar por 9
Teremos respectivamente 40 (5*8) e 108 ( reto da divisão de 12 por 10 é 2, que multiplicado por 9 é igual a 18;
temos então 40 e 18
soma-se os dois e calcula o resto da divisão por 10
40+18 = 58 ==>> resto da divisão por 10 é: 8
o DV desse codigo seria 8
Como é que eu faço esse calculo em SQL no Interbase? ja tentei no Delphi mas nem sempre dava o valor certo, devido o posicionameto do apontador da tabela apos atualizar os dados. Se alguem sabe como posso calcular o resto da divisão e tambem, como faço para truncar um numero em SQL, por favor compartilhe seu conhecimento
Obrigado!
Criei um compo de auto incremento, utilizando um generator. Quando se usa esse recurso, é necessário inserir a seguinte linha de codigo na trigger:
Tabela.campo = gen_id(GeneratorCriado, 1);
onde tabela e o campo se refere ao campo COD, gen_id é uma função do interbase e GeneratorCriado é o generator criado para gerar a sequencia numerica.
o problema é que eu tenho um campo DV (Digito Verificador) que é feito com o calculo do numero gerado pela generator. a conta é a seguinte
digamos que o novo codigo é 125 então ficaria assim:
Pegar o ultimo numero ( 5 ) e multiplicar por 8
Pegar o restante ( 12 ), calcular o resto da divisao por 10 e multiplicar por 9
Teremos respectivamente 40 (5*8) e 108 ( reto da divisão de 12 por 10 é 2, que multiplicado por 9 é igual a 18;
temos então 40 e 18
soma-se os dois e calcula o resto da divisão por 10
40+18 = 58 ==>> resto da divisão por 10 é: 8
o DV desse codigo seria 8
Como é que eu faço esse calculo em SQL no Interbase? ja tentei no Delphi mas nem sempre dava o valor certo, devido o posicionameto do apontador da tabela apos atualizar os dados. Se alguem sabe como posso calcular o resto da divisão e tambem, como faço para truncar um numero em SQL, por favor compartilhe seu conhecimento
Obrigado!
Maxadens
Curtir tópico
+ 0
Responder
Posts
18/10/2003
Afarias
|Quando se usa esse recurso, é necessário inserir a seguinte linha de
|codigo na trigger: Tabela.campo = gen_id(GeneratorCriado, 1);
não é exatamente necessário, é muito prático usar os GENERATORS no lado ´cliente´ e não usar TRIGGERS com eles.
|Como é que eu faço esse calculo em SQL no Interbase?
Vc terá q necessáriamente usar UDFs... ou vc cria uma UDF própia q faça todo o processo para vc ou usa as UDFs padrões para implementar o cálculo na sua TRIGGER ou PROCEDURE.
|ja tentei no Delphi mas nem sempre dava o valor certo, devido o
|posicionameto do apontador da tabela apos atualizar os dados.
?? não entendi ?? não há pq não dar certo no lado cliente (app. Delphi)
|Se alguem sabe como posso calcular o resto da divisão e tambem, como
|faço para truncar um numero em SQL,
para pegar o resto da divisão:: função MOD da UDF padrão do IB/FB
e para truncar o valor inteiro como vc deseja será necessário usar a função interna de conversão CAST e as funções externas SUBSTR e STRLEN da UDF padrão do IB/FB, ex::
declare as variáveis num_str varchar(10), tam integer, num_int integer ::
num_str = cast(novo_id as varchar(10));
tam = strlen(num_str);
num_int = cast(substr(num_str, tam, tam) as integer);
ou apenas faça::
num_int = cast(substr(cast(novo_id as varchar(10)), strlen(cast(novo_id as varchar(10))), strlen(cast(novo_id as varchar(10)))) as integer);
onde novo_id é o id que vc pegou com a função GEN_ID (Tabela.campo) -- e num_int é o número q vc quer (por ex: 5 se o novo_id = 125)
para registrar essas funções externas, use os comandos DECLARE EXTERNAL FUNCTION como definidos no arquivo \examples\udf\ib_udf.sql
T+
|codigo na trigger: Tabela.campo = gen_id(GeneratorCriado, 1);
não é exatamente necessário, é muito prático usar os GENERATORS no lado ´cliente´ e não usar TRIGGERS com eles.
|Como é que eu faço esse calculo em SQL no Interbase?
Vc terá q necessáriamente usar UDFs... ou vc cria uma UDF própia q faça todo o processo para vc ou usa as UDFs padrões para implementar o cálculo na sua TRIGGER ou PROCEDURE.
|ja tentei no Delphi mas nem sempre dava o valor certo, devido o
|posicionameto do apontador da tabela apos atualizar os dados.
?? não entendi ?? não há pq não dar certo no lado cliente (app. Delphi)
|Se alguem sabe como posso calcular o resto da divisão e tambem, como
|faço para truncar um numero em SQL,
para pegar o resto da divisão:: função MOD da UDF padrão do IB/FB
e para truncar o valor inteiro como vc deseja será necessário usar a função interna de conversão CAST e as funções externas SUBSTR e STRLEN da UDF padrão do IB/FB, ex::
declare as variáveis num_str varchar(10), tam integer, num_int integer ::
num_str = cast(novo_id as varchar(10));
tam = strlen(num_str);
num_int = cast(substr(num_str, tam, tam) as integer);
ou apenas faça::
num_int = cast(substr(cast(novo_id as varchar(10)), strlen(cast(novo_id as varchar(10))), strlen(cast(novo_id as varchar(10)))) as integer);
onde novo_id é o id que vc pegou com a função GEN_ID (Tabela.campo) -- e num_int é o número q vc quer (por ex: 5 se o novo_id = 125)
para registrar essas funções externas, use os comandos DECLARE EXTERNAL FUNCTION como definidos no arquivo \examples\udf\ib_udf.sql
T+
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)