Ir para conteúdo

Arquivado

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

AlexFigueiredoo

Selecionar registro com maior data

Recommended Posts

Galera,

 

Já pesquisei, testei, tentei... enfim, só me resta pedir ajuda.

 

Minha situação é essa: O sistema da empresa onde trabalho (Protheus) possui muitas tabelas, muitos relatorios, porém dessa vez preciso montar um relatório bem especifico.

 

Imagine o seguinte, o departamento de compras precisa de um relatório que mostre o último valor de compra de uma lista de produtos, o nome do fornecedor, a data entre outras informações.

 

Depois de quebrar a cabeça consegui fazer um SELECT que me traz essas informações. Porém, aqui na empresa, antes de comprar, o Comprador tem de obrigatóriamente gerar cotações com outras empresas no nosso sistema.

 

Então vamos ao meu problema.

 

Tenho as seguintes tabelas: Fornecedores, Cotacoes, Produtos e Pedidos (de compra).

 

Na tabela de Cotacoes, eu tenho o código do fornecedor, do produto e do valor da cotação e a data.

 

O que eu preciso é trazer as ultimas cotacoes de todos os produtos. Isso é, somente a última data de cada fornecedor, de cada produto.

 

Por exemplo:

 

A ultima compra do produto 00010 foi no dia 02/02/10, no fornecedor 00050, e o valor do produto foi R$ 100,00.

 

Porem, esse mesmo produto foi cotado no fornecedor 00060 e 00070. E as cotacoes nao necessariamente sao no dia 02/02/10, que foi a data da compra.

 

Nao sei se deu pra entender...

 

Vou colar meu codigo:

 

SELECT DISTINCT D1_COD, B1_GRUPO, B1_TIPO, B1_DESC, A2_NOME, A2_TEL, A2_CONTATO, A2_EMAIL, A2_CGC, B1_UPRC, MAX(D1_EMISSAO)
FROM SB1010
LEFT JOIN SD1010 ON  (B1_FILIAL='' AND B1_COD=D1_COD AND SD1010.D_E_L_E_T_<>'*')
LEFT JOIN SA2010 ON  (A2_FILIAL='' AND A2_COD=D1_FORNECE AND A2_LOJA=D1_LOJA AND SA2010.D_E_L_E_T_<>'*')

WHERE
B1_TIPO = 'FE' AND
D1_TES = '140' AND

SD1010.D_E_L_E_T_<>'*'

GROUP BY B1_GRUPO, D1_COD, B1_TIPO, B1_DESC, A2_NOME, A2_TEL, A2_CONTATO, A2_EMAIL, A2_CGC, B1_UPRC
ORDER BY B1_GRUPO, D1_COD

 

De maneira que SD1010 = Pedidos, SA2010 = Fornecedores, SB1010 = Produtos.

 

Com o código acima, eu consegui trazer todas as COMPRAS, porém preciso trazer tambem as cotacoes que ficam em outra tabela. Entao tenho o seguinte

 

SELECT DISTINCT D1_COD, B1_GRUPO, B1_TIPO, B1_DESC, A2_NOME, A2_TEL, A2_CONTATO, A2_EMAIL, A2_CGC, B1_UPRC, MAX(D1_EMISSAO), D1_EMISSAO
SELECT DISTINCT C8_PRODUTO, C8_QUANT, C8_PRECO, C8_CONTATO, A2_NOME, MAX(C8_EMISSAO), C8_EMISSAO
FROM SC8010
LEFT JOIN SA2010 ON  (A2_FILIAL='' AND A2_COD=C8_FORNECE AND A2_LOJA=C8_LOJA AND SA2010.D_E_L_E_T_<>'*')

WHERE 
SC8010.D_E_L_E_T_<>'*'
GROUP BY C8_PRODUTO, C8_QUANT, C8_PRECO, C8_CONTATO, A2_NOME, C8_EMISSAO

Onde SC8010 = Cotacoes.

 

Meu problema é que essa ultima consulta NUNCA sera DISTINCT, ja que eu trago um campo PREÇO, e os preços variam, portanto ele não trará apenas a ultima data, que é o que eu preciso.

 

 

Nao sei se deu pra entender direito. Qualquer coisa tento explicar novamente.

Alguem tem alguma sugestao?

 

Valeu desde ja!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela ajuda Motta.

 

Não entendo muito bem como fazer SELECT dentro de SELECT.

 

O seguinte bloco funciona perfeitamente para mim

 

SELECT DISTINCT C8_PRODUTO, B1_DESC, A2_NOME, MAX(C8_EMISSAO) FROM SA2010
INNER JOIN SC8010 ON (A2_COD = C8_FORNECE)
INNER JOIN SB1010 ON (C8_PRODUTO = B1_COD)
WHERE B1_GRUPO BETWEEN '5001' AND '5002'
GROUP BY A2_NOME, C8_PRODUTO, B1_DESC
ORDER BY C8_PRODUTO

Ele traz apenas a ultima cotação, porém eu preciso incluir mais dois campos nessa consulta, o que faz com que ela não me traga apenas a última cotação...

 

C8_PRECO, C8_QUANT,

 

Com esses campos o DISTINCT não serve para data.

 

Tentei fazer algo do tipo

 

WHERE C8_EMISSAO = (SELECT MAX(C8_EMISSAO) FROM SC81010)

 

mas nao deu certo.

 

Nao entendi muito bem, pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rode por fora assim :

 

SELECT MAX(C8_EMISSAO) FROM SC81010

 

vai retornar o maior valor de C8_EMISSAO

 

Rode

 

SELECT * FROM WHERE C8_EMISSAO = (SELECT MAX(C8_EMISSAO) FROM SC81010)

 

Vai retornar TODOS os registros da SC8010 iguais ao maior valor de C8_EMISSAO.

 

Só tome cuidado pois pela cara é Microsiga e o campo DATA não é data e sim uma string o que pode causar problemas.

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.