none
Executar Formula RRS feed

  • Pergunta

  •  

    Olá amigos,

     

    estou desde ontem tentando uma forma de executar uma formula pelo banco e não consigo. Qual é a situação:

     

    - Calcular a média do aluno. Logo como cada professor tem seu metodo, ele vai escolher a formula de calculo:

     

    ex 1:  {1} * {2} / 10

     

    A Formula acima é para calcular uma avaliação que contém Peso. logo {1} = Nota da Avaliação e {2} = Peso da Avaliação.

     

    EU consigo normalmente substituir os valores chaves pelo valor tirado. Ex, substituido.

     

    Ex 1.1 : 10*5/10

     

     

    Agora vem o problema, esta formula ex: 1.1 esta em formato String ae não consigo executar o calculo... Tentei por função mais não permiti executar o 'Exec' (aparentemente)' só consigo obter este resultado quando faço exec('select ' + @Formula).

     

    Logo, tenho que listar uma relação de aluno ao lado ir calculando as Media.

     

    Alguem pode me ajudar??

     

    Grato pela atenção!!!

     

     

    terça-feira, 15 de julho de 2008 19:56

Todas as Respostas

  • Luiz,

     

    Você poderia postar o código de exemplo?

     

    terça-feira, 15 de julho de 2008 19:57
  • a Função abaixo, deveria me retornar o resultado da consulta:

     

     

    =================================================================== - FUNCTION

     

     

    set ANSI_NULLS ON

    set QUOTED_IDENTIFIER ON

    go

    -- =============================================

    -- Author: <Author,,Name>

    -- Create date: <Create Date, ,>

    -- Description: <Description, ,>

    -- =============================================

    ALTER FUNCTION [dbo].[acadCalcularMedia]

    (

    -- Add the parameters for the function here

    @Formula varchar(200),

    @A int,

    @B int,

    @C int,

    @D int

    )

    RETURNS nvarchar(MAX)

    AS

    BEGIN

    -- Declare the return variable here

    DECLARE @iFormula varchar(800)

    SET @iFormula = null

    DECLARE @iRetorno nvarchar(MAX)

    SET @iRetorno = null

    DECLARE @sql varchar(200)

    SET @sql = null

    SET @iFormula = replace(replace(replace(replace(@Formula,'{1}', ISNULL(@A, 0)), '{2}', ISNULL(@B, 0)), '{3}', ISNULL(@C, 0)), '{4}', ISNULL(@D, 0));

    SET @SQL = 'select @iRetorno = ' + @iFormula

    exec sp_executesql @sql, N'@iRetorno nvarchar(MAX) OUTPUT', @iRetorno OUTPUT;

    return @iRetorno

    END

     

     

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

    Não me retorna porque esta em Função, porque quando é Stored Procedure funciona normal. Só que como quero colocar nA SQL para gerar linha a linha junto com cada linha necessito que seja Function

     

     

    Vamos ao exemplo que fiz, só que usando Stored Procedures

     

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

     

    set ANSI_NULLS ON

    set QUOTED_IDENTIFIER ON

    go

     

     

    /*

    {1} = Nota da Avaliacao

    {2} = Peso da Avaliacao

    {3} = Somatorio de todas as notas.

    {4} = Quantidade de Avaliação

    {5} = Quantidade de Disciplina

    */

    -- =============================================

    -- Author: <Luiz Anderson>

    -- Create date: <14-07-2008>

    -- Description: <Calcular a Média de Acordo ao Modelo de Calculo optado.>

    -- =============================================

    ALTER PROCEDURE [dbo].[acadModeloDeCalculo_Listar]

    @Formula varchar(200),

    @AvNota Decimal(18,2) = null, -- {1}

    @AvPeso int = 0, -- {2}

    @AvNotaTotal Decimal(18,2) = null, -- {3}

    @AvQuantidade int = 0, -- {4}

    @iRetorno Decimal(18,2) output

    AS

    DECLARE @iFormula varchar(800) -- Formula já com todos os parametros.

    SET @iFormula = null

    DECLARE @SQL NVARCHAR(100)

    --DECLARE @iRetorno varchar(100)

    -- set @iRetorno = null

    BEGIN

    SET @iFormula = replace(replace(replace(replace(@Formula,'{1}', ISNULL(@AvNota, 0)), '{2}', ISNULL(@AvPeso, 0)), '{3}', ISNULL(@AvNotaTotal, 0)), '{4}', ISNULL(@AvQuantidade, 0));

    SET @SQL = 'select @iRetorno =' + @iFormula

    exec sp_executesql @sql, N'@iRetorno nvarchar(MAX) OUTPUT', @iRetorno OUTPUT

    return @iRetorno

    END

     

     

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

     

     

    Agora como chamar cada uma:

     

     

    -- Chamar a Function

    select 'cav' descricao, aa =(dbo.acadCalcularMedia('{1} + {2}', 1,2,3,4))

     

    -- Chamar a Stored Procedure

    DECLARE @iRetorno Decimal(18,2)

    SET @iRetorno = null

    exec acadModeloDeCalculo_Listar '{1} + {2}', 1,2,3,4, @iRetorno output

    SELECT @iRetorno

     

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

     

    Como disse, eu tenho um "Select matricula, NomeAluno FROM ealunos" esta sql cada linha gerado tenho que colocar  a media, pela função ficaria assim "Select matricula, NomeAluno, Media = dbo.acadCalcularMedia('{1} + {2}', Nota,Peso,sum(Nota),AvQuantidade) FROM ealunos"

     

     

    Obrigado pela atenção amigo!!!

     

     

     

    terça-feira, 15 de julho de 2008 20:56
  •  

    Olá, alguem tem noção como fazer o que falei no topico??

     

    no caso, no Function não posso nem executar um EXEC, pois tentei também na Function gerar apenas a expressão SQL e passar via EXEC NomeProcedure 'select * from tabela', iRetorno output e não foi, da erro devido ao EXEC.

     

    Alguem sabe dizer uma forma de fazer isso, no caso não posso chamar uma SP estando dentro da Function??

     

    Abraço

    quarta-feira, 16 de julho de 2008 13:50