Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

pa_bruno

Selecionar valor de um campo na tabela

Recommended Posts

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...

Compartilhar este post


Link para o post
Compartilhar em outros sites

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....

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.