Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Falae pessoal... tenho uma procedure q eh pra armazenar numa tabela, os parâmetros enviados via formulário. Até ae beleza... A procedure está funcionando corretamente, mas só que quando um horario estivesr cadastrado, ele naum pode ser informado novamente... E ele não está fazendo isso... Está passando por cima... Gravando no lugar da existente. Segue a procedure:
(in_login IN VARCHAR2,in_tipo_horario IN CHAR)asv_usuario NUMBER(10);v_horario DATE;begin-- Verifica se o usuário já apontou alguma hora no dia atualSELECT SUM(1) INTO v_usuarioFROM TB_HORARIOWHERE TO_CHAR(DT_DIA, 'dd/MM/yyyy') = TO_CHAR(SYSDATE, 'dd/MM/yyyy')AND SQ_USUARIO = in_login;-- Se for EntradaIF (v_usuario IS NULL) THEN IF (UPPER(in_tipo_horario) = 'E') THEN htp.p('Cadastrando hora de entrada '); INSERT INTO TB_HORARIO(DT_DIA, SQ_USUARIO, HR_ENTRADA) VALUES (SYSDATE, in_login, SYSDATE ); ELSIF (UPPER(in_tipo_horario) = 'A') THEN htp.p('Cadastrando hora de almoco '); INSERT INTO TB_HORARIO(DT_DIA, SQ_USUARIO, HR_ALMOCO) VALUES (SYSDATE, in_login, SYSDATE ); ELSIF (UPPER(in_tipo_horario) = 'R') THEN htp.p('Cadastrando hora de retorno '); INSERT INTO TB_HORARIO(DT_DIA, SQ_USUARIO, HR_RETORNO) VALUES (SYSDATE, in_login, SYSDATE ); ELSIF (UPPER(in_tipo_horario) = 'S') THEN htp.p('Cadastrando hora de saida '); INSERT INTO TB_HORARIO(DT_DIA, SQ_USUARIO, HR_SAIDA) VALUES (SYSDATE, in_login, SYSDATE ); END IF;ELSE IF (UPPER(in_tipo_horario) = 'E') THEN htp.p('Inserindo hora de entrada '); SELECT HR_ENTRADA INTO v_horario FROM TB_HORARIO WHERE TO_CHAR(DT_DIA, 'dd/MM/yyyy') = TO_CHAR(SYSDATE, 'dd/MM/yyyy') AND HR_ENTRADA IS NULL AND SQ_USUARIO = in_login; UPDATE TB_HORARIO SET HR_ENTRADA = SYSDATE WHERE SQ_USUARIO = in_login; ELSIF (UPPER(in_tipo_horario) = 'A') THEN htp.p('Inserindo hora de almoco '); SELECT HR_ALMOCO INTO v_horario FROM TB_HORARIO WHERE TO_CHAR(DT_DIA, 'dd/MM/yyyy') = TO_CHAR(SYSDATE, 'dd/MM/yyyy') AND HR_ALMOCO IS NULL AND SQ_USUARIO = in_login; UPDATE TB_HORARIO SET HR_ALMOCO = SYSDATE WHERE SQ_USUARIO = in_login; ELSIF (UPPER(in_tipo_horario) = 'R') THEN htp.p('Inserindo hora de retorno '); SELECT HR_RETORNO INTO v_horario FROM TB_HORARIO WHERE TO_CHAR(DT_DIA, 'dd/MM/yyyy') = TO_CHAR(SYSDATE, 'dd/MM/yyyy') AND HR_RETORNO IS NULL AND SQ_USUARIO = in_login; UPDATE TB_HORARIO SET HR_RETORNO = SYSDATE WHERE SQ_USUARIO = in_login; ELSIF (UPPER(in_tipo_horario) = 'S') THEN htp.p('Inserindo hora de saida '); SELECT HR_SAIDA INTO v_horario FROM TB_HORARIO WHERE TO_CHAR(DT_DIA, 'dd/MM/yyyy') = TO_CHAR(SYSDATE, 'dd/MM/yyyy') AND HR_SAIDA IS NULL AND SQ_USUARIO = in_login; UPDATE TB_HORARIO SET HR_SAIDA = SYSDATE WHERE SQ_USUARIO = in_login; END IF; END IF; COMMIT; htp.p('Enviado com sucesso'); exceptionwhen others then null;end;São quatro tipo de horário: entrada, almoço, retorno e saída. E como um bate ponto, uma Gerência de Horário. Estou começando com essa parada, estou há um mês somente e mexendo com Oracle Portal e não diretamente com o Oracle, etc... Queria saber como faria pra saber se tal campo na tabela está vazio, caso estivesse, grava, senão, não grava...
Brigadão ae galera...
Cara,
Tive que implementar algo parecido com o seu sisteminha de ponto tb, fiz a procedure da seguinte forma, esta bem simples:
CREATE OR REPLACE PROCEDURE inserir_ponto_2edicao(TIPO_IN CHAR, NOME_IN VARCHAR2)
AS
--
-- TIPO_IN = VALOR QUE SERVE PARA VERIFICAR SE O PONTO FOI DE ENTRADA('E') OU SAIDA('S')
-- NOME_IN = VARIAVEL QUE RECEBE O NOME DO FUNCIONARIO
--
BEGIN
DECLARE
QTDE CHAR(1);
QTDE_ENTRADA INTEGER;
BEGIN
--
-- VERIFICANDO SE O PONTO FOI O DE ENTRADA OU SAIDA
--
-- ENTRADA
--
IF (TIPO_IN = 'E') THEN
BEGIN
--
-- VERIFICANDO SE O FUNCIONARIO DEU UM PONTO DE ENTRADA NO DIA SEM DAR UMA SAIDA
--
BEGIN
SELECT COUNT(*) INTO QTDE_ENTRADA FROM T_PONTO WHERE NOME = NOME_IN AND
TO_CHAR(DATA,'DDMMYYYY') = TO_CHAR(SYSDATE, 'DDMMYYYY') AND DATA_SAIDA IS NULL;
EXCEPTION WHEN NO_DATA_FOUND THEN
QTDE_ENTRADA := 0;
END;
--
-- CASO FUNCIONARIO NAO TENHA DADO PONTO UM NOVO PONTO SERA DADO
--
IF(QTDE_ENTRADA = 0) THEN
INSERT INTO T_PONTO (NOME, DATA) VALUES(NOME_IN, SYSDATE);
ELSE
DBMS_OUTPUT.PUT_LINE('ERRO: SEU PONTO DE ENTRADA NESTE TURNO JA FOI DADO.');
END IF;
END;
--
-- PONTO DE SAIDA
--
ELSE
BEGIN
UPDATE T_PONTO SET DATA_SAIDA = SYSDATE
WHERE NOME = NOME_IN AND
TO_CHAR(DATA, 'DDMMYYYY') = TO_CHAR(SYSDATE, 'DDMMYYYY') AND
DATA_SAIDA IS NULL;
END;
END IF;
COMMIT;
END;
END;
/
Espero que ajude!
http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
Cara....não sei se cons entender muito bem o que você quer. A intenbção é somente verificar se o campo está vazio antes de fazer a atualização? Se for isso, acho que você pode fazer da seguinte forma: -- Seleciona o campo hr_saida select hr_saida into v_horario from tb_horario where to_char(dt_dia, 'dd/MM/yyyy') = to_char(sysdate, 'dd/MM/yyyy') and sq_usuario = in_login; -- Atualiza somente se o campo não for nulo if v_horario is not null then update TB_HORARIO set HR_SAIDA = SYSDATE where SQ_USUARIO = in_login; end if;Obs.: Se você não quiser fazer com "if", pode ser feito utilizando as exceptions da query.Não sei se era exatamente isso que você queria?Flw....
falae rafael... mas se eu fizer assim, acontece o q está acontecendo... ele atualiza a hora incluída... e isso naum pode... uma pessoa naum pode inserir mais d uma vez o horario d entrada, almoço, retorno ou saída... eh soh isso q quero... se ele jah inseriu o horário (entrada ou almoço ou retorno ou saída), este mesmo horário naum pode ser inserido novamente... soh qnd mudar o dia... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
Fala Bruno.....seguinte, vamos tentar analisar o teu problema.
**Primeiro é feito um select TB_HORARIO para verificar se o usuário já inseriu algum horário no dia, certo?**
SELECT SUM(1) INTO v_usuario
FROM TB_HORARIO
WHERE TO_CHAR(DT_DIA, 'dd/MM/yyyy') = TO_CHAR(SYSDATE, 'dd/MM/yyyy')
AND SQ_USUARIO = in_login;
Logo depois vem o teste para ver se encontrou alguma coisa na consulta, certo?
-- Se for Entrada
IF (v_usuario IS NULL) THEN
Mais abaixo existe o else que é nde se encontra o nosso problema
ELSE - se o cara já inseriu alguma coisa cai aqui, certo?
aqui vem o teste para ver qual o tipo de horário a ser armazenado, certo? Vamos imaginar que seja a saída.
IF (UPPER(in_tipo_horario) = 'E') THEN
ELSIF (UPPER(in_tipo_horario) = 'A') THEN
ELSIF (UPPER(in_tipo_horario) = 'R') THEN
ELSIF (UPPER(in_tipo_horario) = 'S') THEN
**Tudo berm, se chegamos até aqui é porque o usuário já inseriu alguma hora do ponto no dia de hj! Então vamo verificar se a hora que ele inseriu não foi a saída. Para isso vamos fazer um select na tabela TB_HORARIO passando como parâmetro o login do cara e o dia (tiramos apensa o AND HR_SAIDA IS NULL do teu select original) e temos:**
** Ao final do texto estou passando o teu select original para você ver qual linha foi retirada.**
SELECT HR_SAIDA INTO v_horario
FROM TB_HORARIO
WHERE TO_CHAR(DT_DIA, 'dd/MM/yyyy') = TO_CHAR(SYSDATE, 'dd/MM/yyyy')
AND SQ_USUARIO = in_login;
** Neste select existe um registro e o valor do campo horário será retornado para a variável v_horário. Agora precisamos verificar se a variável que contém o valor do campo hr_saida (v_horario) está nula.**
if v_horario is not null then
Se entrar aqui é pq a variável está nula e, conseqüentemente, o campo da tabela, então, atualizamos. Se a variável(campo da tabela) não estiver nula, ele não entra aqui e não atualiza.
update TB_HORARIO
set HR_SAIDA = SYSDATE
where SQ_USUARIO = in_login;
end if;
END IF;
Este controle deve ser feito para todos os teus horários (entrada, saída, etc..)
SELECT HR_SAIDA INTO v_horario
FROM TB_HORARIO
WHERE TO_CHAR(DT_DIA, 'dd/MM/yyyy') = TO_CHAR(SYSDATE, 'dd/MM/yyyy')
**AND HR_SAIDA IS NULL** --> esta linha foi retirada do select.
AND SQ_USUARIO = in_login;
Já que você falou no outro e-mail que estava começando, posso dar uma sugestão?
Bom, lá vai: é interessante sempre que você fizer um select, update, insert usar as exceptions e fazer no mínimo o tratamento de erros other. ex:
begin
select coluna
from tabela
where cd_coluna = valor
exception
when other then
mensagem de erro || sqlerrm;
end;
Caso ocorra algum erro, ele será exibido.
É isso aí.....abraço!
falae rafael... brigadaum ae pela dica... vou testar aqui e posto o resultado... entendi bem o q você disse sim... ;)
estou começando sim... a procedure está apenas começando... pretendo colocar umas exceptions tb, mas to começando aos poucos... pra depois ir colocando mais coisas... ;)
brigadaum ae novamente... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
falae rafael... funcionou aki, depois de umas modificações aki q eu fiz... tinha q ser IS NULL e naum IS NOT NULL, senão ele colocava no campo se estivesse preenchido... e eu queria ao contrário... ainda farei alguns testes aki para confirmar se está sobescrevendo ou naum...
e outra coisa q estava acontecendo, eh q ele atualizava todos os campos q tinha o nome do usuário passado... ae coloquei o:
WHERE TO_CHAR(DT_DIA, 'dd/MM/yyyy') = TO_CHAR(SYSDATE, 'dd/MM/yyyy') naquele update... ;)
brigadaum ae rapaz...
Cara....não sei se cons entender muito bem o que você quer. A intenbção é somente verificar se o campo está vazio antes de fazer a atualização? Se for isso, acho que você pode fazer da seguinte forma: -- Seleciona o campo hr_saida select hr_saida into v_horario from tb_horario where to_char(dt_dia, 'dd/MM/yyyy') = to_char(sysdate, 'dd/MM/yyyy') and sq_usuario = in_login; -- Atualiza somente se o campo não for nulo if v_horario is not null then update TB_HORARIO set HR_SAIDA = SYSDATE where SQ_USUARIO = in_login; end if;Obs.: Se você não quiser fazer com "if", pode ser feito utilizando as exceptions da query.Não sei se era exatamente isso que você queria?Flw....