Ir para conteúdo

POWERED BY:

Arquivado

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

Maykel-ctba

Não está trazendo alguns registros

Recommended Posts

Fala povo,

 

Seguinte, eu estou montando um gerenciador de trabalhos aqui na agência, e funciona da seguinte forma:

 

- usuarios (que são funcionários)

- jobs (os trabalhos)

- jobs_usuarios (tabela que liga um trabalho a um funcionario.)

 

Tive que criar esta ultima tabela pois um trabalho pode pertencer a mais de um usuário, ok?

 

Pois então, na hora de exibir, não estou conseguindo exibir para mais de uma pessoa. Cada pessoa tem um login (acesso restrito), onde faço uma determinada consulta para ver quais trabalhos aquela pessoa tem para fazer.

 

A consulta hoje, está assim:

 

SELECT jbu.*, job.*
FROM sistema_job_usuario jbu, sistema_job job
WHERE job.jobId = jbu.jobId 
AND jbu.usuId = 2 
AND jbu.jobUsuInativo = 'N' 
AND jbu.jobSituacao <> 3 
AND jbu.jbuId = ( SELECT MAX(jb2.jbuId) FROM sistema_job_usuario jb2 WHERE jbu.jobId = jb2.jobId ) ORDER BY job.jobPrioridade ASC, job.jobOrdem ASC 

 

 

E retornam 2 registros. Pois bem, deveriam retornar 5.

 

E não consigo entender o porquê! Sendo que existem 5 trabalhos cadastrados para o usuário de ID 2.

 

Tabela sistema_job

CREATE TABLE IF NOT EXISTS `sistema_job` (
  `jobId` int(5) NOT NULL AUTO_INCREMENT,
  `jobDataEntrada` datetime NOT NULL,
  `conId` int(5) NOT NULL COMMENT 'ID Contato (Solicitante)',
  `jobTipo` int(5) NOT NULL,
  `jobPrioridade` enum('B','M','A') NOT NULL,
  `jobOrdem` int(2) NOT NULL,
  `pecId` int(5) NOT NULL COMMENT 'ID Peça',
  `forId` int(1) NOT NULL,
  `jobEtapa` int(1) NOT NULL,
  `jobFinalizado` enum('S','N') NOT NULL,
  `jobDataFechamento` datetime NOT NULL,
  `jobBriefing` text NOT NULL,
  `jobExcluido` enum('S','N') NOT NULL,
  PRIMARY KEY (`jobId`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;

--
-- Dumping data for table `sistema_job`
--

INSERT INTO `sistema_job` (`jobId`, `jobDataEntrada`, `conId`, `jobTipo`, `jobPrioridade`, `jobOrdem`, `pecId`, `forId`, `jobEtapa`, `jobFinalizado`, `jobDataFechamento`, `jobBriefing`, `jobExcluido`) VALUES
(1, '2013-05-15 13:13:00', 5, 1, 'M', 2, 27, 16, 2, 'N', '0000-00-00 00:00:00', 'Verificar briefing em e-mail', 'N'),
(2, '2013-05-15 10:54:00', 5, 1, 'M', 3, 27, 16, 2, 'N', '0000-00-00 00:00:00', '', 'N'),
(3, '2013-05-15 10:54:00', 5, 1, 'M', 4, 27, 16, 2, 'N', '0000-00-00 00:00:00', '', 'N'),
(4, '2013-05-15 10:58:00', 12, 3, 'M', 5, 41, 16, 4, 'N', '0000-00-00 00:00:00', '', 'N'),
(5, '2013-05-15 11:00:00', 5, 1, 'A', 1, 13, 16, 4, 'N', '0000-00-00 00:00:00', '', 'N'),
(6, '2013-05-15 11:02:00', 5, 3, 'A', 1, 56, 4, 4, 'N', '0000-00-00 00:00:00', '', 'N'),
(7, '2013-05-15 11:02:00', 5, 3, 'A', 2, 9, 4, 4, 'N', '0000-00-00 00:00:00', '', 'N');

 

 

Tabela sistema_job_usuario

--
-- Table structure for table `sistema_job_usuario`
--

CREATE TABLE IF NOT EXISTS `sistema_job_usuario` (
  `jbuId` int(5) NOT NULL AUTO_INCREMENT,
  `usuId` int(5) NOT NULL,
  `usuInteracao` enum('R','P') NOT NULL COMMENT 'R = Responsavel pelo job / P = Participante',
  `jobId` int(5) NOT NULL,
  `jobDataInicio` datetime NOT NULL,
  `jobDataFim` datetime NOT NULL,
  `jobSituacao` int(1) NOT NULL COMMENT '0 = Não iniciado / 1 = Andamento / 2 = Aprovação / 3 = Finalizado / 4 = Suspenso',
  `jobMotivoPausa` int(1) NOT NULL,
  `jobUsuInativo` enum('S','N') NOT NULL COMMENT 'Caso o profissional saia do job no meio, não exclui, apenas muda o status para que não perca as horas que ele já trabalhou.',
  `jobAcrescimo` int(10) NOT NULL,
  PRIMARY KEY (`jbuId`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;

--
-- Dumping data for table `sistema_job_usuario`
--

INSERT INTO `sistema_job_usuario` (`jbuId`, `usuId`, `usuInteracao`, `jobId`, `jobDataInicio`, `jobDataFim`, `jobSituacao`, `jobMotivoPausa`, `jobUsuInativo`, `jobAcrescimo`) VALUES
(1, 2, 'R', 1, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 0, 0, 'N', 0),
(2, 6, 'P', 1, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 0, 0, 'S', 0),
(3, 2, 'R', 2, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 0, 0, 'N', 0),
(4, 6, 'P', 2, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 0, 0, 'N', 0),
(5, 2, 'R', 3, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 0, 0, 'N', 0),
(6, 6, 'P', 3, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 0, 0, 'N', 0),
(7, 2, 'R', 4, '2013-05-15 11:12:41', '2013-05-15 11:13:37', 4, 2, 'N', 0),
(8, 2, 'R', 5, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 0, 0, 'N', 0),
(9, 1, 'R', 6, '2013-05-15 11:04:41', '2013-05-15 13:20:46', 4, 2, 'N', 0),
(10, 1, 'R', 7, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 0, 0, 'N', 0),
(11, 6, 'P', 1, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 0, 0, 'N', 0);

 

Alguma luz? Ou de repente, outra solução. :innocent:



PS: Isso acontece apenas quando tenho 2 funcionários vinculados a um trabalho. Apenas um dos funcionários vê o trabalho, o outro não. Nos trabalhos que tem apenas um funcionário, funciona normal!

Compartilhar este post


Link para o post
Compartilhar em outros sites

a linha

 

AND jbu.jbuId = ( SELECT MAX(jb2.jbuId) FROM sistema_job_usuario jb2 WHERE jbu.jobId = jb2.jobId ) ORDER BY job.jobPrioridade ASC, job.jobOrdem ASC 

 

faz com que só traga o maior jbuId , não ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é.

 

Na verdade essa não foi uma solução que deu certo, me passaram num outro tópico: http://forum.imasters.com.br/topic/492058-ordenar-group-by-possivel/ e até postei lá, mas o tópico morreu. Fui usando e acabei me deparando com esse problema.

 

Funciona assim:

 

Para cada alteração no trabalho, é criado um novo jbuId.

 

Porém, preciso mostrar apenas o último jbuId cadastrado daquele jobId. Não sei se fui claro, rs.

Para um funcionário está mostrando, mas para outro, não. E não entendi a logica deste select max... :upset:

Compartilhar este post


Link para o post
Compartilhar em outros sites

o último jbuId cadastrado

faria sentido o MAX

 

 

E não entendi a logica deste select max

 

a sub query obtem o maior valor de jbuId por jobId e a query principal compara com este para só exibir o maior

 

--------------------

 

Todo sistema_job tem sistema_job_usuario !?

 

Se não pode ser o caso de usar outer joins.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, todos job tem ao menos um usuário! O problema acontece quando há mais de um.

 

A principio não sei aplicar este outer join. Vou dar uma olhada com calma neste link e respondo a noite... obrigado Motta!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema acontece quando há mais de um

 

não creio, me parece que é quando não há nenhum.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Motta, retomando...

 

Vou explicar um pouco mais da minha consulta, e o que acontece... depois quero tirar uma dúvidazinha:

 

SELECT jbu.*, job.* FROM sistema_job_usuario jbu, sistema_job job // Pega tudo das 2 tables
WHERE job.jobId = jbu.jobId // Une os jobId
AND jbu.usuId = 1 // Usuário deve ser 1 (Maykel)
AND jbu.jobUsuInativo = 'N' // Deve ser um usuário ativo no trabalho
AND jbu.jobSituacao <> 3 // Situação deve ser diferente de 3, ou seja, o trabalho está em andamento
AND job.jobExcluido = 'N' // Não deve ser um trabalho excluído 
AND jbu.jbuId = ( SELECT MAX(jb2.jbuId) FROM sistema_job_usuario jb2 WHERE jbu.jobId = jb2.jobId AND jobUsuInativo = 'N' ) // Sempre traz o último jbuId, pois para cada jobId, existem vários jbuId (Cada pausa, reinício do trabalho é criado um novo jbuId para contabilizar as horas trabalhadas)

 

 

Esta consulta hoje, está retornando 3 trabalhos. Poréeeem, tenho um trabalho (jobId) que está cadastrado para duas pessoas. Esta outra pessoa (ID 8) está vendo. Ou seja, ao trocar o usuId para 8, ele retorna este job, que eu também deveria ver.

 

Se eu tiro o SELECT MAX, eu vejo todos os jbuId, consequentemente mostra todos os trabalhos certos, mas não ~agrupam~ os jbuId em um jobId, entendeu? Eu não quero mostrar todos os jbuId, apenas o mais recente. Porém está dando essa zica.

 

Agora a dúvida é: Este outer join deve ser aplicado como? Nunca fiz um, vou tentar aqui, mas se puder me dar um caminho, ficaria bem feliz :yes:

Compartilhar este post


Link para o post
Compartilhar em outros sites

tenho um trabalho (jobId) que está cadastrado para duas pessoas.

 

Isto seria erro de cadastro ?

 

Como sistema_job_usuario jbu se relaciona a sistema_job ? Todos os campos foram informados no where ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não não... um trabalho pode ter vários funcionários envolvidos.

Claro que, estão cadastrados "separados".

 

Na tabela sistema_job, tem os detalhes do trabalho. (1 registro por trabalho)

Na tabela sistema_job_usuario tem a ligação entre o usuId e o jobId. (1 registro por funcionário... se um trabalho tem 2 funcionarios, aqui viriam 2 registros, contendo o ID do trabalho e o ID do funcionário)

 

Sim, todos os campos necessários estão aí no WHERE. Eu complementaria depois com algumas outras tabelas para trazer, por exemplo o nome do usuário ao invés do ID. A consulta completa é esta:

 

SELECT jbu.*, job.*, usu.usuNome, con.conNome, cli.cliNome, pec.pecNome 

FROM sistema_job_usuario jbu, sistema_usuario usu, sistema_job job, sistema_peca pec, sistema_contato con, sistema_cliente cli 

WHERE usu.usuId = jbu.usuId 
AND job.jobId = jbu.jobId 
AND pec.pecId = job.pecId 
AND con.conId = job.conId 
AND cli.cliId = con.cliId 
AND jbu.usuId = 1 
AND jbu.jobUsuInativo = 'N' 
AND jbu.jobSituacao <> 3 
AND job.jobExcluido = 'N' 
AND jbu.jbuId = ( SELECT MAX(jb2.jbuId) FROM sistema_job_usuario jb2 WHERE jbu.jobId = jb2.jobId AND jobUsuInativo = 'N' ) 

ORDER BY job.jobPrioridade DESC, job.jobOrdem ASC

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente

...
AND jbu.jbuId = 
( SELECT MAX(jb2.jbuId) 
  FROM sistema_job_usuario jb2 
  WHERE jbu.jobId = jb2.jobId 
  AND jbu.usuId = jb2.usuId  /*incluí isto*/
  AND jobUsuInativo = 'N' ) 
...

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.