loop para procurar linhas com numeros repetidos

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
dcp
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Ter, 17 Set 2013 11:02 am

tenho uma bloco tabular com 4 itens da mesma tabela, quero varrer esse bloco e verificar se o numero 1 foi digitado, se não, dar uma msg ao usuario de que o codigo não foi informado e sair do loop.
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

Se o bloco é BASE TABLE, basta executar o comando POST e fazer uma query mesmo.
O "post" envia todos dados que estão nos blocos para o banco de dados, mas sem fazer COMMIT. Dessa forma é possível fazer query normalmente.

Caso o bloco não seja base-table, então vai ter que fazer um LOOP mesmo.
Algo assim:

Selecionar tudo

DECLARE
  v_encontrou BOOLEAN := FALSE;
BEGIN

  GO_BLOCK('seubloco');
  FIRST_RECORD;
  LOOP
    IF :seubloco.seucampo = 'algoQueVoceQuerTestar' 
    THEN 
      v_encontrou := TRUE;
      EXIT;
    END IF;

    IF :SYSTEM.LAST_RECORD = 'TRUE'
    THEN EXIT;
    ELSE NEXT_RECORD;
    END IF;
  END LOOP;

  --se não encontrou, coloca o codigo que você quer aqui.
  IF not V_ENCONTROU
  THEN
     --ERROR MESSAGE
     -- ETC
     NULL;
     RETURN;
  END IF;

  --se encontrou, coloca o codigo aqui do sucesso.
  COMMIT;

END; 
(Eu não testei isso, to sem oracle aqui :oops: ... mas é por ai). Lembrando que isso ai não testa se tem números repetidos, conforme o título do post. Ele apenas testa se um numero existe no bloco, conforme o que foi explicado na mensagem)
:-o
dcp
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Ter, 17 Set 2013 11:02 am

é o titulo esta errado mesmo hahaa :mrgreen:
posso fazer esse codigo em um botão WHEN-BUTTON-PRESSED também né ?
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, tranquilo.
dcp
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Ter, 17 Set 2013 11:02 am

Valeu !!
fiz umas modificações e aplicou perfeitamente, mas o caminho é esse...

tenho mais uma duvida. :?:

Usando a mesma condição abaixo mas ... quando eu encontrar um código repetido, ao invés de eu retornar a variável boolean FALSE eu mostre somente uma vez esse código.
ex:
cod
1
2
1
3
----
resultado
1
2
3
pensei em algo tipo

Selecionar tudo

DECLARE
  v_encontrou BOOLEAN := FALSE;
  v_id        number := :seubloco.seucampo;
BEGIN

  GO_BLOCK('seubloco');
  FIRST_RECORD;
  LOOP
    IF :seubloco.seucampo <> v_id THEN 
      v_encontrou := FALSE;
      EXIT;
    END IF;

    IF :SYSTEM.LAST_RECORD = 'TRUE'
    THEN EXIT;
    ELSE NEXT_RECORD;
    END IF;
  END LOOP;

  --se não encontrou, coloca o codigo que você quer aqui.
  IF not V_ENCONTROU THEN
     mas(v_id);
 
  END IF;  
 	
  --se encontrou, coloca o codigo aqui do sucesso.
  
  COMMIT;
  
END;
Teria que tipo mostrar dentro do msg todos os campos que não repetem mais de 1 vez, se repetir mais de 1 vez mostrar somente a primeira ocorrência, descartando a segunda. :shock: :P
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Selecionar tudo

select distinct(campo) from tabela
Assim irá mostrar todos os códigos uma única vez, sem repetir quando tiver repetido.
dcp
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Ter, 17 Set 2013 11:02 am

não sei se usando a estrutura acima daria para fazer com comandos DML. Nesse meu caso não vou dar commit no final, quando esse loop varrer o bloco teria que mostrar todos os registros sem duplicidade, mesmo havendo não devo mostrar.
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Bom, se a situação é de um bloco não base-table, então você terá que usar dois loop's, um percorrendo o bloco e outro percorrendo o array onde estarão os valores que você irá mostrar, ai depois é só usar a lógica, se já existir no array você não adiciona, caso não exista, adiciona.
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

Se for muitas linhas, talvez vale a pena inserir esses valores numa tabela temporária.
(ou seja, percorrer o bloco e ir inserindo, já que ele é não base-table).

Dai fica fácil de achar duplicados.
Responder
  • Informação
  • Quem está online

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