Ir para conteúdo

POWERED BY:

Arquivado

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

WellingtonSilva

Como tratar coluna que não existe no join

Recommended Posts

Amigos,

 

Tenho o seguinte problema: Preciso fazer um join de uma tabela que contém valores, estes valores podem estar em outra moeda, com isso tenho de ir na tabela de COTACOES e buscar a cotação do dia do lançamento. Até ai tudo bem, o problema é que existem dias em que não existe cotação, ou melhor, não existe registro, dai meus CASEs não conseguem fazer a comparação e não trazem nada!

 

Alguém poderia me dar uma direção, por favor>

Select CCR.grupos,CCR.contas, 
		CASE WHEN CCR.Opers='D' THEN CCR.Valors * 1 
			ELSE CCR.Valors * - 1 
			END AS lnValorGrupoMoeda, CCR.moedas, CCR.cotacaos, CCR.Opers, CCR.Datas as DtDatas, 
		CCR.Vencs as DtVencs, 
		"lnValorCotacao" =
		CASE 
			WHEN dCOT.valos = NULL and CCR.Opers='D' THEN (CCR.Valors * 1 )
			WHEN dCOT.valos = NULL and CCR.Opers<>'D' THEN (CCR.Valors * -1 )
			WHEN dCOT.valos > 0 and CCR.Opers='D' THEN (((CCR.Valors * 1) * 100)/ dCOT.valos)
			WHEN dCOT.valos > 0 and CCR.Opers<>'D' THEN (((CCR.Valors * -1) * 100)/ dCOT.valos)
		END,
		dCOT.valos
	From sigmvccr CCR
		left join SigCdCot dCOT on dCOT.datas = CCR.Vencs
	Where Vencs BetWeen '20140101' And '20140102'
		and grupos = '5114'
	Order By Moedas,Vencs

Vejam que nos 2 primeiros When é que esta o problema, porque o dCOT.valos nunca vai ser NULL, porque ele não existe!

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com cotação eu faria uma FUNCTION , esta receberia 3 parametros :

 

moeda_para

data

valor

 

A function buscaria a mais recente cotação da moeda calcularia

o valor com cambio e retornaria

Compartilhar este post


Link para o post
Compartilhar em outros sites
Então, o problema é que se não houver cambio na data o valor tem de ficar o mesmo, sem cálculo, ou seja, o valor original.

 

 

Então :

A function buscaria a cotação da moeda na data exata e calcularia

o valor com cambio e retornaria, não achando retornaria o valor original.

 

 

=================

ou

=================

 

 

Este tópico talvez te ajude .

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, agora você vai ter dó de mim. rsrs

 

Cara, eu não posso utilizar os recursos do banco neste cliente, eles não tem NADA feito em banco, tudo é feito no código, na mão, por isso estou tentando montar a select.

 

Em um outro momento eu até cheguei a gerar algumas procedures e triggers, mas mandaram tirar e passar para o código dentro da aplicação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

via t-sql vai ser dor de cabeça montar isso....

impossivel nao eh, soh complicado.

qual a estriutura das tabelas envolvidas?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente fazer um union como eu disse no post #4 "criando" dados para as datas , uma função como SUM ou MAX torna uma tabela única, uma solução para o sql trazer dados que não existem.

 

Outra seria obrigar a existir a data, tipo travar se não houver cadastro, já que o cliente quer feijão com arroz que arque com o "tempero" ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

 

Desculpe a demora no retorno.

Eu levei em consideração a sua ideia de "criar" valor e acabei fazendo isso no próprio select:

Select CCR.grupos,CCR.contas,
 CASE
  WHEN CCR.Opers='D' THEN CCR.Valors * 1 ELSE CCR.Valors * - 1 END AS lnValorGrupoMoeda,
  CCR.moedas, CCR.cotacaos, CCR.Opers, CCR.Datas as DtDatas, CCR.Vencs as DtVencs, 
 CASE 
  WHEN dCOT.valos IS NULL THEN 0 ELSE dCOT.valos END AS vlrCotacao, dCOT.datas 
From sigmvccr CCR
 left join SigCdCot dCOT on dCOT.datas = CCR.Vencs
Where CCR.Vencs BetWeen '20140101' And '20140130'
Order By CCR.Moedas,CCR.Vencs

Eu coloquei um CASE onde, quando não existir valor na data eu jogo 0 para a coluna vlrCotacao, e então dentro do código da aplicação eu gerei um looping para verificar quando o vlrCotacao é 0 mantém o valor original, caso contrário faço o cálculo.

 

Foi o que deu!

 

Grande abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pq não faz o valor ser 1 ? Na multiplicação seria igual, em tese dispensaria o tratamento.

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.