• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

SonicSpot

Problema com UDF (User-Defined Function)

4 mensagens neste tópico

Viva pessoal! Estou a criar uma UDF que faz um SUM do valor actual de um carrinho de compras, de um determinado cliente, que está representado numa tabela em que cada registo equivale a um produto no carrinho de compras, e deveria devolver esse valor, mas por alguma razão, está a devolver NULL quando, na situação actual da base de dados (ainda não está populada), deveria devolver 0. Deixo aqui as tabelas utilizadas, assim como as referenciadas pelas mesmas e a UDF que criei.

   CREATE TABLE Produtos (
       idProduto INT IDENTITY PRIMARY KEY,
       marca NVARCHAR(30) NOT NULL,
       modelo NVARCHAR(30) NOT NULL,
       garantia SMALLINT DEFAULT 12,
       peso FLOAT,
       preco SMALLMONEY NOT NULL,
       descricao NVARCHAR
   );

   CREATE TABLE Entidades (
       idEntidade INT IDENTITY PRIMARY KEY,
       nome NVARCHAR(50) NOT NULL,
       email VARCHAR(320) NOT NULL,
       username VARCHAR(30) UNIQUE NOT NULL,
       password VARCHAR(12) NOT NULL,
       morada NVARCHAR(255) NOT NULL,
       localidade NVARCHAR(40) NOT NULL,
       codPostal CHAR(8) NOT NULL,
       telefone VARCHAR(13) NOT NULL,
       NIF INT NOT NULL
   );

   CREATE TABLE Clientes (
       idCliente INT IDENTITY PRIMARY KEY,
       REFidEntidade INT FOREIGN KEY REFERENCES Entidades(idEntidade) NOT NULL,
       dataNascimento SMALLDATETIME NOT NULL,
       BI INT NOT NULL
   );

   CREATE TABLE ProdutosCarrinhoCompras (
       REFidCliente INT FOREIGN KEY REFERENCES Clientes(idCliente) NOT NULL,
       REFidProduto INT FOREIGN KEY REFERENCES Produtos(idProduto) NOT NULL
   );



GO

CREATE FUNCTION TotalCarrinho(@idCliente INT)
RETURNS INT
AS
BEGIN
   RETURN(
       SELECT SUM(Produtos.preco)
       FROM ProdutosCarrinhoCompras INNER JOIN Produtos ON ProdutosCarrinhoCompras.REFidProduto=Produtos.idProduto
       WHERE REFidCliente=@idCliente)
END

GO 

Já me disseram que enquanto não houver nenhum registo que obedeça à restrição WHERE, vai dar sempre NULL, e para lhe dar a volta, tentei:

CREATE FUNCTION TotalCarrinho(@idCliente INT)
RETURNS INT
AS
BEGIN
IF EXISTS (SELECT * FROM ProdutosCarrinhoCompras WHERE REFidCliente=@idCliente)
BEGIN
RETURN(
	SELECT SUM(Produtos.preco)
	FROM ProdutosCarrinhoCompras INNER JOIN Produtos ON ProdutosCarrinhoCompras.REFidProduto=Produtos.idProduto
	WHERE REFidCliente=@idCliente)
END
ELSE BEGIN
	RETURN (0)
END
END

mas também não me serviu de nada, já que obtenho o erro:

Msg 455, Level 16, State 2, Procedure TotalCarrinho, Line 13

The last statement included within a function must be a return statement.

Isto tudo em SQL Server 2005.

Agradecia imenso que me ajudassem!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta substituir

ELSE BEGIN

RETURN (0)

END

simplesmente por

RETURN (0)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

parece k funcionou! pelo menos, nao se queixou... agora falta popular a base de dados, e testar para ver se está a dar o resultado esperado... obrigado TheDark!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se leres bem a mensagem de erro, verás que ele se queixa que a última instrução da função não é um RETURN.

Por outro lado, como dentro do IF fazes sempre RETURN, não precisas do ELSE, uma vez que se entrar no IF já não sai. Daí aquela simplificação funcionar :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora