Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Consulta com subconsulta


Alex_DTP

Pergunta

Tenho 2 tabelas (exemplo)

tblDocumentos

docsID - Documento

1 - Documento tal a

2 - Documento tal b

3 - Documento tal c

...

tblTramitação

tramID - docsID - Destino - Data

1 - 1 - Seção a - 17/12/2008

2 - 2 - Seção b - 16/12/2008

3 - 3 - Seção b - 14/12/2008

4 - 2 - Seção b - 15/12/2008

5 - 3 - Seção a - 16/12/2008

Preciso que: ao pesquisar "destino" como "Seção b", me retornasse todos os documentos em que a última data da tramimitação contivesse "Seção b".

2 - 2 - Seção b - 16/12/2008

3 - 3 - Seção b - 14/12/2008

Sei que terei que usar uma subconsulta.

Seria: listar todos os documentos em tramitação agrupando pela última data e então selecionar somente os que contivessem a seção pesquisada.

Acho que o caminho é mais ou menos este:

SELECT tblDocumentos.ID, tblDocumentos.Documento, tblTramitação.tramID, tblTramitação.docsID, tblTramitação.Destino, tblTramitação.Data
FROM tblDocumentos LEFT JOIN tblTramitação ON tblDocumentos.ID = tblTramitação.ID
WHERE (((tblTramitação.tramID) In (SELECT tramID, MAX(Data) FROM tbltblTramitação WHERE ([tbltblTramitação].[Destino]=[Formulários]![frmPesquisa]![Combinação38]))))

Mas não está funcionando. O Access dá a seguinte mensagem:

"Você gravou uma subconsulta que pode retornar mais de um campo sem usar a palavra EXISTS na cláusula FROM da consulta principal..."

Já tentei também de várias outras formas, mas não consegui.

Talvez nem seja assim, então se alguém puder me ajudar, agradeço.

Alex

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0
Ummm olhando o codigo num percebi erro, se puder post o bd pra mim ou alguém analisar e ajudar você!

Olá, MrMALJ

Infelizmente não posso postar o bd que além de ser grande tem informações da empresa e acho melhor evitar, mas vou montar um modelo depois.

Ví um caso parecido, que se aproxima bem do que preciso neste tópico, mas não consegui adaptar.

http://scriptbrasil.com.br/forum/index.php?showtopic=126312

Valeu por enquanto.

Link para o comentário
Compartilhar em outros sites

  • 0
Ummm olhando o codigo num percebi erro, se puder post o bd pra mim ou alguém analisar e ajudar você!

Olha eu de novo.

Segue o exemplo:

consultaUltData.zip

Observe que na qryDestino_1 usei assim o óbvio mas não funciona:

SELECT tblDocumentos.docsID, tblDocumentos.documento, tblTramitação.destino, Max(tblTramitação.data) AS MáxDedata
FROM tblDocumentos INNER JOIN tblTramitação ON tblDocumentos.docsid = tblTramitação.docsid
GROUP BY tblDocumentos.docsID, tblDocumentos.documento, tblTramitação.destino
HAVING (((tblTramitação.destino)="Seção b"));

Observe que buscando, por exemplo, por "Seção b" ele me retorna entre os resultados o "Documento A" que a sua última tramitação é na "Seção c".

Preciso que me retorne os documentos que sua última tramitação tenha sido na "Seção b"

Na qryDestino_2 usei a query que postei no começo do tópico, mas dá erro.

Se puder me dar uma luz, agradeço.

Alex

Editado por Alex_DTP
Link para o comentário
Compartilhar em outros sites

  • 0

Bom pelo que vi você não necessariamente necessitaria de dados de outra tabela e acredito que o codigo a seguir resolva seu problema:

select tblTramitação.docsID, tblTramitação.Destino, Last(tblTramitação.Data) as ultimaData

from tblTramitação

group by tblTramitação.docsID, tblTramitação.Destino

having (((tblTramitação.Destino)="Seção B"))

order by Last(tblTramitação.Data), tblTramitação.docsID;

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, MrMALJ

Na verdade eu preciso ainda listar o Documento da tblDocumento. Se eu incluo este campo o resultado não é o esperado, pois assim ele lista todos os documentos na data que passaram pela seção b.

Consegui resolver assim, fazendo uma outra consulta. Uma gambiarra, mas funcionou.

Fiz uma query filtrando pelo último ID da tramitação dos documentos, e não pela data. Assim obtive os resultados apenas da última tramitação dos documentos.

SELECT tblTramitação.docsID, Max(tblTramitação.tramID) AS MáxDetramID
FROM tblTramitação
GROUP BY tblTramitação.docsID;
Então foi só criar uma relação desta qry com a tblTramitação "amarrando" o resultado na qryDestino
SELECT tblDocumentos.docsID, tblDocumentos.Documento, tblTramitação.Destino, tblTramitação.Data
FROM qryUltimaTramitacao INNER JOIN (tblDocumentos INNER JOIN tblTramitação ON tblDocumentos.docsID=tblTramitação.docsID) ON [qryUltimaTramitacao].MáxDetramID=tblTramitação.tramID
GROUP BY tblDocumentos.docsID, tblDocumentos.Documento, tblTramitação.Destino, tblTramitação.Data
HAVING (((tblTramitação.Destino)="Seção b"));

Segue o arquivo: consultaUltData.zip

Valeu pela força.

Alex

Editado por Alex_DTP
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...