[firebase-br] Dígito verificador

Fabio Cardoso fabio em alcanceweb.com.br
Qui Jun 11 09:03:17 -03 2015


Obrigado, Flavio e Walter, vou implementar e depois retorno os resultados.

grande abraço!
Fabio.


On 11/06/2015 08:09, Flavio Divino wrote:
> Bom dia Fábio,
>
> Tenho duas procedures que podem te ajudar nesse problema.
> A primeira é essa que faz a função de truncar (tive que fazer essa
> procedure por causa da minha versão do firebird 2.0)
> SET TERM ^ ;
>
> create or alter procedure SP_TRUNC (
>      FLOATVALUE double precision,
>      DECIMALS smallint)
> returns (
>      RESULT double precision)
> as
> declare variable STRVALUE varchar(50);
> declare variable STRINT varchar(50);
> declare variable STRFRAC varchar(50);
> declare variable AFTERSEP smallint;
> declare variable DECCOUNT smallint;
> BEGIN
>    IF (FloatValue IS NULL) THEN
>      Result = NULL;
>    ELSE
>    BEGIN
>      StrValue = FloatValue;
>      StrInt = '';
>      StrFrac = '';
>      AfterSep = 0;
>      DecCount = 0;
>      WHILE (StrValue <> '') DO
>      BEGIN
>        IF (SUBSTRING(StrValue FROM 1 FOR 1) = '.') THEN
>          AfterSep = 1;
>        ELSE
>        BEGIN
>          IF (AfterSep = 0) THEN
>            StrInt = StrInt || SUBSTRING(StrValue FROM 1 FOR 1);
>          ELSE IF (DecCount >= Decimals) THEN
>            BREAK;
>          ELSE
>          BEGIN
>            StrFrac = StrFrac || SUBSTRING(StrValue FROM 1 FOR 1);
>            DecCount = DecCount + 1;
>          END
>        END
>        StrValue = SUBSTRING(StrValue FROM 2 FOR 50);
> --      SUSPEND;
>      END
>      Result = StrInt || '.' || StrFrac;
>    END
>    SUSPEND;
> END^
>
> SET TERM ; ^
>
> Depois pois está aqui que vai gerar o digito verificador.
> SET TERM ^ ;
>
> create or alter procedure MODULO11 (
>      NUMERO integer)
> returns (
>      DIGITO integer)
> as
> declare variable TXTNUMERO varchar(6);
> declare variable I integer;
> declare variable TOTAL integer;
> declare variable DIG integer;
> begin
>   txtnumero = numero;
>   txtnumero = substring(cast( 1000000 + cast(numero as integer) as char(7))
> from 2 for 6);
>   total = 0;
>   DIG = 0;
>   i = 1;
>
>    while (i <= 6) do
>      begin
>        total = total + cast(substring(txtnumero from :i for 1) as
> integer)*(8-i);
>       i = i + 1;
>      end
>        if (total <= 11) then
>          digito = 11-total;
>        else
>          begin
>            execute procedure SP_Trunc(total/11, 0) returning_values : dig;
>             digito = dig;
>            digito = (total -(11*digito));
>            digito = 11-digito;
>            if (digito >= 10) then
>               digito = 0;
>          end
>    suspend;
> end^
>
> SET TERM ; ^
>
> /* Following GRANT statetements are generated automatically */
>
> GRANT EXECUTE ON PROCEDURE SP_TRUNC TO PROCEDURE MODULO11;
>
> Depois que você "cadastrar" as procedures, você usa esse exemplo
> select modulo11.digito from modulo11(1)
> Ou seja passo o numero 1 (um) para a procedure e ela me retornará 9 (nove).
> select modulo11.digito from modulo11(2)
> o resultado será 7 (sete), e assim por diante.
> Espero ter lhe ajudado.
> Atenciosamente,
>
> Flávio Divino
>
> Em 10 de junho de 2015 23:21, Walter R. Ojeda Valiente <
> sistemas2000profesional em gmail.com> escreveu:
>
>> Si quieres aprender sobre los triggers, puedes leer los siguientes
>> artículos:
>>
>> https://firebird21.wordpress.com/2013/03/17/entendiendo-a-los-triggers/
>>
>> https://firebird21.wordpress.com/2014/03/14/escribiendo-un-trigger/
>>
>> Saludos.
>>
>> Walter.
>>
>> 2015-06-08 9:46 GMT-04:00 Fabio Cardoso <fabio em alcanceweb.com.br>:
>>
>>> Olá Sandro,
>>>
>>> Eu concordo com a primeira saída, criar uma trigger. Porém, não sei como
>>> fazer isso, estou em busca de material na internet pra aprender, talvez
>>> você possa me dar uma dica da solução do problema.
>>>
>>> Boa semana.
>>>
>>> att,
>>> Fabio
>>>
>>>
>>> On 08/06/2015 09:24, Sandro Marcelo Pascoal wrote:
>>>
>>>> Fábio.
>>>> Vejo 2 saídas para isso.
>>>> 1) Vc cria um trigger para executar o código que calcula do DV
>> (recomendo
>>>> essa).
>>>> 2) Vc cria uma dll com a função de cálculo do DV e usar ela no BD.
>>>>
>>>> Com relação a usar o generator dentro do trigger/procedure, é simples.
>> Vc
>>>> usaria CODIGO = GEN_ID(NOME_DO_GEN, 1) e depois faria o cálculo do DV
>>>> usando a variável CODIGO.
>>>>
>>>> Não tenho certeza se é isso que você precisa. Talvez não tenha
>> entendido.
>>>> Sandro
>>>>
>>>> On 06/06/2015 16:56, Fabio Cardoso wrote:
>>>>
>>>>> Amigos,
>>>>>
>>>>> Estou criando uma tabela de clientes com o gerador automático de código
>>>>> para o campo CLIENTE_ID. O meu caso é que, em vez de usar o gerador
>> padrão
>>>>> do firebird, onde ele gera o código sequencial (1, 2, 3,.....), eu
>> quero
>>>>> gerar esse código sequencial adicionando um dígito verificador para
>> ele.
>>>>> Assim, quando eu cadastrar três clientes, em vez de ficar assim
>>>>> CLIENTE_ID    -     CLIENTE_NOME
>>>>> 1    FABIO
>>>>> 2     JOÃO
>>>>> 3     CARLOS
>>>>>
>>>>> Ficaria assim:
>>>>> 19    FABIO
>>>>> 27    JOAO
>>>>> 35    CARLOS
>>>>>
>>>>> Onde, o código é composto do 1, que é o sequencial + 9, que é o dígito
>>>>> verificador desse 1. Eu baixei um código que calcula esse dígito
>>>>> verificador no Delphi, mas gostaria de fazer um generator do firebird
>> pra
>>>>> realizar essa tarefa:
>>>>>
>>>>> function DvModulo11 ( str: String ): Char;
>>>>> var soma, fator, i: Integer;
>>>>>
>>>>>    function chInt ( ch: Char ): ShortInt;
>>>>>    begin
>>>>>      Result := Ord ( ch ) - Ord ( '0' );
>>>>>    end;
>>>>>
>>>>>    function intCh ( int: ShortInt ): Char;
>>>>>    begin
>>>>>      Result := Chr ( int + Ord ( '0' ) );
>>>>>    end;
>>>>>
>>>>> begin
>>>>>    soma := 0;
>>>>>    fator := 2;
>>>>>    for i := Length ( str ) downto 1 do
>>>>>    begin
>>>>>      soma := soma + chInt ( str[i] ) * fator;
>>>>>      Inc ( fator );
>>>>>      if fator = 10 then
>>>>>      fator := 2;
>>>>>    end;
>>>>>    soma := 11 - ( soma mod 11 );
>>>>>    if soma >= 10 then
>>>>>      Result := '1'
>>>>>    else
>>>>>    Result := intCh ( soma );
>>>>> end;
>>>>>
>>>>>
>>>>> um abraço,
>>>>> Fabio.
>>>>>
>>>>> ---
>>>>> Este email foi escaneado pelo Avast antivírus.
>>>>> https://www.avast.com/antivirus
>>>>>
>>>>>
>>>>> ______________________________________________
>>>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>>>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>>>>> http://www.firebase.com.br/fb/artigo.php?id=1107
>>>>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>>>>
>>>>>
>>>>
>>> ---
>>> Este email foi escaneado pelo Avast antivírus.
>>> https://www.avast.com/antivirus
>>>
>>>
>>> ______________________________________________
>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>>> http://www.firebase.com.br/fb/artigo.php?id=1107
>>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>> http://www.firebase.com.br/fb/artigo.php?id=1107
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa


---
Este email foi escaneado pelo Avast antivírus.
https://www.avast.com/antivirus





Mais detalhes sobre a lista de discussão lista