Retorno de um ID no Firebird

23/10/2017

0

Olá pessoal, blz!?

Poderiam colocar um exemplo bem básico de retorno de um ID de um registro incluído por uma Stored Procedure no Firebird, por favor.

Meu Exemplo não está retornando o valor do ID no componente:

create or alter procedure VENDAS_INSERT (
    DATA type of column VENDAS.DATA,
    HORA type of column VENDAS.HORA,
    CLIENTE_ID type of column VENDAS.CLIENTE_ID,
    ENTREGADOR_ID type of column VENDAS.ENTREGADOR_ID,
    PAGAMENTO_ID type of column VENDAS.PAGAMENTO_ID,
    VALOR_TOTAL type of column VENDAS.VALOR_TOTAL,
    VALOR_DESCONTO type of column VENDAS.VALOR_DESCONTO,
    VALOR_TAXAENTREGA type of column VENDAS.VALOR_TAXAENTREGA)
returns (
    ID_VENDA type of column VENDAS.ID)
as
declare variable VENDAS_ID type of column VENDAS.ID;
begin
  VENDAS_ID = gen_id(gen_vendas_id,1);

  insert into VENDAS (ID, DATA, HORA, CLIENTE_ID, ENTREGADOR_ID, PAGAMENTO_ID, VALOR_TOTAL, VALOR_DESCONTO, VALOR_TAXAENTREGA)
  values (:VENDAS_ID, :DATA, :HORA, :CLIENTE_ID, :ENTREGADOR_ID, :PAGAMENTO_ID, :VALOR_TOTAL, :VALOR_DESCONTO, :VALOR_TAXAENTREGA);

  ID_VENDA = :vendas_id;

  insert into MOVIMENTO(DATA, TIPO, CLIENTE_ID, PEDIDO_ID, HISTORICO, VALOR)
  values (:DATA, 'S', :CLIENTE_ID, :ID_VENDA, 'VENDA DE PRODUTOS', :VALOR_TOTAL);

  suspend;
end


Desde já agradeço a ajuda.

Meu componente de uso é o FDStoredProc XE 10.2 Tokyo

Ricardo


Essa dúvida foi gerada a partir de um comentário na aula 3. Usando Stored Procedures com Firebird e InterBase
Ricardo Vieira

Ricardo Vieira

Responder

Post mais votado

26/10/2017

Prezado Ricardo,

Voce criou uma trigger para disparar o generator ?

AS
BEGIN
IF (NEW.ID_ALIQUOTA_ICMS IS NULL) THEN
NEW.ID_ALIQUOTA_ICMS = GEN_ID(GEN_ALIQUOTAS_ICMS_ID,1);
END

a trigger é disparada no evento before insert.

Se vc quiser pegar o ultimo id da tabela:

EXEC SQL

SELECT GEN_ID(GEN_ALIQUOTAS_ICMS_ID,0)
INTO :WSIDALIQUOTAICMS
FROM RDB$DATABASE
END-EXEC

Não sei se isso irá te ajudar

Atenciosamente

Rogerio Barbosa

Rogerio Ferreira

Rogerio Ferreira
Responder

Mais Posts

26/10/2017

Ricardo Vieira

Olá Rogerio,

Acabei descobrindo a falha que estava havendo comigo.

Respondendo a você, sim criei a Trigger no banco sim, normal.

O problema que me ocorreu é que eu estava acostumado a utilizar o componente Unidac, porém nesse projeto como é um trabalho free para um cliente acabei tendo que usar apenas os componentes nativo da ferramenta a pedido do próprio cliente, e no entanto acabei usando a sequência de utilizar o FDStoredProc como se fosse um UniStoredProc ao que usava apenas o comando ExecProc para executar a Stored Procedure no banco e retornar os dados ao componente como o ID por exemplo.

Depois de ler alguns artigos de amigos descobri que para que eu tenha um retorno de um dado de uma stored procedure com o firedac eu necessito usar o comando Open em vez de do ExecProc, fazendo isso o ID foi retornado como o desejado.

Eu não sei se esse é o procedimento correto do Firedac, estou estudando ainda ele, como disse uso o Unidac como componente principal para conexão de bancos, mas para mim resolveu o meu caso, espero que essa questão também ajude alguém num futuro.

Já fica de explicação para os próximos amigos que passarem por isso também.

Obrigado pela atenção.

Ricardo Vieira
Equipe RvInfo Sistemas
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar