Evitar duplicação de alguns itens

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
ROBSON ROCHA
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 10 Mar 2010 10:20 am
Localização: IGREJINHA

Buenas pessoal!
Seguinte. Tem um projeto em q criei uma tabela para cadastro de dentistas. Nesta tabela consta o código (gerado por uma sequence), nome do dentista e a sua especialidade (list item). Na hora de cadastrar o dentista sem stress, o negócio funciona perfeito. O problema q encontro é q eu não estou conseguindo montar uma restrição para q o mesmo dentista não seja cadastrado novamente com a mesma especialidade. seria como duplicar informação porém com outro código, entendem?
Até montei aqui uma query porém sem êxito algum, segue ela:

Selecionar tudo

 Declare 
  
 Cursor cInserir is (Select NOME_DENTISTA 
                           ,ESPECIALIDADE 
                       From CO_DENTISTAS); 
        rInserir cInserir%rowtype;        
        
Begin 
  
 Open cInserir; 
  Loop 
   Fetch cInserir into rInserir; 
   Exit when cInserir%notfound; 
    
    If    (:CO_DENTISTAS.NOME_DENTISTA   = rInserir.NOME_DENTISTA) 
     and (:CO_DENTISTAS.ESPECIALIDADE = rInserir.ESPECIALIDADE) 
   Then      
       message ('Atenção: Dentista já cadastrado nesta especialidade.'); 
       message ('Atenção: Dentista já cadastrado nesta especialidade.'); 

      raise form_trigger_failure;      
    End If; 
    
  End Loop; 
   Close cInserir; 

End; 
Se alguém aí puder me dar uma luz eu agradeço e muito!

Vlw!!
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

No KEY-COMMIT, antes do COMMIT, você poderia fazer uma query..

Selecionar tudo

Select count(*)
  into vCont
  From CO_DENTISTAS x
where (:CO_DENTISTAS.NOME_DENTISTA   = x.NOME_DENTISTA) 
     and (:CO_DENTISTAS.ESPECIALIDADE = x.ESPECIALIDADE)

  if (nvl(vCont,0) >= 1) then
    raise form_trigger_failure;
  end if;
No seu caso você está validando pelo nome, aí Pedro será diferente de PEDRO, talvez seja o caso de forçar um UPPER nos campos...
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

No forms cria esse bloco, pode ser na trigger WHEN-VALIDATE-ITEM no campo ESPECIALIDADE, dai quando sair deste campo ele valida.

Selecionar tudo

DECLARE 
V_REG NUMBER;
BEGIN
   SELECT COUNT(*)
          INTO V_REG 
          FROM  CO_DENTISTAS T
                WHERE NOME_DENTISTA = :T.NOME_DENTISTA AND  
                      ESPECIELIDADE = :T.ESPECIALIDADE;
          IF V_REG > 0 THEN
            MESSAGE('Dentista já cadastrado para a especialidade');
            RAISE FORM_TRIGGER_FAILURE;
          END IF;
END;
Ou pode criar uma trigger de banco memo, depois é só tratar o erro ao mostrar para o usuário.

Selecionar tudo

CREATE OR REPLACE TRIGGER NOME_TRIGGER
BEFORE INSERT ON CO_DENTISTAS
FOR EACH ROW
DECLARE
V_REG NUMBER(5);
BEGIN
   SELECT COUNT(*)
          INTO V_REG
          FROM CO_DENTISTAS WHERE NOME_DENTISTA = :NEW.NOME_DENTISTA AND ESPECIELIDADE = :NEW.ESPECIELIDADE;
        IF V_REG > 0 THEN
           RAISE_APPLICATION_ERROR(-20000,'Dentista já cadastrado para a especialidade');
        END IF;
END;
ROBSON ROCHA
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 10 Mar 2010 10:20 am
Localização: IGREJINHA

Galera, vlw pela ajuda! Conseguí fazer o troço funcionar da maneira q eu queria! Agradeço à vocês mestres!
falou!
Responder
  • Informação