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
Responder
davidcastilholi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 47
Registrado em: Qui, 07 Abr 2011 3:54 pm
Localização: Jussara PR
David

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

Selecionar tudo

TABELA_TRANSACAO

CD_TRANSACAO  PFK 
NR_SEQ               PK
.
.
.
.
.
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

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

Selecionar tudo


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

Selecionar tudo


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;

davidcastilholi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 47
Registrado em: Qui, 07 Abr 2011 3:54 pm
Localização: Jussara PR
David

Preciso que funcione da seguinte forma:

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

Selecionar tudo

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
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 47
Registrado em: Qui, 07 Abr 2011 3:54 pm
Localização: Jussara PR
David

alguma ideia, sugestão?
ederphil
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Qua, 15 Out 2008 4:05 pm
Localização: taquara-RS

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
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

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...
ederphil
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Qua, 15 Out 2008 4:05 pm
Localização: taquara-RS

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!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

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.
davidcastilholi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 47
Registrado em: Qui, 07 Abr 2011 3:54 pm
Localização: Jussara PR
David

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.
ederphil
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Qua, 15 Out 2008 4:05 pm
Localização: taquara-RS

Selecionar tudo

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!
davidcastilholi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 47
Registrado em: Qui, 07 Abr 2011 3:54 pm
Localização: Jussara PR
David

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

Usando a trigger - WHEN-CREATE-RECORD

Selecionar tudo

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 ?
ederphil
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Qua, 15 Out 2008 4:05 pm
Localização: taquara-RS

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,

Selecionar tudo

BEGIN 
   :TB_ITEMTRANSACAO.NR_SEQ := Get_Block_Property( 'TB_ITEMTRANSACAO, CURRENT_RECORD); 
END;
davidcastilholi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 47
Registrado em: Qui, 07 Abr 2011 3:54 pm
Localização: Jussara PR
David

Deu certo ederphil, certinho, show de bola.


valeu
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

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 :(
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

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??
Responder
  • Informação
  • Quem está online

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