Uma consulta que não dá certo de jeito nenhum

1 resposta
d34d_d3v1l

Boa tarde gente...

O caso é o seguinte:
Estou criando um select para consultar funcionários desocupados...

Eu tenho as seguintes tabelas:

OrdemServico,

Parceiro_Comercial (dentro desta tabela tem as colunas funcionario, cliente e fornecedor todas do tipo boolean pra saber qual é o tipo de cada parceiro) e

funcionarioServico (contendo apenas idOrdemServico e idparceiroComercial)

Eu preciso fazer uma consulta em que o usuário vai digitar uma data inicial, uma data final, uma hora inicial e uma hora final e a consulta teria que
mostrar apenas os parceiros do tipo funcionario que estariam livres nesses dias. Se o funcionario estivesse vinculado a uma ordem de servico que batessem com
as datas digitadas pelo funcionario então o sistema naum retornaria estes funcionarios.

eu consegui criar um select e por um momento cheguei a pensar que estava perfeito porem eu encontrei um erro...
a consulta retornava os funcionarios que naum estavao vinculados a nenhuma ordem de servico pq obviamente eles estariam livres e mostrava tambem
os que estavam vinculados em ordem de servico que o horario naum batia mas o erro foi que se o funcionario 1 estivesse vinculado com a ordem de servico 1 e 4
no qual as datas da ordem de servico 1 não bateriam, porem as datas da ordem de servico quatro bateria o sistema retornava o funcionario como se ele estivesse livre,
sendo que neste caso ele não poderia retornar este funcionario...

a consulta que eu fiz foi a seguinte:

select pc.idparceiro,pc.nome 
from parceiro_comercial as pc, ordemServico as os, funcionarioServico as fs
where pc.funcionario = 'true' and pc.deletado = 'false' and 
(fs.idparceiro = pc.idparceiro and fs.idordemservico = os.idordemServico)
and os.idordemservico in (select o.idordemservico from ordemservico as o
			where ('2011-10-27' > o.datafim) or ('2011-10-29' < o.dataInicio) 
				or ('2011-10-27' = o.datafim and '06:00' >= o.horafim and (o.status = 'Em andamento' or o.status = 'Confirmado') )
				or ('2011-10-29' = o.datainicio and '17:00' <= o.horainicio and (o.status = 'Em andamento' or o.status = 'Confirmado')))
					


union


select pc.idparceiro,pc.nome from parceiro_comercial as pc where pc.funcionario = true AND pc.deletado = false AND
pc.idparceiro not in (select idparceiro from funcionarioservico)

esperam que consigam me ajudar
abrass..

1 Resposta

fantomas

Baseado no que entendi da sua explicação fiz este código, talvez ajude a acender uma luz.

select pc.idparceiro,pc.nome from parceiro_comercial as pc where pc.funcionario = 'true' and pc.deletado = 'false' and ( NOT pc.idparceiro in (select fs.idparceiro from funcionarioServico fs where fs.idparceiro = pc.idparceiro ) or NOT pc.idparceiro in (select fs.idparceiro from funcionarioServico as fs ,ordemservico as o where fs.idparceiro = pc.idparceiro and fs.idordemservico = os.idordemServico and o.dataInicio >= '2011-10-27' and o.datafim <= '2011-10-29' and o.horainicio >= '06:00' and o.horafim <= '17:00' and (o.status = 'Confirmado' or o.status = 'Em andamento' )))

Entendi que a tabela funcionarioServico é a associação entre os funcionários e as ordens de serviços, se isto for verdade então a sua instrução deve aceitar como verdade a ausencia de registros relacionados aos parametros informados; neste casos utilizei o NOT. O primeiro NOT admite a hipotese de que um funcionario começou a trabalhar recentimente e ainda não tem nenhuma ordem de serviço vinculada a ele.

O segundo NOT é para aqueles casos onde o funcionario já atendeu algumas ordens de serviços porem elas já foram fechadas (ver tipos de status); se o funcionario estiver vinculado a alguma ordem de serviço que esteja com status de “Confirmado” ou “Em andamento” tera que ser ignorado (por causa do NOT).

flws

Criado 30 de outubro de 2011
Ultima resposta 31 de out. de 2011
Respostas 1
Participantes 2