Gerar número sequencial a cada transação

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
  

Mensagemem Sex, 10 Jun 2011 4:22 pm

olá a todos, estou com a seguinte dúvida, presiso gerar um número sequencial para o campo NR_SEQ cada nova transação.

estrutura da tabela

TABELA_TRANSACAO

CD_TRANSACAO PFK
NR_SEQ PK
.
.
.
.
.
davidcastilholi
Localização: Jussara PR

David

Mensagemem Sex, 10 Jun 2011 4:33 pm

você tem que criar uma sequence e uma trigger para a sua tabela


Código: Selecionar todos

CREATE SEQUENCE transacao_seq
    MINVALUE 1
    MAXVALUE 999999999999999999999999999
    START WITH 1
    INCREMENT BY 1
    CACHE 20;



Código: Selecionar todos

create or replace trigger TRG_TABELA_TRANSACAO
  before insert on TABELA_TRANSACAO
  for each row
declare
  -- local variables here
begin

  SELECT transacao_seq.nextval
  INTO :new.ID
  FROM dual;

end TRG_TABELA_TRANSACAO;

victorhugomuniz
Localização: Rio de Janeiro - RJ

Jesus está voltando, volte antes para Ele.

Imagem JavaBlackBelt

Mensagemem Sex, 10 Jun 2011 5:05 pm

Preciso que funcione da seguinte forma:

Para cada nova transação o numero sequencial zere e começe uma nova contagem:

Código da transação - CD_TRANSACAO = 1
Itens da transação - NR_SEQ = 1
NR_SEQ = 2
NR_SEQ = 3

Código da transação - CD_TRANSACAO = 2
Itens da transação - NR_SEQ = 1
NR_SEQ = 2
NR_SEQ = 3

Código da transação - CD_TRANSACAO = 3
Itens da transação - NR_SEQ = 1
NR_SEQ = 2
NR_SEQ = 3
davidcastilholi
Localização: Jussara PR

David

Mensagemem Seg, 13 Jun 2011 10:15 am

alguma ideia, sugestão?
davidcastilholi
Localização: Jussara PR

David

Mensagemem Seg, 13 Jun 2011 10:35 am

Cara,

qual é a sua realidade?

você tem um bloco multi- record? você pode fazer um get no blocos e pegar o current_record,
que é o seguencial de registro,
ou se não é um multi record, e é comitado registro a registro, você pode fazer uma query que retorne um seguencial por CD_TRANSACAO,

qualquer coisa posta ai!!

vlw
ederphil
Localização: taquara-RS

Mensagemem Seg, 13 Jun 2011 11:37 am

Ficar fazendo um select a cada vez na tabela toda pra ver o MAX talvez fique lento um dia,

pode pensar em gravar o ultimo sequencial gerado em uma tabela...
diegolenhardt
Localização: Recife

Mensagemem Seg, 13 Jun 2011 12:48 pm

com certeza, fazer um "MAX + 1" não é uma boa prática, mas tudo depende da situação,
neste caso pelo que eu entendi ele terá um numero de itens para cada transação,
teria que ter uma numero de itens representativo para que seja notada a lentidão,
sendo que ele teria que buscar o sequencial da transação e não da tabela,
mas, tudo depende do caso,

vlw!
ederphil
Localização: taquara-RS

Mensagemem Seg, 13 Jun 2011 3:42 pm

SIM, o max só é ruim se tiver um zilhão de linhas pra cada código.
Normalmente isso não ocorre numa estrutura assim.

MESMO ASSIM, tem que tomar cuidado com o MAX no caso de 2 linhas entrarem ao mesmo tempo.
dr_gori
Localização: Seattle, WA, USA

Thomas F. G

Mensagemem Seg, 13 Jun 2011 4:04 pm

O bloco que estou trabalhando é multi- record.

Como eu faria para pegar o get no bloco e pegar o current_record,
que é o seguencial de registro? conforme nosso amigo ederphil comentou.
davidcastilholi
Localização: Jussara PR

David

Mensagemem Seg, 13 Jun 2011 4:15 pm

Get_Block_Property( 'NOME_DO_BLOCO', CURRENT_RECORD);
você pode usar na when-new-item-instance ou na when-create-record, bom, dai depende de como você vai implementar no seu código!

vlw..

qlqr coisa posta ai!
ederphil
Localização: taquara-RS

Mensagemem Qui, 16 Jun 2011 9:37 am

pessoal desculpe a demora, estou tentando fazer da seguinte forma:

Usando a trigger - WHEN-CREATE-RECORD

Código: Selecionar todos
DECLARE
      CURSOR CUR_INCREMENTO IS
         SELECT MAX(NVL(:TB_ITEMTRANSACAO.NR_SEQ,0)) + 1
         FROM TB_ITEMTRANSACAO WHERE CD_PRODUTO = :BLK_LANCAMENTO.CD_LANCAMENTO;
BEGIN
   OPEN CUR_INCREMENTO;
      FETCH CUR_INCREMENTO INTO :TB_ITEMTRANSACAO.NR_SEQ;
   CLOSE CUR_INCREMENTO;
END;


mas sempre que faço o processo ele joga 1 para cadas registro no campo NR_SEQ

O que estou fazendo de errado ?
davidcastilholi
Localização: Jussara PR

David

Mensagemem Qui, 16 Jun 2011 10:02 am

Para dar certo a sequencia você teria que comitar registro a registro, pois ele busca o max do banco, que, se você não comitou o registro anterior ele será sempre o mesmo,

Código: Selecionar todos
BEGIN
   :TB_ITEMTRANSACAO.NR_SEQ := Get_Block_Property( 'TB_ITEMTRANSACAO, CURRENT_RECORD);
END;
ederphil
Localização: taquara-RS

Mensagemem Qui, 16 Jun 2011 12:56 pm

Deu certo ederphil, certinho, show de bola.


valeu
davidcastilholi
Localização: Jussara PR

David

Mensagemem Sex, 15 Mai 2015 9:18 am

aproveitando a dica do ederphil

como fazer para atualizar a sequencia de um bloco multi recorde se por exemplo, excluir um registro do meio da sequencia, como reordenar o sequenciamento?

tentei algumas alternativas de percorrer o bloco com loop para refazer a sequencia, mas não estou sabendo qual trigger usar, algumas são restritas e não permitem :(
Porva
Localização: São Paulo/SP

Rafael S. Nunes
São Paulo/SP

Mensagemem Ter, 15 Nov 2016 10:08 am

ola, bom dia... preciso fazer o mesmo, inserir um sequencia para o proximo cadastro, no meu caso esse sequencial seria NR DE PORTARIA, então queria q o form já abrisse com esse nr preenchido... porem, como tenho apenas 1 mês no apex5, não sei onde eu coloco o codigo para funcionar, poderiam me ajudar??
carlynhos77



Voltar para Forms

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes