RESOLVIDO: Criar SQL

Bom dia a todos e todas.

Estou sem conseguir criar um SQL para uma consulta e gostaria da ajuda dos colegas mais experientes.

  • Tenho uma tabela (tbObjAp) de objetos apreendidos.

CAMPOS
idObjAp (chave)
nomObjAp

  • Tenho uma tabela (tbObjApMov) do movimento dos onjetos apreendidos

CAMPOS
idObjApMov (chave)
idObjAp (chave)
nomMov
dtaMov

  • Cadastro o objeto na primeira tabela e em seguida cadastro o movimento daquele objeto na segunda tabela, pois um objeto pode ter vários movimentos
    que são: APREENDIDO; DEVOLVIDO; ENCAMINHADO, ETC, e cada movimento com uma data diferente.

A estrutura fica assim:

[table]
[tr]
[td]tbObjAp[/td]
[/tr]
[tr]
[td]idObjAp[/td][td]nomObjAp[/td]
[/tr]
[tr]
[td]1[/td][td]REVÓLVER[/td]
[/tr]
[tr]
[td]2[/td][td]MACONHA[/td]
[/tr]
[tr]
[td]3[/td][td]VEÍCULO[/td]
[/tr]
[/table]
///////////////////////////////////////////
[table]
[tr]
[td]tbObjApMov[/td]
[/tr]
[tr]
[td]idObjApMov[/td][td]idObjAp[/td][td]nomMov[/td][td]dtaMov[/td]
[/tr]
[tr]
[td]1[/td][td]1[/td][td]APREENDIDO[/td][td]10/06/2016[/td]
[/tr]
[tr]
[td]2[/td][td]1[/td][td]ENVIADO IC[/td][td]11/06/2016[/td]
[/tr]
[tr]
[td]3[/td][td]2[/td][td]APREENDIDO[/td][td]01/05/2016[/td]
[/tr]
[tr]
[td]4[/td][td]2[/td][td]ENVIADO MP[/td][td]15/05/2016[/td]
[/tr]
[tr]
[td]5[/td][td]3[/td][td]APREENDIDO[/td][td]07/02/2016[/td]
[/tr]
[/table]

  • No exemplo acima gostaria de montar a grid para mostrar o objeto apreendido e a última movimentação dele usando para isso a data mais recente.
    Ficaria assim:

[table]
[tr]
[td]OBJETO[/td][td]SITUAÇÃO[/td][td]DATA
[/td][/tr]
[tr]
[td]REVÓLVER[/td][td]ENVIADO IC[/td][td]11/06/2016[/td]
[/tr]
[tr]
[td]MACONHA[/td][td]ENVIADO MP[/td][td]15/05/2016[/td]
[/tr]
[tr]
[td]VEÍCULO[/td][td]APREENDIDO[/td][td]07/02/2016[/td]
[/tr]
[/table]

Aí está a minha dificuldade. Como montar o SQL para mostrar apenas um registro de cada objeto, sendo sempre o de último movimento (dtaMov).

Espero ter conseguido explicar, e aguardo a ajuda dos colegas.

Obrigado.

sc_lookup(DS, “SELECT idObjApMov,idObjAp,nomMov,dtaMov
FROM tbObjApMov
ORDER BY dtaMov DESC”)

** Aí está a minha dificuldade. Como montar o SQL para mostrar apenas um registro de cada objeto, sendo sempre o de último movimento (dtaMov). **

Na configuracao do grid, vc pode colocar quantos registros por pagina.

Obrigado pela ajuda pessanha, mas da forma que o amigo sugeriu eu vou trazer todos os registros. O que eu preciso é do último movimento de casa objeto. Obrigado.

Tente assim:

sc_lookup(DS, “SELECT idObjApMov,idObjAp,nomMov,dtaMov
FROM tbObjApMov
ORDER BY dtaMov DESC LIMIT 0,1”)

Obrigado Kleiber.
Da forma que o amigo sugeriu retorna apenas um registro, aquele com data mais recente. A necessidade seria um registro de cada objeto com a data mais recente. Obrigado pela sua ajuda. Vou continuar tentando por aqui e se o amigo tiver outras dicas eu fico grato. Obrigado.

SELECT idObjApMov,idObjAp,nomMov,
MAX (dtaMov) FROM tbObjApMov
GROUP BY idObjAp

Eita pessanha. Estais perto. Fiz o teste e realmente só trouxe um registro de cada objeto, com a data mais recente, porém o campo nomMov veio o mesmo (APREENDIDO)para todos os registros. Obrigado.

Estou pesquisando por aqui… Tbm tenho interesse nesta solucao. …

Valeu eu tb estou queimando os restos de neurônios por aqui.

Que tal:

SELECT idObjApMov,idObjAp,nomMov,
MAX (dtaMov) FROM tbObjApMov
GROUP BY dtaMov

OBS.: Não testei…

Oi Kleyber. Ainda não. Desta forma repete o objeto. Obrigado. Vou tentando por aqui.

SELECT
tbObjAp.nomObjAp,
idObjApMov.nomMov,
Max(idObjApMov.dtaMov) As DataUltimoMovimento
FROM
tbObjAp
INNER JOIN tbObjApMov ON tbObjAp.idObjAp=idObjApMmov.idObjAp
GROUP BY
tbObjAp.nomObjAp,
idObjApMov.nomMov

Boa tarde colega Jailton. Obrigado pela ajuda. Mas como o colega pode ver, desta forma está retornando os cinco registros, enquanto que eu preciso que apareça apenas o último movimento de cada objeto, ou seja, deveria retornar apenas três registros. Estou tentando e agradeço e aguardo a sua ajuda. Obrigado.

E só remover o status:

SELECT
tbObjAp.nomObjAp,
Max(idObjApMov.dtaMov) As DataUltimoMovimento
FROM
tbObjAp
INNER JOIN tbObjApMov ON tbObjAp.idObjAp=idObjApMmov.idObjAp
GROUP BY
tbObjAp.nomObjAp

Nunca usou SQL?

Obrigado mais uma vez Jailton. Respondendo a sua pergunta, eu uso SQL, mas não com a sua competência, é claro, mas desta forma que vc sugeriu eu já havia tentado, mas observe que o status (nomMov) é imprescindível que apareça na consulta, pois caso contrário ficaria intelingível ao usuário. Por isso preciso que o SQL retorne o OBJETO, a SITUAÇÃO dele e a DATA da referida situação, além de outros campos que não inclui aqui. Vou tentando aqui e aguardo a sua preciosa ajuda. Obrigado.

Bom dia pessoal. E aí? Alguém conseguiu? Passei quase a noite toda e não consegui. Agradeço ajuda.

Olá, walterflorencio

Adapte esta Query a sua tabela e verifique se te ajuda.

SELECT DISTINCT a.equipamento, (SELECT tipo_manutencao from controle_de_ordens_de_servico where id = a.id limit 1) TIPO_MANUTENCAO, (SELECT status_os from controle_de_ordens_de_servico where id = a.id limit 1) STATUS, (SELECT data_hora_solicitacao from controle_de_ordens_de_servico where id = a.id limit 1) DATA_SOLICITACAO FROM controle_de_ordens_de_servico as a WHERE a.ID_cliente = 1234 GROUP BY a.equipamento ORDER BY data_hora_solicitacao DESC

Obrigado Cleidson, vou adaptar e retorno.

Olá Cleidson. Obrigado pela atenção. Alterei mas não rolou. Obrigado.

Tenta este Walter.

SELECT
tbObjAp.nomObjAp
,(select nomMov As NomeUltimoMov ,Max(idObjApMov.dtaMov) from tbObjApMov
where tbObjApMov.idObjAp= tbObjAp.idObjAp
group by nomMov ) as NomeUltimoMov
,(select Max(idObjApMov.dtaMov) As DataUltimoMov from tbObjApMov
where tbObjApMov.idObjAp= tbObjAp.idObjAp ) as DataUltimoMovimento
FROM
tbObjAp
INNER JOIN tbObjApMov ON tbObjAp.idObjAp=idObjApMmov.idObjAp