Formula na SP

23/05/2012

0

Boa tarde.

Possuo uma SP onde gostaria de implementar uma formula matemática na mesma.

A formula é a seguinte

6371*ACOS(COS(PI()*(90-@P2La)/180)*COS((90-@P1La)*PI()/180)+SEN((90-@P2La)*PI()/180)*SEN((90-@P1La)*PI()/180)*COS((@P1Lo-@P2Lo)*PI()/180))

Onde o resultado seria gravada em uma variável na SP, (@IntervaloAtual)



Set @IntervaloAtual = 6371*ACOS(COS(PI()*(90-@P2La)/180)*COS((90-@P1La)*PI()/180)+SEN((90-@P2La)*PI()/180)*SEN((90-@P1La)*PI()/180)*COS((@P1Lo-@P2Lo)*PI()/180))



A SP recebe

@P1La;

@P1Lo;

@P2La;

@P2Lo;

Eu comparo o resultado de @IntervaloAtual com um resultado que busquei no banco de dados anteriormente, e se for diferente em mais de 7 eu gravo a informação no banco.

A duvida é como implementar a formula na SP e se isto é realmente possível.

Segue um exemplo

@P1La= 25,413596

@P1Lo= 49,250524

@P2La= 25,410299

@P2Lo= 49,253407


@IntervaloAtual= 0,467169
Fabiano Elias

Fabiano Elias

Responder

Posts

23/05/2012

Joel Rodrigues

Não entendi tua dúvida. A fórmula já está aí, pronta, a variável @IntervaloAtual já está recebendo o valor calculado. Qual o problema? Seria a comparação?
Você pode usar a função BETWEEN:
...
@IntervaloAtual BETWEEN (VALOR-7) AND (VALOR+7)
...
Responder

24/05/2012

Fabiano Elias

Bom dia.

Primeiramente muito obrigado pela atenção.

O banco esta em casa com a formula, quando coloco a formula o SQL retorna um erro tipo invalido na linha onde seto a formula.
Hoje a noite eu pego o erro e posto aqui.

Novamente grato pela atenção e paciência.
Responder

26/05/2012

Fabiano Elias

Boa noite

Segue exatamente como estou montando minha SP

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[SP_MONITORAMENTO]
(
@RAS_ID VARCHAR(10),
@P1La CHAR(9),
@P1Lo CHAR(9)
)
AS

DECLARE @DISTANCIA FLOAT
DECLARE @P2La CHAR(9)
DECLARE @P2Lo CHAR(9)

SET @P2La = (SELECT MON_LATITUDE FROM dbo.T_MONITORAMENTO GROUP BY MON_LATITUDE HAVING (MAX(RAS_ID) = @RAS_ID))
SET @P2Lo = (SELECT MON_LONGITUDE FROM dbo.T_MONITORAMENTO GROUP BY MON_LONGITUDE HAVING (MAX(RAS_ID) = @RAS_ID))

SET @DISTANCIA=6371*ACOS(COS(PI()*(90-@P2La)/180)*COS((90-@P1La)*PI()/180)+SEN((90-@P2La)*PI()/180)*SEN((90-@P1La)*PI()/180)*COS((@P1Lo-@P2Lo)*PI()/180))

PRINT(@P1La)
PRINT(@P2Lo)

Retorno quando tento salvar a SP

Msg 195, Level 15, State 10, Procedure SP_MONITORAMENTO, Line 17
SEN is not a recognized built-in function name.

O SQL não esta reconhecendo a função SEN na formula.
Responder

26/05/2012

Fabiano Elias

Resolvido o problema

Segue a SP com as alterações... funcionando

ALTER PROCEDURE [dbo].[SP_MONITORAMENTO]
(
@RAS_ID VARCHAR(10),
@P1La float,
@P1Lo float
)
AS

DECLARE @DISTANCIA FLOAT
DECLARE @P2La float
DECLARE @P2Lo float

SET @P2La = (SELECT MON_LATITUDE FROM dbo.T_MONITORAMENTO GROUP BY MON_LATITUDE HAVING (MAX(RAS_ID) = @RAS_ID))
SET @P2Lo = (SELECT MON_LONGITUDE FROM dbo.T_MONITORAMENTO GROUP BY MON_LONGITUDE HAVING (MAX(RAS_ID) = @RAS_ID))

--SET @DISTANCIA=6371*ACOS(COS(PI()*(90-@P2La)/180)*COS((90-@P1La)*PI()/180)+SEN((90-@P2La)*PI()/180)*SEN((90-@P1La)*PI()/180)*COS((@P1Lo-@P2Lo)*PI()/180))
SET @DISTANCIA=(6371*ACOS(COS(PI()*(90-@P2La)/180)*COS((90-@P1La)*PI()/180)+SIN((90-@P2La)*PI()/180)*SIN((90-@P1La)*PI()/180)*COS((@P1Lo-@P2Lo)*PI()/180)))

PRINT(@P1La)
PRINT(@P2Lo)
print (@DISTANCIA)
Responder

26/05/2012

Joel Rodrigues

Opa, que bom que conseguiu resolver. Obrigado por compartilhar a solução com a comunidade.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar