Duvida OnValidate

Boa noite galera tenho um problema, revirei os tópicos porem nenhum pode me ajudar
minha duvida é a seguinte

tenho um bd

agenda
campo_hora_ini
campo_hora_fin
campo_data_ini
campo_data_fin
campo_sala

eu preciso que ao inserir um novo compromisso antes teria que verificar se ja não existe um evento no mesmo horario e na mesma sala caso tenha precisa mostra que tem e caso não tenha ele agendasse normalmente

lembrando que se o evento ocorre por exemplo
data inicial 21/05/2015 data final 21/05/2015
hora inicial 10:00 hora final 11:00
sala 01

se alguem tentar incluir um evento na mesma sala porem das 11:00 ao 12:00 a sala tem que estar disponivel

galera se puder me ajudar agradeço um grande abraço

sua questão é de como usar no sc, ou de coo fazer a pesquisa para saber se ja existe?

Como fazer este script
obrigado pela resposta

qual instrução sql vc usaria para fazer a pesquisa no banco para saber se já existe o registro ou não?

eu daria um SELEC pore exemplo
não sei se esta correto
SELECT campo_hora_ini,
campo_hora_fin,
campo_data_ini,
campo_data_fin,
campo_sala
FROM agenda

o Campo chave unica resolveria pra mim porem como o proprio nome diz unica eu não vou conseguir inserir em horarios diferente na mesma sala caso ela ja tenho sido escolhida

Entendi, a sua duvida é como montar o sql.
Disponha a estrutura da sua tabela aqui para que possamos lhe ajudar.

Bom dia Haroldo

Minha tabela esta assim

agenda
campo_id int pk
campo_hora_ini = time
campo_hora_fin = time
campo_data_ini = date
campo_data_fin = date
campo_sala = int

acredito que não estou conseguindo achar a logica
não necessita dar diretamente a resposta mas se puder me ajudar onde acha-la ou o que estudar eu ja agradeceria

e os indices?

indice esta no campo sala

Formulei a query abaixo. Espero que lhe ajude. Montei essa query no banco Oracle. Os comandos podem variar conforme o banco, mas a lógica é a mesma:

select *
from (
/* Essa SubQuery serve apenas para simular a sua tabela*/
select 1 agenda
, 1 campo_id
, to_date(‘08:00’,‘hh24:mi’) campo_hora_ini
, to_date(‘11:00’,‘hh24:mi’) campo_hora_fin
, to_date(‘22/05/2015’,‘dd/mm/rrrr’) campo_data_ini
, to_date(‘22/05/2015’,‘dd/mm/rrrr’) campo_data_fin
, ‘01’ campo_sala
from dual
)
where to_date(‘22/05/2015’,‘dd/mm/rrrr’) between campo_data_ini and campo_data_fin /* verifica se há registro para essa data /
and (
(
to_date(‘14:00’,‘hh24:mi’) > campo_hora_ini /
comparando se a data inicial do agendamento é maior que algum outro campo_hora_ini existente /
and to_date(‘14:00’,‘hh24:mi’) < campo_hora_fin /
comparando se a data inicial do agendamento é menor que algum outro campo_hora_fin existente /
)
or
(
to_date(‘16:00’,‘hh24:mi’) > campo_hora_ini /
comparando se a data final do agendamento é maior que algum outro campo_hora_ini existente /
and to_date(‘16:00’,‘hh24:mi’) < campo_hora_fin /
comparando se a data final do agendamento é maior que algum outro campo_hora_ini existente /
)
or
(
campo_hora_ini between to_date(‘14:00’,‘hh24:mi’) and to_date(‘16:00’,‘hh24:mi’) /
comparando se existe algum campo_hora_ini dentro do período de agendamento informado pelo usuário /
and campo_hora_fin between to_date(‘14:00’,‘hh24:mi’) and to_date(‘16:00’,‘hh24:mi’) /
comparando se existe algum campo_hora_fin dentro do período de agendamento informado pelo usuário */
)
)

Faça testes trocando os valores das horas / datas. Do jeito que está acima, a query não retornará dados e isso significa que não existe compromissos existentes para esse período, permitindo que seja agendado esse horário.

Considere alterar o tipo dos teus campos para datetime.
Se fossem tipo datetime, bastaria fazer o seguinte SQL para determinar se há algum agendamento dando choque:
SELECT count(*)
FROM Tabela
WHERE CampoDataDoFormulario BETWEEN Campo_data_ini AND Campo_data_fim
AND CampoSalaDoFormulario = campo_sala

[]s