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!


Maxadens

Maxadens

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+


Responder

Gostei + 0

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

Aceitar