none
FUNCTION RRS feed

  • Discussão Geral

  • Boa tarde!

    Tenho uma tabela GradeProdutos onde eu tenho a descricao da Grade, exemplo: Camisa Polo
    Tenho uma Tabela Produtos, onde tenho 5 opções de grade: Cor: Azul, Tamanho: GG,

    Nesse exemplo usei 2 itens da grade. A descricao completa do produto fica: Camisa Polo Azul GG

    eu pensei que em cada VIEW ou Function que eu fizer vou ter que montar essa descricao completa, e corro o risco de ficar diferente de uma view para a outra, ou ate mesmo se eu quiser alterar o modelo de construcao desse nome eu teria que ir em todas as views que existisse e fazer a alteracao.

    Entao pensei em fazer uma FUNCTION que retorna a descricao completa, e sempre que eu for fazer uma view, function ou procedure que use a descricaocompleta eu usaria essa FUNCTION.

    Primeira pergunta, devo mesmo fazer isso, ou seria bobeira?

    Fazendo a FUNCTION eu fiz passando o ID_Produto como parametro, e essa é minha duvida, se faço uma FUNCTION passando o parametro, ou faço uma com toda a tabela pra fazer INNER JOIN quando fazer uma VIEW.

    Hoje minha FUNCTION esta assim:

    ALTER FUNCTION [FN_CE100_Produtos_DescricaoComnpleta_Table]
       (
       @ID_Produto INT
       )
    
    RETURNS TABLE 
    
    AS
    
    RETURN 
    
    SELECT       dbo.CE100_Grade.Descricao + 
                 CASE  
    			    WHEN NOT dbo.CE100_Produtos.ItemGrade_01_Valor IS NULL THEN
    				   ' ' + dbo.CE100_Produtos.ItemGrade_01_Valor 
    				ELSE
    				   ''
    			 END + 
                 CASE  
    			    WHEN NOT dbo.CE100_Produtos.ItemGrade_02_Valor IS NULL THEN
    				   ' ' + dbo.CE100_Produtos.ItemGrade_02_Valor 
    				ELSE
    				   ''
    			 END + 
                 CASE  
    			    WHEN NOT dbo.CE100_Produtos.ItemGrade_03_Valor IS NULL THEN
    				   ' ' + dbo.CE100_Produtos.ItemGrade_03_Valor 
    				ELSE
    				   ''
    			 END + 
                 CASE  
    			    WHEN NOT dbo.CE100_Produtos.ItemGrade_04_Valor IS NULL THEN
    				   ' ' + dbo.CE100_Produtos.ItemGrade_04_Valor 
    				ELSE
    				   ''
    			 END + 
                 CASE  
    			    WHEN NOT dbo.CE100_Produtos.ItemGrade_05_Valor IS NULL THEN
    				   ' ' + dbo.CE100_Produtos.ItemGrade_05_Valor 
    				ELSE
    				   ''
    			 END AS DescricaoCompleta 
    FROM         dbo.CE100_Produtos WITH(NOLOCK) INNER JOIN 
                 dbo.CE100_Grade WITH(NOLOCK) ON dbo.CE100_Produtos.ID_Grade = dbo.CE100_Grade.ID_Grade
    WHERE        (dbo.CE100_Produtos.ID_Produto = @ID_Produto)
    

    sábado, 27 de abril de 2019 20:37

Todas as Respostas

  • Deleted
    domingo, 28 de abril de 2019 00:09
  • Jose Diz obrigado. Voce disse que algumas tabelas nao sao normatizadas por performance. Nesse caso acha que tenho que normatizar, ou sigo nessa linha?

    Tem funcao que retorna valor, mas minha preocupação é que como passa o parametro ID, e se o select retorna 100 ou 1000 itens vai executar a function para cada item.

    Por isso estava pensando em fazer uma FUNCAO que retorna todos os itens, fazendo um INNER JOIN com a tabela na VIEW.

    O que voce acha?

    quinta-feira, 2 de maio de 2019 14:39
  • Deleted
    quinta-feira, 2 de maio de 2019 22:57
  • Obrigado a todos, eu utilizaria em uma view por exemplo:


    ALTER VIEW [VwCE100_Produtos]
    
    AS
    
    SELECT       dbo.CE100_Produtos.ID_Produto, 
                 dbo.CE100_Grade.ID_Grade, 
                 dbo.CE100_Grade.ID_Objeto, 
                 dbo.MA730_Empresas.ID_Empresa, 
                 dbo.MA730_Empresas.Nome AS EmpNome, 
                 dbo.MA730_Empresas.RazaoSocial AS EmpRS, 
                 dbo.MA730_Empresas.Nome + ' - ' + dbo.MA730_Empresas.RazaoSocial AS EmpNomeRS, 
                 dbo.MA732_Filiais.ID_Filial, 
                 dbo.MA732_Filiais.Nome AS FilialNome, 
                 dbo.MA732_Filiais.RazaoSocial AS FilialRS, 
                 dbo.MA732_Filiais.Nome + ' - ' + dbo.MA732_Filiais.RazaoSocial AS FilialNomeRS, 
                 dbo.CE100_Grade.ID_Tipo, 
                 dbo.CE900_TipoProduto.Descricao AS TipoDesc, 
                 dbo.CE100_Grade.Descricao, 
                 dbo.CE100_Produtos.ItemGrade_01_Valor, 
                 dbo.CE100_Produtos.ItemGrade_02_Valor, 
                 dbo.CE100_Produtos.ItemGrade_03_Valor, 
                 dbo.CE100_Produtos.ItemGrade_04_Valor, 
                 dbo.CE100_Produtos.ItemGrade_05_Valor, 
    			 FN_CE100_Produtos_DescricaoComnpleta.DescricaoCompleta, 
                 dbo.CE100_Grade.ID_UnidadeEstoque, 
                 dbo.CE901_Unidade.Sigla AS UniEstSigla, 
                 dbo.CE901_Unidade.Descricao AS UniEstDesc, 
                 dbo.CE100_Produtos.ID_Fabricante, 
                 dbo.CE153_Fabricante.Descricao AS FabDesc, 
                 dbo.CE150_Grupo.ID_Grupo, 
                 dbo.CE150_Grupo.Descricao AS GruDesc, 
                 dbo.CE100_Produtos.ID_Classe, 
                 dbo.CE155_Classe.Descricao AS ClaDesc, 
                 dbo.CE100_Produtos.ComissaoP, 
                 dbo.CE100_Produtos.EstoqueMinimo, 
                 dbo.CE100_Produtos.EstoqueMaximo, 
                 dbo.CE100_Grade.ControlaLote, 
                 dbo.CE100_Produtos.Inativo
    FROM         dbo.CE100_Produtos INNER JOIN
                 dbo.CE100_Grade ON dbo.CE100_Produtos.ID_Grade = dbo.CE100_Grade.ID_Grade INNER JOIN
                 dbo.MA350_AssociacaoFiliais ON dbo.CE100_Grade.ID_Objeto = dbo.MA350_AssociacaoFiliais.ID_Objeto AND dbo.CE100_Grade.ID_Grade = dbo.MA350_AssociacaoFiliais.ID_IndicePrimario INNER JOIN
                 dbo.MA732_Filiais ON dbo.MA350_AssociacaoFiliais.ID_Filial = dbo.MA732_Filiais.ID_Filial INNER JOIN 
                 dbo.MA730_Empresas ON dbo.MA732_Filiais.ID_Empresa = dbo.MA730_Empresas.ID_Empresa INNER JOIN 
                 dbo.CE901_Unidade ON dbo.CE100_Grade.ID_UnidadeEstoque = dbo.CE901_Unidade.ID_Unidade INNER JOIN
                 dbo.CE153_Fabricante ON dbo.CE100_Produtos.ID_Fabricante = dbo.CE153_Fabricante.ID_Fabricante INNER JOIN
                 dbo.CE155_Classe ON dbo.CE100_Produtos.ID_Classe = dbo.CE155_Classe.ID_Classe INNER JOIN
                 dbo.CE900_TipoProduto ON dbo.CE100_Grade.ID_Tipo = dbo.CE900_TipoProduto.ID_Tipo INNER JOIN
                 dbo.CE150_Grupo ON dbo.CE100_Grade.ID_Grupo = dbo.CE150_Grupo.ID_Grupo CROSS APPLY
    			 dbo.FN_CE100_Produtos_DescricaoComnpleta_Table (dbo.CE100_Produtos.ID_Produto) AS FN_CE100_Produtos_DescricaoComnpleta
    
    
    GO

    domingo, 12 de maio de 2019 15:44