- Este tópico contém 10 respostas, 5 vozes e foi atualizado pela última vez 16 anos, 9 meses atrás por
Ishii.
-
AutorPosts
-
3 de junho de 2009 às 9:40 pm #87121
evandro_araujo
ParticipantePessoal,
tenho o controle de acesso um sistema de terceiros aqui…..onde cada vez que o funcionario
passa na porta…com o cracha alimenta a tabela forponto.marcacaotenho a seguinte trigger
create or replace trigger T_IA_GERA_H_ENTRADA_NOVO
after insert on forponto.marcacao
for each row
declare
vexist varchar2(1);
vhorrefreal integer;
vdfjorentradanucleo_func integer;
vsetincodigo integer;
vDFFUNCRACHA varchar2(17);
vemail varchar2(200);
vnome varchar2(50);
vsysdate date;
crlf varchar2( 2 ):= CHR( 13 ) || CHR( 10 );
v_mensagem varchar2(800);
— vmarcreal date;
begin
if (:new.coda_cod_coletor <> ’04’ and :new.coda_cod_coletor <> ’01’) and :new.marc_cod_acesso = ’01’ then
begin
IA_P_GERA_H_ENTRADA(:new.marc_cod_cracha,:new.coda_cod_coletor,:new.marc_dat_marcacao);
exception when no_data_found then
null;
end;
end if;end T_IA_GERA_H_ENTRADA_NOVO;
essa trigger ira processar esta procedure (esta procedure dispara um email para o administrador, estou
recebendo este email quando habilito esta trigger), porem a tabela forponto.marcacao na é alimentada,
quando eu desabilito esta trigger a tabela forponto.marcacao volta a alimentar.no aguardo
Evandro
3 de junho de 2009 às 9:49 pm #87124Manoel872
ParticipanteAmigo posta o código da IA_P_GERA_H_ENTRADA e faz um teste comenta a chamada dessa procedure e ativa a trigger, pois se com isso persistir a informação na tabela você já pode afirma que o erro esta na chamada da procedure.
Att,
Manoel.
3 de junho de 2009 às 10:14 pm #87129Marcio68Almeida
ParticipanteAcho que é por que a procedure que envia email não retorna nada e e que chamou fica aguardando…
4 de junho de 2009 às 2:06 pm #87138evandro_araujo
Participantecreate or replace procedure IA_P_GERA_H_ENTRADA(
marc_cod_cracha in varchar2 ,
coda_cod_coletor in varchar2,
marc_dat_marcacao in date) is
vexist varchar2(1);
vhorrefreal integer;
vdfjorentradanucleo_func integer;
vsetincodigo integer;
vDFFUNCRACHA varchar2(17);
vemail varchar2(50);
vnome varchar2(50);
vsysdate date;
crlf varchar2( 2 ):= CHR( 13 ) || CHR( 10 );
v_mensagem varchar2(800);
beginvsysdate:= sysdate; begin select nvl('S','N') into vexist from ia_t_gera_h_entrada t where t.crac_cod_cracha = marc_cod_cracha and to_date(t.marc_dt_marcacao,'dd/mm/yyyy') = to_date(vsysdate,'dd/mm/yyyy');— to_date(t.marc_dt_marcacao,’dd/mm/yyyy’) = to_date(:new.marc_dat_marcacao,’dd/mm/yyyy’);
exception when no_data_found then
vexist := ‘N’;
end;if vexist = 'N' then begin select jor.dfjorentradanucleo, fun.dffunnome into vdfjorentradanucleo_func, vnome from forponto.pfunfpto fun, forponto.pfuhfpto fhor, forponto.phorfpto hor, forponto.phojfpto hjor, forponto.pjorfpto jor where fun.dffuncracha = fhor.dffuncracha and fhor.dfhorcodigo = hor.dfhorcodigo and hor.dfhorcodigo = hjor.dfhorcodigo and hjor.dfjorcodigo = jor.dfjorcodigo and fun.dffunativo = 'S' and hjor.dfhojorigem = 'H' and hjor.dftpdcodigo in ('02','04') and fhor.dffuhinicio = trunc(sysdate) and hjor.dfhojfator = trim(to_char(to_char(trunc(sysdate), 'D'),'000')) and not exists (select * from forponto.pfuafpto aff where fun.dffuncracha = aff.dffuncracha and aff.dfmtvcodigo = '100' ) and to_number(fun.dffuncracha) = to_number(marc_cod_cracha); exception when others then null; end; vhorrefreal := ((to_number(trim(to_char(marc_dat_marcacao,'hh24'))) * 60) + to_number(trim(to_char(marc_dat_marcacao,'mi')))); begin insert into mgia.IA_T_GERA_H_ENTRADA(crac_cod_cracha, coda_cod_coletor, marc_dt_marcacao, marc_hor_marcacao_atual, dfjorentradanucleo_func) values (marc_cod_cracha, coda_cod_coletor, marc_dat_marcacao, vhorrefreal, vdfjorentradanucleo_func); exception when others then null; end;—————————- hora de tolerancia por exemplo 30 minutos
— vhoratolerancia:=5;
— if vhorrefreal > (vdfjorentradanucleo_func+vhoratolerancia) then
if vhorrefreal > (vdfjorentradanucleo_func) then
beginselect E.SET_IN_CODIGO into vsetincodigo from mglan.lan_encarregados E where to_number(E.dffuncracha) = to_number(marc_cod_cracha); exception when others then null; end; begin insert into mgia.IA_T_GERA_PENDENCIA_COLAB(crac_cod_cracha, marc_dt_marcacao, set_in_codigo, status) values( marc_cod_cracha, marc_dat_marcacao, vsetincodigo, 0); exception when others then null; end; begin SELECT P.DFFUNCRACHA INTO vDFFUNCRACHA FROM FORPONTO.PFUNFPTO P, MGLAN.LAN_SETORENC E WHERE P.DFFUNCRACHA=E.ENC_ST_CRACHA AND E.SET_IN_CODIGO=vsetincodigo AND P.DFFUNATIVO = 'S' AND P.DFFUNCRACHA NOT IN(SELECT A.DFFUNCRACHA FROM FORPONTO.PFUAFPTO A WHERE A.DFMTVCODIGO IN('100','101')); exception when others then null; end;—- dbms_output.put_line(‘ valormensal –> ‘ || vDFFUNCRACHA);
begin SELECT l.usu_st_email into vemail FROM MGLAN.LAN_ENCARREGADOS L WHERE L.ENC_ST_TIPO = 'E' AND to_number(L.DFFUNCRACHA) = to_number(vDFFUNCRACHA); exception when others then null; end; v_mensagem := crlf; v_mensagem := v_mensagem || 'Atencao! Atraso de Funcionário! no dia '|| to_char(marc_dat_marcacao) || ''; v_mensagem := v_mensagem || crlf; v_mensagem := v_mensagem || crlf; v_mensagem := v_mensagem || 'Existe atraso do funcionário '|| to_char(vnome) || ' .'; v_mensagem := v_mensagem || crlf; v_mensagem := v_mensagem || 'Favor entrar no sistema Encarregados e avaliar este atraso.'; v_mensagem := v_mensagem || crlf; v_mensagem := v_mensagem || crlf; v_mensagem := v_mensagem || '<<<>>>'; v_mensagem := v_mensagem || crlf; v_mensagem := v_mensagem || crlf; mgia.envio_email(<a href="mailto:'mega@lanmard.local" />'mega@lanmard.local</a>','evandroa@lanmard.local','Atraso de Funcionario!',v_mensagem); ---mgia.envio_email(<a href="mailto:'mega@lanmard.local" />'mega@lanmard.local</a>',vemail,'Atraso de Funcionario!',v_mensagem); end if;—————————–hora de tolerancia por exemplo 30 minutos
end if;
end IA_P_GERA_H_ENTRADA;4 de junho de 2009 às 2:14 pm #87139evandro_araujo
ParticipanteO estranho se eu utilizar a opcao TEST WINDOW do pl sql e tentar incluir uma linha na minha tabela marcacao, acontece que INCLUI a linha normalmente e executa a TRIGGER, so quando vou passar o cracha..ele nao inclui na minha tabela marcacao se a minha TRIGGER tiver habilitada.
4 de junho de 2009 às 3:57 pm #87140Leonardo Litz
ParticipanteCara da uma olhada se não esta dando erro de trigger multante.
Como vc esta fazendo um select na tabela forponto dentro da procedure e a trigger é nesta mesma tabela.
4 de junho de 2009 às 4:32 pm #87142evandro_araujo
ParticipantePessoal,
criei uma trigger assim:
create or replace trigger T_IA_GERA_H_ENTRADA_NOVO1
after insert on forponto.marcacao
for each row
declare
— local variables here
begindbms_output.put_line(' numfuncionarios --> ');end T_IA_GERA_H_ENTRADA_NOVO1;
e estou com o mesmo problema……
help..nao sei mais o que fazer
4 de junho de 2009 às 5:36 pm #87146Ishii
ParticipanteOlá,
Sugiro duas ações simultâneas:
1) Habilite o trace do Client no sqlnet.ora para saber se há algum retorno para o caso do controle de acesso que não seja identificado pelo equipamento;
2) Habilite o trace da Sessão Oracle também para podermos verificar a razão para identificar o motivo deste comportamento estranho.SQLNET.ORA
trace_file_client = log.trc
trace_directory_client = c:
trace_level_client = SUPPORTPara o trace da Sessão pode-se criar uma trigger de logon (depende da versão do Oracle) executando o comando:
alter session set sql_trace = TRUE;Coloque os resultados aqui para uma análise
[]s Ishii
4 de junho de 2009 às 6:18 pm #87148Marcio68Almeida
Participante[quote=”evandro_araujo”:1c140v9k]O estranho se eu utilizar a opcao TEST WINDOW do pl sql e tentar incluir uma linha na minha tabela marcacao, acontece que INCLUI a linha normalmente e executa a TRIGGER, so quando vou passar o cracha..ele nao inclui na minha tabela marcacao se a minha TRIGGER tiver habilitada.[/quote]
Vamos por eliminação…
Se você insere uma linha na mão, a trigger funciona e o processo ocorre sem problemas, correto ?
Se você chama um processo que irá inserir a linha e dá erro, devemos olhar o processo, não a tabela com a trigger…
Acho que o processo está aguardando alguma coisa que acaba não acontecendo.
Faça o que nosso amigo Ishii sugeriu, habilite os traces e veja o que realmetne está acontecendo…5 de junho de 2009 às 2:29 pm #87167evandro_araujo
ParticipantePessoal,
tenho duas perguntas.
1 – Este arquivo sqlnet.ora é o que esta no meu mcro ???Vou acrescentar este comando neste arquivo correto?
2 – Este comando alter session set sql_trace = TRUE; vou executar no sql plus..correto?
5 de junho de 2009 às 3:59 pm #87170Ishii
Participante[quote=”evandro_araujo”:1ai6otd5]Pessoal,
tenho duas perguntas.
1 – Este arquivo sqlnet.ora é o que esta no meu mcro ???Vou acrescentar este comando neste arquivo correto?
2 – Este comando alter session set sql_trace = TRUE; vou executar no sql plus..correto?[/quote]
Olá
1- SQLNET.ORA acho melhor usar o micro que faz a comunicação com o seu equipamento. Se esse equipamento não usa o sqlnet.ora veja como é feita a comunicação dele com o Oracle. Há outras opções de habilitar este trace de client, mas será necessário saber como a conexão é feita.
2-Quem abre a sessão Oracle do Equipamento? Se for um user fixo, você pode criar uma trigger de logon e colocar este comando, assim toda vez que o user logar no Oracle já seta a sessão para sql_trace= true.[]s Ishii
-
AutorPosts
- Você deve fazer login para responder a este tópico.