Ir para conteúdo

Arquivado

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

fernandoperez

Tabela de preços especiais para clientes cruzada com tabela padrão

Recommended Posts

Pessoal, boa tarde. Sou novo no fórum e gostaria de tirar uma dúvida.
Antes de mais nada, já pesquisei em diversos sites e não encontrei nada que possa me ajudar.

A minha dúvida é a seguinte:

Eu tenho uma tabela com os preços "padrão" da empresa. Até aqui tudo bem.
O problema é que alguns clientes possuem preço diferenciado da tabela padrão.

Para isso, eu criei uma tabela com preços especiais para clientes.

O problema está no SELECT para trazer essas informações cruzadas. Se ele possuir preço especial, coloca o preço especial. Caso contrário, coloca o preço de tabela. Isso para cada produto existente na empresa.
Da forma que eu fiz, ele só retorna os preços de tabela que nunca foram cadastrados com preço especial por algum cliente.

Por exemplo: No começo (sem preço especial) roda sem problema. Na hora que eu coloco um preço especial do produto 1, os outros clientes (que não possuem preço especial) não conseguem mais ver este produto.

O código é o seguinte:

SELECT  
b.codigo_cliente AS COD_CLI,  
a.codigo_ensaio AS ID_ENSAIO,  
c.tipo AS CLASSE,  
c.cod_ensaio_Tribolab AS COD_TRIBO,  
c.Descricao AS DESCRICAO,  
a.valor AS VALOR_TABELA,  
b.valor AS VALOR_CLIENTE,  
ISNULL(b.valor, a.valor) AS VALOR_FINAL,  
CASE WHEN b.valor IS NOT NULL THEN b.data_alter ELSE a.data_alter END AS DATA_ALTER,  
CASE WHEN b.valor IS NOT NULL THEN '*' ELSE '' END AS PRECO_ESPECIAL,  
CASE WHEN b.valor < a.valor THEN '< Tabela' ELSE '>= Tabela' END AS OBS,
CASE WHEN b.valor IS NOT NULL THEN '0' ELSE c.desc_max END AS DESCONTO  
FROM		[SituacaoClientes2].[Comercial].[Ensaios]               AS c  
LEFT JOIN	[SituacaoClientes2].[Comercial].[Preco_Tribolab]	AS a ON c.codigo_ensaio = a.codigo_ensaio  
LEFT JOIN	[SituacaoClientes2].[Comercial].[Preco_Clientes]	AS b ON c.codigo_ensaio = b.codigo_ensaio  
--WHERE b.codigo_cliente = '9999998' OR b.codigo_cliente IS NULL  
ORDER BY a.codigo_ensaio

Compartilhar este post


Link para o post
Compartilhar em outros sites

1) Faça uma query com union , nos clientes comuns faça um not exists na tabela de preços especiais , na outra queru do union vá somentes nos clientes especias

 

ou

 

2) Faça uma function que receba cliente e produto por parametro e devolva o preço, na function se faz o tratamento de ir em preços especiais , não achando vai na padrão

Compartilhar este post


Link para o post
Compartilhar em outros sites
Motta, muito obrigado pela dica.

Resolvi ficar com a primeira.

 

Segue o código abaixo para quem quiser aproveitar:

DECLARE @codcli varchar(10) = '9999998'; 

SELECT 
NULL AS COD_CLI,
a.codigo_ensaio AS ID_ENSAIO,
j.tipo AS CLASSE,
j.cod_ensaio AS COD,
j.Descricao AS DESCRICAO,
a.valor AS VALOR_FINAL,
a.data_alter AS DATA_ALTER,
'' AS PRECO_ESPECIAL,
j.desc_max AS DESCONTO

FROM			[SituacaoClientes2].[Comercial].[Preco]	AS a
INNER JOIN		[SituacaoClientes2].[Comercial].[Ensaios]			AS j   ON a.codigo_ensaio = j.codigo_ensaio

WHERE 
NOT EXISTS 
( 
SELECT codigo_ensaio 
FROM [SituacaoClientes2].[Comercial].[Preco_Clientes] AS b 
WHERE codigo_cliente = @codcli AND a.codigo_ensaio = b.codigo_ensaio
)

UNION SELECT 

i.codigo_cliente AS COD_CLI,
i.codigo_ensaio AS ID_ENSAIO,
j.tipo AS CLASSE,
j.cod_ensaio AS COD,
j.Descricao AS DESCRICAO,
i.valor AS VALOR_FINAL,
i.data_alter AS DATA_ALTER,
'*' AS PRECO_ESPECIAL,
'0' AS DESCONTO

FROM [SituacaoClientes2].[Comercial].[Preco_Clientes] AS i
INNER JOIN [SituacaoClientes2].[Comercial].[Ensaios] AS j ON i.codigo_ensaio = j.codigo_ensaio

WHERE i.codigo_cliente = @codcli

ORDER BY ID_ENSAIO

Abraço,

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.