Jump to content

Archived

This topic is now archived and is closed to further replies.

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!

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.