Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 4704 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Pessoal eu procurei no forum e nao encontrei...

preciso do seguinte, tenho todos os dados da nota fiscal e preciso simular a geração da chave de acesso...

só que se envio a nota fiscal ela funciona perfeitamente me dando uma chave de acesso no retorno.

mas se utilizo o metodo NotaUtil.ChaveAcesso() ; ele me retorna outra chave mesmo eu passando as infomações correta?

tem como eu saber em que momento o componente gera a chave de acesso? para eu comparar

Postado

Pessoal eu depurei o componente e percebi que ele utiliza outra função para fazer a chave e as duas dá resultados diferente...

entao para fazer a correta eu utilizei a

pcnAuxiliar

function GerarChave(var chave: AnsiString; const codigoUF: integer; codigoNumerico: integer;

const modelo, serie, numero, tpemi: integer; const emissao: TDateTime; const CNPJ: string): boolean;

esta me retornou a chave correta

Postado

Pessoal eu depurei o componente e percebi que ele utiliza outra função para fazer a chave e as duas dá resultados diferente...

entao para fazer a correta eu utilizei a

pcnAuxiliar

function GerarChave(var chave: AnsiString; const codigoUF: integer; codigoNumerico: integer;

const modelo, serie, numero, tpemi: integer; const emissao: TDateTime; const CNPJ: string): boolean;

esta me retornou a chave correta

Amigo, eu gero a chave dentro do banco de dados mesmo. Criei uma stored procedure onde passo os campos necessários para formar a chave e ela me retorna a chave incluindo o digito verificador. Chamo essa stored procedure dentro de um trigger de before insert or update da tabela "cabeçalho da nota". Nunca tive problemas. Eu uso Firebird 2.1 de banco. Segue abaixo a Stored Procedure e a Trigger se você quizer usa-las.

CREATE PROCEDURE SP_GERA_CHAVE_NFE (

    COD_UF INTEGER NOT NULL,

    EMISSAO DATE NOT NULL,

    CNPJ CHAR(18) NOT NULL COLLATE PT_BR,

    SERIE INTEGER NOT NULL,

    NUMERO INTEGER NOT NULL,

    CODIGO INTEGER NOT NULL,

    MODELO INTEGER NOT NULL,

    FORMAEMISSAO INTEGER NOT NULL)

RETURNS (

    CHAVE VARCHAR(44) COLLATE PT_BR)

AS

DECLARE VARIABLE XUF CHAR(2) COLLATE PT_BR;

DECLARE VARIABLE XDATAEMISSAO CHAR(4) COLLATE PT_BR;

DECLARE VARIABLE XMODELO CHAR(2) COLLATE PT_BR;

DECLARE VARIABLE XSERIE CHAR(3) COLLATE PT_BR;

DECLARE VARIABLE XNUMERO CHAR(9) COLLATE PT_BR;

DECLARE VARIABLE XCODIGO CHAR(9) COLLATE PT_BR;

DECLARE VARIABLE XCNPJ VARCHAR(18) COLLATE PT_BR;

DECLARE VARIABLE XFORMAEMISSAO CHAR(1) COLLATE PT_BR;

DECLARE VARIABLE SOMA INTEGER;

DECLARE VARIABLE K INTEGER;

DECLARE VARIABLE CONTADOR INTEGER;

DECLARE VARIABLE VALOR INTEGER;

BEGIN

    XUF = LPAD(COD_UF, 2, '0');

    XDATAEMISSAO = SUBSTRING(EXTRACT(YEAR  FROM EMISSAO) FROM 3 FOR 2) || LPAD(EXTRACT(MONTH FROM EMISSAO),2,'0');


    -- LIMPA O CNPJ

    XCNPJ = REPLACE(CNPJ,'.','');

    XCNPJ = REPLACE(XCNPJ,'/','');

    XCNPJ = LPAD(REPLACE(XCNPJ,'-',''),14,'0');


    XMODELO = LPAD(MODELO, 2, '0');

    XSERIE  = LPAD(SERIE, 3, '0');

    XNUMERO = LPAD(NUMERO, 9, '0');

    XFORMAEMISSAO = LPAD(FORMAEMISSAO, 1, '0');

    XCODIGO = LPAD(CODIGO, 8, '0');


    CHAVE = TRIM(XUF || XDATAEMISSAO || XCNPJ || XMODELO || XSERIE || XNUMERO || XFORMAEMISSAO || XCODIGO);


    -- MODULO 11

    K = 2;

    SOMA = 0;

    CONTADOR = 43;

    WHILE (CONTADOR <> 0) DO

     BEGIN

         IF (K > 9)

           THEN K = 2;


         VALOR = SUBSTRING(CHAVE FROM CONTADOR FOR 1);

         SOMA = SOMA + (VALOR * K);

         CONTADOR = CONTADOR - 1;

         K = K + 1;

     END


    SOMA = MOD(SOMA, 11);

    SOMA = (11 - SOMA);


    IF (SOMA > 9)

      THEN SOMA = 0;


    CHAVE = CHAVE || SOMA;

END
CREATE OR ALTER TRIGGER NOTAS_SAIDA_BIU0 FOR NOTAS_SAIDA

ACTIVE BEFORE INSERT OR UPDATE POSITION 0

AS

BEGIN

    EXECUTE PROCEDURE SP_GERA_CHAVE_NFE(NEW.COD_UF_EMITENTE, NEW.DATA_EMISSAO, NEW.CNPJ_CPF_EMITENTE, NEW.SERIE_DOC_FISCAL, NEW.NUMERO_NOTA, NEW.COD_NUMERICO_CHAVE_ACESSO, NEW.COD_MODELO_DOC_FISCAL, NEW.TIPO_EMISSAO_NFE) RETURNING_VALUES NEW.CHAVE_NFE;


    NEW.DIGITO_VERIFICADOR_CHAVE = SUBSTRING(NEW.CHAVE_NFE FROM 44 FOR 1);

END

:idea::!:8-)

Carlos Alexandre Heidrich

Programador e Técnico em Informática

  • 6 meses depois ...
Postado

Convertida para PostgreSQL:


CREATE OR REPLACE FUNCTION sp_gera_chave_nfe (

  cod_uf integer,

  emissao date,

  cnpj bigint,

  serie integer,

  numero bigint,

  codigo integer,

  modelo integer,

  formaemissao integer)

  RETURNS varchar(44)

AS $$

DECLARE

  XUF CHAR(2);

  XDATAEMISSAO CHAR(4);

  XMODELO CHAR(2) ;

  XSERIE CHAR(3) ;

  XNUMERO CHAR(9) ;

  XCODIGO CHAR(9) ;

  XCNPJ VARCHAR(18) ;

  XFORMAEMISSAO CHAR(1) ;

  SOMA INTEGER;

  K INTEGER;

  CONTADOR INTEGER;

  VALOR INTEGER;

  CHAVE VARCHAR(44) ;

BEGIN

  XUF := LPAD(cast(COD_UF as text), 2, '0');

  XDATAEMISSAO := SUBSTRING(cast(date_part('YEAR', EMISSAO) as text) FROM 3 FOR 2) ||

    LPAD(cast(date_part('MONTH', EMISSAO) as text), 2, '0');


  XCNPJ := LPAD(cast(CNPJ as text),14,'0');

  XMODELO := LPAD(cast(MODELO as text), 2, '0');

  XSERIE  := LPAD(cast(SERIE as text), 3, '0');

  XNUMERO := LPAD(cast(NUMERO as text), 9, '0');

  XFORMAEMISSAO := LPAD(cast(FORMAEMISSAO as text), 1, '0');

  XCODIGO := LPAD(cast(CODIGO as text), 8, '0');


  CHAVE := TRIM(XUF || XDATAEMISSAO || XCNPJ || XMODELO || XSERIE || XNUMERO || XFORMAEMISSAO || XCODIGO);


  -- MODULO 11

  K := 2;

  SOMA := 0;

  CONTADOR := 43;

  WHILE (CONTADOR <> 0) LOOP

    IF (K > 9) THEN

      K := 2;

    END IF;

    VALOR := SUBSTRING(CHAVE FROM CONTADOR FOR 1);

    SOMA := SOMA + (VALOR * K);

    CONTADOR := CONTADOR - 1;

    K := K + 1;

  END LOOP;


  SOMA := MOD(SOMA, 11);

  SOMA := (11 - SOMA);


  IF (SOMA > 9) THEN

    SOMA := 0;

  END IF;


  CHAVE := CHAVE || SOMA;

  RETURN CHAVE;

END;

$$

    LANGUAGE plpgsql;


SELECT sp_gera_chave_nfe(43,CURRENT_DATE,87958674000181,890,16384,31415927,55,1);


Alexsander da Rosa

Rednaxel Informática

http://rednaxel.com

  • Este tópico foi criado há 4704 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...