locked
Programação de Function RRS feed

  • Pergunta

  • Pessoal,

    Estou tentando criar uma Function que retorne o valor de duas tabelas distintas. O problema é o seguinte:

    Escreva uma função que retorne a renda salarial de todos os clientes, incluindo na renda de cada um o salário do seu cônjuge daqueles que são casados.

    Tables:

    create table cliente
    (
    cod int not null identity,
    nome varchar(50),
    renda float,
    estadoCivil varchar(20)
    );

    create table conjuge
    (
    codCliente int not null,
    nome_conjuge varchar(50),
    renda_conjuge float
    );

    Construi o seguinte código:

    create function rendaCliente (@Codigo int)

    returns float
    as
    begin
            declare @rendaCli float = (select renda from cliente where cod = 3)
            declare @rendaConjuge float = (select renda_conjuge from conjuge where codCliente = 3)
            declare @ec varchar(20) = (select estadoCivil from cliente where cod = 3)
            declare @renda float
                
            select renda, nome from cliente where estadoCivil = @ec
            if(@ec = 'solteiro')
            set @renda = @rendaCli
            else if(@ec = 'casado')
            set @renda = @rendaConjuge + @rendaCli

            return @renda
    end

    Só que me traz o erro de que não posso retornar um valor para o cliente, ou seja, não estou conseguindo inserir somente o valor da variável.

    Alguém pode me ajudar, por favor???

    segunda-feira, 19 de maio de 2014 13:51

Respostas

  • J.Neves,

    O problema é que você definiu uma consulta sem adicionar seu retorno em nenhuma variável.

    Veja o script abaixo(removi apenas à consulta antes do IF) e faça às adaptações de acordo com sua necessidade:

    create function rendaCliente (@Codigo int)
    returns float
    as
    begin
            declare @rendaCli float = (select renda from cliente where cod = 3)
            declare @rendaConjuge float = (select renda_conjuge from conjuge where codCliente = 3)
            declare @ec varchar(20) = (select estadoCivil from cliente where cod = 3)
            declare @renda float
                
    
            if(@ec = 'solteiro')
               set @renda = @rendaCli
            else if(@ec = 'casado')
               set @renda = @rendaConjuge + @rendaCli
    
            return @renda
    end
    GO


    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    segunda-feira, 19 de maio de 2014 20:21
    Moderador

Todas as Respostas

  • J.Neves,

    O problema é que você definiu uma consulta sem adicionar seu retorno em nenhuma variável.

    Veja o script abaixo(removi apenas à consulta antes do IF) e faça às adaptações de acordo com sua necessidade:

    create function rendaCliente (@Codigo int)
    returns float
    as
    begin
            declare @rendaCli float = (select renda from cliente where cod = 3)
            declare @rendaConjuge float = (select renda_conjuge from conjuge where codCliente = 3)
            declare @ec varchar(20) = (select estadoCivil from cliente where cod = 3)
            declare @renda float
                
    
            if(@ec = 'solteiro')
               set @renda = @rendaCli
            else if(@ec = 'casado')
               set @renda = @rendaConjuge + @rendaCli
    
            return @renda
    end
    GO


    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    segunda-feira, 19 de maio de 2014 20:21
    Moderador
  • J.Neves,

    Quando estamos trabalhando com Function o comando Select só pode ser utilizado como mecanismo de retorno dos dados para algum elemento dentro da Function, neste caso, o Select sozinho é reconhecido e interpretado como um retorno, por isso o Query Processor esta retornando esta mensagem de erro:

    "Select statements included within a function cannot return data to a client."

    Com o Durval citou, removendo esta linha este erro não é mais apresentando, mas no seu caso, talvez será necessário você pegar o valor deste Select e armazenar em alguma outra variável!!!

    Mas veja que no seu código você já esta armazenando a renda e não o nome, então fiz uma pequena mudança no Código:

    create function rendaCliente (@Codigo int)
    
    returns float
    as
    begin
            declare @rendaCli float = (select renda from cliente where cod = 3)
            declare @rendaConjuge float = (select renda_conjuge from conjuge where codCliente = 3)
            declare @ec varchar(20) = (select estadoCivil from cliente where cod = 3)
            declare @renda float
            Declare @nome varchar(50)
    		
    		Select @Nome=Nome from cliente where estadoCivil = @ec	    
                    
    		if(@ec = 'solteiro')
            set @renda = @rendaCli
            else if(@ec = 'casado')
            set @renda = @rendaConjuge + @rendaCli
    
            return @renda
    end
    


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quarta-feira, 21 de maio de 2014 13:51